You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 00:10:38