2、SLI基础:什么是SLI(服务等级指标)、SLI的选取原则、常见的SLI类型(延迟、错误率、吞吐量、饱和度)
2.1 什么是SLI(服务等级指标)
SLI(Service Level Indicator,服务等级指标) 是对服务某个特定维度进行量化的直接测量值。它是可观测性体系中最原始的“信号”,反映了服务在用户视角下的真实表现。SLI 不是目标,而是事实——它回答的是“服务现在怎么样”,而不是“服务应该怎么样”。
SLI 是 Error Budget 计算的原材料。没有精确的 SLI 口径,后续的 SLO 制定和 Error Budget 量化都无从谈起。SLI 必须满足 可采集、可聚合、可对比 三个基本属性。
| 属性 | 说明 | 反例 |
|---|---|---|
| 可采集 | 能从监控系统、日志、链路追踪中直接获取原始值 | “用户体验满意度”无法直接采集 |
| 可聚合 | 能在时间窗口(如1分钟、5分钟)内做统计计算 | 单次请求的耗时无法代表整体 |
| 可对比 | 不同时间段的SLI值可以比较,用于判断趋势 | “系统负载”在不同硬件下无法直接对比 |
2.2 SLI的选取原则
选取正确的 SLI 是 Error Budget 工程中最关键的决策之一。错误的 SLI 会导致 SLO 失真,进而使 Error Budget 失去指导意义。以下是经过生产环境验证的 SLI 选取四原则:
- 用户视角优先: 始终从用户(或下游调用方)的体验出发,而不是从基础设施视角出发。例如:选择“用户侧请求延迟”而非“CPU使用率”。
- 高覆盖率: SLI 应覆盖服务的大部分流量。避免只采集健康实例的数据而忽略故障实例。建议覆盖至少 95% 以上的生产流量。
- 可区分好坏: SLI 必须能明确区分“好”与“坏”的边界。例如:延迟 SLI 需要定义“多快算好”,错误率 SLI 需要定义“什么算错误”。
- 避免代理指标: 不要使用间接指标代替直接指标。例如:用“TCP连接数”代替“请求成功率”是错误的,因为连接数正常不代表请求成功。
2.3 常见的SLI类型
在生产环境中,SLI 通常被归纳为 四大黄金信号:延迟、错误率、吞吐量、饱和度。这四类指标从不同维度刻画了服务的健康状态,是 Error Budget 量化的基础。
2.3.1 延迟(Latency)
延迟衡量服务响应请求所花费的时间。延迟 SLI 通常使用 百分位值(P50、P90、P99)而非平均值,因为平均值会掩盖长尾问题。在 Error Budget 中,延迟 SLI 的“好”与“坏”由阈值定义,例如:P99 延迟 ≤ 500ms 算作“好”,否则算作“坏”。
2.3.2 错误率(Error Rate)
错误率衡量请求失败的占比。错误不仅包括 HTTP 5xx 状态码,还包括业务逻辑错误(如返回错误码、超时、熔断)。错误率 SLI 的计算公式为:错误请求数 / 总请求数 × 100%。在 Error Budget 中,错误率 SLI 通常要求低于某个阈值(如 0.1%)。
2.3.3 吞吐量(Throughput)
吞吐量衡量服务在单位时间内处理的请求量或数据量。常见的吞吐量 SLI 包括:QPS(每秒查询数)、RPS(每秒请求数)、TPS(每秒事务数)。吞吐量 SLI 通常与容量规划相关,当吞吐量接近系统上限时,Error Budget 消耗会加速。
2.3.4 饱和度(Saturation)
饱和度衡量服务资源被占用的程度。常见的饱和度 SLI 包括:CPU 使用率、内存使用率、连接池使用率、队列深度。饱和度 SLI 是“前兆性”指标——当饱和度升高时,延迟和错误率往往会随之恶化。在 Error Budget 中,饱和度 SLI 用于预警,而非直接计入 Error Budget 消耗。
| SLI 类型 | 典型指标 | 采集方式 | 在 Error Budget 中的角色 |
|---|---|---|---|
| 延迟 | P99 延迟、P50 延迟 | 请求耗时埋点、APM | 直接计入消耗 |
| 错误率 | HTTP 5xx 占比、业务错误码占比 | 日志、监控指标 | 直接计入消耗 |
| 吞吐量 | QPS、RPS、TPS | 流量统计、网关指标 | 间接影响(容量规划) |
| 饱和度 | CPU 使用率、队列深度 | 系统指标、中间件指标 | 预警信号(不直接计入) |
2.4 SLI 口径定义示例
为了让 SLI 真正可量化,必须给出精确的 口径定义。以下是一个典型的 HTTP 服务 SLI 口径定义模板:
SLI 名称:HTTP 请求延迟(P99)
采集来源:Nginx 访问日志 / APM 代理
统计窗口:1 分钟(滚动窗口)
好事件定义:P99 延迟 ≤ 500ms
坏事件定义:P99 延迟 > 500ms
排除条件:健康检查请求、内部监控探针
覆盖范围:所有外部用户请求(排除内部流量)