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% 通常意味着性能拐点即将到来 |
实践要点: 黄金信号强调“用户可感知”。例如,数据库的延迟指标应取自客户端侧(应用层),而非数据库内部视图,因为用户只关心端到端的响应时间。
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 监控。
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,掩盖真实性能问题。这是黄金信号中“延迟”与“错误”必须独立测量的核心原因。