指标监控体系:四大黄金信号
第4章 · 指标监控体系

4、指标监控体系:四大黄金信号

说实话,做SRE这么多年,我踩过最大的坑就是——指标太多,重点全丢。你想想看,一个订单系统几百个指标,CPU、内存、线程数、GC次数……全堆在Grafana上,出了事根本不知道看哪张图。

后来我学乖了。Google的SRE圣经里提过四个黄金信号,我把它当成监控的「宪法」。说白了,你只要盯住这四个维度,90%的根因都能在30秒内圈定范围。今天我就把这套打法拆开揉碎讲给你。

四大黄金 信号 📊 延迟 请求耗时 / P99 📈 流量 QPS / 请求速率 ❌ 错误 错误率 / 异常数 ⚡ 饱和度 资源使用率 → 四个维度交叉分析,30秒锁定根因范围

4.1 四大黄金信号:到底盯什么?

这四个信号不是拍脑袋定的。我经历过一次线上事故,订单延迟从50ms飙到3s,第一反应是看CPU——结果CPU才30%。后来发现是数据库连接池被打满了,这就是典型的「饱和度」问题。所以四个信号必须一起看。

信号核心含义订单场景举例我常用的指标
延迟请求处理耗时下单接口P99延迟http_request_duration_seconds
流量系统负载压力每秒订单创建数http_requests_total
错误失败请求比例下单失败率 > 1%http_requests_errors_total
饱和度资源耗尽程度数据库连接池使用率db_connections_used / max
我的经验法则: 延迟飙升 + 流量平稳 = 大概率是代码或依赖问题;延迟飙升 + 流量暴涨 = 容量问题;错误率上升 + 饱和度升高 = 资源瓶颈。

4.2 Prometheus指标采集:怎么收?

Prometheus是我最顺手的工具。它拉取指标的方式,说白了就是「定时去你家门口拿快递」。你只需要在服务里暴露一个/metrics端点,Prometheus每15秒来取一次。

我习惯把指标分成三类:

  • Counter:只增不减,比如请求总数、错误总数。适合看速率。
  • Gauge:可增可减,比如内存使用量、连接数。适合看当前值。
  • Histogram:分布统计,比如请求延迟的P50/P90/P99。这个最有用。

给你看一段我实际在订单服务里用的采集配置:

# 订单服务 metrics 端点暴露示例 (Go + Prometheus client)
http.Handle("/metrics", promhttp.Handler())

// 自定义指标:订单创建延迟直方图
orderCreateDuration := prometheus.NewHistogramVec(
    prometheus.HistogramOpts{
        Name:    "order_create_duration_seconds",
        Help:    "订单创建耗时分布",
        Buckets: []float64{0.01, 0.05, 0.1, 0.5, 1, 2, 5},
    },
    []string{"status", "payment_method"},
)
prometheus.MustRegister(orderCreateDuration)
我个人习惯把Bucket设置得「前密后疏」。因为订单延迟大部分在100ms以内,所以0.01、0.05、0.1这几个桶要细。后面到秒级可以放宽。

4.3 Grafana看板设计:一眼看出问题

Grafana看板不是堆图表。我见过最烂的看板——一个页面放了40张图,滚动三屏都看不到底。出了事,运维小哥得拿放大镜找。

我的设计原则只有三条:

  1. 从上到下,按黄金信号分层。第一行放延迟和错误,第二行放流量和饱和度。
  2. 红色警报放左边。人眼习惯从左往右扫,最重要的错误率、P99延迟放左上角。
  3. 每个面板只放一个指标。别把CPU和内存画在一张图上,混在一起谁也看不清。

下面是我为订单延迟做的看板JSON片段(核心部分):

{
  "title": "订单执行延迟 · 黄金信号看板",
  "panels": [
    {
      "title": "P99 延迟 (最近1小时)",
      "type": "graph",
      "targets": [{
        "expr": "histogram_quantile(0.99, 
          rate(order_create_duration_seconds_bucket[5m]))",
        "legendFormat": "P99"
      }],
      "yaxis": {"unit": "s"}
    },
    {
      "title": "错误率",
      "type": "graph",
      "targets": [{
        "expr": "rate(order_create_errors_total[5m]) 
          / rate(order_create_total[5m]) * 100",
        "legendFormat": "错误率%"
      }]
    }
  ]
}
我曾经犯过一个错:把P99和平均延迟画在一起,结果P99飙到2s,平均值才200ms,看起来一片祥和。后来我把平均值去掉了——平均值在SRE眼里就是「温水煮青蛙」。

4.4 实战:订单延迟根因定位的监控组合拳

假设你现在看到Grafana上订单P99延迟从100ms涨到了800ms。别慌,按这个顺序查:

  • 第一步:看错误率。如果错误率也涨了,大概率是下游服务挂了(比如支付网关超时)。
  • 第二步:看流量。如果QPS翻倍了,那就是促销流量导致延迟增加,加机器就行。
  • 第三步:看饱和度。如果数据库连接池使用率到了95%,那就是连接不够,要么扩连接池,要么优化SQL。
  • 第四步:看延迟分布。用Histogram看是P50涨了还是P99涨了。P50涨说明普遍慢,P99涨说明有长尾请求。

我记得有一次,P99涨到1.2s,但P50只有80ms。我一看Histogram,发现有个别请求耗时超过5s。顺着trace一查,是某个订单触发了库存锁重试。这就是长尾问题的典型特征。

一句话总结: 四个黄金信号是SRE的「体检四项」。延迟看快慢,流量看多少,错误看好坏,饱和度看够不够。把这四个盯住了,订单延迟的根因基本跑不掉。
专注资料整理