3. 制品误差预算模型:SLI、SLO、Error Budget 定义与计算逻辑
在制品交付链中,误差预算(Error Budget)是连接可靠性目标与变更风险的量化桥梁。本章定义 SLI、SLO、Error Budget 三个核心概念,并给出在 Terraform 审计日志场景下的计算逻辑与台账映射方式。
3.1 核心概念定义
| 术语 | 全称 | 定义 | 审计日志场景示例 |
|---|---|---|---|
| SLI | Service Level Indicator | 服务等级指标,对可靠性的直接量化测量 | 审计日志采集成功率、日志写入延迟 P99 |
| SLO | Service Level Objective | 服务等级目标,SLI 的目标阈值或区间 | 采集成功率 ≥ 99.9%,P99 延迟 ≤ 500ms |
| Error Budget | 误差预算 | 1 - SLO,允许的不可用时间或失败次数 | 每月允许失败日志条数 = 总日志量 × (1 - 0.999) |
关键认知: Error Budget 不是“错误容忍度”,而是变更可用额度。当预算耗尽时,应自动冻结高风险 Terraform 部署,直到预算恢复。
3.2 SLI 定义与测量维度
针对 Terraform 驱动的制品审计日志采集,SLI 应覆盖以下三个维度:
- 可用性 SLI: 日志采集端点健康检查通过率。测量方式:每分钟探活,成功响应数 / 总探活数。
- 完整性 SLI: 成功写入存储的日志条数 / 制品侧实际产生的日志条数。需在制品侧埋点记录“应发数”。
- 时效性 SLI: 日志从产生到可查询的时间差(P99 延迟)。测量方式:日志时间戳 vs 存储接收时间戳。
台账字段映射: 每一条审计日志记录应携带
sli_availability、sli_completeness、sli_latency_ms 三个标签,用于后续 Error Budget 聚合计算。
3.3 SLO 设定与误差预算计算逻辑
以月为窗口期,定义典型 SLO 及对应的 Error Budget 计算公式:
| SLO 类型 | 目标值 | 窗口期 | Error Budget 计算公式 |
|---|---|---|---|
| 采集可用性 | 99.9% | 30 天 | 允许不可用分钟数 = 30 × 24 × 60 × (1 - 0.999) = 43.2 分钟 |
| 日志完整性 | 99.95% | 30 天 | 允许丢失条数 = 预估月总日志量 × (1 - 0.9995) |
| P99 延迟 | ≤ 500ms | 滚动 5 分钟 | 超出 500ms 的请求数 ≤ 总请求数 × 0.01 |
通用计算模型:
Error Budget = 总测量单位数 × (1 - SLO)
# 示例:完整性预算
total_logs_30d = 10_000_000 # 预估月日志总量
slo_completeness = 0.9995
error_budget = total_logs_30d * (1 - slo_completeness)
# error_budget = 5_000 条允许丢失
3.4 误差预算消耗与剩余量计算
实际消耗量由 SLI 测量值与 SLO 阈值的差值累加得到:
# 每日消耗计算
daily_budget_consumption = max(0, sli_actual - slo_target) * 总测量数
# 剩余预算
remaining_budget = error_budget - sum(daily_budget_consumption)
# 预算耗尽阈值触发
if remaining_budget <= 0:
trigger_terraform_freeze()
注意: 延迟类 SLI 的消耗计算需使用滑动窗口,避免单次突发耗尽整个预算。建议采用“超出阈值请求数 × 权重系数”的方式平滑计算。
3.5 制品误差预算台账结构
在 Terraform 审计日志采集系统中,Error Budget 台账应作为独立索引存储,结构如下:
| 字段 | 类型 | 说明 |
|---|---|---|
budget_id |
string | 预算唯一标识,格式:slo_{type}_{制品名} |
slo_type |
enum | availability / completeness / latency |
window_start |
timestamp | 窗口期起始时间 |
window_end |
timestamp | 窗口期结束时间 |
total_budget |
float | 总预算量(分钟/条数/请求数) |
consumed_budget |
float | 已消耗预算量 |
remaining_budget |
float | 剩余预算量 |
budget_status |
enum | healthy / warning / exhausted |
3.6 SLI → SLO → Error Budget 流转关系
下图展示从原始日志到预算决策的完整数据流:
3.7 误差预算状态机与 Terraform 联动
Error Budget 状态直接驱动 Terraform 部署策略:
台账审计日志记录点: 每次 Error Budget 状态变更(Healthy → Warning → Exhausted)必须生成一条审计日志,记录变更时间、触发原因、当前消耗量、关联的 Terraform 执行 ID。这是后续合规审计的关键证据链。
3.8 计算逻辑代码示例(伪代码)
# 误差预算计算与状态判定
class ErrorBudgetCalculator:
def __init__(self, slo_target: float, window_seconds: int, total_units: int):
self.slo = slo_target
self.window = window_seconds
self.total_budget = total_units * (1 - slo_target)
self.consumed = 0.0
def record_sli(self, sli_value: float, measurement_count: int):
"""记录一次 SLI 测量并更新消耗"""
if sli_value < self.slo:
deficit = self.slo - sli_value
self.consumed += deficit * measurement_count
@property
def remaining(self) -> float:
return max(0.0, self.total_budget - self.consumed)
@property
def status(self) -> str:
ratio = self.remaining / self.total_budget if self.total_budget > 0 else 0
if ratio > 0.30:
return "healthy"
elif ratio > 0:
return "warning"
else:
return "exhausted"
生产建议: 上述计算逻辑应封装为 Terraform Provider 中的
data source,每次 terraform plan 时自动查询当前 Error Budget 状态,并在 plan 输出中展示预算消耗百分比,让运维人员在执行前感知风险。