Prometheus 和 Grafana 之间的数据传输方式主要有以下几种:
1. Grafana 通过 PromQL 从 Prometheus 拉取数据(默认方式 ✅)
适用场景:大部分监控场景,Grafana 从 Prometheus 直接查询数据并可视化
原理
- Prometheus 定期抓取(scrape) 监控目标的数据,并存储在**时间序列数据库(TSDB)**中。
- Grafana 通过 Prometheus 数据源 使用 PromQL 查询数据,并展示在可视化面板上。
配置方式
- 在 Prometheus 配置监控目标 (
prometheus.yml
):scrape_configs: - job_name: 'my_application' static_configs: - targets: ['localhost:9090']
- 在 Grafana 配置 Prometheus 数据源:
- 进入 Grafana → Configuration → Data Sources
- 选择 Prometheus
- 设置 URL 为
http://<prometheus-server>:9090
- 点击 Save & Test
- 在 Grafana 创建仪表盘,使用 PromQL 查询数据:
rate(http_requests_total[5m])
优点
✅ 简单高效,Grafana 直接查询 Prometheus,无需额外组件
✅ 支持 PromQL,查询灵活
✅ 适用于大多数监控场景
缺点
❌ Grafana 只能查询,不会主动存储数据
❌ Prometheus 存储有限,数据只能保存一段时间(默认 15 天)
2. Prometheus 远程写入 (Remote Write) + Grafana Mimir / Thanos / Cortex
适用场景:大规模数据存储,历史数据分析,Prometheus 存储扩展
原理
- Prometheus 提供 Remote Write 机制,可以将数据写入远程存储(如 Grafana Mimir、Thanos、Cortex)。
- Grafana 直接连接 远程存储 进行数据查询,而不是查询 Prometheus。
配置方式
- 在 Prometheus (
prometheus.yml
) 配置远程写入:remote_write: - url: "http://mimir-gateway:9009/api/v1/push"
- 在 Grafana 配置远程存储作为数据源
- 进入 Grafana → Data Sources
- 选择 Prometheus
- URL 填写
http://mimir-gateway:9009
- 启用
Prometheus Remote Write
- Grafana 通过远程存储查询数据
优点
✅ 支持长期存储,避免 Prometheus 15 天数据过期问题
✅ 适用于大规模集群监控,数据可持久化
✅ 支持高可用,避免 Prometheus 单点故障
缺点
❌ 需要额外部署 Mimir/Thanos/Cortex,运维复杂
❌ 数据存储成本较高
3. Prometheus Pushgateway + Grafana
适用场景:短时任务(如定时任务、批处理)
原理
- Pushgateway 接收应用程序主动推送的监控数据,然后 Prometheus 定期拉取数据。
- Grafana 通过 Prometheus 查询 Pushgateway 存储的数据。
配置方式
- 启动 Pushgateway
./pushgateway --web.listen-address=":9091"
- 应用程序主动推送数据
echo "job_execution_time 5.3" | curl --data-binary @- http://localhost:9091/metrics/job/my_job
- 在 Prometheus (
prometheus.yml
) 配置 Pushgatewayscrape_configs: - job_name: 'pushgateway' static_configs: - targets: ['localhost:9091']
- Grafana 通过 Prometheus 查询数据
优点
✅ 适用于短时任务、批处理、定时任务
✅ 兼容 Prometheus 拉取模式
✅ 适用于无固定运行时间的应用(如 CI/CD 任务)
缺点
❌ Pushgateway 只能存储最新数据,不适合时间序列数据
❌ 数据不会自动过期,需要手动清理
4. Prometheus + Webhook / API 方式推送到 Grafana Loki / InfluxDB
适用场景:日志监控、外部系统数据推送
原理
- Prometheus 使用 Webhook 方式,主动推送数据到 Grafana Loki(日志监控) 或 InfluxDB(时序数据库)。
- Grafana 直接从 Loki/InfluxDB 查询数据,而不是查询 Prometheus。
配置方式
4.1 Loki(日志监控)
- 应用程序主动推送日志数据到 Loki
echo '{"streams": [{ "stream": { "app": "my_service" }, "values": [["'$(date +%s%N)'", "error: something went wrong"]] }]}' | curl -XPOST http://localhost:3100/loki/api/v1/push -H "Content-Type: application/json" --data-binary @-
- 在 Grafana 配置 Loki 作为数据源
- 进入 Grafana → Data Sources
- 选择 Loki
- URL 填写
http://localhost:3100
- 保存并测试
4.2 InfluxDB(时序数据库)
- 应用程序主动推送数据
curl -i -XPOST 'http://localhost:8086/write?db=mydb' --data-binary 'cpu_load_short,host=server01 value=0.64'
- 在 Grafana 配置 InfluxDB
- 进入 Grafana → Data Sources
- 选择 InfluxDB
- 配置 URL 为
http://localhost:8086
- 保存并测试
优点
✅ 适用于日志监控、IoT 数据监控
✅ 可以直接推送数据,无需 Prometheus
✅ 适用于应用程序不适合被 Prometheus 直接拉取的场景
缺点
❌ 需要额外的存储(Loki、InfluxDB)
❌ Grafana 不能直接存储数据,只能展示
总结:哪种方式适合你?
方式 | 适用场景 | 主要特点 | 依赖组件 |
---|---|---|---|
Prometheus 拉取模式 ✅ | 绝大多数监控 | Grafana 直接查询 Prometheus | Prometheus |
Remote Write(Mimir/Thanos) | 大规模存储 | 长期存储数据,解决 Prometheus 15 天限制 | Mimir/Thanos |
Pushgateway | 短时任务(CI/CD、批处理) | 应用主动推送数据,Prometheus 拉取 | Pushgateway |
Webhook / API(Loki/InfluxDB) | 日志监控 / IoT | 直接推送数据到 Loki/InfluxDB | Loki/InfluxDB |
推荐选择:
- 标准监控 → Prometheus 拉取模式
- 高并发数据存储 → 远程存储(Mimir/Thanos)
- 定时任务监控 → Pushgateway
- 日志监控 → Loki
- IoT 设备数据监控 → InfluxDB