
业务场景描述
在大型分布式系统中,核心服务无法通过传统拉取(scrape)方式收集所有业务指标,尤其是短命批处理任务、异步消息消费等场景。我们需要将这些自定义指标主动推送到监控系统,并对关键指标设置告警策略,确保在异常时能够及时发现并响应。本文结合生产环境经验,介绍如何基于Prometheus Pushgateway 与Alertmanager搭建可靠的自定义指标监控与告警体系。
技术选型过程
- Prometheus:开源度高,生态完善,支持多种Exporter和Alertmanager集成。
- Pushgateway:适用于短生命周期或不易被Prometheus直接抓取的应用,用于临时保存推送的指标。
- Alertmanager:Prometheus官方告警组件,支持多种告警方式(邮件、钉钉、企业微信、Slack等)。
- Micrometer:Java生态常用指标采集库,可无缝集成Spring Boot项目,支持Pushgateway后端。
综合考虑,选用Prometheus + Pushgateway + Alertmanager,并在Java微服务中使用Micrometer进行指标推送。
实现方案详解
系统架构
- 各微服务(批处理、异步消费者)通过Micrometer将指标推送至Pushgateway
- Prometheus定时(如30s)从Pushgateway抓取自定义指标
- Alertmanager根据Prometheus告警规则进行告警分发
text
+------------+ +---------------+ +-------------+ +--------------+
| Service A | ----> | Pushgateway | <---- | Service B | | Batch Jobs |
+------------+ +---------------+ +-------------+ +--------------+
| | | |
v v v v
+--------------------------------------------------------------------------+
| Prometheus |
+--------------------------------------------------------------------------+
|
v
+-----------------+
| Alertmanager |
+-----------------+
部署方式(Docker Compose示例)
yaml
version: '3.7'
services:
prometheus:
image: prom/prometheus:v2.31.1
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
ports:
- '9090:9090'
pushgateway:
image: prom/pushgateway:v1.4.1
ports:
- '9091:9091'
alertmanager:
image: prom/alertmanager:v0.23.0
volumes:
- ./alertmanager.yml:/etc/alertmanager/alertmanager.yml
ports:
- '9093:9093'
prometheus.yml
yaml
global:
scrape_interval: 30s
scrape_configs:
- job_name: 'pushgateway'
honor_labels: true
static_configs:
- targets: ['pushgateway:9091']
alertmanager.yml
yaml
route:
receiver: 'team_email'
receivers:
- name: 'team_email'
email_configs:
- to: 'oncall@example.com'
from: 'alertmanager@example.com'
smarthost: 'smtp.example.com:587'
auth_username: 'alertmanager@example.com'
auth_identity: 'alertmanager@example.com'
auth_password: 'password'
代码示例(Spring Boot + Micrometer)
- 引入依赖(pom.xml)
xml
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus-pushgateway</artifactId>
</dependency>
- 配置Pushgateway客户端(application.yml)
yaml
management:
metrics:
export:
prometheus:
enabled: false # 禁用默认拉取接口
pushgateway:
enabled: true
base-url: http://pushgateway:9091
push-rate: 30s
job: my-service
- 自定义指标推送示例
java
@RestController
public class JobController {
private final PushGateway pushGateway;
private final CollectorRegistry registry;
@Autowired
public JobController() throws MalformedURLException {
this.registry = CollectorRegistry.defaultRegistry;
this.pushGateway = new PushGateway(new URL("http://pushgateway:9091"));
}
@PostMapping("/runJob")
public String runJob() throws IOException {
// 业务逻辑
long start = System.currentTimeMillis();
// ... 模拟执行任务
long duration = System.currentTimeMillis() - start;
// 构建自定义Histogram
Histogram histogram = Histogram.build()
.name("job_execution_duration_seconds")
.help("Job execution time in seconds")
.register(registry);
histogram.observe(duration / 1000.0);
// 推送到Pushgateway
pushGateway.pushAdd(registry, "my-service");
return "Job completed in " + duration + " ms";
}
}
踩过的坑与解决方案
-
指标重复推送导致Pushgateway堆积指标
解决:使用
pushAdd
替换push
,并定期清理过期job或配置--persistence.file
和--persistence.interval
。 -
Alertmanager无法发送邮件
解决:检查SMTP配置、SSL/TLS设置,确认防火墙及网络可达性。
-
Prometheus抓取Pushgateway标签不对齐
解决:开启
honor_labels: true
,保证推送标签在Prometheus侧保留。
总结与最佳实践
- 对短生命周期应用和批处理任务,优先使用Pushgateway主动推送指标。
- 推荐结合Micrometer与Pushgateway,简化Java项目集成成本。
- 告警策略应与SLO、业务重点结合,避免告警疲劳。
- 定期清理Pushgateway历史数据,防止磁盘占满。
- 在生产环境部署高可用Prometheus和Alertmanager,实现监控告警的可靠性。
通过本文方案,您可以快速为自定义指标构建全链路监控与告警系统,帮助团队在生产环境中高效定位问题,保障服务稳定性。