3. SLI 口径定义:四大黄金信号的采集口径差异
在可观测性工程中,延迟、错误率、吞吐量、饱和度 被 Google SRE 定义为“四大黄金信号”。然而,Collector 的配置方式(如采样策略、聚合窗口、标签保留规则)会直接改变这些 SLI 的采集口径,导致同一服务在不同 Collector 配置下呈现截然不同的健康状态。本节将逐一拆解每个信号的口径定义与采集差异。
3.1 延迟(Latency)
延迟衡量请求从发出到收到完整响应的时间间隔。口径差异主要体现在分位数计算方式与采样偏差上。
| 口径维度 | 典型 Collector 配置 | 对 SLI 的影响 |
|---|---|---|
| 分位数计算 | Histogram(直方图)vs. Summary(摘要) | Histogram 支持聚合与分位数预估,但桶边界设置不当会引入误差;Summary 在客户端计算分位数,无法跨实例聚合 |
| 采样策略 | 头部采样(Head-based)vs. 尾部采样(Tail-based) | 头部采样可能遗漏高延迟尾部请求;尾部采样保留慢请求但增加存储开销 |
| 聚合窗口 | 1m / 5m / 10m 滑动窗口 | 窗口越短,对突发延迟越敏感,但噪声也越大;窗口过长会掩盖瞬态高延迟 |
实践建议:对于延迟 SLI,推荐使用 Histogram 配合
le 桶边界(如 10ms、50ms、100ms、500ms、1s、5s),并在 Collector 端启用尾部采样以捕获长尾请求。聚合窗口建议设为 5 分钟,兼顾敏感度与稳定性。
3.2 错误率(Error Rate)
错误率定义为失败请求数占总请求数的比例。口径差异集中在错误判定标准与状态码覆盖范围上。
- HTTP 状态码口径:仅统计 5xx(服务端错误)vs. 包含 4xx(客户端错误)vs. 包含所有非 2xx 状态码。不同口径下错误率可能相差数倍。
- 业务错误口径:即使返回 200,业务逻辑层仍可能返回错误码(如
{"code":5001,"msg":"库存不足"})。Collector 需配置 Body 解析规则 才能捕获此类错误。 - 超时与重试口径:客户端超时后自动重试,Collector 可能将重试请求视为独立请求,导致错误率被稀释或放大。
| 错误类型 | Collector 配置要点 | 口径差异示例 |
|---|---|---|
| HTTP 5xx | 匹配 status_code >= 500 |
仅统计服务端故障,口径最窄 |
| HTTP 4xx+5xx | 匹配 status_code >= 400 |
包含客户端错误,口径中等 |
| 业务错误 | 配置 Body 解析 + 正则匹配 "code":\s*[4-5]\d{3} |
捕获业务逻辑失败,口径最宽 |
| 超时重试 | 启用 Span 关联 + 重试标记 | 避免重复计数,口径更精确 |
常见陷阱:仅依赖 HTTP 5xx 作为错误率 SLI 会严重低估故障影响。例如,缓存穿透导致数据库超时,但网关返回 504 的比例可能只有 1%,而业务错误率可能高达 15%。建议至少同时采集 HTTP 5xx 与业务错误码两个口径。
3.3 吞吐量(Throughput)
吞吐量通常以 RPS(Requests Per Second) 或 TPS(Transactions Per Second) 表示。口径差异主要源于计数窗口与请求去重策略。
- 原始计数 vs. 成功计数:Collector 可配置为统计所有请求(含失败)或仅统计成功请求。前者反映系统负载,后者反映有效产出。
- 去重策略:重试请求是否重复计数?Collector 需通过 Trace ID 或请求唯一标识进行去重,否则吞吐量会被高估。
- 聚合粒度:按 endpoint、service、instance 聚合的吞吐量口径差异显著。粗粒度聚合可能掩盖局部热点。
3.4 饱和度(Saturation)
饱和度衡量系统资源被利用的程度,通常以百分比或排队深度表示。口径差异主要源于资源定义与阈值设定。
| 资源类型 | 常见采集指标 | 口径差异说明 |
|---|---|---|
| CPU | utilization / load average | utilization 仅反映使用率;load average 包含排队任务,更能体现饱和度 |
| 内存 | used / available / pressure | used 口径可能包含缓存,低估饱和度;PSI(Pressure Stall Information)更准确 |
| 磁盘 I/O | iowait / queue depth / latency | iowait 仅反映 CPU 等待时间;queue depth 直接反映 I/O 排队情况 |
| 网络 | bandwidth utilization / drop rate | 带宽利用率可能忽略小包冲击;丢包率更能反映网络饱和 |
| 连接池 | active connections / pending requests | active 反映当前使用量;pending 反映排队深度,是更敏感的饱和度指标 |
核心原则:饱和度 SLI 应优先选择排队深度或压力指标(如 PSI、连接池 pending 数),而非简单的资源利用率。利用率达到 100% 时系统可能早已过载,而排队深度在利用率达到 60%-70% 时就会开始显著增长。
3.5 四大黄金信号口径差异总结
| 黄金信号 | 核心口径 | Collector 配置关键点 | 常见口径偏差 |
|---|---|---|---|
| 延迟 | p50 / p90 / p99 延迟 | Histogram 桶边界、采样策略、聚合窗口 | Summary 无法跨实例聚合;头部采样遗漏尾部延迟 |
| 错误率 | 失败请求 / 总请求 | 状态码范围、Body 解析、重试去重 | 仅统计 5xx 低估错误;重试请求重复计数 |
| 吞吐量 | RPS / TPS | 去重策略、聚合粒度、成功/全部计数 | 非去重口径在重试风暴时虚高 |
| 饱和度 | 排队深度 / 压力指标 | 资源定义、阈值设定、PSI 启用 | 利用率口径滞后于实际饱和点 |
最佳实践:在 Collector 配置中,为每个黄金信号至少保留两个口径(一个宽口径用于告警,一个窄口径用于 SLO 计算),并通过标签区分。例如:
error_rate:http_5xx 与 error_rate:business,throughput:raw 与 throughput:deduped。这样既能保证告警灵敏度,又能确保 SLO 计算的准确性。