2. Metric Design 核心原则:黄金信号、USE 方法、RED 方法

在构建可观测性体系时,Metric Design 的核心在于选择正确的指标。业界经过多年实践,沉淀出三套经典方法论:黄金信号(The Four Golden Signals)、USE 方法(Utilization, Saturation, Errors) 和 RED 方法(Rate, Errors, Duration)。这三者分别从用户视角、资源视角和服务视角定义了“该测量什么”。

2.1 黄金信号:用户视角的四大支柱

黄金信号源自 Google SRE 实践,用于衡量用户所体验到的系统健康度。任何分布式系统都应优先关注以下四个维度:

信号 定义 典型指标示例 SLI 口径关注点
延迟(Latency) 请求从发出到收到响应所花费的时间 p50 / p95 / p99 响应时间 区分成功请求与失败请求的延迟;失败请求的快速返回会掩盖真实延迟
流量(Traffic) 系统当前承载的请求量级 QPS、RPS、并发连接数、吞吐量 流量突增或突降都是异常信号;需结合容量规划设定阈值
错误(Errors) 请求失败的比率 HTTP 5xx 率、超时率、业务错误码率 显式错误(HTTP 500)与隐式错误(返回 200 但业务失败)均需覆盖
饱和度(Saturation) 系统资源被消耗的程度 CPU 使用率、内存占用、磁盘 I/O 队列深度 饱和度超过 80% 通常意味着性能拐点即将到来
实践要点: 黄金信号强调“用户可感知”。例如,数据库的延迟指标应取自客户端侧(应用层),而非数据库内部视图,因为用户只关心端到端的响应时间。
黄金信号四象限关系图 黄金信号四象限:用户视角的 Metric Design 延迟 (Latency) p50 / p95 / p99 响应时间 区分成功与失败请求的延迟 避免“失败快、成功慢”的误导 流量 (Traffic) QPS / RPS / 并发连接数 反映系统当前负载水平 突增或突降均为异常信号 错误 (Errors) HTTP 5xx / 超时 / 业务错误码 显式错误 + 隐式错误 错误率是 SLI 最直接的信号 饱和度 (Saturation) CPU / 内存 / 磁盘 I/O 队列 超过 80% 进入性能拐点 资源瓶颈的前置预警 用户可感知的系统健康度

2.2 USE 方法:资源视角的瓶颈定位

USE 方法由 Brendan Gregg 提出,专注于资源层面的指标设计。对于每一个系统资源(CPU、内存、磁盘、网络),依次检查三个维度:

  • 利用率(Utilization):资源忙于处理工作的时间百分比。例如 CPU 利用率、磁盘带宽利用率。
  • 饱和度(Saturation):资源无法及时服务的额外排队工作量。例如 CPU 运行队列长度、磁盘 I/O 等待队列。
  • 错误(Errors):资源发生的错误事件计数。例如网卡丢包、磁盘坏道、内存 ECC 错误。
USE 方法的核心价值: 它提供了一种“自上而下”的排查框架。当延迟升高时,先检查资源的饱和度(队列深度),再检查利用率是否接近 100%,最后检查是否有硬件错误。这种顺序能最快定位瓶颈。
资源类型 利用率指标 饱和度指标 错误指标
CPU % CPU 使用率 CPU 运行队列长度(load average) CPU 故障 / 温度告警
内存 % 内存使用率 Swap 使用量 / OOM 事件 ECC 错误计数
磁盘 磁盘 I/O 利用率(% busy) I/O 等待队列深度(avgqu-sz) 磁盘坏道 / I/O 错误
网络 带宽利用率(bps) 网卡溢出 / 丢包率 网卡 CRC 错误 / 冲突计数

2.3 RED 方法:服务视角的请求健康度

RED 方法由 Tom Wilkie(Grafana / Prometheus 核心贡献者)提出,专为微服务架构设计。对于每一个服务,只需测量三个指标:

  • 速率(Rate):服务每秒处理的请求数(RPS)。对应黄金信号中的流量。
  • 错误(Errors):请求失败的比率。对应黄金信号中的错误。
  • 持续时间(Duration):请求处理所花费的时间分布。对应黄金信号中的延迟。
RED 方法与黄金信号的区别: RED 方法刻意省略了“饱和度”,因为服务层面的饱和度通常由底层资源(USE 方法)来覆盖。RED 方法强调“每个服务都应该有这三个指标”,非常适合 Kubernetes 环境下的 Service Mesh 监控。
RED 方法与 USE 方法的关系图 RED 方法(服务层)与 USE 方法(资源层)的协作关系 速率 (Rate) RPS / QPS 错误 (Errors) 错误率 / 异常计数 持续时间 (Duration) p50 / p95 / p99 服务层(RED 方法) 利用率 (Utilization) CPU / 内存 / 磁盘 % 饱和度 (Saturation) 队列深度 / 等待时间 错误 (Errors) 硬件错误 / 丢包 资源层(USE 方法) RED 方法回答“服务健康吗?” → USE 方法回答“哪里堵了?”

2.4 三套方法的对比与选型

在实际的 Metric Design 中,这三套方法并非互斥,而是互补的。下表总结了它们的适用场景和核心差异:

维度 黄金信号 USE 方法 RED 方法
视角 用户 / 终端体验 基础设施 / 资源 服务 / 应用
核心指标数 4 个(延迟、流量、错误、饱和度) 3 个(利用率、饱和度、错误) 3 个(速率、错误、持续时间)
最佳适用场景 面向用户的 Web 服务、API 网关 操作系统、数据库、网络设备 微服务、Service Mesh、Kubernetes
与 SLI 的关系 直接定义 SLI 的四个维度 为 SLI 提供资源层根因分析 简化 SLI 为三个核心指标
典型工具 Prometheus + Grafana Node Exporter / cAdvisor Prometheus + Service Mesh(Istio)
选型建议:
  • 如果你在定义用户可见的 SLI,优先使用黄金信号。
  • 如果你在排查基础设施瓶颈,优先使用USE 方法。
  • 如果你在构建微服务监控仪表盘,优先使用RED 方法。
  • 最佳实践:黄金信号 + RED 方法定义服务层 SLI,USE 方法定义资源层 SLI,形成完整的可观测性覆盖。

2.5 实践案例:从黄金信号到 SLI 口径

假设我们有一个电商平台的“商品详情页”服务,使用黄金信号定义 SLI 口径:

# 延迟 SLI:p99 响应时间 < 500ms
histogram_quantile(0.99, 
  sum(rate(http_request_duration_seconds_bucket{service="product-detail", status!~"5.."}[5m])) 
  by (le)
)

# 流量 SLI:QPS 在基线 ±20% 范围内
sum(rate(http_requests_total{service="product-detail"}[5m]))

# 错误 SLI:错误率 < 0.1%
sum(rate(http_requests_total{service="product-detail", status=~"5.."}[5m])) 
/ 
sum(rate(http_requests_total{service="product-detail"}[5m]))

# 饱和度 SLI:CPU 使用率 < 80%
avg(node_cpu_seconds_total{mode="idle", instance=~"product-detail.*"}) 
by (instance)
关键提醒: 在定义 SLI 口径时,务必明确“什么是成功”。例如,延迟 SLI 应排除错误请求(status!~"5.."),因为错误请求的快速返回会拉低 p99,掩盖真实性能问题。这是黄金信号中“延迟”与“错误”必须独立测量的核心原因。