Prometheus + Grafana 原理和用法(通俗易懂版)
我们可以把这个组合想象成 「智能体检中心」:
- Prometheus = 体检医生:主动上门,定期采集服务器/应用的“健康数据”(CPU、内存、接口响应时间等),并把数据存起来。
- Grafana = 体检报告可视化工具:把 Prometheus 存的枯燥数据,变成直观的折线图、仪表盘,一眼就能看出“健康状况”。
一、核心原理
1. 整体工作流程(故事场景)
假设你负责一个电商系统的服务器,想监控它的运行状态:
-
数据采集(Prometheus 主动拉取)
- 你的服务器/应用需要暴露一个 Metrics 接口(比如
http://服务器IP:9090/metrics),这个接口会返回当前的监控数据(例如cpu_usage 60表示CPU使用率60%)。 - Prometheus 会按照你配置的 采集间隔(比如10秒一次),主动去这个接口“拉取”数据——就像医生定期上门量血压。
- 支持的采集目标:服务器(Node Exporter)、Java 应用(JMX Exporter)、MySQL(MySQL Exporter)等,几乎所有中间件都有对应的 Exporter。
- 你的服务器/应用需要暴露一个 Metrics 接口(比如
-
数据存储(时序数据库)
- Prometheus 把拉取到的数据存在自己的 时序数据库(TSDB) 里。时序数据库的特点是:按时间戳存储数据,适合快速查询“某段时间内的指标变化”。
- 数据会有 保留时间(比如保留15天),超过时间自动删除,避免磁盘占满。
-
数据查询(PromQL 语言)
- Prometheus 提供了专用查询语言 PromQL,可以对数据做计算和筛选。
- 比如查CPU使用率:
avg(cpu_usage) by (instance)(按服务器分组计算平均CPU使用率)。 - 比如查接口5xx错误率:
sum(http_requests{code="500"}) / sum(http_requests)。
- 比如查CPU使用率:
- Prometheus 提供了专用查询语言 PromQL,可以对数据做计算和筛选。
-
可视化与告警(Grafana 联动)
- Grafana 不存数据,它是一个“中间商”:连接 Prometheus 作为 数据源,然后用 PromQL 查数据,再做成可视化图表。
- 同时可以配置 告警规则:比如CPU使用率超过90%持续5分钟,就自动发邮件/钉钉通知你。
2. 核心特点
| 组件 | 优点 | 缺点 |
|---|---|---|
| Prometheus | 轻量级、部署简单、自带时序库 | 不适合存储超大量历史数据(需搭配远程存储如Thanos) |
| Grafana | 图表美观、支持多数据源、开源免费 | 依赖外部数据源,自身不采集数据 |
二、实战用法(Docker 快速部署,5分钟搞定)
我们用 Docker 部署一个最基础的监控环境:监控服务器CPU/内存 + 可视化仪表盘
步骤1:部署 Node Exporter(采集服务器硬件数据)
Node Exporter 是 Prometheus 官方的服务器监控工具,负责收集CPU、内存、磁盘等数据。
# 启动 Node Exporter,暴露 9100 端口供 Prometheus 采集
docker run -d \--name node_exporter \--net="host" \--pid="host" \-v "/:/host:ro,rslave" \quay.io/prometheus/node-exporter:latest \--path.rootfs=/host
验证:访问 http://你的服务器IP:9100/metrics,能看到一堆监控数据就说明成功了。
步骤2:部署 Prometheus(采集+存储数据)
- 创建 Prometheus 配置文件
prometheus.yml:
global:scrape_interval: 10s # 采集间隔,10秒拉一次数据scrape_configs:# 采集 Node Exporter 的数据- job_name: 'node_exporter'static_configs:- targets: ['你的服务器IP:9100'] # Node Exporter 的地址
- 启动 Prometheus 容器:
docker run -d \--name prometheus \-p 9090:9090 \-v $(pwd)/prometheus.yml:/etc/prometheus/prometheus.yml \prom/prometheus:latest
验证:访问 http://你的服务器IP:9090,在 PromQL 查询框输入 node_cpu_seconds_total,能查到CPU数据就OK。
步骤3:部署 Grafana(可视化数据)
- 启动 Grafana 容器:
docker run -d \--name grafana \-p 3000:3000 \grafana/grafana:latest
-
配置 Grafana 连接 Prometheus
- 访问
http://你的服务器IP:3000,默认账号密码:admin/admin。 - 登录后 → 左侧 Configuration → Data Sources → Add data source → 选择 Prometheus。
- 填写 Prometheus 地址:
http://你的服务器IP:9090→ 点击 Save & test,提示“Data source is working”就成功了。
- 访问
-
导入官方仪表盘(一键可视化)
- Grafana 社区有大量现成的仪表盘模板,不用自己从零画。
- 左侧 Dashboards → Import → 输入模板ID
1860(Node Exporter 官方模板)→ 选择刚才配置的 Prometheus 数据源 → 点击 Import。 - 搞定!你会看到一个炫酷的服务器监控仪表盘,包含CPU、内存、磁盘、网络的实时数据。
三、进阶用法
-
监控 Java 应用
- 用 JMX Exporter 采集 JVM 指标(堆内存、线程数、GC次数),配置到 Prometheus 后,导入 Grafana 的 JVM 模板(ID:8563)。
-
配置告警
- 在 Prometheus 中配置
alert_rules.yml,定义告警规则(比如CPU>90%)。 - 部署 AlertManager 处理告警通知,支持邮件、钉钉、微信等渠道。
- 在 Grafana 中也可以直接配置告警,更简单直观。
- 在 Prometheus 中配置
-
大规模监控
- 单台 Prometheus 不够用?用 Prometheus Federation(联邦集群)实现分级采集。
- 历史数据归档?搭配 Thanos 实现无限存储和全局查询。
四、关键总结
- Prometheus 是 拉模式 采集数据,需要被监控端暴露 Metrics 接口。
- PromQL 是核心,学会它才能灵活查询数据。
- Grafana 是可视化神器,社区模板能帮你省90%的画图时间。
我可以帮你整理一份Java应用监控的完整配置清单,包括JMX Exporter配置和Grafana JVM仪表盘导入步骤,需要吗?