Prometheus查询逻辑实现及and运算符异常结果疑问
实现条件分支的Prometheus查询
要实现「当查询A的结果大于0时返回查询B,否则返回查询C」的逻辑,有两种常用写法:
- 用
if表达式配合or:
(B if (A > 0)) or C
逻辑是:如果A>0的条件成立,就返回B的结果;否则执行后半段的C。
- 用乘法配合
or(更严谨的标签匹配处理):
(A > 0) * B or (A <= 0) * C
当A>0时,A>0会输出值为1的序列,乘以B后得到B的结果;当A<=0时,A<=0输出值为1的序列,乘以C得到C的结果,or会自动取非0的那组结果。
解释
(1 and 0)与(0 and 1)的返回结果 这是因为Prometheus的and不是传统的数值逻辑与,而是标签匹配过滤操作,规则是:
- 先计算左边表达式,得到一组时间序列
- 再计算右边表达式,得到另一组时间序列
- 最终返回左边表达式中,和右边表达式标签完全匹配的序列,并且保留左边序列的原始数值
具体到你的测试:
(1 and 0):左右两边都是无标签的序列,标签匹配成功,所以返回左边的数值1(0 and 1):同样标签匹配成功,返回左边的数值0
如果要做数值层面的逻辑与运算,需要加上bool修饰符,这样会返回布尔结果(1或0):
bool (1 and 0) // 返回0 bool (0 and 1) // 返回0
内容的提问来源于stack exchange,提问作者Rishabh Madan
相关产品推荐
相关产品推荐

