3. 误差预算模型设计:定义SLI/SLO、计算误差预算消耗、预算告警阈值设定

误差预算(Error Budget)是SRE实践中的核心量化工具,它将服务可靠性与产品迭代速度统一到一个可度量的经济模型中。在制品供应链场景下,误差预算模型用于衡量从代码提交到制品部署全链路的“不可用”或“不符合预期”的时长与次数,从而驱动基线配置的自动调整与告警响应。

3.1 核心概念与模型结构

误差预算模型由三个层次构成:

  • SLI(Service Level Indicator):直接测量的原始指标,如流水线成功率、制品分发延迟、配置同步失败率。
  • SLO(Service Level Objective):对SLI设定的目标阈值,如“月度流水线成功率 ≥ 99.9%”。
  • 误差预算:SLO允许的最大不可用或失败额度,通常以百分比或时间单位表示。
关键公式:
误差预算总额 = 1 - SLO(例如SLO=99.9%,则预算总额=0.1%)
误差预算消耗 = 实际SLI - SLO(当实际SLI低于SLO时产生消耗)
剩余预算 = 预算总额 - 累计消耗
误差预算模型三层结构 SLI(服务等级指标) 流水线成功率 | 制品分发延迟P95 | 配置同步失败率 | 制品签名验证通过率 SLO(服务等级目标) 月度流水线成功率 ≥ 99.9% | 制品分发P95延迟 ≤ 2s | 配置同步失败率 ≤ 0.05% 误差预算(Error Budget) 预算总额 = 1 - SLO | 消耗 = max(0, SLO - 实际SLI) | 剩余 = 总额 - 累计消耗

3.2 制品供应链SLI定义

针对制品供应链的四个关键阶段,定义以下SLI:

阶段 SLI名称 测量方式 数据来源
构建 流水线成功率 成功流水线数 / 总触发流水线数 CI系统(Jenkins/GitHub Actions)
制品存储 制品上传延迟P95 从构建完成到制品仓库确认接收的P95延迟 制品仓库API日志
分发 制品分发成功率 成功分发节点数 / 目标分发节点总数 分发代理上报
配置同步 基线同步失败率 同步失败次数 / 总同步触发次数 Terraform状态文件 + 配置审计日志
实践建议: 在Terraform中,将SLI数据源定义为data块,从Prometheus或CloudWatch等监控系统实时拉取,避免手动录入。

3.3 SLO设定与误差预算计算

SLO的设定需要平衡可靠性与迭代速度。以下为推荐的SLO基线:

SLI SLO目标 预算窗口 预算总额
流水线成功率 99.9% 30天 0.1%(约43.2分钟不可用)
制品上传延迟P95 ≤ 2秒 7天 超出2秒的请求占比 ≤ 5%
制品分发成功率 99.95% 30天 0.05%(约21.6分钟不可用)
基线同步失败率 99.99% 30天 0.01%(约4.32分钟不可用)

误差预算消耗计算示例:

# 假设30天内流水线总触发次数 = 100,000
# 失败次数 = 150
# 实际成功率 = (100,000 - 150) / 100,000 = 99.85%
# SLO = 99.9%
# 误差预算消耗 = max(0, 99.9% - 99.85%) = 0.05%
# 预算总额 = 0.1%
# 剩余预算 = 0.1% - 0.05% = 0.05%
# 剩余可用失败次数 = 0.05% * 100,000 = 50次

3.4 预算告警阈值设定

告警阈值采用多级预警策略,确保在预算耗尽前有足够的响应时间:

  • 警告(Warning):剩余预算 ≤ 30% —— 触发通知,进入观察期。
  • 严重(Critical):剩余预算 ≤ 10% —— 触发自动降级或冻结非关键变更。
  • 耗尽(Exhausted):剩余预算 = 0% —— 触发紧急响应,暂停所有非修复性流水线。
预算告警阈值与响应流程 70% 90% 100% 剩余 ≥ 70% 正常状态 30% ~ 70% Warning 通知 10% ~ 30% Critical 降级 0% ~ 10% Exhausted 冻结 无动作 Slack/邮件通知 自动降级 + PagerDuty 冻结流水线 + 紧急会议

3.5 Terraform中的误差预算配置实现

在Terraform中,误差预算模型通过locals和data块实现动态计算,并与监控告警资源联动:

# 定义SLO与预算参数
locals {
  slo_pipeline_success   = 0.999
  slo_sync_failure       = 0.9999
  budget_window_days     = 30

  # 从Prometheus查询实际SLI(示例)
  actual_pipeline_success = data.prometheus_query.pipeline_success.result[0].value[1]
  actual_sync_failure     = data.prometheus_query.sync_failure.result[0].value[1]

  # 计算误差预算消耗
  pipeline_budget_total   = 1 - local.slo_pipeline_success
  pipeline_budget_consumed = max(0, local.slo_pipeline_success - local.actual_pipeline_success)
  pipeline_budget_remaining = local.pipeline_budget_total - local.pipeline_budget_consumed
}

# 告警规则:剩余预算 < 30% 触发Warning
resource "prometheus_alert_rule" "pipeline_budget_warning" {
  name      = "PipelineErrorBudgetWarning"
  expr      = "pipeline_budget_remaining < 0.30"
  for       = "5m"
  severity  = "warning"
  labels = {
    team = "platform-sre"
  }
  annotations = {
    summary = "流水线误差预算剩余不足30%"
  }
}

# 告警规则:剩余预算 < 10% 触发Critical
resource "prometheus_alert_rule" "pipeline_budget_critical" {
  name      = "PipelineErrorBudgetCritical"
  expr      = "pipeline_budget_remaining < 0.10"
  for       = "2m"
  severity  = "critical"
  labels = {
    team = "platform-sre"
  }
  annotations = {
    summary = "流水线误差预算即将耗尽,自动降级已触发"
  }
}
注意: 误差预算告警不应直接绑定到基础设施变更操作(如Terraform apply),而应通过事件驱动框架(如Webhook + Lambda)触发审批流程。直接自动化变更可能导致连锁故障。

3.6 预算消耗与基线同步的联动机制

当误差预算消耗超过阈值时,Terraform管理的配置基线应自动进入“保守模式”:

  • 预算充足(剩余 > 70%):正常同步所有基线配置。
  • 预算警告(30% ~ 70%):同步频率从实时降为每小时一次,跳过非关键配置。
  • 预算严重(10% ~ 30%):仅同步安全补丁和紧急修复配置,冻结功能变更。
  • 预算耗尽(< 10%):暂停所有基线同步,仅保留手动紧急通道。

此联动机制通过Terraform的condition和count元参数实现条件执行,确保供应链在不可靠状态下不会因自动同步引入更多风险。