2. SLI 基础概念:服务等级指标的定义、分类与选择原则

SLI(Service Level Indicator,服务等级指标)是 SRE 可观测性体系的基石。它是对系统某一特定行为特征的量化度量,直接反映用户所感知的服务质量。没有精确的 SLI,Error Budget 便失去了计算依据,质量门禁也沦为空中楼阁。

2.1 SLI 的定义与核心特征

SLI 本质上是一个随时间变化的数值序列,通常以比率、延迟分位数或计数形式呈现。其核心特征包括:

  • 可测量性:必须能够通过监控系统持续采集,而非人工估算。
  • 用户视角:优先度量用户真实请求的体验,而非基础设施内部指标。
  • 可聚合性:支持按时间窗口(如 1 分钟、1 小时)或维度(如地域、服务版本)进行聚合。
  • 可比较性:同一 SLI 在不同时间段的数值应具备可比性,口径需保持稳定。
实践要点: 定义 SLI 时,务必明确“好事件”与“总事件”的边界。例如,延迟 SLI 的“总事件”是所有到达服务器的 HTTP 请求,还是仅包含成功响应的请求?口径差异会直接改变 SLI 数值,进而影响 Error Budget 的消耗速率。

2.2 SLI 的四大分类体系

Google SRE 经典理论将 SLI 归纳为四大黄金信号。下表对比了每类指标的定义、典型度量方式及常见陷阱:

分类 定义 典型度量方式 常见口径陷阱
延迟 (Latency) 请求从发出到收到完整响应所消耗的时间 P50 / P95 / P99 分位数,或满足阈值(如 ≤200ms)的请求占比 忽略网络往返时间;仅统计服务端处理时间,遗漏客户端等待队列时间
错误率 (Error Rate) 失败请求占总请求数的比例 HTTP 5xx 占比、业务错误码占比、超时或连接失败计数 仅统计显式错误码,忽略隐式错误(如返回 200 但业务逻辑失败);未区分可重试错误与致命错误
吞吐量 (Throughput) 单位时间内系统处理的请求量或数据量 RPS(每秒请求数)、TPS(每秒事务数)、带宽利用率 将重试请求计入吞吐量,导致指标虚高;未区分读写请求的权重差异
饱和度 (Saturation) 系统资源被消耗的程度,反映容量瓶颈的逼近程度 CPU 利用率、内存使用率、连接池占用率、队列深度 使用平均值掩盖峰值压力;未定义饱和阈值(如 CPU 超过 80% 视为饱和)

2.3 SLI 选择原则

在实际治理中,并非所有指标都适合作为 SLI。以下四项原则可帮助团队从海量监控数据中筛选出高价值指标:

  1. 用户相关原则:优先选择用户直接感知的指标。例如,对于 API 网关,延迟 SLI 应度量端到端响应时间,而非仅网关内部处理时间。
  2. 可行动作原则:SLI 的恶化必须能触发明确的修复动作。如果某个指标下降后团队不知如何应对,则该指标不适合作为 SLI。
  3. 稳定性原则:SLI 口径应保持长期稳定,避免因版本迭代频繁调整分母或分子定义。口径变更需经过变更评审并同步更新 Error Budget 基线。
  4. 覆盖率原则:SLI 应覆盖核心用户场景的 80% 以上流量。仅覆盖边缘路径的指标无法代表整体服务质量。
案例: 某电商团队曾将“数据库 CPU 利用率”作为核心 SLI,但用户投诉下单缓慢时该指标仍处于低位。分析发现,瓶颈在于 Redis 缓存击穿导致的请求排队,而非 CPU 算力。最终团队将 SLI 切换为“下单接口 P95 延迟”,才准确反映了真实用户体验。

2.4 SLI 分类与选择的关系图

下图展示了四大 SLI 分类与选择原则之间的映射关系,帮助团队在定义 SLI 时快速定位合适的指标类型:

SLI 分类与选择原则映射 延迟 错误率 吞吐量 饱和度 用户相关 可行动作 稳定性 覆盖率 选择原则指导:每个分类应至少匹配 2 项原则 例如:延迟 SLI 必须同时满足“用户相关”和“可行动作” 实践建议:从四大分类中各选 1-2 个指标,再按四项原则逐一验证 避免选择过多 SLI 导致监控成本膨胀,也避免过少导致盲区

2.5 常见 SLI 口径定义示例

以下代码片段展示了一个典型的 SLI 口径定义配置,使用 YAML 格式描述延迟和错误率的口径边界:

# SLI 口径定义示例 (YAML)
sli_definitions:
  - name: "api_latency_p99"
    category: "latency"
    measurement: "http_request_duration_seconds"
    aggregation: "p99"
    good_event: "duration <= 0.5"   # 好事件:延迟 ≤ 500ms
    total_event: "all_requests"      # 总事件:所有到达的请求
    window: "1m"                     # 滚动窗口 1 分钟

  - name: "api_error_rate"
    category: "error_rate"
    measurement: "http_requests_total"
    aggregation: "ratio"
    good_event: "status < 500"      # 好事件:非 5xx 响应
    total_event: "all_requests"
    window: "5m"                     # 滚动窗口 5 分钟
口径治理警告: 上述示例中,延迟 SLI 的 good_event 定义为 duration <= 0.5(500ms),但不同业务场景的阈值差异巨大。支付接口的延迟阈值通常设为 200ms,而批量导出接口可放宽至 5s。切勿对所有服务使用统一阈值,必须按用户场景逐一定义。

2.6 小结