如何实现PromQL类似outer-join的指标求和行为
PromQL 求和时将缺失标签的指标视为0
问题场景
现有指标:
foo{a="a"} 1 foo{a="b"} 1 bar{a="b"} 1 bar{a="c"} 1
执行查询:
sum by (a) (foo) + sum by (a) (bar)
仅返回标签匹配的结果:
{a="b"} 2
需要编写查询,将求和时另一侧缺失对应标签的指标视为0,期望得到:
{a="a"} 1 {a="b"} 2 {a="c"} 1
解决方案
方法一:通过or合并多场景结果
直接合并三种情况的结果,即可覆盖所有标签项:
sum by (a) (foo) + sum by (a) (bar) or sum by (a) (foo) or sum by (a) (bar)
原理
sum by (a) (foo) + sum by (a) (bar):得到foo和bar标签重叠的项({a="b"} 2)。or sum by (a) (foo):补充仅在foo中存在的标签项({a="a"} 1),已存在的标签会保留之前的求和结果,不会被覆盖。or sum by (a) (bar):补充仅在bar中存在的标签项({a="c"} 1),同样不会覆盖已有结果。
方法二:利用union生成全标签集合
先获取所有存在的标签,再通过计算补全缺失值:
sum by (a) (union(foo, bar)) * 0 + sum by (a) (foo) + sum by (a) (bar)
原理
sum by (a) (union(foo, bar)):获取所有a标签的集合,对每个标签下的序列求和。- 乘以0后得到每个标签对应的值为0,再分别加上
sum by (a) (foo)和sum by (a) (bar)的结果,缺失指标的项相当于加0,最终得到所有标签的求和结果。
内容的提问来源于stack exchange,提问作者Cruncher
相关产品推荐
相关产品推荐

