如何通过Promtail和Loki在Grafana中提取过滤JSON数组条目
问题:从Loki的Errors数组中提取错误并关联system标签展示
我用Promtail将JSON日志发送至Loki,想要在Grafana中制作一个表格面板,左侧显示错误信息,右侧显示对应的system标签。当前遇到的核心问题是无法正确访问JSON结构里的Errors数组条目,之前的查询会把数组元素转成无区分的标签,没法和system标签对应展示。
JSON日志格式
日志文件每分钟重建一次,格式如下:
{ "Date": "2023-10-23T11:43:57.0096488+02:00", "Standort": { "GeraeteNr": "01", "PLZ": "48653", "Ort": "Coesfeld", "Strasse": "Boschstraße 14" }, "Errors": [ { "Key1": "value1" }, { "Key2": "value2" } ] }
当前Promtail采集配置
scrape_configs: - job_name: mrs_error_list static_configs: - targets: - localhost labels: job: mrs_error_list system: mrs2-14 __path__: /var/lib/mrs/data/log/mrs-state.json pipeline_stages: - multiline: firstline: '^\{' max_wait_time: 3s
尝试过的查询及问题
使用以下查询时,Errors数组的每个条目会被转成独立标签,但无法区分这些标签是否来自Errors数组,也没法和system标签对应展示:
{job="test_6", system="mrs2-14"} | json | line_format `{{.log}}`
解决方案
1. 优化Promtail Pipeline配置
修改pipeline_stages,将Errors数组展开为单独日志条目,同时保留system标签关联:
pipeline_stages: - multiline: firstline: '^\{' max_wait_time: 3s # 解析JSON,提取Errors数组和原标签中的system字段 - json: expressions: errors: Errors system: system # 将Errors数组的每个元素展开为独立日志条目 - unfold: source: errors # 将system字段保留为标签,确保每个错误条目都绑定对应系统标识 - labels: system:
2. Grafana查询与表格配置
在Grafana中使用以下LogQL查询:
{job="mrs_error_list", system="mrs2-14"} | json
然后在表格面板的字段映射中:
- 将
errors字段设置为第一列(错误信息) - 将
system字段设置为第二列(对应系统标签)
如果需要把错误的键值对转为可读文本展示,可调整查询为:
{job="mrs_error_list", system="mrs2-14"} | json | line_format "{{.errors}} | 系统: {{.system}}"
进阶:解析错误内的具体键值对
如果需要把Errors数组内的具体键值(比如Key1、Key2)单独作为字段展示,可以在Pipeline中增加一步解析:
pipeline_stages: - multiline: firstline: '^\{' max_wait_time: 3s - json: expressions: errors: Errors system: system - unfold: source: errors # 解析每个错误条目内的键值对为单独字段 - json: source: errors - labels: system:
此时Grafana查询后会自动生成Key1、Key2等字段,可直接添加到表格中展示。
内容的提问来源于stack exchange,提问作者Falke
相关产品推荐
相关产品推荐

