3、容量规划工具:Prometheus监控体系、Grafana可视化、自定义指标采集

聊到容量规划,很多人第一反应是「拍脑袋」。但真正落地的团队,靠的是数据。而数据从哪来?就是监控体系。

我个人习惯把监控体系比作「眼睛」。没有它,你连系统跑在什么水位都不知道,谈何规划?今天我们就来拆解这套工具链:Prometheus 负责采集和存储,Grafana 负责展示,自定义指标则是你业务特有的「体检报告」。

3.1 Prometheus 监控体系:不止是拉取数据

Prometheus 的核心是 Pull 模型。它主动去目标机器上抓取指标,而不是等着被推送。这个设计有个好处:你只要配好 targets,它就能稳定采集,不受目标端故障影响。

我在项目中遇到过一个问题:某次业务高峰期,Pushgateway 被打爆了,所有推送数据全部丢失。后来我全面改用 Pull 模式,配合服务发现,再也没出过类似问题。

核心组件一览:

  • Prometheus Server:负责抓取、存储、查询
  • Exporters:暴露指标的代理,比如 node_exporter、mysqld_exporter
  • Alertmanager:处理告警,支持分组、抑制、静默
  • Pushgateway:用于短任务或无法直接 Pull 的场景

你想想看,一个典型的架构是什么样的?

Prometheus 监控体系架构图 Prometheus Server node_exporter mysqld_exporter 自定义 Exporter Pushgateway Alertmanager Grafana

说白了,Prometheus 就是通过 Exporters 把系统指标暴露成 HTTP 接口,然后自己定期去拉。拉回来的数据存在时序数据库里,你可以用 PromQL 做各种聚合计算。

3.2 Grafana 可视化:让数据会说话

数据光有数字不行,得变成图表。Grafana 就是干这个的。它支持 Prometheus 作为数据源,画折线图、柱状图、热力图都行。

我记得有一次帮客户做容量分析,他们服务器 CPU 使用率一直显示 30%,但业务就是卡。我打开 Grafana 一看,发现是平均聚合掩盖了真相。改成 P99 分位图后,瞬间看到每 10 秒就有一次 CPU 飙到 95%。

我的 Grafana 配置习惯:

  • 每个仪表盘只放 6-8 个面板,太多反而看不清
  • 关键指标用「红色」阈值线标出,比如 CPU 超过 80% 变红
  • 时间范围默认 6 小时,方便看趋势
  • 加上变量(Variables),可以切换不同机房或集群

举个例子,一个简单的 CPU 使用率面板,PromQL 查询是这样的:

100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)

这个查询的意思是:取过去 5 分钟 CPU 空闲时间的平均变化率,然后用 100 减去它,得到使用率。嗯,这里要注意:rate 函数必须用在 Counter 类型的指标上,Gauge 类型不能用。

3.3 自定义指标采集:你的业务,你说了算

系统指标(CPU、内存、磁盘)谁都会看。但容量规划真正值钱的地方,在于业务指标。比如:

  • 队列积压数量
  • 订单处理延迟
  • API 调用失败率
  • 数据库连接池使用率

这些指标 Prometheus 原生没有,得自己写 Exporter 暴露出来。

我曾经帮一个电商团队做过自定义指标。他们想知道「每秒新增订单数」和「库存扣减成功率」。我们用 Python 写了个简单的 Exporter,从业务数据库里查数据,然后暴露成 Prometheus 格式。

代码大概长这样:

from prometheus_client import start_http_server, Gauge
import time
import random

# 定义自定义指标
order_count = Gauge('app_orders_total', 'Total orders placed')
inventory_success = Gauge('app_inventory_success_rate', 'Inventory deduction success rate')

def collect_metrics():
    while True:
        # 模拟从业务系统获取数据
        orders = random.randint(100, 500)
        success_rate = random.uniform(0.95, 1.0)
        
        order_count.set(orders)
        inventory_success.set(success_rate)
        
        time.sleep(15)  # 每15秒采集一次

if __name__ == '__main__':
    start_http_server(8000)  # 暴露HTTP端口
    collect_metrics()

启动后,访问 http://localhost:8000/metrics 就能看到指标。然后在 Prometheus 配置里加上这个 target,Grafana 里就能画图了。

避坑指南:

我曾经犯过一个错:自定义指标采集频率太高,每 1 秒查一次数据库,结果把业务库查挂了。后来改成 15 秒一次,加上缓存,才稳住。记住:监控不能反噬业务。

3.4 容量规划中的关键指标

有了工具,还得知道看什么。我整理了一张表,是容量规划最常用的指标:

指标类别 具体指标 采集方式 容量规划用途
CPU 使用率、负载、上下文切换 node_exporter 判断是否需要扩容 CPU
内存 使用率、可用内存、Swap node_exporter 判断内存是否成为瓶颈
磁盘 使用率、IOPS、吞吐量 node_exporter 预估磁盘扩容时间点
网络 带宽使用率、丢包率 node_exporter 判断带宽是否够用
业务 QPS、延迟、错误率 自定义 Exporter 直接反映业务容量

你想想看,如果只盯着 CPU 看,可能内存早就爆了你还不知道。所以我的习惯是:每个服务至少监控 5 个维度的指标,然后统一放到 Grafana 的一个仪表盘里。

3.5 小结

Prometheus + Grafana + 自定义指标,这套组合拳打好了,容量规划就有了数据基础。说白了,工具只是手段,关键是你得知道「看什么」和「怎么看」。

我个人经验是:先跑通基础监控(CPU、内存、磁盘),再逐步加入业务指标。别想一口吃成胖子。等你把自定义指标也跑起来,你会发现——原来系统的真实水位,跟你之前想的完全不一样。

一句话总结: 监控是容量规划的「眼睛」,Prometheus 是采集器,Grafana 是显示器,自定义指标是放大镜。三者缺一不可。


专注资料整理