PromQL上两个布尔即时向量的逻辑按位与

时间:2019-12-03 09:29:03

标签: prometheus promql prometheus-blackbox-exporter

我正在尝试从用户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中执行此类“按位”操作?

2 个答案:

答案 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)