用 Alertmanager 做好告警管理:分组、路由、静默与抑制
Alertmanager 是 Prometheus 告警体系的调度中枢:分组降噪、按标签路由、静默窗口、告警抑制。核心概念与完整配置示例,附通知模板定制方法。
Prometheus 负责评估规则"该不该告警",Alertmanager 负责"怎么告"——同样的 100 条原始告警,直接发是灾难(告警风暴),经过 Alertmanager 的分组、去重、路由后是一条聚合通知。理解这四个核心功能,告警体系才算完整。
Alertmanager 在链路中的位置
Prometheus 评估规则 → 产生告警 → Alertmanager
→ 去重(多个 Prom 实例发同一告警只留一份)
→ 分组(按标签聚合,一组一条通知)
→ 路由(按标签发给不同接收人)
→ 抑制(上游故障时压掉下游告警)
→ 静默(维护窗口不打扰)
→ 接收器(邮件/Slack/Webhook……)
基础配置骨架
# alertmanager.yml
global:
smtp_smarthost: 'smtp.example.com:587'
smtp_from: 'alert@example.com'
route:
receiver: default # 默认接收器
group_by: ['alertname', 'severity']
group_wait: 30s # 组内等待:攒 30s 的告警一起发
group_interval: 5m # 同组后续告警的间隔
repeat_interval: 4h # 未恢复告警的重发间隔
routes:
- match: {severity: critical}
receiver: oncall
- match: {team: database}
receiver: dba-team
receivers:
- name: default
email_configs:
- to: ops@example.com
- name: oncall
webhook_configs:
- url: http://oncall-system/hook
分组(Grouping):降噪第一招
一次数据库故障可能触发 50 个相关告警。group_by 把它们聚成一条通知:"HighErrorRate(critical):50 个实例受影响",而不是 50 条消息轰炸。group_wait 的存在就是为了"攒一攒再发"。
路由(Routing):对的人收对的告警
按标签分派:数据库告警给 DBA、前端告警给前端组、critical 打电话、warning 进 IM。match/match_re(正则)定义路由条件,未匹配的走默认接收器。
静默(Silence):维护窗口不打扰
发布、迁移、扩容期间,已知会产生的告警应该静默:
# amtool 命令行创建静默
amtool silence add severity=warning --duration=2h --comment="发版窗口"
Web UI 上也可操作。静默按匹配器生效,可以精确到单个实例。
抑制(Inhibition):上游故障压掉下游
数据库集群挂了 → 依赖它的 20 个服务全部报 HighErrorRate。抑制规则说:当"数据库宕机"这个 P0 告警存在时,压掉相关的下游告警:
inhibit_rules:
- source_match: {alertname: 'DatabaseDown'}
target_match_re: {alertname: 'HighErrorRate|HighLatency'}
equal: ['cluster'] # 同一集群内才抑制
值班人收到一条根因告警,而不是 21 条互相印证的噪声。
通知模板定制
Go template 语法定制通知内容,把关键信息(实例、数值、runbook 链接)塞进告警:
receivers:
- name: oncall
webhook_configs:
- url: http://hook/alert
email_configs:
- to: ops@example.com
html: '{{ template "custom.html" . }}'
一条好告警的标准格式:什么服务 + 什么现象 + 当前值 + 从何时开始 + runbook 链接。
观测云对照
Alertmanager 的这些能力在观测云里是监控器的开箱功能:告警策略支持按维度分组聚合、分级通知(邮件/钉钉/企微/飞书/电话/Webhook)、静默与免打扰时段、以及基于关联规则的告警收敛;告警与指标/日志/Trace 同平台,点击告警直接跳到故障时刻的完整现场数据。已有 Prometheus 体系的告警规则也可以通过 remote write 指标继续复用。
常见问题(FAQ)
Q:Alertmanager 需要高可用吗?
A:生产建议跑 2-3 个实例组成集群(gossip 协议自动同步静默与通知状态)。单点 Alertmanager 挂了 = 所有告警静默,比没有监控更危险。
Q:告警发出去了但没人处理怎么办?
A:需要升级策略(escalation):Alertmanager 本身弱升级,配合值班系统(或观测云的告警升级策略)实现"15 分钟未确认 → 升级上级"。
Q:repeat_interval 设多少?
A:critical 建议 1-4 小时重发提醒;warning 可以 12-24 小时或干脆不重发。太频繁制造疲劳,太久会遗忘未恢复的告警。