Prometheus + Grafana 在生产环境中的部署和监控模式,目前主流有以下几种:
Pull(拉模式)------ Prometheus 默认模式,也是最主流的
架构:
text
业务服务
│
├─ /metrics
│
Prometheus
│
▼
Grafana
例如:
text
Java应用
└── Micrometer
└── /actuator/prometheus
Prometheus
└── 每15秒拉取一次
Grafana
└── 查询Prometheus
Prometheus主动去目标服务拉取数据:
yaml
scrape_configs:
- job_name: java-app
static_configs:
- targets:
- 10.0.0.1:8080
- 10.0.0.2:8080
优点
- Prometheus掌控采集频率
- 服务无需主动上报
- 服务重启不影响
- 易于发现异常实例
缺点
- Prometheus必须能访问目标
- 跨网络、跨机房比较麻烦
Push(推模式)
通过 PushGateway:
text
Job
│
▼
PushGateway
│
▼
Prometheus
│
▼
Grafana
例如:
java
批处理任务
ETL任务
定时任务
数据同步任务
执行完成后:
java
pushAdd(...)
把指标推给 PushGateway。
使用场景
短生命周期任务:
text
CronJob
Spark Job
Flink Batch
数据清洗任务
因为这些任务可能几秒钟就结束了:
text
Prometheus还没来得及抓
进程已经退出
所以需要主动推送。
因此:
text
长期运行服务 → Pull
临时任务 → PushGateway
Service Discovery(服务发现)
这是现在 Kubernetes 环境最常见的模式。
text
Pod
Pod
Pod
↓ 自动发现
Prometheus
↓ 查询
Grafana
Prometheus自动发现实例:
yaml
kubernetes_sd_configs:
不需要手动维护:
yaml
targets:
- 10.0.0.1
- 10.0.0.2
- 10.0.0.3
实例扩容后自动加入监控。
现代云原生环境
基本都是:
text
Pull + Service Discovery
组合。
实际生产中最常见的做法是:
text
Actor系统
↓
Micrometer
↓
/actuator/prometheus
↓
Prometheus(Pull)
↓
Grafana
也就是 Pull + Service Discovery(如果有 K8S)。这是目前 Java 微服务领域最主流、最成熟的方案。