Prometheus告警触发后标签缺失问题求助
问题分析与解决
根本原因
你的告警规则中expr的聚合逻辑错误,导致job标签被意外丢弃:
expr: avg by (job) (100 - (100 * avg(irate(node_cpu_seconds_total{mode="idle", job="node_secure"}[1m]))))
内层的avg(irate(...))未指定聚合维度,会将所有标签(包括job、instance)全部聚合掉,生成一个无任何标签的单值时间序列。外层的avg by (job)无法从无标签序列中提取job标签,最终导致告警中的{{$labels.job}}为空。
解决方案
根据监控需求调整告警规则的expr,确保保留需要的标签:
方案1:按job聚合平均CPU使用率(保留job标签)
修改alert_rules.yml中的expr为:
expr: avg by (job) (100 - 100 * irate(node_cpu_seconds_total{mode="idle", job="node_secure"}[1m])) > 90
- 直接对每个
job+instance的空闲CPU使用率做速率计算,再按job求平均值,最后判断是否超过90% - 聚合后会保留
job标签,告警中的{{$labels.job}}可正常显示
方案2:监控单个实例的CPU使用率(保留job和instance标签)
若需监控每个服务器实例的CPU使用率,修改expr为:
expr: 100 - 100 * irate(node_cpu_seconds_total{mode="idle", job="node_secure"}[1m]) > 90
- 不对实例做聚合,每个
instance的超标情况都会触发独立告警 - 告警中会同时保留
job和instance标签,{{$labels.instance}}也能正常显示
额外优化
将告警规则中的for值从10s改为1m,与描述中的“more than 1 minute”保持一致:
for: 1m
验证步骤
- 保存修改后的
alert_rules.yml - 重启Prometheus服务加载新规则
- 等待告警触发后,检查仪表盘或Alertmanager中的标签显示情况
内容的提问来源于stack exchange,提问作者Arno Van Brussel
相关产品推荐
相关产品推荐

