核心概念:什么是 Error Budget?SLO 与 SLI 的定义与计算方式

在分布式追踪与值班告警体系中,Error Budget(错误预算) 是连接“可靠性目标”与“日常运维动作”的量化桥梁。没有 Error Budget,SLO 只是一纸空文;有了 Error Budget,团队才能科学地决定“何时必须响应告警”与“何时可以放心发布”。

2.1 从 SLI 到 SLO:可靠性的度量阶梯

在定义 Error Budget 之前,必须先理解两个基础概念:SLI(Service Level Indicator,服务等级指标) 与 SLO(Service Level Objective,服务等级目标)。

概念 定义 典型示例 度量单位
SLI 对服务质量的某个维度进行实际测量得到的数值 请求成功率、P99 延迟、吞吐量 百分比 / 毫秒 / QPS
SLO 团队为 SLI 设定的目标阈值,是承诺或内部标准 99.9% 的请求成功、P99 延迟 < 200ms 百分比 / 时间
Error Budget SLO 允许的最大失效时间或失效次数 30 天内最多允许 43 分钟不可用 分钟 / 请求数 / 百分比
关键公式:
Error Budget = 1 − SLO(以百分比表示)
例如:SLO = 99.9% → Error Budget = 0.1% 的时间窗口。

2.2 SLI 的选取与计算方式

SLI 必须可测量、可对比、与用户体验强相关。在分布式追踪场景下,最常用的三类 SLI 如下:

  • 可用性 SLI:成功请求数 ÷ 总请求数 × 100%。通常以 HTTP 状态码 2xx/4xx/5xx 为判断依据。
  • 延迟 SLI:通常取 P50、P95、P99 分位值。例如“P99 延迟 ≤ 500ms”表示 99% 的请求在 500ms 内完成。
  • 错误率 SLI:基于 Span 状态(OK / ERROR)计算。在分布式追踪中,一个 Trace 只要有一个 ERROR Span,即可计入错误。
# 可用性 SLI 计算示例(基于追踪数据)
total_spans = count(trace_span{service="payment"})
error_spans = count(trace_span{service="payment", status="ERROR"})
availability_sli = (total_spans - error_spans) / total_spans * 100

# 延迟 SLI 计算示例(P99)
p99_latency = histogram_quantile(0.99, 
  rate(trace_span_duration_seconds_bucket{service="payment"}[5m]))

2.3 SLO 的定义与窗口选择

SLO 不是拍脑袋定的数字,它需要结合业务容忍度与基础设施成本。常见的 SLO 定义方式包括:

SLO 类型 定义方式 适用场景
滚动窗口 SLO 基于过去 N 天的滑动窗口计算 持续监控、告警阈值
日历窗口 SLO 基于固定月份/季度计算 业务报告、SLA 对账
复合 SLO 多个 SLI 加权组合 多维度服务质量评估
实践建议: 值班告警场景优先使用 滚动窗口 SLO(如 30 天滑动窗口),因为它能实时反映近期服务质量,避免“月初预算重置”导致的告警盲区。

2.4 Error Budget 的计算与消耗模型

Error Budget 的核心思想是:只要预算未耗尽,团队可以接受一定程度的故障或发布风险。其计算模型如下:

Error Budget = 总时间窗口 × (1 − SLO)

示例(30 天窗口,SLO = 99.9%):
总时间 = 30 × 24 × 60 = 43,200 分钟
Error Budget = 43,200 × 0.001 = 43.2 分钟

当前消耗 = 窗口内累计不可用时间 / 总时间 × 100%
剩余预算 = Error Budget − 当前消耗
常见误区: Error Budget 不是“故障配额”,而是“风险预算”。即使预算还有剩余,也不意味着可以故意制造故障;它只是帮助团队在“发布速度”与“可靠性”之间做量化决策。

2.5 SLI → SLO → Error Budget 关系图

下图展示了从原始追踪数据到 Error Budget 的完整转化链路:

SLI → SLO → Error Budget 转化链路 分布式追踪数据 Span / Trace / 延迟 SLI 指标计算 成功率 / P99 / 错误率 SLO 目标设定 99.9% / 99.99% EB 预算 Error Budget 消耗模型(30 天滚动窗口) 总预算 = 43,200 分钟 × (1 − 0.999) = 43.2 分钟 → 消耗超过 70% 触发告警 预算充足 → 允许发布 风险可控,正常迭代 预算紧张 → 冻结发布 优先修复,降低消耗 预算耗尽 → 紧急响应 P0 告警,全员介入

2.6 分布式追踪中的 Error Budget 特殊考量

在基于分布式追踪的告警体系中,Error Budget 的计算需要额外注意以下三点:

  • Span 级 vs Trace 级:一个 Trace 包含多个 Span,错误可能发生在下游依赖。建议以 Trace 最终状态 作为 SLI 计算单元,避免“局部错误、全局成功”的误判。
  • 采样偏差:分布式追踪通常只采样部分请求(如 1%)。Error Budget 计算必须基于采样率校正,否则会低估实际错误量。
  • 依赖爆炸:一个请求可能经过 20+ 服务。Error Budget 应分层定义:全局 SLO(端到端)与 组件 SLO(单服务)分开管理。
值班台实战要点:
• 告警阈值建议设为 Error Budget 消耗的 70%(预警)和 90%(紧急)。
• 每次告警触发时,自动计算“当前剩余预算”并附在告警消息中,帮助值班人员快速判断严重程度。
• 每周自动生成 Error Budget 消耗报告,用于发布决策会议。