2. 误差预算基础:SLO与误差预算的定义

2.1 从SLA到SLO:可靠性量化的演进

在可观测性工程中,服务等级目标(SLO)是服务可靠性的核心量化指标。它不同于传统的服务等级协议(SLA)——SLA是面向客户的合同承诺,而SLO是团队内部设定的可靠性目标,通常比SLA更严格。

概念 定义 受众 典型值
SLA 服务等级协议,法律/合同层面的承诺 客户、法务 99.9% (三九)
SLO 服务等级目标,内部可靠性量化指标 SRE、研发团队 99.95% (四九)
SLI 服务等级指标,实际测量的原始数据 监控系统 请求延迟、错误率
实践要点:SLO应始终比SLA严格。如果SLA是99.9%,SLO建议设为99.95%或更高,为合同承诺预留缓冲空间。

2.2 误差预算的定义与核心公式

误差预算(Error Budget)是SLO的互补概念,表示服务在给定时间窗口内允许的最大不可用时间或失败请求量。它量化了"可以犯多少错误而不违反SLO"。

核心计算公式:

误差预算 = 总请求量 × (1 - SLO)

示例:
- 时间窗口:30天(滚动窗口)
- 总请求量:10,000,000 次
- SLO:99.95%
- 误差预算 = 10,000,000 × (1 - 0.9995) = 5,000 次失败请求
关键理解:误差预算不是"剩余可用时间",而是"允许失败的总配额"。每次服务降级、超时、错误响应都会消耗这个配额。

2.3 误差预算的消耗机制

误差预算的消耗遵循事件驱动原则。每次SLI指标超出SLO阈值时,系统记录一次"不良事件",并从预算中扣除相应配额。

消耗规则:

  • 按请求计数:每个失败的请求消耗1单位预算(适用于可用性SLO)
  • 按持续时间:每秒不可用状态消耗固定配额(适用于延迟SLO)
  • 按严重程度加权:高影响故障消耗更多预算(适用于多维度SLO)
常见陷阱:不要将误差预算消耗与"宕机时间"直接等同。一个高流量服务可能在几秒内消耗完整个月的预算,而低流量服务可能长时间不触发消耗。
误差预算生命周期:消耗与重置机制 SLO定义 99.95% / 30天 计算误差预算 总请求 × (1 - SLO) 预算池 初始配额 服务运行 持续产生SLI数据 SLI检测 是否超出SLO阈值? 消耗预算 扣除失败配额 预算耗尽? 触发冻结/降级 时间窗口重置 预算恢复初始值 新窗口开始 说明:误差预算在时间窗口结束时自动重置,消耗速率决定服务可靠性健康状况

2.4 误差预算的重置机制

误差预算的重置是时间窗口驱动的。常见的重置策略包括:

重置策略 窗口类型 适用场景 优缺点
固定日历窗口 自然月/自然周 与财务/业务周期对齐 易于理解,但月末可能集中消耗
滚动时间窗口 最近N天(如30天) 实时可靠性监控 平滑消耗,但计算复杂
事件驱动重置 重大变更后 发布/部署周期 灵活,但需要人工干预
Prometheus实践:使用prometheus_sli:error_budget_remaining指标跟踪实时预算消耗。公式:1 - (sum(rate(sli_bad_events[5m])) / (sum(rate(sli_total_events[5m])) * (1 - slo_target)))

2.5 误差预算消耗速率与告警

误差预算的消耗速率比剩余量更重要。一个服务可能在月初快速消耗50%预算,然后在剩余时间保持稳定——这比均匀消耗更危险。

关键告警阈值:

  • 消耗速率 > 2× 预期速率:触发警告(Warning)
  • 消耗速率 > 3× 预期速率:触发严重告警(Critical)
  • 预算剩余 < 20% 且消耗速率持续上升:触发紧急响应
误差预算消耗速率对比:健康 vs 危险模式 健康模式(均匀消耗) 窗口开始 窗口结束 预算剩余 危险模式(突发消耗) 窗口开始 窗口结束 预算剩余 消耗速率告警策略 健康模式:预算线性消耗,剩余量可预测 → 常规监控 危险模式:预算在短时间内急剧消耗 → 触发紧急告警和自动降级 健康消耗 危险消耗 告警阈值线

2.6 误差预算在Prometheus中的指标设计

在Prometheus中,误差预算台账需要设计以下核心指标:

指标名称 类型 标签 说明
sli_total_events Counter service, sli_type 总请求事件计数
sli_bad_events Counter service, sli_type, error_class 不良事件计数
slo_target Gauge service, slo_name SLO目标值(如0.9995)
error_budget_total Gauge service, window 总误差预算配额
error_budget_consumed Gauge service, window 已消耗的误差预算
error_budget_remaining Gauge service, window 剩余误差预算
error_budget_burn_rate Gauge service, window 预算消耗速率(/小时)
最佳实践:使用recording rules预计算误差预算消耗率,避免每次查询都进行全量计算。例如:record: error_budget_burn_rate_5m 基于5分钟窗口的消耗速率。

2.7 误差预算的决策驱动

误差预算不仅是监控指标,更是决策引擎。当预算耗尽时,团队应触发以下动作:

  • 冻结发布:停止所有非关键变更,直到预算恢复
  • 自动降级:关闭非核心功能,保护核心SLO
  • 容量扩展:增加资源以降低故障影响
  • 根因分析:启动事故调查流程
重要原则:误差预算不是"惩罚机制",而是"风险量化工具"。它帮助团队在创新速度与可靠性之间做出数据驱动的权衡。