多窗口燃烧率报警

燃烧率(Burn Rate)报警是 SLO(Service Level Objective)监控中最重要的报警方式。与传统阈值报警不同,燃烧率报警能够在保证 SLO 目标的前提下,提前发现系统健康度的衰退趋势。

燃烧率的核心概念

燃烧率描述的是系统「消耗」错误预算的速度。燃烧率为 1 意味着系统按预期速度消耗错误预算;燃烧率大于 1 意味着消耗速度超过预期,SLO 可能会被违反。

# 燃烧率计算公式
burn_rate = 实际错误率 / 允许错误率
           = error_rate / (1 - SLO)

# 示例:99.9% SLO,允许错误率为 0.1%
# 如果实际错误率为 1%,则燃烧率 = 1% / 0.1% = 10

燃烧率大于 1 并不立即意味着 SLO 被违反——如果只在短时间内超出允许错误率,平均下来仍然可能满足 SLO。但持续的高燃烧率会消耗错误预算,最终导致 SLO 违约。

多窗口燃烧率报警

多窗口燃烧率报警通过多个时间窗口同时监控燃烧率,既能快速发现短期异常,又不会因为瞬时抖动而产生误报。

窗口燃烧率阈值含义
1 小时14.41 小时内消耗了约 14.4 倍的预期错误预算(对应 6 小时内耗尽 30 天预算)
6 小时66 小时内持续高错误率(对应 1 天内耗尽 30 天预算)
3 天23 天内持续偏高错误率(对应 6 天内耗尽 30 天预算)
30 天130 天内燃烧率与预期一致(允许范围内)

窗口选择原理

30 天窗口对应的是长期的 SLO 目标达成情况。如果 30 天内燃烧率持续为 1,则 SLO 刚好被满足。如果燃烧率偶尔超过 1,但被其他时间段的低错误率抵消,整体仍然可以达标。

短期窗口(1 小时、6 小时)则用于快速发现异常。如果 1 小时内燃烧率达到 14.4,说明系统正在快速消耗错误预算,需要立即关注。

快速消耗场景举例

假设 99.9% SLO(每月允许 43.8 分钟错误时间):

  • 如果某小时错误率为 2%(远高于 0.1%),则该小时燃烧率 = 2% / 0.1% = 20
  • 该小时消耗的错误预算相当于 20 小时的允许预算
  • 如果这种状态持续 6 小时,将消耗约 5 天的错误预算

Prometheus 实现

# 计算燃烧率
# 30 天窗口(1x 燃烧率)
slo_error_total / 30d / (1 - $slo / 100) / 24h > 1

# 1 小时窗口(14.4x 燃烧率)
slo_error_total / 1h / (1 - $slo / 100) / 1h > 14.4

# 6 小时窗口(6x 燃烧率)
slo_error_total / 6h / (1 - $slo / 100) / 6h > 6

完整报警规则

groups:
  - name: slo-burn-rate
    rules:
      # 短期快速报警
      - alert: SLOHighBurnRate1h
        expr: |
          sum(error_rate{slo="api-latency"}) by (slo)
          / (1 - 0.999)
          > 14.4
        for: 1m
        labels:
          severity: critical
        annotations:
          summary: "API 延迟 SLO 燃烧率过高(1 小时窗口)"
          description: "1 小时内燃烧率达到 {{ $value }}x,{{ $value | printf \"%.1f\" }} 天内将耗尽错误预算"
      
      # 中期报警
      - alert: SLOHighBurnRate6h
        expr: |
          sum(error_rate{slo="api-latency"}) by (slo)
          / (1 - 0.999)
          > 6
        for: 5m
        labels:
          severity: warning

最佳实践

同时配置多个窗口:不要只依赖单一窗口,短期窗口快速发现,长期窗口确保无遗漏。

合理设置 for 子句:短期窗口的 for 时间应当足够长以避免抖动,长期窗口可以适当延长。

结合多指标:燃烧率报警可以应用于错误率、延迟、可用性等多种指标。

持续优化阈值:基于实际运行数据调整燃烧率阈值,找到噪音和灵敏度的平衡点。