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 流转关系

下图展示从原始日志到预算决策的完整数据流:

SLI → SLO → Error Budget 流转关系图 SLI → SLO → Error Budget 流转关系 审计日志原始数据 制品侧埋点计数 健康检查探针 SLI 计算层:可用性 / 完整性 / 延迟 P99 SLO 比较:SLI 实际值 vs SLO 目标阈值 Error Budget 台账:消耗 / 剩余 / 状态

3.7 误差预算状态机与 Terraform 联动

Error Budget 状态直接驱动 Terraform 部署策略:

Error Budget 状态机与部署联动 Error Budget 状态机与 Terraform 部署联动 Healthy 剩余 > 30% Warning 剩余 0% ~ 30% Exhausted 剩余 ≤ 0% 预算恢复 > 30% Terraform 部署策略联动 • Healthy:正常执行 terraform apply,全量部署 • Warning:仅允许 terraform plan,apply 需人工审批 • Exhausted:冻结所有 terraform apply,仅允许 plan 查看
台账审计日志记录点: 每次 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 输出中展示预算消耗百分比,让运维人员在执行前感知风险。