1

我正在尝试定义来自用户 PoV 的服务的 E2E 访问可用性,这是在表示单个服务可用性的两个布尔即时向量之间应用按位与运算的结果。

我正在probe_success从预安装的“用户节点”获取 ping 这两个服务(例如 S1 和 S2)的结果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 中执行这些“按位”操作?

4

2 回答 2

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如果使用绝对基数,handily 是一个单元素输入向量。例如,如果使用 with 相同的表达式将不起作用,probe_success{user="foo"}因为它会导致多个元素向量。

+运算符显然将两个标量相加

bool()之所以使用,是因为 Prometheus 期望 bool 修饰符必须在 2 个要比较的标量之间提供,在本例中是使用==运算符。请参阅此处。

于 2019-12-03T12:32:09.283 回答
0

保留标签的细微变化:

sum(probe_success{job~"S[12]", user="foo"})by(user)== bool(2) 
于 2020-09-25T22:32:55.283 回答