2. SLO告警体系:告警规则设计原则、燃烧速率告警、多窗口多燃烧速率策略

SLO告警体系的核心目标是在用户体验受损之前,提前发现服务健康度的劣化趋势。与传统的阈值告警不同,SLO告警关注的是错误预算的消耗速率,而非瞬时指标。本章将深入剖析告警规则的设计原则、燃烧速率告警的数学模型,以及多窗口多燃烧速率策略的工程实践。

2.1 告警规则设计原则

设计SLO告警规则时,必须遵循以下四项核心原则,以确保告警的准确性、及时性和可操作性:

原则 说明 反例
可操作性 每次告警都必须对应一个明确的故障恢复流程或排查动作,避免“噪音告警”。 “延迟P99超过100ms”但无对应Runbook。
及时性 告警必须在错误预算耗尽之前触发,留出足够的MTTR窗口。 错误预算已耗尽才触发告警。
准确性 告警应基于燃烧速率,而非瞬时毛刺,减少误报和漏报。 单次请求超时即触发P0告警。
可预测性 告警阈值应基于历史数据和SLO目标计算得出,而非人工拍脑袋。 随意设置“错误率>5%”作为固定阈值。
最佳实践: 告警规则应像代码一样进行版本管理(GitOps),每次变更都需要经过Code Review,并附带明确的预期行为描述。

2.2 燃烧速率告警(Burn Rate Alerting)

燃烧速率(Burn Rate)衡量的是错误预算消耗的速度。它定义为:实际错误率 / 目标错误率。当燃烧速率 > 1 时,意味着错误预算正在以快于预期的速度被消耗。

例如,一个SLO为99.9%(目标错误率0.1%)的服务,如果当前窗口的实际错误率为1%,则燃烧速率为 1% / 0.1% = 10。这意味着错误预算的消耗速度是预期的10倍。

燃烧速率告警的核心公式:

燃烧速率 = (总事件数 - 成功事件数) / 总事件数 / (1 - SLO目标)

通过燃烧速率,我们可以将告警阈值与SLO目标直接挂钩,实现“SLO即告警”。

关键指标: 燃烧速率 = 1 表示错误预算消耗速度与预期一致;燃烧速率 > 1 表示消耗过快,需要触发告警。

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小时

只有当短窗口和长窗口的燃烧速率同时超过阈值时,告警才会被触发。这有效过滤了短时毛刺,同时确保了对持续故障的快速响应。

避坑指南: 不要将燃烧速率阈值设置得过高或过低。过高的阈值会导致漏报,过低的阈值则会产生大量噪音。建议基于历史故障数据,通过回测来校准阈值。
多窗口多燃烧速率告警触发逻辑 多窗口多燃烧速率告警触发逻辑 短窗口(5分钟) 燃烧速率 > 14.4 长窗口(1小时) 燃烧速率 > 14.4 AND 触发 P0 告警 执行 Runbook 只有当短窗口和长窗口的燃烧速率同时超过阈值时,告警才会被触发

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天内完成故障恢复。

燃烧速率与错误预算消耗时间关系 燃烧速率 vs 错误预算耗尽时间(SLO 99.9%) 1 6 14.4 100 燃烧速率 30天 5天 2天 7小时 燃烧速率越高,响应时间越短

2.6 策略调优与注意事项

  • 窗口长度选择: 短窗口建议设置为1-5分钟,用于检测突发故障;长窗口建议设置为1-24小时,用于确认趋势。窗口长度应与SLO周期(通常为30天)成比例。
  • 燃烧速率阈值计算: 阈值 = (1 - SLO目标) / (1 - 期望的剩余错误预算比例)。例如,希望在错误预算剩余50%时触发告警,则阈值 = 1 / 0.5 = 2。
  • 告警疲劳: 如果P0告警频繁触发但实际影响不大,应检查燃烧速率阈值是否过低,或窗口长度是否过短。
  • 自动化联动: 告警触发后,应自动关联对应的Runbook,并启动自动化恢复流程(如自动扩容、回滚、切换流量等)。
进阶技巧: 对于关键服务,可以设置“燃烧速率预测告警”,利用时间序列预测模型(如Prophet)提前预判错误预算的消耗趋势,实现更早的告警。