4. 告警体系搭建:告警分级、源接入、路由与去重
告警体系是自愈剧本的“神经末梢”。如果告警不准、延迟高、重复轰炸,后续的降级、熔断、自愈动作都会失去依据。本章聚焦四个核心环节:告警分级(P0/P1/P2)、告警源接入(Prometheus / Grafana)、告警路由与去重降噪,目标是让每一条告警在正确的时间到达正确的人,且只到达一次。
4.1 告警分级:P0 / P1 / P2 定义与响应目标
告警分级不是简单的“严重/警告/信息”,而是与业务影响面和响应 SLA 强绑定的等级制度。下表给出生产环境通用的分级标准:
| 等级 | 定义 | 典型场景 | 响应 SLA | 通知方式 |
|---|---|---|---|---|
| P0 | 核心业务完全不可用,或资损、安全事件 | 支付接口 5xx 率 > 50%、数据库主库宕机 | 5 分钟响应,15 分钟恢复 | 电话 + 短信 + 即时消息 |
| P1 | 核心功能严重受损,但非完全不可用 | 订单延迟 > 30s、缓存集群部分节点故障 | 15 分钟响应,1 小时恢复 | 短信 + 即时消息 |
| P2 | 非核心功能异常,或核心功能轻微劣化 | 后台报表延迟、非关键 API 延迟升高 | 2 小时响应,24 小时恢复 | 即时消息(可聚合) |
分级原则:P0 必须触发电话,P1 必须触发短信,P2 只发即时消息。避免将 P2 告警升级到电话通道,否则值班人员会因“狼来了”效应忽略真正的高危告警。
4.2 告警源接入:Prometheus + Grafana 双通道
现代可观测性栈中,Prometheus 负责指标采集与告警规则评估,Grafana 负责可视化与告警事件转发。两者可以独立作为告警源,也可以串联使用。
4.2.1 Prometheus Alertmanager 原生接入
Prometheus 通过 alerting_rules.yml 定义告警规则,由 Alertmanager 统一处理路由、分组、抑制和发送。以下是一个典型的 P0 告警规则片段:
groups:
- name: p0_critical
rules:
- alert: Payment5xxRateHigh
expr: |
sum(rate(http_requests_total{status=~"5..", endpoint="payment"}[1m]))
/ sum(rate(http_requests_total{endpoint="payment"}[1m]))
> 0.5
for: 2m
labels:
severity: p0
team: payment
annotations:
summary: "支付接口 5xx 率超过 50%"
description: "当前 5xx 率 {{ $value | humanizePercentage }},持续 2 分钟以上"
4.2.2 Grafana 告警引擎接入
Grafana 8.0+ 内置统一告警引擎,支持从 Prometheus、Loki、Tempo 等多数据源直接生成告警。Grafana 告警的优势在于:
- 可视化规则管理:直接在 Dashboard 面板上创建告警,所见即所得。
- 多维度标签:自动继承查询中的 label,减少手动维护。
- 静默与抑制:支持基于时间窗口的静默规则。
接入策略:建议将 Prometheus 作为“指标级告警”的第一道防线,Grafana 作为“业务级告警”和“日志/链路告警”的补充。两者通过统一的 Webhook 接收器汇聚到告警路由层。
4.3 告警路由:基于标签的智能分发
告警路由的核心是标签匹配。Alertmanager 的 route 配置块支持树形路由结构,根据 severity、team、region 等标签将告警分发到不同的接收器(Receiver)。
route:
receiver: 'default'
group_wait: 30s
group_interval: 5m
repeat_interval: 4h
routes:
- match:
severity: p0
receiver: 'p0-oncall'
repeat_interval: 5m
- match:
severity: p1
receiver: 'p1-im'
repeat_interval: 30m
- match:
severity: p2
receiver: 'p2-slack'
group_wait: 2m
group_interval: 15m
路由决策树如下图所示:
4.4 告警去重:从源头到聚合的降噪策略
重复告警是值班人员的头号痛点。去重需要从三个层面协同:
- 规则层去重:避免多条规则覆盖同一指标。例如,不要同时配置“CPU > 90%”和“CPU > 95%”两条独立告警,应使用单一规则配合不同 severity。
- Alertmanager 分组去重:通过
group_by将相同标签的告警合并为一条通知。例如,所有severity=p2, team=infra的告警每 15 分钟聚合一次。 - 接收端去重:在即时消息机器人(如 PagerDuty、Opsgenie)侧启用外部去重,防止网络抖动导致重复投递。
避坑提示:不要将
repeat_interval 设置过短(如 < 5 分钟),否则故障持续期间会频繁轰炸。P0 建议 5 分钟重复一次,P1 建议 30 分钟,P2 建议 4 小时以上。
4.5 告警去重与聚合流程
下图展示了一条告警从产生到最终通知的完整去重与聚合链路:
4.6 实战检查清单
- 分级是否覆盖所有业务? 每个核心服务至少有一条 P0 规则,每条规则必须有明确的
severity标签。 - 路由是否闭环? 所有告警必须匹配到至少一个 receiver,避免落入默认接收器导致无人响应。
- 去重是否生效? 在故障演练中故意触发多条同类告警,验证最终通知数量是否被压缩到 1 条。
- 静默是否可管理? 维护窗口期间应通过 Alertmanager 的 silence API 或 Grafana 静默规则提前抑制,避免误报。
核心指标:告警去重率 = (原始告警数 - 最终通知数) / 原始告警数。生产环境目标去重率应 > 90%,否则值班人员会被无效告警淹没。