如何在Prometheus Alertmanager中实现站点宕机时抑制节点告警?
Prometheus Alertmanager实现站点全宕机时抑制节点告警的方案
你的需求完全可以实现,之前的问题出在站点宕机的告警表达式错误,以及对Alertmanager抑制规则的误解(抑制规则不要求告警名称相同)。以下是具体解决步骤:
一、修正告警规则表达式(snmp.rules)
首先要确保站点全宕机的告警能准确触发,同时给所有节点告警和站点告警带上统一的site_code标签,用于后续抑制匹配。
1. 节点告警规则(每个设备单独配置)
给每个节点告警添加site_code标签,确保标签值和所属站点一致:
groups: - name: snmp_node_alerts rules: - alert: RouterDown expr: probe_success{job="snmp_icmp", instance="cis004a01"} == 0 labels: severity: critical site_code: "004" device_type: router annotations: summary: "路由器 {{ $labels.instance }} 宕机" - alert: WirelessDeviceDown expr: probe_success{job="snmp_icmp", instance="cis004a02"} == 0 labels: severity: critical site_code: "004" device_type: wireless annotations: summary: "无线设备 {{ $labels.instance }} 宕机" - alert: SwitchDown expr: probe_success{job="snmp_icmp", instance="cis004a03"} == 0 labels: severity: critical site_code: "004" device_type: switch annotations: summary: "交换机 {{ $labels.instance }} 宕机" # 其他站点的节点告警同理,替换site_code和instance值
2. 站点全宕机告警规则
使用count函数统计站点内所有正常实例的数量,当数量为0时触发告警(表示全站点宕机):
- name: snmp_site_alerts rules: - alert: SiteFullDown expr: count by (site_code) (probe_success{job="snmp_icmp", site_code=~".+"} == 1) == 0 labels: severity: critical annotations: summary: "站点 {{ $labels.site_code }} 所有设备已宕机"
这个表达式的逻辑是:统计当前site_code下,probe_success为1(正常)的实例数量,若数量为0,说明该站点所有设备都宕机了。
二、配置Alertmanager抑制规则
Alertmanager的抑制规则不要求告警名称相同,只要源告警(站点全宕机)和目标告警(节点宕机)的指定标签匹配,就能实现抑制。
在Alertmanager配置文件中添加以下抑制规则:
inhibit_rules: - source_match: alertname: SiteFullDown severity: critical target_match_re: # 用正则匹配所有节点类的告警名称 alertname: "^(RouterDown|WirelessDeviceDown|SwitchDown)$" equal: ["site_code"]
规则说明:
source_match:指定触发抑制的源告警条件(站点全宕机告警)target_match_re:用正则匹配需要被抑制的目标告警(所有节点类告警)equal:指定匹配的标签,当源告警和目标告警的site_code标签值相同时,触发抑制
三、验证逻辑
- 当站点仅部分节点宕机时:
SiteFullDown告警不会触发,节点宕机告警正常发送到对应Slack频道 - 当站点所有节点都宕机时:
SiteFullDown告警触发,同site_code下的所有节点告警都会被抑制,不会发送到Slack
内容的提问来源于stack exchange,提问作者Sagar_Bhutani
相关产品推荐
相关产品推荐

