前言
Prometheus监控体系中极易出现告警风暴:单台服务器宕机时,CPU、内存、磁盘、端口、进程等几十条次要告警同时推送,运维被海量无效消息淹没。Alertmanager提供两种分层降噪方案:
-
告警抑制(inhibit_rules):静态写入配置、永久生效,解决「底层故障连锁引发上层冗余告警」,属于长期规则;
-
静默(Silence):临时动态屏蔽告警,无需改配置、支持自动过期,用于版本发布、硬件维护、已知故障排查等短期场景。
二者核心区别:
| 维度 | inhibit_rules 告警抑制 | Silence 静默 |
|---|---|---|
| 生效方式 | 写alertmanager.yml,重启/重载生效 | Web页面/API临时创建,内存存储 |
| 生命周期 | 永久,删除配置失效 | 自定义过期时间,到期自动解除 |
| 作用范围 | 匹配标签+同源实例才抑制 | 任意标签全局屏蔽,无依赖关系 |
| 适用场景 | 服务器宕机抑制资源告警、主库故障抑制从库延迟 | 服务器下线、业务发布、临时故障 |
| 可追溯 | 配置文件留存 | Web界面可查看历史静默记录 |
一、告警抑制 inhibit_rules 完整实战
1. 核心语法说明(官方标准匹配器,0.26+版本推荐 source_matchers/target_matchers)
单条抑制规则四要素:
-
source_matchers:源告警(故障根因,触发抑制的告警) -
target_matchers:目标告警(会被屏蔽的冗余告警) -
equal:约束标签,只有源、目标告警该标签值完全一致才会抑制(核心防跨实例误屏蔽) -
name:规则名称,便于日志、指标区分(可选但建议填写)
2. 抑制规则
适配Node主机监控、K8s节点、MySQL数据库三类主流场景
inhibit_rules:# 规则1:同一主机NodeDown(严重)宕机,抑制本机CPU/内存/磁盘所有warning警告告警- name: node_down_suppress_resourcesource_matchers:- alertname = "NodeDown"- severity = "critical"target_matchers:- severity = "warning"- alertname =~ "HighCPUUsage|HighMemoryUsage|HighDiskUsage"equal: ["instance"]# 规则2:K8s节点不可用,抑制该节点所有Pod告警- name: k8s_node_suppress_podsource_matchers:- alertname = "KubeNodeNotReady"- severity = "critical"target_matchers:- alertname =~ "Pod.*|Container.*"equal: ["node"]# 规则3:MySQL主库宕机,抑制从库延迟、连接数告警- name: mysql_master_suppress_slavesource_matchers:- alertname = "MysqlMasterDown"- severity = "critical"target_matchers:- alertname =~ "MysqlSlaveDelay|MysqlConn"equal: ["cluster"]# 规则4:同实例严重告警抑制所有普通警告(兜底降噪)- name: critical_suppress_warningsource_matchers:- severity = "critical"target_matchers:- severity = "warning"equal: ["instance","job"]
3. 配套Prometheus主机告警规则
用于复现「主机宕机抑制资源告警」场景
groups:
- name: node_alertsrules:# 主机失联-严重告警(抑制源)- alert: NodeDownexpr: up{job="node-exporter"} == 0for: 1mlabels:severity: criticalannotations:summary: "节点 {{ $labels.instance }} 服务失联"description: "节点采集中断,请检查网络、node_exporter进程"# CPU高负载-警告(被抑制目标)- alert: HighCPUUsageexpr: 100 - (avg by(instance) (irate(node_cpu_seconds_total[5m])) * 100) > 85for: 5mlabels:severity: warningannotations:summary: "节点{{$labels.instance}}CPU使用率过高"description: "CPU使用率{{$value}}%"# 内存高负载-警告(被抑制目标)- alert: HighMemoryUsageexpr: (1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100 > 85for: 5mlabels:severity: warningannotations:summary: "节点{{$labels.instance}}内存不足"
4. 验证抑制效果实操步骤
- 配置校验+重载Prometheus、Alertmanager
# 校验Alertmanager语法
cd /data/alertmanager-0.32.2
./amtool check-config alertmanager.yml
systemctl restart alertmanager# 重载Prometheus规则
curl -XPOST http://PrometheusIP:9090/-/reload
- 关闭目标服务器node_exporter进程,模拟
NodeDown宕机 - 打开Alertmanager Web页面
http://IP:9093/#/alerts - 现象:仅收到一条
NodeDown critical告警,CPU/内存告警状态标记Inhibited,不会推送邮件/企业微信 - 恢复node_exporter,抑制状态自动消失,资源告警恢复推送通知
5. 关键避坑点
-
equal标签必须精准:只写instance才能保证A机器宕机不会抑制B机器告警; -
匹配器区分
=精确匹配 /=~正则匹配; -
源告警必须是
critical,目标为warning,层级符合故障因果; -
抑制仅在两条告警同时活跃时生效,若资源告警先恢复则无作用。
二、告警静默 Silence 全量实战(Web界面 + API两种方式)
核心概念
Silence是临时屏蔽规则,不修改配置,存于Alertmanager内存,重启后全部丢失;支持自定义起止时间、标签精准匹配,多用于计划内维护。
生效优先级:Silence > inhibit_rules > 正常通知(静默会直接跳过抑制逻辑,完全屏蔽告警)。
方式一:Web可视化操作(运维日常首选)
访问Alertmanager地址 http://10.0.0.42:9093/#/silences
步骤1 新建静默规则
- 点击右上角
New Silence; - Start:静默生效时间(默认当前时间);
- End / Duration:两种填法,二选一:
- Duration:填写
4h/12h快速设置时长; - End:手动指定精确结束UTC时间;
- Duration:填写
- Matchers 匹配器(核心,精准屏蔽范围)
示例1:屏蔽单台服务器所有告警
示例2:屏蔽所有CPU告警instance="10.0.0.71:9100"
示例3:屏蔽整个集群所有warning告警alertname=~"HighCPUUsage"severity="warning" - Creator:操作人姓名/工号(审计用);
- Comment:维护说明,如「2026-08-09 consul1服务器硬件升级」;
- 点击
Preview Alerts预览匹配到的告警,确认无误后点Create。
![image]()
![image]()
步骤2 查看/过期/删除静默
- 静默列表区分状态:
Active生效中 /Expired已过期; - 临时提前终止:点击对应静默规则
Expire按钮,立即失效; - 过期静默保留记录,可追溯历史维护操作。
![image]()
步骤3 触发报警测试



