2. SLO告警体系:告警规则设计原则、燃烧速率告警、多窗口多燃烧速率策略
SLO告警体系的核心目标是在用户体验受损之前,提前发现服务健康度的劣化趋势。与传统的阈值告警不同,SLO告警关注的是错误预算的消耗速率,而非瞬时指标。本章将深入剖析告警规则的设计原则、燃烧速率告警的数学模型,以及多窗口多燃烧速率策略的工程实践。
2.1 告警规则设计原则
设计SLO告警规则时,必须遵循以下四项核心原则,以确保告警的准确性、及时性和可操作性:
| 原则 | 说明 | 反例 |
|---|---|---|
| 可操作性 | 每次告警都必须对应一个明确的故障恢复流程或排查动作,避免“噪音告警”。 | “延迟P99超过100ms”但无对应Runbook。 |
| 及时性 | 告警必须在错误预算耗尽之前触发,留出足够的MTTR窗口。 | 错误预算已耗尽才触发告警。 |
| 准确性 | 告警应基于燃烧速率,而非瞬时毛刺,减少误报和漏报。 | 单次请求超时即触发P0告警。 |
| 可预测性 | 告警阈值应基于历史数据和SLO目标计算得出,而非人工拍脑袋。 | 随意设置“错误率>5%”作为固定阈值。 |
2.2 燃烧速率告警(Burn Rate Alerting)
燃烧速率(Burn Rate)衡量的是错误预算消耗的速度。它定义为:实际错误率 / 目标错误率。当燃烧速率 > 1 时,意味着错误预算正在以快于预期的速度被消耗。
例如,一个SLO为99.9%(目标错误率0.1%)的服务,如果当前窗口的实际错误率为1%,则燃烧速率为 1% / 0.1% = 10。这意味着错误预算的消耗速度是预期的10倍。
燃烧速率告警的核心公式:
燃烧速率 = (总事件数 - 成功事件数) / 总事件数 / (1 - SLO目标)
通过燃烧速率,我们可以将告警阈值与SLO目标直接挂钩,实现“SLO即告警”。
2.3 多窗口多燃烧速率策略(Multi-Window, Multi-Burn-Rate)
单一窗口的燃烧速率告警存在缺陷:短窗口容易产生误报(毛刺),长窗口则告警延迟。Google SRE实践提出了多窗口多燃烧速率策略,通过组合不同长度的窗口和不同的燃烧速率阈值,同时解决误报和延迟问题。
该策略的核心思想是:使用短窗口检测快速故障,使用长窗口确认持续劣化。
典型的策略配置如下表所示:
| 告警级别 | 燃烧速率阈值 | 短窗口 | 长窗口 | 预期响应时间 |
|---|---|---|---|---|
| P0(严重) | 14.4 | 5分钟 | 1小时 | < 15分钟 |
| P1(高) | 6.0 | 10分钟 | 6小时 | < 1小时 |
| P2(中) | 1.5 | 30分钟 | 24小时 | < 8小时 |
只有当短窗口和长窗口的燃烧速率同时超过阈值时,告警才会被触发。这有效过滤了短时毛刺,同时确保了对持续故障的快速响应。
2.4 策略配置与代码示例
以下是一个基于Prometheus的告警规则配置示例,实现了P0级别的多窗口多燃烧速率告警:
groups:
- name: slo_burn_rate_alerts
rules:
# P0 告警:燃烧速率 > 14.4,短窗口5分钟,长窗口1小时
- alert: HighBurnRate_P0
expr: |
(
sum(rate(http_requests_total{status=~"5.."}[5m]))
/
sum(rate(http_requests_total[5m]))
) / (1 - 0.999) > 14.4
and
(
sum(rate(http_requests_total{status=~"5.."}[1h]))
/
sum(rate(http_requests_total[1h]))
) / (1 - 0.999) > 14.4
for: 2m
labels:
severity: critical
slo: "99.9"
annotations:
summary: "SLO 99.9% 错误预算消耗过快 (燃烧速率 > 14.4)"
description: "短窗口(5m)和长窗口(1h)的燃烧速率均超过14.4,请立即排查。"
expr 中的 and 操作符确保了双窗口条件同时满足;for: 2m 增加了额外的防抖时间,进一步减少误报。
2.5 燃烧速率与错误预算消耗时间的关系
理解燃烧速率与错误预算耗尽时间的关系,有助于我们合理设置告警级别。以下表格展示了不同燃烧速率下,错误预算耗尽所需的时间(假设SLO为99.9%,窗口为30天):
| 燃烧速率 | 错误预算耗尽时间 | 典型场景 |
|---|---|---|
| 1 | 30天 | 正常消耗 |
| 6 | 5天 | 持续劣化,需关注 |
| 14.4 | 2天 | 严重故障,需立即响应 |
| 100 | 约7小时 | 灾难性故障 |
通过这张表,我们可以直观地看到:燃烧速率越高,留给SRE团队的响应时间越短。因此,P0级别的告警通常对应燃烧速率14.4以上,确保在2天内完成故障恢复。
2.6 策略调优与注意事项
- 窗口长度选择: 短窗口建议设置为1-5分钟,用于检测突发故障;长窗口建议设置为1-24小时,用于确认趋势。窗口长度应与SLO周期(通常为30天)成比例。
- 燃烧速率阈值计算: 阈值 = (1 - SLO目标) / (1 - 期望的剩余错误预算比例)。例如,希望在错误预算剩余50%时触发告警,则阈值 = 1 / 0.5 = 2。
- 告警疲劳: 如果P0告警频繁触发但实际影响不大,应检查燃烧速率阈值是否过低,或窗口长度是否过短。
- 自动化联动: 告警触发后,应自动关联对应的Runbook,并启动自动化恢复流程(如自动扩容、回滚、切换流量等)。