Grafana中null值指标查询逻辑疑问及替代方案咨询
问题解答
现有方案的合理性确认
你用的反向查询方案(metric{id="$id"} default 0) == 0完全靠谱,逻辑顺还符合PromQL的语法要求:
- 先用
default 0把原指标为null的情况(也就是对应时间序列不存在)填充成0 - 再通过
== 0筛选出这些填充后的序列,把图例设为"Not Connected"就行 - 同时保留原查询
metric{id="$id"}(图例设为{{id}} - {{name}}),这样指标值为1时,原查询返回有效序列显示标签,反向查询返回null不会显示;指标为null时,原查询返回null不显示,反向查询返回0就会显示"Not Connected"
为什么不能直接判断null?
PromQL里没法直接写== nil这种判断,核心原因是:
- 当指标返回null时,本质是这个时间序列根本不存在,不是说某个序列的值是null
- PromQL的条件判断(比如
==)只能对已经存在的时间序列的值做操作,没法直接匹配“不存在的序列” - 你试的
(nil if (metric{id="$id"} == 1)) default 0这类写法不符合PromQL语法,PromQL的if表达式要求分支返回数值型向量,不能直接返回nil来消除序列
其他实现方式
方式1:用absent函数
absent就是专门用来检测时间序列存不存在的:
- 当
metric{id="$id"}存在(值为1)时,absent(metric{id="$id"})返回null - 当
metric{id="$id"}不存在(原指标为null)时,absent(metric{id="$id"})会返回一个值为1的序列
搭配着用:
- 保留原查询
metric{id="$id"},图例设为{{id}} - {{name}} - 再加个查询
absent(metric{id="$id"}),图例设为"Not Connected" - 在Stat面板的Options里把
Values设为Last,Grafana会自动忽略null的序列,只显示有效的那个
方式2:用or构造默认序列
通过构造一个带指定标签的默认序列来替代null情况:
metric{id="$id"} or vector(0) + on() group_left() label_replace(vector(1), "id", "$id", "", "") + label_replace(vector(1), "name", "Not Connected", "", "")
逻辑是:
- 原序列存在时,直接返回原序列,显示
{{id}} - {{name}} - 原序列不存在时,返回一个构造的序列,
name标签是"Not Connected",值为0,图例就会显示$id - Not Connected
注意:这种方式要保证构造的序列标签和原指标一致,不然面板可能显示出问题
总结
你的原始方案已经是简洁高效的实现方式了,上面的其他方法可以作为备选,看你习惯哪种面板配置方式来选就行。
内容的提问来源于stack exchange,提问作者Tek
相关产品推荐
相关产品推荐

