Grafana v11.2.0告警注释描述中展示查询详情的实现方案
在Grafana 11.2.0告警描述中按entry_type分组展示entry_id(无需修改SQL)
问题背景
我有一个Grafana告警包含两个查询:
- 阈值查询:当返回结果大于0时触发告警,SQL如下:
SELECT COUNT(DISTINCT(dt.entry_id)) FROM database_table_process dt JOIN entities e using(entry_id) WHERE $__timeFilter(dt.started)
- 详情查询:用于在告警描述中展示分组后的entry_id,SQL如下:
SELECT e.entry_id, COUNT(*) FROM database_table_process dt JOIN entities e using(entry_id) WHERE $__timeFilter(dt.started) GROUP BY dt.entry_type
预期告警描述输出:
Alert: 14 entries are affected. Type simple_entry: 1231, 1245, 1245 Type complex_entry: 6555, 2424, 09767
此前尝试用range、series等方法获取第二个查询的数据未成功,直接展示查询值仅显示整数,使用len、range等方法后描述中无变量值填充。当前使用Grafana v11.2.0版本,希望找到无需调整SQL即可实现该需求的方法。
解决方案
1. 为查询设置唯一ID
在告警规则的「Queries」标签页中,给两个查询分别设置自定义ID:
- 阈值查询ID设为
main(可自定义,后续模板中对应引用即可) - 详情查询ID设为
details
2. 编写告警描述模板
切换到「Notification templates」标签页,编辑告警消息的「Description」部分,使用以下Grafana模板语法:
Alert: {{ .Values.main }} entries are affected. {{ range $type, $entries := groupBy .Data.details.Series "entry_type" }} Type {{ $type }}: {{ range $index, $entry := $entries }}{{ if $index }}, {{ end }}{{ index $entry.Labels "entry_id" }}{{ end }} {{ end }}
模板语法说明
{{ .Values.main }}:引用阈值查询(ID为main)的返回结果,即受影响的总条目数groupBy .Data.details.Series "entry_type":将详情查询的所有数据按entry_type标签分组- 内层
range遍历分组后的每个条目,提取entry_id标签值并以逗号分隔拼接
关键注意事项
- 确保详情查询的SQL执行后,Grafana能将
entry_type和entry_id识别为数据系列的标签(这是Grafana对SQL GROUP BY结果的默认处理逻辑,只要每条返回数据对应唯一的entry_type+entry_id组合即可) - 如果你的详情查询ID不是
details,需将模板中的.Data.details.Series替换为对应的查询ID
内容的提问来源于stack exchange,提问作者Luka
相关产品推荐
相关产品推荐

