Grafana配置含模板变量的查询无法设置磁盘等指标告警
问题背景
在15台以上虚拟机规模的环境中部署TIG监控栈(Telegraf、InfluxDB、Grafana)采集CPU、内存、磁盘等系统运行指标:Telegraf负责采集指标并写入InfluxDB,InfluxDB作为Grafana的数据源提供查询能力。
为了实现通过模板变量在同一个图表中展示所有虚拟机的同类统计数据,查询区域使用的语句如下:
- 磁盘指标查询
SELECT last(used_percent) AS PercentageUsed FROM "disk" WHERE "host" =~ /$server$/ AND "path" = '/' AND $timeFilter GROUP BY time($interval), "host", "path"
- CPU指标查询
SELECT mean("usage_user") AS "user" FROM "cpu" WHERE ("cpu" = 'cpu-total') AND host =~ /$server$/ AND $timeFilter GROUP BY time($interval), host ORDER BY asc
配置系统指标告警规则时全部失败,界面返回错误:
Template variables are not supported in alert queries
无法完成磁盘使用率等指标的告警配置。
解决方法
这个报错是Grafana的原生机制限制:告警规则由后台引擎独立调度执行,不会加载仪表盘前端选中的模板变量值,因此告警查询语句中不支持引用任何模板变量。可按以下方式调整配置:
- 仪表盘的展示查询保留原有带模板变量的写法即可,不需要修改,不影响多主机同图展示的效果。
- 告警规则不要复用展示用的查询,单独新建告警专用查询,将语句中所有模板变量替换为固定逻辑:
- 将主机筛选条件
host =~ /$server$/替换为全量主机匹配规则host =~ /.*/,覆盖所有被监控的虚拟机 - 将时间筛选变量
$timeFilter替换为和告警评估周期匹配的固定时间条件,例如评估周期为5分钟时写为time > now() - 5m - 将聚合间隔变量
$interval替换为固定聚合粒度,例如根据指标采集频率设置为1m或5m - 保留
GROUP BY host的分组逻辑,确保触发告警时可以准确定位到异常对应的具体虚拟机
- 将主机筛选条件
- 调整完成后的磁盘使用率告警查询示例:
SELECT last(used_percent) AS PercentageUsed FROM "disk" WHERE "host" =~ /.*/ AND "path" = '/' AND time > now() - 5m GROUP BY time(1m), "host", "path"
该语句不依赖任何模板变量,可被告警引擎正常执行,配置对应阈值后即可正常触发告警。如果需要给指定分组的主机配置差异化告警阈值,直接在WHERE条件中写死对应主机的匹配规则即可,不需要依赖模板变量筛选。
内容的提问来源于stack exchange,提问作者adg
相关产品推荐
相关产品推荐

