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 分钟,兼顾敏感度与稳定性。
延迟采集口径对比:Histogram vs. Summary Histogram(直方图) • 桶边界:10ms, 50ms, 100ms, 500ms, 1s • 支持服务端聚合与分位数预估 • 可跨 Collector 实例合并 • 桶边界设置不当 → 精度损失 • 存储开销相对可控 Summary(摘要) • 客户端预计算 p50/p90/p99 • 无法跨实例聚合分位数 • 适合单实例精确分位数需求 • 多实例场景下聚合结果失真 • 存储开销随分位数数量线性增长 口径差异 选择建议:多实例聚合场景优先使用 Histogram;单实例精确分位数场景使用 Summary

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 聚合的吞吐量口径差异显著。粗粒度聚合可能掩盖局部热点。
吞吐量采集口径:去重 vs. 非去重 非去重计数 • 每次请求(含重试)均计数 • 反映实际网络流量与负载 • 重试风暴时吞吐量虚高 • 适合容量规划与成本分析 去重计数 • 基于 Trace ID 去重 • 反映真实用户请求量 • 重试不影响吞吐量指标 • 适合 SLO 计算与故障评估 口径差异 建议:同时采集两个口径,分别用于容量规划(非去重)与 SLO 计算(去重)

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 计算的准确性。