Alertmanager 告警合并、抑制与自动恢复策略,给出 YAML 示例
解读
性能测试工程师在压测或稳定性演练过程中,会触发大量同类告警(如接口超时、CPU 飙高)。如果每条告警都独立发送,值班手机会被“轰炸”,真正关键的信号反而被淹没。面试官通过此题考察三件事:
- 是否理解 Alertmanager 的三大核心机制:分组(group)、抑制(inhibit)、静默(silence);
- 能否把“性能测试场景”翻译成具体的匹配规则(label、regex、duration);
- 是否具备“告警可自动恢复”的意识——压测停止后,告警应自动解除,避免人工登平台点“已解决”。
知识点
- 分组(group_by):把具有相同“指纹”的告警合并成一条通知,减少轰炸。
- 抑制(inhibit_rules):高优告警抑制低优告警,例如“节点宕机”抑制该节点上所有“进程无响应”。
- 静默(silence):人工临时屏蔽,适合变更窗口;YAML 里不直接体现,但需知道区别。
- 自动恢复:Prometheus 的告警表达式一旦不再满足,Alertmanager 会立即自动“resolved”,无需人工干预;性能测试脚本里务必把恢复时间(for)设得比压测持续时间短,否则会出现“压测结束 5 min 后还在告警”的尴尬。
- 国内常用通道:钉钉、企业微信、飞书;YAML 中 receiver 字段需写 webhook,并配合内部加签密钥。
答案
以下是一份可直接落地到性能测试环境的 alertmanager.yml 片段,演示“合并+抑制+自动恢复”完整闭环。
global:
resolve_timeout: 2m # 压测结束 2 min 内告警自动恢复
webhook_url: 'https://oapi.dingtalk.com/robot/send?access_token=xxx'
route:
group_by: ['alertname', 'cluster', 'service'] # 合并维度
group_wait: 15s # 第一批告警等 15 s 一起发
group_interval: 30s # 同一组内后续告警 30 s 合并一次
repeat_interval: 1h # 已发过的组 1 h 内不再重复
receiver: 'performance-webhook'
routes:
- receiver: 'performance-webhook'
match_re:
severity: 'critical|warning'
continue: true
inhibit_rules:
# 节点宕机抑制该节点所有服务告警
- source_match:
alertname: 'NodeDown'
severity: 'critical'
target_match_re:
service: '.+'
equal: ['instance'] # 只有 instance 相同才抑制
receivers:
- name: 'performance-webhook'
webhook_configs:
- url: 'https://oapi.dingtalk.com/robot/send?access_token=xxx'
send_resolved: true # 自动恢复也发“已解决”卡片
http_config:
headers:
Content-Type: 'application/json; charset=utf-8'
title: |-
{{ if .Alerts.Firing }}🔥 性能测试告警{{ else }}✅ 告警已恢复{{ end }}
text: |-
{{ range .Alerts }}
实例: {{ .Labels.instance }}
服务: {{ .Labels.service }}
值: {{ .Annotations.value }}
摘要: {{ .Annotations.summary }}
{{ end }}
使用要点
- Prometheus 端告警表达式必须带
for: 30s以内,保证压测停止后 2 min 内 Alertmanager 收到 resolved; - 压测脚本里最后一步“梯度降载”也要体现在指标里,否则 CPU 会瞬间掉到阈值以下,告警瞬间恢复,验证通过;
- 若需临时屏蔽某台压力机,用 amtool silence add instance=pressure-node-01 --duration=2h,无需改 YAML。
拓展思考
-
灰度发布场景:同一套 Alertmanager,如何只让“灰度集群”的告警发到飞书群,而“基线集群”仍走邮件?
答:在 route 下再建子路由,用 match: {cluster="gray"} 即可;同时把 repeat_interval 缩短到 5 min,方便快速观察灰度效果。 -
双活数据中心:北京、上海各一套 Prometheus,但只想要一份合并通知,怎么做?
答:把两地的 Alertmanager 做成集群(--cluster.peer),分组 key 里去掉 datacenter 标签,即可跨机房合并。 -
性能测试报告集成:如何把当天所有已恢复告警自动写进 Confluence 报告?
答:利用 Alertmanager 的 webhook 把 resolved 事件推给内部“告警归档服务”,服务按测试任务 ID 落库,报告模板里直接拉取即可,无需人工截图。