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