4. SLI 采集与度量:从数据源到可靠指标
SLI 的落地依赖高质量、低延迟的原始数据。本章聚焦 SLI 数据的三大采集来源(客户端、服务端、基础设施),以及如何通过度量方法与聚合策略将原始观测值转化为可用的 SLO 指标。
4.1 SLI 数据采集的三大来源
根据数据产生的位置,SLI 采集可分为三类。每类在覆盖度、延迟、准确性和运维成本上各有取舍。
| 采集来源 | 典型数据 | 优势 | 局限 |
|---|---|---|---|
| 客户端 | 真实用户页面加载、API 调用耗时、JS 错误率 | 反映真实用户体验,包含网络延迟 | 数据量大、采样率受限、隐私合规要求高 |
| 服务端 | 请求日志、响应状态码、处理耗时、错误计数 | 数据完整、易于聚合、控制精度高 | 无法感知客户端网络与设备差异 |
| 基础设施 | CPU/内存/磁盘/网络 IO、容器重启次数 | 覆盖容量与资源瓶颈,辅助定位根因 | 与用户体验间接相关,需映射到服务指标 |
选型建议: 核心 SLO(如可用性、延迟)优先采用服务端采集作为 truth source;用户体验类 SLO(如首屏加载时间)必须补充客户端真实数据;基础设施指标用于容量预警和故障排查,不宜直接作为 SLI 主体。
4.2 采集方式与协议
- 拉取(Pull)模式: Prometheus 为代表,服务端定期抓取目标端点。适合微服务、Kubernetes 环境,服务发现自动,但需保证抓取端可达。
- 推送(Push)模式: StatsD、OpenTelemetry Collector 为代表,应用主动上报指标。适合短生命周期任务、批处理、边缘设备,但需管理聚合网关。
- 日志提取: 从结构化日志(JSON、Protobuf)中解析请求耗时、状态码。适合已有日志系统的团队,但延迟较高,不适合高基数实时 SLI。
- 分布式追踪: 从 Span 中提取服务间调用延迟、错误信息。适合跨服务依赖分析,但采样率通常较低,需结合指标做降采样。
实践要点: 同一 SLI 尽量只采用一种采集方式,避免多源数据口径不一致导致 SLO 计算偏差。若必须多源,需在聚合层做对齐(如统一时间窗口、过滤条件)。
4.3 度量方法与聚合策略
原始数据采集后,需要经过度量与聚合才能形成可用的 SLI 时间序列。核心步骤包括:
- 事件计数: 统计时间窗口内总请求数、成功请求数、错误请求数。这是可用性 SLI 的基础。
- 延迟分位数: 对请求耗时排序,计算 p50、p90、p99 等分位值。推荐使用 T-Digest 或 HDR Histogram 以降低存储开销。
- 速率与比率: 计算错误率(错误数/总数)、饱和度(当前负载/容量上限)。
- 时间窗口聚合: 固定窗口(如 1 分钟、5 分钟)或滑动窗口(如 10 分钟滑动平均)。滑动窗口更平滑,但计算成本更高。
常见陷阱: 直接对原始延迟值求平均(mean)会掩盖长尾问题;使用算术平均计算错误率在低流量时段会剧烈波动。推荐使用分位数 + 滑动窗口组合,并配合 EWMA(指数加权移动平均)平滑。
4.4 SLI 采集与聚合架构
下图展示了一个典型的多源 SLI 采集与聚合流水线:
4.5 聚合策略对比与选型
| 聚合策略 | 适用场景 | 存储开销 | 实时性 | 抗噪能力 |
|---|---|---|---|---|
| 固定窗口计数 | 可用性 SLI(成功/失败计数) | 低 | 高 | 低(窗口边界抖动) |
| 滑动窗口平均 | 延迟 SLI、错误率 | 中 | 中 | 中 |
| 分位数(T-Digest) | 延迟分布、长尾分析 | 中 | 中 | 高 |
| EWMA | 错误率、饱和度 | 低 | 高 | 高(指数衰减) |
| 直方图(HDR) | 高精度延迟分位数 | 高 | 中 | 高 |
推荐组合: 可用性 SLI 使用滑动窗口计数 + 错误率 EWMA;延迟 SLI 使用HDR Histogram 计算 p50/p90/p99,并配合 10 分钟滑动窗口输出。避免在 SLI 层直接使用原始计数,务必经过至少一次时间窗口聚合。
4.6 采集与聚合的常见避坑
- 数据口径不一致: 客户端和服务端对“成功”的定义不同(如客户端认为 4xx 是失败,服务端认为 4xx 是正常业务逻辑)。必须在 SLI 定义阶段统一过滤条件。
- 高基数标签爆炸: 避免将 user_id、request_id 等无限基数标签加入 SLI 指标。使用聚合后的分桶或降采样。
- 采集延迟导致窗口错位: 客户端数据可能延迟到达,导致滑动窗口计算偏差。建议对客户端数据使用“事件时间”而非“处理时间”进行窗口划分。
- 忽略冷启动与空窗口: 新部署的服务在初始窗口内无数据,直接计算错误率会得到 0% 或 100% 的极端值。应设置最小样本数阈值(如至少 10 个请求才参与 SLI 计算)。
落地检查清单:
✅ 每个 SLI 明确标注采集来源(客户端/服务端/基础设施)
✅ 统一时间窗口长度(推荐 1 分钟原始粒度,10 分钟滑动聚合)
✅ 设置最小样本数阈值,避免空窗口或低流量误报
✅ 对分位数指标使用 T-Digest 或 HDR Histogram,不直接存储原始值
✅ 定期校验采集端与聚合端的数据一致性(如通过双写对比)
✅ 每个 SLI 明确标注采集来源(客户端/服务端/基础设施)
✅ 统一时间窗口长度(推荐 1 分钟原始粒度,10 分钟滑动聚合)
✅ 设置最小样本数阈值,避免空窗口或低流量误报
✅ 对分位数指标使用 T-Digest 或 HDR Histogram,不直接存储原始值
✅ 定期校验采集端与聚合端的数据一致性(如通过双写对比)