17.7.3 Alertmanager架构与告警生命周期
Alertmanager 是告警处理中心,负责接收 Prometheus 推送的告警事件,对其进行去重、分组、路由、抑制与静默,并投递到通知渠道。其核心价值是“降噪与治理”,通过生命周期管理将告警从触发到解决完整闭环。
告警生命周期关键阶段#
- 触发:规则表达式满足且持续超过
for时间。 - 去重:同一标签集合生成同一指纹,避免重复告警。
- 分组:按
group_by聚合为一条通知。 - 路由:根据标签与正则匹配不同接收器。
- 抑制/静默:上游抑制下游、维护期静默。
- 解决:收到
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_by、repeat_interval 与标签集合一致
- 集群不一致:检查 --cluster.peer 与网络端口 9094 可达
练习#
- 新增一条
ServiceDown告警规则,并验证被HostDown抑制。 - 将
group_by从['alertname','instance']改为['alertname'],观察分组差异。 - 创建一个 10 分钟的静默,验证告警不再投递并在到期后恢复。