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)
常见陷阱:不要将误差预算消耗与"宕机时间"直接等同。一个高流量服务可能在几秒内消耗完整个月的预算,而低流量服务可能长时间不触发消耗。
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% 且消耗速率持续上升:触发紧急响应
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
- 容量扩展:增加资源以降低故障影响
- 根因分析:启动事故调查流程
重要原则:误差预算不是"惩罚机制",而是"风险量化工具"。它帮助团队在创新速度与可靠性之间做出数据驱动的权衡。