error-budget

错误预算的计算、消费与发布门禁

补充说明

错误预算是 1 减去 SLO 后允许的失败量,单位可以是分钟、请求数或事件数。它的用途不是“把预算花完”,而是给发布和故障提供一个可量化的风险额度。预算耗尽时,先冻结功能发布,只做可靠性改进。

预算按 SLO 分别计算:可用性、延迟、数据新鲜度各有各的预算,不能合并成一个数字。

常用示例

28 天窗口的预算换算:

# 99.9% SLO:允许失败比例 0.1%
awk 'BEGIN {printf "可用性预算: %.2f 分钟\n", 28*24*60*(1-0.999)}'
# 请求数预算:800 万请求
awk 'BEGIN {printf "允许失败请求: %.0f\n", 8000000*(1-0.999)}'

按剩余预算决定发布策略:

剩余预算 发布策略 审批
> 50% 正常发布 无需额外审批
25%–50% 暂停高风险变更,缩小批次 团队负责人
1%–25% 只允许小流量金丝雀 SRE + 负责人
0 功能冻结,只修可靠性 事故复盘后解冻

计算剩余预算的 PromQL:

1 - (
  sum(rate(http_requests_total{job="api",code=~"5.."}[28d]))
  /
  sum(rate(http_requests_total{job="api"}[28d]))
) / (1 - 0.999)

长期窗口查询代价高,用 recording rule 预聚合:

groups:
- name: error-budget
  interval: 1m
  rules:
  - record: job:slo_error_ratio:rate5m
    expr: |
      sum by (job) (rate(http_requests_total{code=~"5.."}[5m]))
      / sum by (job) (rate(http_requests_total[5m]))

按燃烧率触发冻结,而不是等预算归零;job:error_budget_remaining:ratio 由 28 天预算公式预聚合:

groups:
- name: budget-freeze
  rules:
  - alert: ErrorBudgetExhausted
    expr: job:error_budget_remaining:ratio < 0.05
    for: 10m
    labels:
      severity: critical
    annotations:
      summary: "错误预算不足 5%,冻结功能发布"
  - alert: ErrorBudgetBurnRateHigh
    expr: job:slo_error_ratio:rate1h > 6 * 0.001
    for: 5m
    labels:
      severity: page

易错点与排错

读完自测

合上页面,先回答,再展开对照。

  1. 99.9% SLO、28 天窗口,允许失败多少分钟?
  2. 剩余预算 10% 时,发布策略应该是什么?
  3. 为什么错误预算不能当成“必须花完的额度”?
答案
  1. 40.32 分钟(40320 × 0.1%)。
  2. 只允许小流量金丝雀,并需要 SRE 和负责人审批;高风险变更暂停。
  3. 预算衡量的是可接受风险,不是可用额度。花完预算意味着用户体验已经受损,继续发布只会扩大风险。

相关条目