Skip to content
返回运维与 SRE

错误预算

把错误预算作共享记分板,治理部署速度和可靠性投资。

为什么

错误预算是结束产品(发布更快)与 SRE(更可靠)战争的共享货币。产品要速度消耗预算;SRE 要可靠性保留它。无预算这是政治斗争谁资本多谁赢。有预算则是记分板:未超则产品自由发布;超了则部署冻结团队投资可靠性直到预算恢复。这把慢性组织冲突变自治理系统由数据决定非屋里最大声的人。采用错误预算的团队报 2-3 倍部署速度因为安全余量被量化且可用。

何时使用

定义 SLO 后立即。预算 = (1 - SLO) × 窗口;持续跟踪并向全队展示。

如何做

1. 从 SLO 算预算
   - SLO 99.9% over 28d → 预算 = 0.1% × 40320m = 40.3 分钟
   - 这是窗口内允许总宕机

2. 持续跟踪预算消耗
   - remaining = budget - downtime_so_far_this_window
   - burn_rate = (downtime_last_1h) / (budget / 28d / 24h)  # 消耗多快
   - 展示在全队可见仪表盘,每 5m 更新

3. 定义消耗预算的策略
   - burn < 0.5x → "绿":自由部署、允许风险变更、实验
   - burn 0.5-1x → "黄":正常部署、无实验
   - burn > 1x → "红":冻结功能部署、仅可靠性修复、page SRE

4. 使预算违规可见且自动
   - burn > 2x → 自动建工单"部署冻结直到 burn < 1"
   - 预算耗尽 → 阻塞部署管道(强制,非仅警告)

5. 窗口结束重置并学习
   - 28d:未超预算完成?→ 放松 SLO 或下窗口发布更多
   - 超了?→ 收紧流程、投资可靠性、保持冻结更久

示例

# 错误预算仪表盘(Prometheus + Grafana)
# SLO:99.9% over 28d → 预算 = 40.3m
budget_total_minutes = 40.3
downtime_this_window = sum_over_time( (1 - sli) [28d] ) * 28d_in_minutes
remaining = budget_total_minutes - downtime_this_window
burn_rate = (1 - sli_over_1h) / (1 - 0.999)  # >1 = 比允许更快消耗

# Grafana stat 面板:
#   "预算剩余:12.4m / 40.3m"  (色:绿 >50%、黄 10-50%、红 <10%)
#   "燃烧率 (1h):2.3x"  (色:红 if >2)
#   "燃烧率 (6h):0.8x"  (色:黄 if >1)

# 部署门(CI 检查):
if burn_rate_1h > 2:
    fail("错误预算燃烧 >2x — 部署冻结直到 burn < 1x")
# 这使预算硬门,非产品可覆盖的建议

常见问题

  • ⚠预算存在但不强制 — 超预算仍部署,数字是装饰且产品/SRE 战继续。
  • ⚠仅 SRE 看预算 — 产品团队不知在消耗,无法自治理;展示在人人可见仪表盘。
  • ⚠预算窗口太短(1 天)— 噪声主导且团队不停翻冻结和发布;28 天平滑此。
  • ⚠无预算烧完怎么办的策略 — 数字被跟踪但无变化,只是指标非治理工具。

最佳实践

  • ✓把预算作 CI 部署门强制,非仪表盘建议 — 燃烧 >2x 时管道阻塞;这使策略真实。
  • ✓把预算展示在全公司可见仪表盘,非仅 SRE — 产品团队看到消耗时自治理。
  • ✓用 28 天窗口平滑噪声;更短窗口不停翻冻结和发布,更长窗口延迟行动。
  • ✓按燃烧率带(绿/黄/红)定义显式策略使响应自动,非每次预算动就开会。