17.1.6 告警链路:Alertmanager与通知集成

告警链路以 Prometheus 规则评估为起点,达到 for 条件后触发告警并发送到 Alertmanager,后者完成去重、分组、抑制、静默与路由,最终投递到邮件、Webhook、IM 等渠道。目标是降噪、分流、闭环。

原理草图(告警链路):

文章图片

核心机制要点:
- 去重:相同标签集合在窗口内只通知一次。
- 分组:按 service/env/severity 等标签聚合。
- 抑制:高优先级抑制低优先级关联告警。
- 静默:维护窗口临时屏蔽。

安装与启动示例(Alertmanager):

# 1) 下载与安装
wget https://github.com/prometheus/alertmanager/releases/download/v0.26.0/alertmanager-0.26.0.linux-amd64.tar.gz
tar -xf alertmanager-0.26.0.linux-amd64.tar.gz
sudo mv alertmanager-0.26.0.linux-amd64/alertmanager /usr/local/bin/
sudo mv alertmanager-0.26.0.linux-amd64/amtool /usr/local/bin/

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

# 3) 基本运行(前台)
alertmanager --config.file=/etc/alertmanager/alertmanager.yml --storage.path=/var/lib/alertmanager
# 预期:监听 9093 端口

Prometheus 侧对接 Alertmanager(prometheus.yml):

# /etc/prometheus/prometheus.yml
alerting:
  alertmanagers:
    - static_configs:
        - targets: ["127.0.0.1:9093"]
rule_files:
  - /etc/prometheus/rules/*.yml

告警规则示例(CPU 使用率 > 80% 持续 5 分钟):

# /etc/prometheus/rules/cpu.yml
groups:
- name: host-cpu
  rules:
  - alert: HighCPUUsage
    expr: 100 - avg by(instance)(rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100 > 80
    for: 5m
    labels:
      severity: critical
      team: ops
      service: node
    annotations:
      summary: "CPU 高使用率"
      description: "实例 {{ $labels.instance }} CPU 使用率超过 80% (5m)"
      runbook: "https://wiki.example.com/runbooks/cpu"

Alertmanager 路由与通知示例(邮件 + Webhook):

# /etc/alertmanager/alertmanager.yml
global:
  resolve_timeout: 5m
  smtp_smarthost: "smtp.example.com:25"
  smtp_from: "alert@example.com"
  smtp_auth_username: "alert@example.com"
  smtp_auth_password: "password"

route:
  group_by: ['service','env','severity']
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 2h
  receiver: default-email
  routes:
  - matchers:
    - severity="critical"
    receiver: webhook-oncall
  - matchers:
    - severity="warning"
    receiver: default-email

receivers:
- name: default-email
  email_configs:
  - to: "ops@example.com"
    send_resolved: true
- name: webhook-oncall
  webhook_configs:
  - url: "http://127.0.0.1:9099/alerts"
    send_resolved: true

通知模板示例(邮件标题与正文):

# /etc/alertmanager/alertmanager.yml 片段
templates:
- '/etc/alertmanager/templates/*.tmpl'
# /etc/alertmanager/templates/mail.tmpl
{{ define "email.subject" }}[{{ .Status | toUpper }}] {{ .CommonLabels.alertname }}{{ end }}
{{ define "email.html" }}
告警: {{ .CommonLabels.alertname }}<br/>
级别: {{ .CommonLabels.severity }}<br/>
实例: {{ .CommonLabels.instance }}<br/>
摘要: {{ .CommonAnnotations.summary }}<br/>
详情: {{ .CommonAnnotations.description }}<br/>
Runbook: {{ .CommonAnnotations.runbook }}<br/>
{{ end }}

Webhook 接收端简单示例(本地测试):

# 使用 nc 模拟接收端
nc -l 9099
# 触发告警后可看到 JSON 输出

关键命令与解释:

# 验证 Prometheus 规则文件语法
promtool check rules /etc/prometheus/rules/cpu.yml
# 预期:SUCCESS

# 验证 Alertmanager 配置
amtool check-config /etc/alertmanager/alertmanager.yml
# 预期:SUCCESS

# 发送测试告警到 Alertmanager
amtool alert add TestAlert severity=critical service=test env=prod \
  --alertmanager.url=http://127.0.0.1:9093
# 预期:Alertmanager UI 中出现 TestAlert

排错清单:
1. Prometheus 无法推送告警
- 检查 alerting.alertmanagers.targets 是否正确,端口 9093 是否可达
- curl http://127.0.0.1:9093/-/ready 验证健康状态
2. 告警未发送通知
- amtool status 查看 Alertmanager 状态
- 检查路由匹配是否命中(标签是否一致)
3. Webhook 无响应
- curl -v http://127.0.0.1:9099/alerts 确认服务可达
- 查看 Alertmanager 日志中的 notify 错误

练习:
1. 新增一个 severity=warning 的磁盘空间告警,并设置 for: 10m
2. 为 team=dev 追加一条路由,发送到独立邮箱。
3. 通过 amtool 添加静默,模拟维护窗口并验证不再通知。