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

如何在Grafana中用LogQL(Loki)处理减法查询的无数据问题

解决LogQL减法查询无数据时返回'no data'的问题

问题场景

使用Promtail转发日志到Loki,通过Grafana可视化时,编写了以下LogQL计算无错误在线设备数量:

(
  count(count by(system) (count_over_time({job="mrs_error_list"} |~ "" [7d])))
)
-
(
  count(count by(system) (count_over_time({job="mrs_error_list"} |~ "Error" [5m])))
)

当减法两侧都有数据时查询正常,但最近5分钟无错误日志时,整个查询返回no data,需要将无数据的部分视为0进行运算。

可行解决方案

修改查询,为可能无数据的子查询添加or on() vector(0),确保无数据时返回0:

(
  count(count by(system) (count_over_time({job="mrs_error_list"} |~ "" [7d])))
)
-
(
  count(count by(system) (count_over_time({job="mrs_error_list"} |~ "Error" [5m]))) or on() vector(0)
)

原理说明

  • 原问题中,当5分钟内无错误日志时,右侧的count(...)子查询没有返回结果,导致整个减法运算因缺少操作数返回no data。
  • or on() vector(0)的作用是:如果左侧子查询无结果,就返回一个值为0的无标签向量。on()用于忽略标签匹配要求,确保无标签的vector(0)能和左侧子查询的无标签结果兼容(即使左侧有标签,on()也能强制匹配)。

对之前尝试的补充说明

  1. or vector(0)无效:之前的写法缺少on(),LogQL会严格匹配标签(即使两侧都是无标签,部分版本可能存在匹配逻辑问题),加上on()后就能强制忽略标签校验,确保0值能被正确替换。
  2. 拆分查询后无法运算:Grafana的"no value"默认值仅作用于可视化展示,无法参与查询层面的算术运算,因此必须在LogQL本身层面处理无数据场景。
  3. Add field from calculation无效:该功能依赖查询返回的字段存在,当子查询无数据时没有可计算的字段,因此无法解决问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 04:32:55