2. SLI 定义与选择:如何定义 SLI、常见类型与关键原则

SLI(Service Level Indicator,服务等级指标)是衡量服务质量某一维度的量化指标。它是 SRE 可观测性体系的基石——没有 SLI,就无法计算误差预算,也无法判断服务是否处于健康状态。本节将系统讲解 SLI 的定义方法、四大常见类型以及选择关键 SLI 的核心原则。

2.1 什么是 SLI?

SLI 是对服务行为某个方面的直接测量值,通常表示为一段时间内的比率、计数或分布。例如:“过去 5 分钟内,所有 HTTP GET 请求中响应时间小于 200ms 的比例”。

核心公式: SLI = 符合预期的事件数 / 总事件数 × 100%

SLI 必须满足以下三个条件:

  • 可测量:能从监控系统中直接采集或计算得到
  • 可理解:团队内外对指标含义有一致认知
  • 可行动:当 SLI 恶化时,能触发明确的响应动作

2.2 四大常见 SLI 类型

Google SRE 经典分类将 SLI 归纳为四个黄金信号(The Four Golden Signals)。下表对比了每种类型的定义、典型指标和 Prometheus 示例查询:

类型 定义 典型指标 PromQL 示例(5 分钟窗口)
延迟 请求从发出到收到响应的时间 p99 延迟 < 500ms
histogram_quantile(0.99, rate(http_request_duration_seconds_bucket[5m]))
错误率 请求失败的比率(HTTP 5xx、超时、业务错误码) 错误率 < 1%
sum(rate(http_requests_total{status=~"5.."}[5m])) / sum(rate(http_requests_total[5m]))
吞吐量 系统每秒处理的请求数或事务数 QPS > 1000
sum(rate(http_requests_total[5m]))
饱和度 系统资源被消耗的程度,接近容量上限 CPU 使用率 < 80%
avg(rate(node_cpu_seconds_total{mode="idle"}[5m])) < 0.2
实践建议: 对于大多数 Web 服务,延迟和错误率是必须优先定义的 SLI。吞吐量和饱和度通常作为容量规划的辅助指标,但在高并发场景下同样关键。

2.3 如何定义 SLI?——三步法

定义 SLI 不是随意选择一个指标,而是需要遵循结构化流程。以下三步法可帮助团队快速落地:

  1. 确定用户旅程:识别对用户最重要的操作(如登录、搜索、下单)
  2. 选择黄金信号:为每个用户旅程从延迟、错误率、吞吐量、饱和度中选择 1-2 个维度
  3. 设定阈值与窗口:定义“好事件”的标准(如 p99 < 300ms)和评估时间窗口(如 5 分钟、1 小时)

以下 SVG 展示了从用户请求到 SLI 定义的完整流程:

SLI 定义三步法流程 步骤 1 确定用户旅程 登录 / 搜索 / 下单 步骤 2 选择黄金信号 延迟 / 错误率 步骤 3 设定阈值与窗口 p99 < 300ms 输出:每个用户旅程对应 1-2 个可量化的 SLI

2.4 选择关键 SLI 的原则

并非所有指标都适合作为 SLI。选择不当会导致监控噪音或遗漏真实问题。以下是经过大量生产环境验证的五大原则:

原则 说明 反例
用户视角优先 SLI 必须反映最终用户的真实体验,而非内部实现细节 用“CPU 使用率”代替“页面加载时间”
少而精 每个服务不超过 3-5 个 SLI,避免指标膨胀 为每个 API 端点定义独立的 SLI
可量化且可重复 SLI 的计算方式必须明确,不同团队能得出相同结果 “响应时间感觉变慢了”这种主观描述
与 SLO 直接关联 每个 SLI 都应能映射到一个 SLO 目标值 定义了 SLI 但从未设定目标阈值
可观测性覆盖 SLI 必须能被现有监控系统持续采集,且覆盖所有关键路径 只监控主链路,忽略降级后的 fallback 路径
常见陷阱: 不要将“内部健康指标”(如内存使用率、goroutine 数量)直接作为 SLI。这些指标虽然重要,但属于资源饱和度的辅助信号,不能替代用户可见的延迟和错误率。正确的做法是将内部指标作为 SLI 恶化的根因分析线索。

2.5 实战案例:为电商下单服务定义 SLI

假设我们有一个电商下单服务(order-service),用户旅程为“提交订单并返回成功”。按照三步法:

  • 用户旅程:用户点击“提交订单” → 后端校验库存 → 扣减库存 → 生成订单 → 返回订单 ID
  • 选择信号:延迟(p99 < 1s)、错误率(HTTP 5xx + 业务错误码 < 0.5%)
  • 设定阈值与窗口:滚动 5 分钟窗口,SLI = 符合延迟和错误率阈值的请求占比

对应的 Prometheus 指标定义如下:

# 延迟 SLI:p99 响应时间 < 1s
histogram_quantile(0.99, rate(order_request_duration_seconds_bucket[5m]))

# 错误率 SLI:非成功请求占比 < 0.5%
(
  sum(rate(order_requests_total{status!~"2.."}[5m]))
  /
  sum(rate(order_requests_total[5m]))
)

以下 SVG 展示了下单服务的 SLI 监控架构:

下单服务 SLI 监控架构 用户 提交订单 order-service 处理请求 采集指标 Prometheus 拉取 / 存储 计算 SLI SLI 输出:延迟 p99 < 1s,错误率 < 0.5%

2.6 SLI 选择检查清单

在最终确定 SLI 之前,建议团队对照以下清单逐项确认:

  • ☐ 该 SLI 是否直接反映用户可感知的体验?
  • ☐ 该 SLI 是否能在生产环境中持续采集(无盲区)?
  • ☐ 该 SLI 是否与一个明确的 SLO 目标绑定?
  • ☐ 该 SLI 的“好事件”定义是否清晰无歧义?
  • ☐ 该 SLI 是否覆盖了服务的关键路径(而非边缘路径)?
  • ☐ 该 SLI 的数量是否控制在 3-5 个以内?
迭代建议: SLI 不是一成不变的。建议每季度回顾一次 SLI 的有效性,根据业务变化和监控盲区发现进行调整。初期可以多定义 1-2 个候选 SLI,运行一段时间后剔除噪音较大的指标。