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

Grafana中存在null值时,如何计算两个PromQL查询的差值?

解决PromQL差值计算中null值处理的问题

我懂你的困扰——本来期望把null当作0来做减法,但直接用or vector(0)没达到预期,核心问题出在标签匹配逻辑上。

为什么之前的写法失效?

当max_over_time(counter{label="label1"}[5m] offset 10m)没有数据返回时,or vector(0)会生成一个不带任何标签的vector(0)。而你的左侧查询结果是带label="label1"标签的向量,Prometheus的减法操作默认要求两边标签完全匹配,标签不匹配的组合会被直接丢弃,所以最终结果还是null,而非你想要的1000-0=1000。

正确的查询写法

你需要通过on()或ignoring()忽略标签匹配要求,让带标签的左侧结果和无标签的0值向量能正常运算。这里有两种可靠的写法:

写法1:用on()忽略标签匹配

(max_over_time(counter{label="label1"}[5m]) or vector(0)) 
- 
(max_over_time(counter{label="label1"}[5m] offset 10m) or on() vector(0))

on()后不指定任何标签,表示忽略所有标签匹配条件,这样左侧带标签的序列就能和右侧无标签的0值向量完成运算。

写法2:用group_left明确保留左侧标签

如果想更清晰地控制标签保留逻辑,推荐用group_left:

max_over_time(counter{label="label1"}[5m]) 
- 
(max_over_time(counter{label="label1"}[5m] offset 10m) or on() group_left vector(0))

group_left表示运算后保留左侧序列的标签,确保结果和原查询的标签一致,同时让无标签的0值向量能和左侧匹配。

效果验证

  • 当两边都有非null值时:标签完全匹配,减法正常计算(比如1500-1000=500)。
  • 当右侧为null时:右侧被替换为无标签的0,通过on()匹配左侧带标签的序列,计算结果为左侧值-0=左侧值(比如1000-0=1000)。
  • 当左侧为null时:左侧被替换为带标签的0,右侧如果有值,会得到0-右侧值的结果(如果这也是你需要的逻辑)。

内容的提问来源于stack exchange,提问作者rarchim2

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 11:32:40