我正在尝试从用户PoV定义服务的E2E访问可用性,这是在表示单个服务可用性的两个布尔即时向量之间应用按位AND操作的结果。
我要从预先安装了probe_success
的“用户节点”对这两个服务(例如S1和S2)执行ping操作,获取blackbox_exporter
的结果:
+-------+ +---------------------+ +-------+
|S1 | | | | S2|
| | | User node with | | |
| +<----+ blackbox_exporter +---->+ |
| | icmp| |icmp6| |
+-------+ +---------------------+ +-------+
由于使用不同的模块(icmp和icmp6)探测了目标,因此我使用了两个作业,因此得到了两个即时向量:
probe_success{job="S1", user="foo"}
# AND
probe_success{job="S2", user="foo"}
正如我在Prometheus (querying) logical operators docs上读到的那样,逻辑and
并不是我所要寻找的。有没有简单的方法可以在PromQL中执行此类“按位”操作?
答案 0 :(得分:1)
由于probe_success{job="S1", user="foo"}
和probe_success{job="S2", user="foo"}
之间的基数不相同,因此逻辑and
运算符将不会产生具有所需效果的矢量/标量。
实现这一目标的方法并不复杂。我会用这样的东西:
(scalar(probe_success{job="S1", user="foo"}) + scalar(probe_success{job="S2", user="foo"})) == bool(2)
scalar
将单个元素输入向量转换为标量。如果使用绝对基数,probe_success
便是一个单元素输入向量。例如,如果与probe_success{user="foo"}
一起使用,则相同的表达式将不起作用,因为它将导致多个元素向量。
+
运算符显然将两个标量相加
bool()
是因为Prometheus期望必须在要比较的2个标量之间提供bool修饰符,在这种情况下使用==
运算符。 Refer在这里。
答案 1 :(得分:0)
保留标签的细微变化:
sum(probe_success{job~"S[12]", user="foo"})by(user)== bool(2)