如何配置Prometheus告警监控从未生成备份的新实例?
解决新实例未触发备份告警的问题
核心思路是结合**运行状态指标(up)**和备份指标的差异——所有实例启动后就有up指标,而备份相关指标仅在首次备份完成后生成,我们需要把「从未备份的运行中实例」和「备份过期的实例」都纳入告警范围。
调整后的告警规则
直接修改原有告警规则,通过unless或absent函数补充未备份实例的检测逻辑:
alert: InstanceNotBackedUp expr: | # 原有规则:检测备份超过24小时的实例 (max by(env, region, cluster) (latest_backup_age{job="my-pods",type="latest_backup"}) > 24) or # 新增规则:检测运行中但从未生成备份指标的实例 (max by(env, region, cluster) (up{job="my-pods"} == 1) unless max by(env, region, cluster) (latest_backup_age{job="my-pods",type="latest_backup"})) for: 1h labels: severity: critical annotations: summary: 实例未完成备份或备份过期 description: 集群{{ $labels.cluster }}(环境{{ $labels.env }}, 区域{{ $labels.region }})的实例要么超过24小时未执行备份,要么自启动后从未完成过首次备份
规则逻辑说明
- 第一部分保留原有逻辑,筛选出备份时间超过24小时的实例。
- 第二部分通过
unless运算符实现:- 先筛选出
up=1(实例处于运行状态)的实例 - 排除掉已经存在
latest_backup_age指标的实例(即已完成过至少一次备份的) - 最终剩下的就是「运行中但从未备份」的实例
- 先筛选出
可选简化写法(用absent函数)
如果觉得unless不够直观,也可以用absent函数替换第二部分逻辑,效果完全一致:
alert: InstanceNotBackedUp expr: | (max by(env, region, cluster) (latest_backup_age{job="my-pods",type="latest_backup"}) > 24) or (max by(env, region, cluster) (up{job="my-pods"} == 1) and absent(latest_backup_age{job="my-pods",type="latest_backup"}))
注意事项
- 确保
up指标和备份指标的标签(env/region/cluster/job)完全一致,否则聚合后的维度无法匹配,会导致规则失效。 - 设置合理的
for时长(比如示例中的1小时),避免新实例刚启动就触发告警,给首次备份留足执行时间。
内容的提问来源于stack exchange,提问作者NoACoder
相关产品推荐
相关产品推荐

