4. SLI 与 SLO 基础:定义、分类与设定方法

服务等级指标(SLI)与服务等级目标(SLO)是可观测性工程的基石,也是服务画像建模中“量化健康度”的核心手段。没有精确的 SLI 定义,基础设施即代码(IaC)的配置将失去度量依据;没有合理的 SLO 设定,错误预算便无从谈起。本节将系统阐述 SLI 的分类体系、SLO 的设定方法以及错误预算的运作机制。

4.1 SLI(服务等级指标)的定义与分类

SLI 是对服务某个特定维度进行量化的直接测量值,通常以比率、延迟或计数形式呈现。一个有效的 SLI 必须满足:可采集、可聚合、可对比。根据 Google SRE 经典分类及行业实践,SLI 主要分为以下四大类:

分类 定义 典型测量方式 常见指标示例
延迟 请求从发出到收到完整响应所消耗的时间 百分位数(p50, p95, p99) HTTP 请求 p99 延迟 < 200ms
错误率 失败请求占总请求数的比例 HTTP 5xx / 4xx 计数 / 总请求数 错误率 < 0.1%
吞吐量 单位时间内系统处理的请求数量 请求/秒(RPS)、事务/秒(TPS) 峰值吞吐量 > 1000 RPS
饱和度 系统资源被消耗的程度,接近容量上限 CPU 使用率、内存占用、连接池水位 CPU 饱和度 < 80%
实践提示: 在服务画像建模中,建议为每个服务至少定义 2 个核心 SLI(通常为延迟 + 错误率),再根据服务类型(如计算密集型、IO 密集型)补充吞吐量或饱和度指标。IaC 配置中的告警阈值应直接映射到这些 SLI 的测量口径。

4.2 SLI 分类的黄金信号关系图

下图展示了四大 SLI 分类之间的关联关系及其在服务健康度评估中的位置:

SLI 四大分类关系图 服务健康度 延迟 (Latency) 错误率 (Error) 吞吐量 (Traffic) 饱和度 (Saturation) 四个信号共同决定服务健康度,缺一不可

4.3 SLO(服务等级目标)的设定方法

SLO 是为 SLI 设定的目标阈值或范围,代表服务所有者承诺的服务质量水平。SLO 的设定不是随意拍板,而是基于业务需求、技术能力与成本约束的平衡决策。以下是标准的 SLO 设定流程:

  1. 识别关键用户旅程:梳理用户最常使用的 3-5 个核心操作(如登录、搜索、下单),这些旅程的 SLI 应优先设定 SLO。
  2. 确定 SLI 测量口径:明确 SLI 的采集窗口(如 1 分钟、5 分钟)、聚合方式(如 p99、平均值)及数据来源(如 Istio 指标、应用埋点)。
  3. 设定目标值:基于历史基线数据,设定一个“足够好”的阈值。常见做法是取过去 30 天 p99 延迟的中位数作为初始 SLO。
  4. 定义合规窗口:SLO 通常以滚动时间窗口(如 28 天、30 天)内的达标率表示,例如“99.9% 的请求在 200ms 内完成”。
  5. 评审与迭代:SLO 不是一成不变的,应每季度根据业务变化、系统演进进行重新评估。
SLO 等级 典型目标值 适用场景 错误预算(每月)
核心服务 SLO 99.99% 支付、登录、核心 API 约 4.3 分钟
标准服务 SLO 99.9% 商品详情、搜索、推荐 约 43 分钟
非关键服务 SLO 99.0% 历史订单、报表、后台任务 约 7.3 小时
常见误区: 不要为所有服务设定统一的 99.99% SLO。过高的 SLO 会显著增加基础设施成本(需要更多冗余、更频繁的故障转移),且对用户感知的提升边际递减。SLO 应差异化设定,与业务价值对齐。

4.4 错误预算的概念与运作机制

错误预算 是 SLO 的衍生概念,定义为 1 - SLO。它表示在 SLO 合规窗口内,服务允许发生故障或性能降级的总时间或总请求比例。错误预算将“允许犯错”量化,为 SRE 团队提供了发布节奏与故障恢复的决策依据。

错误预算的核心运作逻辑如下:

  • 预算消耗:每次 SLI 未达标的事件(如延迟超过 SLO 阈值)都会消耗错误预算。
  • 预算剩余:当错误预算充足时(> 50%),团队可以正常发布新功能、进行实验性变更。
  • 预算耗尽:当错误预算低于阈值(如 < 20%)时,应冻结所有非关键变更,优先投入稳定性修复。
  • 预算重置:每个合规窗口结束时,错误预算自动重置为满额。

4.5 错误预算与 SLO 的联动流程

下图展示了错误预算如何驱动 SRE 决策,形成闭环管理:

错误预算驱动决策流程图 SLI 实时采集 与 SLO 对比 计算错误预算 预算充足 → 正常发布 预算不足 → 冻结变更 投入稳定性修复 修复完成后恢复发布节奏

4.6 SLI 口径映射到 IaC 的实践要点

在服务画像建模中,SLI 的定义必须与 IaC 配置中的监控采集、告警规则、自动扩缩容策略严格对齐。以下是关键映射规则:

# 示例:使用 Terraform 配置 Prometheus SLI 采集与告警
resource "prometheus_rule" "sli_latency_p99" {
  name      = "sli_latency_p99_high"
  expr      = "histogram_quantile(0.99, rate(http_request_duration_seconds_bucket[5m])) > 0.2"
  for       = "5m"
  labels    = { severity = "critical", sli_type = "latency" }
  annotations = {
    summary     = "服务 p99 延迟超过 SLO 阈值"
    description = "当前 p99 延迟 {{ $value }}s,SLO 目标 < 0.2s"
  }
}

resource "prometheus_rule" "sli_error_rate" {
  name      = "sli_error_rate_high"
  expr      = "sum(rate(http_requests_total{status=~'5..'}[5m])) / sum(rate(http_requests_total[5m])) > 0.001"
  for       = "5m"
  labels    = { severity = "critical", sli_type = "error_rate" }
  annotations = {
    summary     = "服务错误率超过 SLO 阈值"
    description = "当前错误率 {{ $value }},SLO 目标 < 0.1%"
  }
}
关键原则: SLI 的采集口径(如时间窗口、聚合函数、标签过滤)必须在 IaC 代码中显式声明,并与 SLO 计算逻辑保持一致。任何口径不一致都会导致错误预算计算失真,进而误导发布决策。