4. SLI 设计原则:如何选择有效的 SLI 指标
SLI(Service Level Indicator,服务等级指标)是 SLO 监控的基石。选择错误的 SLI 会导致告警噪音泛滥或盲区扩大。本章聚焦于两大经典方法论:Google 黄金信号(The Four Golden Signals)与 USE 方法(Utilization、Saturation、Errors),并给出可落地的指标选择原则。
4.1 黄金信号:面向用户的四大观测维度
Google SRE 团队在《SRE 运维解密》中提出,对于用户可见的服务,只需关注四个核心信号即可覆盖绝大多数故障场景:
| 信号 | 定义 | 典型指标示例 | 故障表现 |
|---|---|---|---|
| 延迟(Latency) | 请求从发出到收到响应的时间 | p50 / p95 / p99 响应时间 | 用户感知卡顿、超时 |
| 错误率(Errors) | 请求失败的比率(显式+隐式) | HTTP 5xx 占比、业务错误码率 | 功能不可用、数据不一致 |
| 吞吐量(Traffic) | 系统处理的请求量或数据量 | QPS、RPS、带宽使用率 | 流量突增导致过载、流量突降表示异常 |
| 饱和度(Saturation) | 资源被使用的程度,通常有瓶颈上限 | CPU 使用率、内存使用率、连接池占用 | 排队、限流、拒绝服务 |
实践要点:黄金信号优先从用户视角采集。例如延迟应测量客户端到服务端的全链路耗时,而非仅服务端处理时间;错误率需包含 HTTP 500 和业务逻辑错误(如“购物车结算失败”返回 200 但 body 含 error code)。
4.2 USE 方法:面向资源的瓶颈定位
USE 方法由 Brendan Gregg 提出,适用于基础设施层(服务器、数据库、中间件)的指标设计。它从三个维度评估每个资源:
- Utilization(使用率):资源被占用的平均比例。例如 CPU 利用率 70%、内存使用率 80%。
- Saturation(饱和度):资源无法服务的额外排队或等待量。例如 CPU 运行队列长度、磁盘 I/O 等待队列。
- Errors(错误):资源发生的错误事件数。例如网卡丢包、磁盘坏道、内存 ECC 错误。
黄金信号 vs USE 方法:黄金信号面向用户,USE 方法面向资源。两者互补:黄金信号告诉你“用户是否受损”,USE 方法告诉你“哪个资源导致受损”。在告警降噪中,建议将 USE 指标作为延迟/错误率告警的根因上下文,而非直接触发告警。
4.3 如何选择有效的 SLI:五条设计原则
- 用户相关原则:SLI 必须直接反映用户体验。例如“API p99 延迟”优于“CPU 空闲率”。
- 可测量原则:指标必须能在生产环境持续采集,且采集成本可控。避免需要全链路追踪才能计算的复杂指标。
- 可区分原则:SLI 应能区分正常与异常。例如“平均延迟”容易被长尾掩盖,应使用百分位延迟(p50/p95/p99)。
- 可行动原则:SLI 恶化时,团队必须有明确的修复动作。例如“错误率 > 1%”触发告警后,能直接定位到错误日志。
- 最小化原则:每个服务只选择 3~5 个核心 SLI,避免指标爆炸。过多的 SLI 会导致告警疲劳和 SLO 管理混乱。
4.4 常见 SLI 选择案例
| 服务类型 | 推荐 SLI | 对应黄金信号 | USE 根因指标 |
|---|---|---|---|
| Web API | p99 延迟 < 500ms,错误率 < 1% | 延迟、错误率 | CPU 使用率、连接池饱和度 |
| 数据库 | 查询 p95 延迟 < 100ms,慢查询占比 | 延迟、吞吐量 | 磁盘 I/O 使用率、锁等待队列 |
| 消息队列 | 端到端投递延迟 < 2s,堆积量 | 延迟、饱和度 | 磁盘使用率、网络带宽饱和度 |
| CDN / 边缘 | 缓存命中率 > 90%,首字节时间 | 延迟、吞吐量 | 带宽使用率、源站连接池饱和度 |
避坑提醒:不要将“CPU 使用率 > 80%”直接作为面向用户的 SLI。CPU 高不一定导致用户延迟升高(例如批处理任务)。正确的做法是:将 CPU 饱和度作为 USE 指标,关联到黄金信号中的延迟告警,作为根因上下文展示。
4.5 从 SLI 到 SLO:指标聚合与阈值设定
选定 SLI 后,需要定义 SLO 目标。核心步骤:
- 采集窗口:通常使用滚动窗口(如 30 天)计算 SLI 合规率。
- 阈值设定:基于历史数据确定合理基线。例如“过去 30 天 p99 延迟 99% 的时间低于 500ms”。
- 错误预算:SLO 目标与 100% 的差值即为错误预算。例如 SLO = 99.9%,则错误预算 = 0.1%。
- 告警触发:当错误预算消耗速度超过预期时触发告警,而非 SLI 单次超标。
# 示例:基于 Prometheus 的 SLI 聚合查询(p99 延迟)
histogram_quantile(0.99,
sum(rate(http_request_duration_seconds_bucket[5m])) by (le)
)
# 错误率计算
sum(rate(http_requests_total{status=~"5.."}[5m]))
/
sum(rate(http_requests_total[5m]))
降噪关键:将 SLI 聚合到 SLO 错误预算后,告警从“指标值 > 阈值”转变为“错误预算消耗速率 > 阈值”。这能过滤掉瞬时抖动,只关注持续恶化趋势,大幅降低告警噪音。