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

如何在Grafana中使用LogQL将Loki解析字段作为数值绘制时序图?

部署与环境说明
  • 部署版本:Loki 2.1.0、Grafana 6.7.3
  • 应用运行在Kubernetes集群中,由Loki负责采集日志
  • 日志样例:
[2021-03-29 10:13:05] [INFO] Q_len=256 sol_q=0.049 info_q=0.240
[2021-03-29 10:13:05] [INFO] Q_len=196 sol_q=0.047 info_q=0.144
  • 日志输出采用logfmt格式,预期Loki可自动识别字段
  • 需求:在Grafana中绘制info_q字段平均值随时间变化的图表

已尝试的查询与遇到的问题

  1. 首次尝试查询语句:
avg by (info) (avg_over_time({job="ism/ism-core-es"} | regexp `.*info_q=(?P<info_q>.*)` | unwrap info_q [1m]))

执行后返回类型不匹配类报错。
2. 按报错提示添加错误过滤条件后调整语句:

avg by (info) (avg_over_time({job="ism/ism-core-es"} | regexp `.*info_q=(?P<info_q>.*)` | unwrap info_q | __error__="" [1m] ))

执行后无返回数据,生成图表为空。
3. 调整正则为非贪婪匹配后再次尝试:

avg_over_time(
{job="ism/ism-core-es"}
| regexp ".*info_q=(?P<info_q>.*?)"
| unwrap info_q [5m])

执行后仍无返回结果。
4. 核心疑问:编写的查询语句存在什么问题?是否需要对解析得到的字段做类型转换?


问题定位与解决方法

  • 分组标签写错:avg by (info)中指定的分组标签info不存在。正则提取的日志字段名是info_q,且聚合函数的分组维度只能是Loki流上携带的元数据标签(比如pod、container、namespace这类),不能直接用解析出来的日志字段做分组。如果只需要计算全局平均,不需要加任何by分组;如果需要按实例拆分,要选择对应的流标签(比如pod)做分组。
  • 正则捕获逻辑有缺陷:写的.*info_q=(?P<info_q>.*)是贪婪匹配,会把info_q=后面所有的内容(包括末尾空格、换行、后续无关字符)都捕获为info_q字段值,得到的不是纯数字;非贪婪匹配的版本虽然能截断内容,但没有限定匹配的字符范围,仍然可能带入非数字字符,导致后续unwarp失败。
  • 语法顺序错误:把__error__=""过滤条件放在了unwrap操作之后,完全起不到预期作用。Loki的解析错误会在字段提取阶段就打上__error__标签,必须在unwarp之前做过滤,且范围选择器[1m]是紧跟unwrap的语法结构,不能插在过滤条件后面。之前调整语句后无数据,就是因为错误过滤放在unwrap之后,解析失败的日志在进入unwrap阶段时已经没有可提取的数值,此时再做错误过滤,剩下的都是没有有效数值的日志,自然查询不出结果。
  • 缺少显式类型转换:Loki 2.1.0版本中,不管是通过正则还是logfmt解析器提取出来的字段,默认都是字符串类型,而unwrap操作只接受数值类型(int/float)的字段,不会自动做字符串到数值的转换——哪怕看到界面上已经自动识别出了info_q字段,只要没显式转成数值,unwrap就会直接失败,返回空结果或者类型报错。

可直接运行的正确查询语句

avg(
  avg_over_time(
    {job="ism/ism-core-es"}
    | regexp "info_q=(?P<info_q>[0-9.]+)"
    | __error__=""
    | cast info_q as float
    | unwrap info_q [1m]
  )
)

如果需要按K8s pod拆分展示每个实例的info_q平均值,把最外层的avg(...)改成avg by (pod)(...)即可。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.28 06:54:02