告警规则
定义基于用户可见症状而非内部噪声的告警规则,带清晰阈值和归属。
为什么
告警是契约:若它触发,一个人会被叫醒,且那人会放下手头事去调查。每个无用户影响就触发的告警破坏契约并训练工程师忽视 page,真实宕机就这样被漏 40 分钟。好告警规则基于症状(SLO 在燃烧)而非原因(CPU 高),因为症状直接映射用户痛苦而原因常是噪声。经验法则:若你无法为告警写 runbook,删掉它 — 无 runbook 的告警是每次浪费 20 分钟调查的 page。
何时使用
在你有 SLO 和 runbook 之后。绝不对你无法绑到用户影响或无法写 runbook 的指标告警。
如何做
1. 从 SLO 出发,非指标 - "错误预算燃烧率 > 2x over 1h" → page(症状:用户在失败) - 非"CPU > 80%"(原因:可能没事,可能坏事,无用户信号) 2. 先写 runbook 再写告警 - 若你无法为告警写"做 X,再 Y,再 Z",说明你不懂它 → 别告警 - Runbook 在稳定 URL;告警链接它 3. 阈值设在燃烧率上,非原始值 - 快燃:2x over 1h → page(抓急性宕机) - 慢燃:1x over 6h → 工单(抓慢性退化不 page) - 这给你快检测和长窗口覆盖而不双重 page 4. 每个告警打归属团队 + 严重性标签 - 路由到能修的团队,非通用队列 - 严重性来自影响:SEV1(收入降)→ page;SEV3(退化)→ 工单 5. 月度测量并修剪告警噪声 - "每值班班告警数" — 若 >5 page/班,你有疲劳 - 每个无行动就触发的告警:删掉或转工单
示例
# Prometheus 告警规则 — SLO 燃烧率(基于症状)
groups:
- name: checkout-slo
rules:
- alert: CheckoutSLOBurnRateFast
expr: |
(1 - (sum(rate(http_requests_total{service="checkout",status!~"5.."}[5m]))
/ sum(rate(http_requests_total{service="checkout"}[5m]))))
/ (1 - 0.999) > 2 # 燃烧 >2x 99.9% SLO
for: 2m
labels: { severity: page, team: payments, runbook: "https://rb/checkout-slo-burn" }
annotations:
summary: "checkout SLO 燃烧 >2x(用户在失败)"
dashboard: "https://grafana/d/checkout"
# 坏(基于原因、无用户信号、会疲劳):
# - alert: HighCPU
# expr: cpu_usage > 0.8
# Runbook:https://rb/checkout-slo-burn
# 1. 打开仪表盘链接
# 2. 按路由查错误分解 — 哪个端点在失败?
# 3. 若最近 30m 有新部署 → 回滚(runbook:rollback-checkout)
# 4. 否则 → 在服务图查下游依赖常见问题
- ⚠对 CPU/内存 >80% 告警 — 高利用率常是健康的(你物有所值);改对延迟/错误 SLO 燃烧告警。
- ⚠告警载荷无 runbook 链接 — 值班工程师花 15 分钟搞清告警含义才能调查。
- ⚠对瞬时值告警无 'for' 窗口 — 10 秒突增在凌晨 3 点 page 人处理自恢复打嗝;要求 'for: 2m' 最小。
- ⚠所有告警路由到通用 ops 队列 — 能修问题的团队从看不到,ops 队列变被忽视 page 的坟场。
最佳实践
- ✓对 SLO 燃烧率(症状)告警非资源利用率(原因)— 症状映射用户痛苦且少误报。
- ✓每个告警规则要求 runbook URL;代码审查拒绝无 runbook 的告警规则 — 无 runbook = 无告警。
- ✓用多窗口多燃烧率告警(快:2x/1h page,慢:1x/6h 工单)抓急性和慢性问题而不双重 page。
- ✓月度审查告警噪声:数每值班班 page 数,删或降级每个无用户可见行动就触发的告警。