基于Prometheus Pushgateway与Alertmanager的自定义指标监控与告警实践指南

业务场景描述

在大型分布式系统中,核心服务无法通过传统拉取(scrape)方式收集所有业务指标,尤其是短命批处理任务、异步消息消费等场景。我们需要将这些自定义指标主动推送到监控系统,并对关键指标设置告警策略,确保在异常时能够及时发现并响应。本文结合生产环境经验,介绍如何基于Prometheus PushgatewayAlertmanager搭建可靠的自定义指标监控与告警体系。

技术选型过程

  1. Prometheus:开源度高,生态完善,支持多种Exporter和Alertmanager集成。
  2. Pushgateway:适用于短生命周期或不易被Prometheus直接抓取的应用,用于临时保存推送的指标。
  3. Alertmanager:Prometheus官方告警组件,支持多种告警方式(邮件、钉钉、企业微信、Slack等)。
  4. 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)

  1. 引入依赖(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>
  1. 配置Pushgateway客户端(application.yml)
yaml 复制代码
management:
  metrics:
    export:
      prometheus:
        enabled: false   # 禁用默认拉取接口
      pushgateway:
        enabled: true
        base-url: http://pushgateway:9091
        push-rate: 30s
        job: my-service
  1. 自定义指标推送示例
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";
    }
}

踩过的坑与解决方案

  1. 指标重复推送导致Pushgateway堆积指标

    解决:使用pushAdd替换push,并定期清理过期job或配置--persistence.file--persistence.interval

  2. Alertmanager无法发送邮件

    解决:检查SMTP配置、SSL/TLS设置,确认防火墙及网络可达性。

  3. Prometheus抓取Pushgateway标签不对齐

    解决:开启honor_labels: true,保证推送标签在Prometheus侧保留。

总结与最佳实践

  • 对短生命周期应用和批处理任务,优先使用Pushgateway主动推送指标。
  • 推荐结合Micrometer与Pushgateway,简化Java项目集成成本。
  • 告警策略应与SLO、业务重点结合,避免告警疲劳。
  • 定期清理Pushgateway历史数据,防止磁盘占满。
  • 在生产环境部署高可用Prometheus和Alertmanager,实现监控告警的可靠性。

通过本文方案,您可以快速为自定义指标构建全链路监控与告警系统,帮助团队在生产环境中高效定位问题,保障服务稳定性。

相关推荐
Cherry的跨界思维4 天前
【AI测试全栈:质量】47、Vue+Prometheus+Grafana实战:打造全方位AI监控面板开发指南
vue.js·人工智能·ci/cd·grafana·prometheus·ai测试·ai全栈
AC赳赳老秦4 天前
云原生AI故障排查新趋势:利用DeepSeek实现高效定位部署报错与性能瓶颈
ide·人工智能·python·云原生·prometheus·ai-native·deepseek
予枫的编程笔记4 天前
【Kafka高级篇】Kafka监控不踩坑:JMX指标暴露+Prometheus+Grafana可视化全流程
kafka·grafana·prometheus·可观测性·jmx·kafka集群调优·中间件监控
AC赳赳老秦5 天前
预见2026:DeepSeek与云平台联动的自动化流程——云原生AI工具演进的核心引擎
人工智能·安全·云原生·架构·自动化·prometheus·deepseek
认真的薛薛5 天前
13.k8s中Prometheus监控集群及其服务,endpoint暴露服务,es采集k8s日志
elasticsearch·kubernetes·prometheus
A-刘晨阳5 天前
K8S部署kube-state-metrics + CAdvisor 并使用 Prometheus 监控 Kubernetes 指标
运维·云原生·kubernetes·云计算·prometheus·cadvisor·state-metrics
AC赳赳老秦6 天前
多模态 AI 驱动办公智能化变革:DeepSeek 赋能图文转写与视频摘要的高效实践
java·ide·人工智能·python·prometheus·ai-native·deepseek
AC赳赳老秦6 天前
2026云原生AI规模化趋势预测:DeepSeek在K8s集群中的部署与运维实战
运维·人工智能·云原生·架构·kubernetes·prometheus·deepseek