Prometheus 完全指南 / 07 - 告警管理
07 - 告警管理
7.1 告警体系概述
Prometheus 的告警系统由两部分组成:
┌──────────────────┐ 告警触发 ┌───────────────────┐ 通知分发 ┌──────────────┐
│ Prometheus │ ─────────────► │ Alertmanager │ ─────────────► │ 通知渠道 │
│ Server │ │ │ │ │
│ (告警规则评估) │ │ · 分组 │ │ · Email │
│ │ │ · 路由 │ │ · Slack │
│ rule_files │ │ · 抑制 │ │ · 钉钉 │
│ │ │ · 静默 │ │ · PagerDuty │
│ │ │ · 去重 │ │ · Webhook │
└──────────────────┘ └───────────────────┘ └──────────────┘
告警生命周期
触发 ──► 发送 ──► 分组 ──► 路由 ──► 通知
│ │ │ │ │
▼ ▼ ▼ ▼ ▼
持续中 恢复 合并 匹配 推送
(firing) (resolved) (group) (route) (notify)
| 状态 | 说明 |
|---|---|
pending | 触发条件满足但未持续达到 for 时间 |
firing | 持续满足条件,正式发送告警 |
resolved | 条件不再满足,发送恢复通知 |
7.2 Alertmanager 安装与配置
安装
# 下载
ALERTMANAGER_VERSION="0.27.0"
wget https://github.com/prometheus/alertmanager/releases/download/v${ALERTMANAGER_VERSION}/alertmanager-${ALERTMANAGER_VERSION}.linux-amd64.tar.gz
# 解压安装
tar xvfz alertmanager-${ALERTMANAGER_VERSION}.linux-amd64.tar.gz
sudo cp alertmanager-${ALERTMANAGER_VERSION}.linux-amd64/alertmanager /usr/local/bin/
sudo cp alertmanager-${ALERTMANAGER_VERSION}.linux-amd64/amtool /usr/local/bin/
# Docker
docker run -d \
--name=alertmanager \
-p 9093:9093 \
-v $(pwd)/alertmanager.yml:/etc/alertmanager/alertmanager.yml \
prom/alertmanager:v0.27.0
Systemd 服务
# /etc/systemd/system/alertmanager.service
[Unit]
Description=Alertmanager
After=network.target
[Service]
Type=simple
User=prometheus
ExecStart=/usr/local/bin/alertmanager \
--config.file=/etc/alertmanager/alertmanager.yml \
--storage.path=/var/lib/alertmanager/ \
--web.listen-address=0.0.0.0:9093 \
--cluster.listen-address=0.0.0.0:9094
Restart=always
[Install]
WantedBy=multi-user.target
配置文件
# /etc/alertmanager/alertmanager.yml
global:
resolve_timeout: 5m
smtp_from: '[email protected]'
smtp_smarthost: 'smtp.example.com:587'
smtp_auth_username: '[email protected]'
smtp_auth_password: 'password'
smtp_require_tls: true
slack_api_url: 'https://hooks.slack.com/services/xxx/yyy/zzz'
# 模板
templates:
- '/etc/alertmanager/templates/*.tmpl'
# 路由
route:
receiver: 'default-receiver'
group_by: ['alertname', 'cluster', 'service']
group_wait: 30s
group_interval: 5m
repeat_interval: 4h
routes:
- match:
severity: 'critical'
receiver: 'critical-receiver'
group_wait: 10s
- match:
severity: 'warning'
receiver: 'warning-receiver'
- match_re:
service: '^(api|web)$'
receiver: 'service-receiver'
- match:
severity: 'info'
receiver: 'info-receiver'
repeat_interval: 24h
# 抑制
inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['alertname', 'cluster', 'service']
# 接收器
receivers:
- name: 'default-receiver'
email_configs:
- to: '[email protected]'
- name: 'critical-receiver'
pagerduty_configs:
- routing_key: 'xxx'
email_configs:
- to: '[email protected]'
- name: 'warning-receiver'
slack_configs:
- channel: '#alerts-warning'
title: '{{ template "slack.title" . }}'
text: '{{ template "slack.text" . }}'
- name: 'info-receiver'
webhook_configs:
- url: 'http://bot:8080/alert'
- name: 'service-receiver'
webhook_configs:
- url: 'http://webhook:9095/alert'
7.3 路由(Route)
路由决定告警发送到哪个接收器。
路由匹配规则
┌──────────────────────┐
│ Route (根) │
│ receiver: default │
│ group_by: [...] │
└──────────┬────────────┘
│
┌───────────────┼───────────────┐
▼ ▼ ▼
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ severity= │ │ severity= │ │ service= │
│ critical │ │ warning │ │ api|web │
│ → critical │ │ → warning │ │ → service │
│ receiver │ │ receiver │ │ receiver │
└─────────────┘ └─────────────┘ └─────────────┘
路由字段说明
| 字段 | 说明 |
|---|---|
match | 精确标签匹配 |
match_re | 正则标签匹配 |
receiver | 接收器名称 |
group_by | 分组标签 |
group_wait | 初始等待时间(等待同组更多告警) |
group_interval | 同组告警发送间隔 |
repeat_interval | 重复发送间隔 |
continue | 是否继续匹配后续路由 |
分组机制
告警流:
T=0s: alertA(node1) ──┐
T=5s: alertB(node1) ──┤ group_wait: 30s
T=15s: alertC(node1) ──┘
T=30s: 发送所有 node1 的告警(合并为一封通知)
T=5m: alertD(node1) ──► group_interval: 5m
T=10m: alertD 仍然 firing ──► repeat_interval: 4h
T=4h10m: 重复发送 alertD
7.4 抑制(Inhibition)
抑制规则允许在某些告警活跃时自动抑制其他相关告警。
inhibit_rules:
# 当 critical 级别告警触发时,抑制同名的 warning 告警
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['alertname', 'cluster', 'service']
# 当节点宕机时,抑制该节点的所有其他告警
- source_match:
alertname: 'InstanceDown'
target_match_re:
alertname: '.+'
equal: ['instance']
抑制示例:
场景:节点 node1 宕机
触发的告警:
1. InstanceDown(node1) [critical] ← 源
2. HighCPU(node1) [warning] ← 被抑制
3. HighMemory(node1) [warning] ← 被抑制
4. DiskSpaceLow(node1) [warning] ← 被抑制
结果:只发送 InstanceDown 告警,避免告警风暴
7.5 静默(Silence)
静默用于临时屏蔽特定告警(如维护窗口期间)。
通过 Web UI 创建
- 访问
http://localhost:9093/#/silences - 点击 “New Silence”
- 设置匹配条件和有效期
- 创建
通过 amtool 创建
# 创建静默(2小时)
amtool silence add alertname="InstanceDown" instance="node1:9090" \
--duration="2h" \
--comment="Planned maintenance"
# 创建静默(特定时间范围)
amtool silence add alertname="HighCPU" \
--start="2024-01-01T22:00:00Z" \
--end="2024-01-02T06:00:00Z" \
--comment="Scheduled maintenance window"
# 查看所有静默
amtool silence query
# 删除静默
amtool silence expire <silence-id>
# 查询当前活跃告警
amtool alert query
静默 vs 抑制
| 特性 | 静默(Silence) | 抑制(Inhibition) |
|---|---|---|
| 触发方式 | 手动创建 | 自动规则 |
| 持续时间 | 指定时间段 | 源告警活跃期间 |
| 适用场景 | 计划维护、已知问题 | 告警级联、根因分析 |
| 配置方式 | Web UI / amtool | alertmanager.yml |
7.6 接收器(Receiver)
邮件通知
receivers:
- name: 'email'
email_configs:
- to: '[email protected]'
from: '[email protected]'
smarthost: 'smtp.example.com:587'
auth_username: 'user'
auth_password: 'pass'
headers:
subject: '[{{ .Status | toUpper }}] {{ .CommonLabels.alertname }}'
html: '{{ template "email.html" . }}'
send_resolved: true
Slack 通知
receivers:
- name: 'slack'
slack_configs:
- channel: '#alerts'
title: '{{ .CommonLabels.alertname }}'
text: >-
{{ range .Alerts }}
*Alert:* {{ .Labels.alertname }}
*Severity:* {{ .Labels.severity }}
*Description:* {{ .Annotations.description }}
*Instance:* {{ .Labels.instance }}
{{ end }}
send_resolved: true
钉钉(Webhook)
receivers:
- name: 'dingtalk'
webhook_configs:
- url: 'http://dingtalk-webhook:8060/dingtalk/ops/send'
send_resolved: true
PagerDuty
receivers:
- name: 'pagerduty'
pagerduty_configs:
- routing_key: '<integration-key>'
severity: '{{ .GroupLabels.severity }}'
description: '{{ .CommonAnnotations.summary }}'
7.7 高可用部署
Alertmanager 集群
┌──────────────────────────────────────────────────┐
│ Prometheus (发送告警到所有 Alertmanager 实例) │
│ │
│ alerting: │
│ alertmanagers: │
│ - static_configs: │
│ - targets: │
│ - alertmanager1:9093 │
│ - alertmanager2:9093 │
│ - alertmanager3:9093 │
└──────────────────────────────────────────────────┘
│ │ │
▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────┐
│ Alert │ │ Alert │ │ Alert │
│ Manager 1│◄──│ Manager 2│◄──│ Manager 3│
│ │──►│ │──►│ │
└──────────┘ └──────────┘ └──────────┘
Gossip Protocol(去重保证)
# 启动集群节点
alertmanager \
--config.file=/etc/alertmanager/alertmanager.yml \
--cluster.peer=alertmanager1:9094 \
--cluster.peer=alertmanager2:9094 \
--cluster.listen-address=0.0.0.0:9094
7.8 本章小结
| 组件 | 功能 | 关键配置 |
|---|---|---|
| 路由 | 告警分发 | match/match_re, receiver |
| 分组 | 合并通知 | group_by, group_wait |
| 抑制 | 减少噪音 | inhibit_rules |
| 静默 | 临时屏蔽 | Silence UI / amtool |
| 接收器 | 通知渠道 | email/slack/webhook/pagerduty |
扩展阅读
上一章:06 - PromQL 进阶 下一章:08 - 告警规则编写