2. SLI 口径定义:构建可观测性的度量基石
SLI(Service Level Indicator,服务等级指标)是服务可靠性最直接的量化表达。但“延迟 200ms”或“成功率 99.5%”这类数字本身没有意义——口径(Measurement Definition)决定了这些数字从哪来、覆盖什么、排除什么。口径定义不清晰,后续的聚合、阈值、SLO 都会产生偏差。
2.1 什么是 SLI 口径
SLI 口径是对一个可观测指标的完整定义,包含:测量对象、测量方法、数据来源、时间窗口以及有效条件。口径决定了“这个数字到底在描述什么”。
核心公式:
SLI = 有效事件中符合成功标准的计数 / 有效事件总数 × 100%
SLI = 有效事件中符合成功标准的计数 / 有效事件总数 × 100%
例如“API 请求成功率 99.5%”这个 SLI,其口径必须明确:
- 测量对象:所有到达网关的 HTTP 请求(排除健康检查、爬虫流量)
- 成功标准:HTTP 状态码 2xx 或 3xx,且响应体不含业务错误码
- 数据来源:API 网关访问日志(非客户端埋点)
- 时间窗口:滚动 5 分钟窗口,每 1 分钟采样一次
2.2 口径的粒度与范围
口径的粒度(Granularity)和范围(Scope)直接影响 SLI 的敏感度和可操作性。粒度越细,越能定位问题;范围越宽,越能反映整体健康度。
| 维度 | 细粒度 | 粗粒度 |
|---|---|---|
| 时间粒度 | 1 秒 / 1 分钟窗口 | 1 小时 / 1 天窗口 |
| 空间粒度 | 单 Pod / 单实例 | 整个集群 / 区域 |
| 请求粒度 | 单 API 端点 / 单用户 | 全量请求聚合 |
| 适用场景 | 故障定位、根因分析 | 整体健康度、SLO 报告 |
实践建议:先定义粗粒度口径用于 SLO 报告,再按需下钻到细粒度口径用于排障。不要一开始就追求最细粒度,否则指标基数会爆炸。
口径的范围还需要明确包含与排除规则:
- 包含:生产环境所有用户流量、内部服务间调用、核心业务流程
- 排除:预发布环境、压测流量、健康检查、已知的灰度实验组、非关键路径(如静态资源)
2.3 常见口径类型
在 SRE 实践中,最常用的三类 SLI 口径是:请求成功率、延迟和错误率。它们覆盖了可用性、性能和正确性三个核心维度。
2.3.1 请求成功率(Availability / Success Rate)
衡量服务是否正常响应请求。口径定义要点:
- 成功定义:HTTP 2xx/3xx + 业务状态码为成功(如 JSON 中 code=0)
- 失败定义:HTTP 5xx、超时、连接拒绝、业务错误码
- 计算方式:成功请求数 / 总请求数 × 100%
- 典型阈值:99.9% ~ 99.99%
2.3.2 延迟(Latency / Response Time)
衡量服务响应速度。口径定义要点:
- 测量点:客户端发起请求到收到完整响应的时间(端到端延迟)
- 聚合方式:通常使用百分位值(p50、p95、p99),而非平均值
- 成功/失败处理:失败请求的延迟是否计入?通常建议计入,因为超时本身就是延迟问题
- 典型阈值:p99 < 200ms(高交互服务),p99 < 1s(批处理服务)
2.3.3 错误率(Error Rate)
衡量请求中发生错误的比例。与成功率互补,但更关注错误类型分布。
- 错误分类:客户端错误(4xx)、服务端错误(5xx)、业务逻辑错误
- 口径粒度:按错误码、按模块、按错误类型分别定义
- 计算方式:错误请求数 / 总请求数 × 100%
- 典型阈值:错误率 < 0.1%(高可靠服务),错误率 < 1%(一般服务)
常见陷阱:不要将“错误率”简单等同于“1 - 成功率”。成功率通常只关注服务端错误,而错误率可能包含客户端错误(4xx)和业务错误。两者口径必须独立定义,避免混淆。
2.4 三类口径的关系与选择
三类口径并非互斥,而是从不同维度描述服务质量。一个完整的 SLI 体系通常同时包含这三类口径。
2.5 口径定义清单示例
以下是一个实际微服务场景的口径定义模板:
| SLI 名称 | 口径类型 | 成功标准 | 数据来源 | 排除规则 | 时间窗口 |
|---|---|---|---|---|---|
| order-api-success-rate | 请求成功率 | HTTP 2xx + code=0 | Kong 网关日志 | 健康检查、压测 | 1 分钟滚动 |
| order-api-p99-latency | 延迟 | 响应时间 < 500ms | 应用侧 Prometheus | 超时请求计入 | 5 分钟滚动 |
| order-api-5xx-rate | 错误率 | HTTP 5xx 占比 | Kong 网关日志 | 4xx 不计入 | 1 分钟滚动 |
关键原则:口径定义必须可复现——不同 SRE 工程师根据同一份口径定义,应该能计算出完全相同的 SLI 数值。建议将口径定义写入版本控制(如 YAML 配置文件),与监控系统联动。