3、容量规划工具:Prometheus监控体系、Grafana可视化、自定义指标采集
聊到容量规划,很多人第一反应是「拍脑袋」。但真正落地的团队,靠的是数据。而数据从哪来?就是监控体系。
我个人习惯把监控体系比作「眼睛」。没有它,你连系统跑在什么水位都不知道,谈何规划?今天我们就来拆解这套工具链:Prometheus 负责采集和存储,Grafana 负责展示,自定义指标则是你业务特有的「体检报告」。
3.1 Prometheus 监控体系:不止是拉取数据
Prometheus 的核心是 Pull 模型。它主动去目标机器上抓取指标,而不是等着被推送。这个设计有个好处:你只要配好 targets,它就能稳定采集,不受目标端故障影响。
我在项目中遇到过一个问题:某次业务高峰期,Pushgateway 被打爆了,所有推送数据全部丢失。后来我全面改用 Pull 模式,配合服务发现,再也没出过类似问题。
核心组件一览:
- Prometheus Server:负责抓取、存储、查询
- Exporters:暴露指标的代理,比如 node_exporter、mysqld_exporter
- Alertmanager:处理告警,支持分组、抑制、静默
- Pushgateway:用于短任务或无法直接 Pull 的场景
你想想看,一个典型的架构是什么样的?
说白了,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 是显示器,自定义指标是放大镜。三者缺一不可。