四大黄金信号 · 以及三套方法论的关系

Google SRE 的 Latency、Traffic、Errors、Saturation。这一章讲清它和 RED/USE 的关系(它其实是 RED + 饱和度)、它独有的两个洞见——「成功请求和失败请求的延迟要分开看」以及「饱和度要看趋势和预测」。

作者 David更新于 第 16 篇(共 52 篇)

四大黄金信号 · 以及三套方法论的关系

第三套方法论来自 Google 的《SRE Book》——四大黄金信号(Four Golden Signals)。书里的说法很硬气:如果你只能测四个指标,就测这四个。

信号含义
Latency请求耗时
Traffic流量(请求速率)
Errors错误率
Saturation饱和度:系统“有多满”

它和 RED/USE 是什么关系

一眼就能看出来:黄金信号 ≈ RED + 饱和度。

黄金信号对应
Latency= RED 的 Duration
Traffic= RED 的 Rate
Errors= RED 的 Errors
Saturation= USE 的 Saturation ← 多出来的这个

所以三套方法论的关系是:

  • RED 从服务/请求视角出发,给出三个信号。
  • USE 从资源视角出发,给出三个信号。
  • 黄金信号从面向用户的整体系统视角出发,把 RED 的三个 + USE 里最重要的那个(饱和度)合在一起。

它们不矛盾,是同一片领土的三张地图。 实践中你不需要“三选一”,而是:对服务用 RED、对资源用 USE,而黄金信号提醒你:别忘了饱和度也是面向用户的一等信号。

为什么 Google 要把饱和度提到服务层

这是黄金信号最有价值的地方——它把“饱和度”从资源指标提升成了服务级的一等信号:

因为饱和度是唯一有预测性的信号。 其他三个都是滞后的:

  • Latency 涨了 → 已经慢了,用户已经在受苦。
  • Errors 涨了 → 已经错了,用户已经看到 500 了。
  • Traffic 变了 → 那是外部输入,不是你的健康。

只有饱和度是“提前量”:线程池用了 80%、磁盘还剩 20%、连接池快满了——这些时候用户还什么都没感觉到,但你知道再涨一点就要出事。

这就是“叫醒你”和“叫醒你时已经晚了”的区别。 基于 Latency/Errors 的告警本质上是事后通知(SLO 已经在燃烧了);基于饱和度的告警是事前预警,你还有时间扩容。

《SRE Book》强调饱和度要看“趋势和预测”,而不只是当前值:

# 不只问"磁盘满了吗",要问"按这个速度,多久会满"
# predict_linear:基于过去 6 小时趋势,预测 4 小时后的值
predict_linear(node_filesystem_avail_bytes{mountpoint="/"}[6h], 4*3600) < 0

这条查询的意思是:“按当前增长速度,4 小时内磁盘会满”——它在磁盘还有 30% 空间时就告警,给你充足的处理时间。这比“磁盘使用率 > 90%”这种静态阈值高明得多:后者在小盘上太晚(90% 时可能只剩几分钟),在大盘上太早(90% 的 10TB 盘还剩 1TB,能撑一周)。第 5 部分讲阈值时会展开这个思路。

黄金信号独有的洞见:成功和失败的延迟要分开

《SRE Book》里有个容易被忽略、但极其实用的提醒:

失败请求的延迟会污染你的延迟指标——必须把成功和失败分开统计。

两种污染方向,都很致命:

  • 失败得快 —— 服务过载时快速返回 503(fail fast),这些请求耗时极短。它们混进整体延迟里,会把 P99 拉低——于是系统越是在崩溃,延迟指标看起来越健康。这是个极其危险的假象:告警不响,但用户全在看错误页。
  • 失败得慢 —— 超时的请求耗时 = 超时时间(比如 30s)。它们会把 P99 拉高到超时值附近,掩盖了成功请求的真实延迟变化。

正确做法:延迟按 status 分开看。

# ✅ 只看成功请求的 P99(这才是"用户成功时等了多久")
histogram_quantile(0.99,
  sum(rate(http_request_duration_seconds_bucket{status=~"2.."}[5m])) by (le)
)

# 失败请求的延迟单独看(它有自己的意义:失败得快还是慢?)
histogram_quantile(0.99,
  sum(rate(http_request_duration_seconds_bucket{status=~"5.."}[5m])) by (le)
)

记住这个组合:成功率(E)+ 成功请求的延迟(D)。 这两个一起才完整描述了“用户体验”:有多少人成功了,以及成功的人等了多久。混在一起的 P99 是个会骗人的数。

实战:一张服务健康看板该有什么

把三套方法论落成一张真正有用的看板:

图表加载中…

这张看板的关键是分层**,而不是把 50 个图平铺在一页。**

  • 第一层(4 个图) —— 回答“现在用户体验好吗”。平时只看这一层。 全绿就可以关掉页面去干活。
  • 第二层 —— 第一层红了才看:“是哪一跳的问题”(本服务还是下游)。
  • 第三层 —— 定位到某一跳后才看:“是哪个资源”(USE)。

这个分层结构直接对应上一章的排障算法:症状 → 哪一跳 → 哪个资源。看板的结构应该长得像排障的思路,而不是像“我们能采到的指标列表”。

一个检验标准:如果值班的人被叫醒后,能顺着看板从上往下在 5 分钟内定位到根因,这个看板就是好的;如果他还是得去 tail 日志或者问人,那这个看板就是装饰品。

三套方法论速查

你要监控的东西用信号
HTTP/gRPC 服务、消息消费者REDRate、Errors、Duration
CPU/内存/磁盘/网络/连接池/线程池USEUtilization、Saturation、Errors
整个面向用户的系统(顶层看板)黄金信号Latency、Traffic、Errors、Saturation
业务健康没有方法论靠你对业务的理解(第 1 章说过)

小结与下一章

四大黄金信号 = Latency、Traffic、Errors、Saturation,本质是 RED + 饱和度——三套方法论是同一片领土的三张地图,不用三选一(服务用 RED、资源用 USE、顶层看板用黄金信号)。它最大的贡献是把饱和度提升为服务级一等信号,因为饱和度是唯一有预测性的信号(延迟和错误都是滞后的——响的时候用户已在受苦;饱和度让你在出事前扩容);故饱和度要看趋势和预测(predict_linear 比静态阈值高明,后者在小盘上太晚、大盘上太早)。独有洞见:成功与失败的延迟必须分开——失败得快会把 P99 拉低(系统越崩指标越健康,危险的假象),失败得慢会把 P99 顶到超时值(掩盖真实延迟);正确组合是成功率 + 成功请求的延迟。看板要分层(用户视角 → 哪一跳 → 哪个资源),结构应该长得像排障思路。

方法论说完了“该测什么”。接下来是“怎么把它定义好”——命名、标签、以及那条不能碰的基数红线。👉 怎么定义指标。

参考资料

  • [1] Google《SRE Book》第 6 章「Monitoring Distributed Systems」——四大黄金信号。
  • [2] Prometheus 官方文档:predict_linear。
  • [3] 关联RED、USE、告警阈值。

本页目录