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 添加静默,模拟维护窗口并验证不再通知。