Alertmanager 告警合并、抑制与自动恢复策略,给出 YAML 示例

解读

性能测试工程师在压测或稳定性演练过程中,会触发大量同类告警(如接口超时、CPU 飙高)。如果每条告警都独立发送,值班手机会被“轰炸”,真正关键的信号反而被淹没。面试官通过此题考察三件事:

  1. 是否理解 Alertmanager 的三大核心机制:分组(group)、抑制(inhibit)、静默(silence);
  2. 能否把“性能测试场景”翻译成具体的匹配规则(label、regex、duration);
  3. 是否具备“告警可自动恢复”的意识——压测停止后,告警应自动解除,避免人工登平台点“已解决”。

知识点

  1. 分组(group_by):把具有相同“指纹”的告警合并成一条通知,减少轰炸。
  2. 抑制(inhibit_rules):高优告警抑制低优告警,例如“节点宕机”抑制该节点上所有“进程无响应”。
  3. 静默(silence):人工临时屏蔽,适合变更窗口;YAML 里不直接体现,但需知道区别。
  4. 自动恢复:Prometheus 的告警表达式一旦不再满足,Alertmanager 会立即自动“resolved”,无需人工干预;性能测试脚本里务必把恢复时间(for)设得比压测持续时间短,否则会出现“压测结束 5 min 后还在告警”的尴尬。
  5. 国内常用通道:钉钉、企业微信、飞书;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 }}

使用要点

  1. Prometheus 端告警表达式必须带 for: 30s 以内,保证压测停止后 2 min 内 Alertmanager 收到 resolved;
  2. 压测脚本里最后一步“梯度降载”也要体现在指标里,否则 CPU 会瞬间掉到阈值以下,告警瞬间恢复,验证通过;
  3. 若需临时屏蔽某台压力机,用 amtool silence add instance=pressure-node-01 --duration=2h,无需改 YAML。

拓展思考

  1. 灰度发布场景:同一套 Alertmanager,如何只让“灰度集群”的告警发到飞书群,而“基线集群”仍走邮件?
    答:在 route 下再建子路由,用 match: {cluster="gray"} 即可;同时把 repeat_interval 缩短到 5 min,方便快速观察灰度效果。

  2. 双活数据中心:北京、上海各一套 Prometheus,但只想要一份合并通知,怎么做?
    答:把两地的 Alertmanager 做成集群(--cluster.peer),分组 key 里去掉 datacenter 标签,即可跨机房合并。

  3. 性能测试报告集成:如何把当天所有已恢复告警自动写进 Confluence 报告?
    答:利用 Alertmanager 的 webhook 把 resolved 事件推给内部“告警归档服务”,服务按测试任务 ID 落库,报告模板里直接拉取即可,无需人工截图。