步骤4 关闭静默模式并验证


方式二:API 命令行创建静默(自动化脚本/CI发布使用)
1. curl创建静默示例(屏蔽10.0.0.71主机12小时)
curl -X POST http://127.0.0.1:9093/api/v2/silences \
-H "Content-Type: application/json" \
-d '{"matchers": [{"name": "instance","value": "10.0.0.71:9100","isRegex": false}],"startsAt": "'$(date -u +%Y-%m-%dT%H:%M:%SZ)'","endsAt": "'$(date -u -d +12hours +%Y-%m-%dT%H:%M:%SZ)'","createdBy": "运维-张三","comment": "consul1服务器硬件维护,12小时内屏蔽所有监控告警"
}'
执行成功会返回silence唯一ID,用于后续管理。
2. 查询全部静默规则
curl http://127.0.0.1:9093/api/v2/silences
3. 删除指定静默(提前解除屏蔽)
curl -X DELETE http://127.0.0.1/api/v2/silence/静默ID
方式三:amtool 工具快速创建(本地运维)
# 屏蔽指定实例6小时
./amtool silence add instance="10.0.0.71:9100" --duration 6h --comment "服务器版本升级"
# 查询所有静默
./amtool silence query
# 删除静默
./amtool silence expire 静默ID
静默避坑规范
-
禁止全局静默所有告警(
matchers: []),会丢失所有故障通知; -
维护时长不要设置过长,避免忘记过期漏报故障;
-
必须填写Creator+Comment,方便多人运维追溯;
-
Alertmanager重启后所有Silence全部清空,长期屏蔽请改用inhibit_rules。
三、二者组合生产最佳实践
-
长期故障连锁降噪:用
inhibit_rules写入配置永久抑制; -
计划内停机/发布:临时创建Silence静默,设置自动过期;
-
故障排查时临时屏蔽单台机器:Web页面快速创建Silence;
-
架构分层设计:底层基础设施告警critical,上层业务warning,依靠抑制自动过滤风暴。
四、排错常用命令
- 校验Alertmanager完整配置(含抑制、模板、接收器)
./amtool check-config alertmanager.yml
- 实时查看告警推送日志,确认抑制/静默是否生效
journalctl -u alertmanager -f
- 手动注入测试告警验证抑制逻辑
curl -XPOST http://127.0.0.1:9093/api/v2/alerts -H "Content-Type: application/json" -d '[
{"labels":{"alertname":"NodeDown","instance":"10.0.0.71:9100","severity":"critical","job":"node-exporter"},"annotations":{"summary":"测试主机宕机"},"startsAt":"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'"
},
{"labels":{"alertname":"HighCPUUsage","instance":"10.0.0.71:9100","severity":"warning","job":"node-exporter"},"annotations":{"summary":"测试CPU高负载"},"startsAt":"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'"
}
]'
注入后查看邮件/企业微信,只会收到NodeDown,CPU告警被抑制。


