17.7.3 Alertmanager架构与告警生命周期

Alertmanager 是告警处理中心,负责接收 Prometheus 推送的告警事件,对其进行去重、分组、路由、抑制与静默,并投递到通知渠道。其核心价值是“降噪与治理”,通过生命周期管理将告警从触发到解决完整闭环。

文章图片

告警生命周期关键阶段#

  1. 触发:规则表达式满足且持续超过 for 时间。
  2. 去重:同一标签集合生成同一指纹,避免重复告警。
  3. 分组:按 group_by 聚合为一条通知。
  4. 路由:根据标签与正则匹配不同接收器。
  5. 抑制/静默:上游抑制下游、维护期静默。
  6. 解决:收到 resolved 状态,更新内部状态并可通知恢复。

安装与启动示例(含高可用参数)#

# 以 Linux 二进制包安装为例(可替换版本)
wget https://github.com/prometheus/alertmanager/releases/download/v0.27.0/alertmanager-0.27.0.linux-amd64.tar.gz
tar -xzf alertmanager-0.27.0.linux-amd64.tar.gz
sudo mv alertmanager-0.27.0.linux-amd64/alertmanager /usr/local/bin/
sudo mv alertmanager-0.27.0.linux-amd64/amtool /usr/local/bin/

# 创建配置目录
sudo mkdir -p /etc/alertmanager /var/lib/alertmanager

/etc/alertmanager/alertmanager.yml 示例(含路由、分组、抑制、静默策略):

global:
  resolve_timeout: 5m

route:
  receiver: default-mail
  group_by: ['alertname','instance']
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 2h
  routes:
    - match:
        severity: critical
      receiver: oncall-webhook

receivers:
  - name: default-mail
    email_configs:
      - to: ops@example.com
        from: alert@example.com
        smarthost: smtp.example.com:25

  - name: oncall-webhook
    webhook_configs:
      - url: http://127.0.0.1:5001/alert

inhibit_rules:
  - source_match:
      alertname: HostDown
    target_match:
      alertname: ServiceDown
    equal: ['instance']

启动(集群模式示例,需多节点互联):

/usr/local/bin/alertmanager \
  --config.file=/etc/alertmanager/alertmanager.yml \
  --storage.path=/var/lib/alertmanager \
  --cluster.listen-address=0.0.0.0:9094 \
  --cluster.peer=10.0.0.11:9094 \
  --cluster.peer=10.0.0.12:9094

命令解释
- --cluster.listen-address:本节点对等通信端口
- --cluster.peer:加入的集群节点
- --storage.path:静默与通知状态持久化目录

触发与生命周期验证示例#

在 Prometheus 中加入告警规则(/etc/prometheus/rules.yml):

groups:
- name: demo
  rules:
  - alert: HostDown
    expr: up{job="node"} == 0
    for: 1m
    labels:
      severity: critical
    annotations:
      summary: "主机不可达 {{ $labels.instance }}"

触发测试(模拟 webhook 接收):

# 简易 webhook 服务器
python3 -m http.server 5001

# 发送测试告警到 Alertmanager
curl -XPOST http://127.0.0.1:9093/api/v1/alerts -H "Content-Type: application/json" -d '[
  {
    "labels": {"alertname": "HostDown", "instance": "10.0.0.1:9100", "severity":"critical"},
    "annotations": {"summary": "主机不可达 10.0.0.1"},
    "startsAt": "2024-01-01T00:00:00Z"
  }
]'

告警分组与抑制效果演示#

# 查看当前活跃告警(含分组)
amtool alert query --alertmanager.url=http://127.0.0.1:9093

# 创建静默(维护窗口)
amtool silence add --alertmanager.url=http://127.0.0.1:9093 \
  alertname=HostDown instance=10.0.0.1:9100 \
  --duration=2h --comment="维护窗口" --author="ops"

预期效果
- 相同 alertname+instance 只触发一次通知
- 在 HostDown 触发后,ServiceDown 自动抑制
- 静默期间不再发送通知

排错清单与命令#

# 1. 配置语法检查
amtool check-config /etc/alertmanager/alertmanager.yml

# 2. 查看集群状态
amtool cluster show --alertmanager.url=http://127.0.0.1:9093

# 3. 查看运行日志(systemd)
journalctl -u alertmanager -n 200 --no-pager

# 4. 确认 Prometheus 是否成功发送告警
curl http://127.0.0.1:9090/api/v1/alerts

常见问题:
- 无通知:检查路由匹配条件、receiver 配置、SMTP/Webhook连通性
- 重复通知:确认 group_byrepeat_interval 与标签集合一致
- 集群不一致:检查 --cluster.peer 与网络端口 9094 可达

练习#

  1. 新增一条 ServiceDown 告警规则,并验证被 HostDown 抑制。
  2. group_by['alertname','instance'] 改为 ['alertname'],观察分组差异。
  3. 创建一个 10 分钟的静默,验证告警不再投递并在到期后恢复。