如何在Prometheus中为无数据场景插入0值以实现Grafana Agent告警
解决Grafana Agent无指标推送时的告警触发问题
需要监控Grafana Agent,当指定集群环境(dev/sit/acc)中某个Agent实例停止向Prometheus推送up指标时触发Grafana告警,但现有查询无法稳定生效:
- 原查询
(up{cluster_environment=~"dev|sit|acc", job="integrations/agent"} offset 5m) unless up{cluster_environment=~"dev|sit|acc", job="integrations/agent"}仅能在Agent停止后的5分钟内返回1,超时后告警自动恢复; - 尝试结合
vector(0)会丢失原有标签,新增无意义的序列,无法定位到具体故障实例。
目标效果:Agent正常推送指标时返回1(告警恢复),无数据时返回0(触发告警),且保留所有原有标签。
解决方案
使用absent()函数结合标签匹配的OR逻辑,确保无数据时返回带完整标签的0值:
up{cluster_environment=~"dev|sit|acc", job="integrations/agent"} OR on(cluster_environment, job, instance) absent(up{cluster_environment=~"dev|sit|acc", job="integrations/agent"}) * 0
语句解释
up{...}:正常情况下,Agent推送的up指标返回1,保留所有原始标签(cluster_environment、job、instance等);absent(up{...}):当某个Agent实例的up指标消失时,该函数返回值为1的序列,标签包含查询指定的匹配维度;* 0:将absent()返回的1转为0,满足告警触发的数值条件;on(cluster_environment, job, instance):指定标签匹配规则,确保OR操作后仅保留与原有up指标一致的标签序列,不会新增无标签的冗余序列。
告警配置建议
在Grafana告警规则中设置:
- 评估条件:
查询结果 == 0 - 持续时间:建议设置为3-5分钟,过滤临时网络波动或Agent重启导致的短时间无数据情况,减少误告警。
内容的提问来源于stack exchange,提问作者Grigas
相关产品推荐
相关产品推荐

