当前位置:首页 > 文章列表 > 文章 > java教程 > Prometheus监控Java应用指标采集指南

Prometheus监控Java应用指标采集指南

2025-07-19 18:59:22 0浏览 收藏

想为你的Java应用实现高效监控?本文为你提供一份全面的Prometheus监控Java应用指标采集教程,助你轻松掌握关键技术。针对Spring Boot应用,推荐使用Micrometer,通过引入`spring-boot-starter-actuator`和`micrometer-registry-prometheus`依赖,并配置启用`/prometheus`端点,即可快速集成并暴露自定义指标,实现对应用运行状态的实时监控。对于传统Java应用,JMX Exporter则是不二之选,它能将JMX MBeans转换为Prometheus指标,只需下载`jmx_prometheus_javaagent.jar`,编写`config.yaml`定义映射规则,并通过`-javaagent`参数加载代理,即可让Prometheus抓取JMX转换后的指标。无论选择哪种方案,都能让你充分利用Prometheus强大的监控能力,深入洞察Java应用的运行状况。

Prometheus监控Java应用的核心方法是使用Micrometer或JMX Exporter暴露指标。1. 使用Micrometer时,添加spring-boot-starter-actuator和micrometer-registry-prometheus依赖,配置management.endpoints.web.exposure.include启用/prometheus端点,并通过MeterRegistry创建Counter、Gauge、Timer等指标类型记录数据。2. 使用JMX Exporter时,下载jmx_prometheus_javaagent.jar并编写config.yaml定义JMX到Prometheus指标的映射规则,通过-javaagent参数加载代理并指定端口和配置文件,使Prometheus可抓取JMX转换后的指标。两者分别适用于Spring Boot应用和传统Java应用,实现对运行状态的有效监控。

Prometheus监控Java应用的指标采集指南

Prometheus监控Java应用,核心在于让Java应用以Prometheus可识别的格式(通常是OpenMetrics文本格式)暴露其内部指标。这通常通过在应用内部集成特定的客户端库(如Micrometer)或使用外部代理(如JMX Exporter)来实现。一旦指标暴露出来,Prometheus服务器就能周期性地抓取(scrape)这些数据,进行存储、查询和告警。

Prometheus监控Java应用的指标采集指南

解决方案

要让Prometheus顺利监控到你的Java应用,最主流且推荐的方式是使用Micrometer。它是一个度量门面(metrics facade),支持多种监控系统,包括Prometheus。对于一些遗留或非Spring Boot的应用,JMX Exporter则是一个非常实用的选择,它能将Java应用通过JMX暴露的MBeans转换为Prometheus指标。

1. 使用Micrometer (推荐)

Prometheus监控Java应用的指标采集指南

如果你在使用Spring Boot,Micrometer的集成简直是无缝的。它内置了对各种指标类型的支持,并且通过Spring Boot Actuator自动暴露/actuator/prometheus端点。

Maven依赖:

Prometheus监控Java应用的指标采集指南
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</groupId>
</dependency>
<dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-registry-prometheus</artifactId>
    <scope>runtime</scope>
</dependency>

Gradle依赖:

implementation 'org.springframework.boot:spring-boot-starter-actuator'
runtimeOnly 'io.micrometer:micrometer-registry-prometheus'

配置 (application.properties 或 application.yml):

确保Actuator的Prometheus端点被启用。

management.endpoints.web.exposure.include=health,prometheus

自定义指标示例 (Java代码):

import io.micrometer.core.instrument.Counter;
import io.micrometer.core.instrument.MeterRegistry;
import org.springframework.stereotype.Service;

@Service
public class MyService {

    private final Counter requestCounter;

    public MyService(MeterRegistry registry) {
        // 创建一个名为 "my_service_requests_total" 的计数器
        // 带有标签 "status" 和 "method"
        this.requestCounter = Counter.builder("my_service_requests_total")
                .description("Total number of requests to MyService")
                .tag("status", "success")
                .register(registry);
    }

    public String processRequest() {
        // 每次调用此方法,计数器加1
        requestCounter.increment();
        return "Request processed successfully!";
    }
}

启动应用后,访问 http://localhost:8080/actuator/prometheus 就能看到你的指标了。

2. 使用JMX Exporter (适用于传统或非Spring Boot应用)

JMX Exporter是一个独立的Java代理,它通过JMX连接到运行中的JVM,并根据配置文件将JMX MBean属性转换为Prometheus指标。

下载JMX Exporter JAR:

你可以从Maven Central下载最新版本的 jmx_prometheus_javaagent.jar。比如,搜索 io.prometheus.jmx:jmx_prometheus_javaagent

创建配置文件 (config.yaml):

这个文件定义了哪些JMX MBean应该被暴露,以及如何命名它们。

# config.yaml 示例
startDelaySeconds: 0 # 代理启动后立即开始暴露指标
rules:
  - pattern: "java.lang<type=OperatingSystem><>SystemLoadAverage"
    name: "jvm_system_load_average"
    help: "System load average for the last minute"
    type: GAUGE
  - pattern: "java.lang<type=Memory><HeapMemoryUsage>committed"
    name: "jvm_heap_memory_committed_bytes"
    help: "Committed heap memory in bytes"
    type: GAUGE
  - pattern: "java.lang<type=MemoryPool, name=(.+?)><Usage>committed"
    name: "jvm_memory_pool_committed_bytes"
    help: "Committed memory for a given memory pool in bytes"
    labels:
      pool: "$1"
    type: GAUGE

启动Java应用时加载JMX Exporter:

java -javaagent:/path/to/jmx_prometheus_javaagent.jar=9090:/path/to/config.yaml -jar your-application.jar

这里 9090 是JMX Exporter暴露指标的端口,/path/to/config.yaml 是你的配置文件路径。

为什么选择Prometheus来监控Java应用?

在我看来,Prometheus和Java的结合简直是天作之合。首先,它是一个强大的开源监控系统,尤其是其基于拉取(pull)模型的指标采集方式,与Java应用的服务发现机制能很好地协同工作。你不需要担心应用主动推送数据的问题,Prometheus会定期来“拜访”你的应用,把需要的数据拿走。这种模式在微服务架构下特别香,服务启动了,Prometheus自然就能发现它并开始监控。

其次,Prometheus的PromQL查询语言真的非常强大。它可以让你对收集到的时间序列数据进行各种复杂的聚合、过滤和计算,从而深入洞察应用的运行状况。我记得有一次,我用PromQL几行代码就快速定位了一个内存泄露问题,那种效率是传统监控工具很难比拟的。

当然,它也有一些小“脾气”。比如,PromQL的学习曲线对于新手来说可能有点陡峭,而且Prometheus本身是单机的,虽然有联邦(federation)和远程存储(remote storage)方案来扩展,但大规模集群的规划和维护确实需要一些经验。不过,这些挑战相比它带来的价值来说,我觉得完全值得投入。

Micrometer在Java应用中如何快速集成并暴露自定义指标?

Micrometer的魅力在于它的“门面”特性,这意味着你写一次代码,就可以适配多种监控后端,Prometheus只是其中之一。对于Spring Boot应用,集成简直是傻瓜式的。

  1. 添加依赖:上面已经提到了 spring-boot-starter-actuatormicrometer-registry-prometheus。前者提供了Spring Boot的监控端点基础设施,后者是Prometheus注册表的实现。

  2. 启用Actuator端点:在 application.propertiesapplication.yml 中配置 management.endpoints.web.exposure.include=prometheus。这样,Spring Boot就会在 /actuator/prometheus 路径上暴露Prometheus格式的指标。

  3. 创建自定义指标: Micrometer提供了几种核心的度量类型:

    • Counter (计数器):只增不减的数值,适合统计请求总数、错误总数等。
      Counter myCounter = registry.counter("my_app_processed_events_total", "type", "success");
      myCounter.increment(); // 每次事件发生时调用
    • Gauge (计量器):表示瞬时值,可增可减,适合表示当前内存使用、队列大小等。
      // 监控一个List的当前大小
      List<String> myList = new ArrayList<>();
      registry.gaugeCollectionSize("my_app_list_size", Tags.empty(), myList);

      或者直接绑定一个函数:

      registry.gauge("my_app_active_connections", this, MyService::getActiveConnections);
      // MyService中需要有 public double getActiveConnections() 方法
    • Timer (计时器):测量短时间事件的持续时间,如方法执行时间、请求处理时间。它同时提供了计数和总时间。
      Timer myTimer = registry.timer("my_app_task_duration", "task", "data_processing");
      myTimer.record(() -> {
          // 这里是需要计时的代码块
          try {
              Thread.sleep(100);
          } catch (InterruptedException e) {
              Thread.currentThread().interrupt();
          }
      });
    • DistributionSummary (分布摘要):用于统计事件的分布,如请求体大小、响应延迟等,可以提供分位数(percentiles)信息。
      DistributionSummary mySummary = registry.summary("my_app_payload_size_bytes");
      mySummary.record(1024); // 记录一个1024字节的负载

关键点是,你需要通过 MeterRegistry 实例来注册这些指标。在Spring Boot中,MeterRegistry 会被自动注入到你的组件中。

我个人在使用Micrometer时,最喜欢它的标签(tags)功能。你可以为每个指标添加任意数量的键值对标签,比如 method="GET", path="/api/v1/users", status="success"。这让你的数据变得异常灵活,在PromQL查询时能进行非常细粒度的过滤和聚合。

JMX Exporter:如何为传统Java应用配置Prometheus监控?

JMX Exporter对于那些不是Spring Boot,或者你不想修改应用代码来集成Micrometer的传统Java应用来说,简直是救星。它的工作原理是作为一个Java代理运行,通过JVM的JMX接口获取运行时的各种MBeans信息,然后转换成Prometheus能理解的格式。

  1. 获取JMX Exporter Jar包:从Maven Central下载 jmx_prometheus_javaagent.jar。通常,你会把它放在应用服务器能访问到的某个路径下。

  2. 编写 config.yaml 配置文件:这是JMX Exporter的核心。它定义了哪些JMX MBean应该被暴露,以及如何将它们的属性映射到Prometheus指标。这个配置文件是基于YAML格式的,包含一系列的 rules

    • pattern: 这是匹配JMX MBean名称的正则表达式。JMX MBean的名称通常是 domain:key=value,key=value,... 的形式,比如 java.lang:type=Memory
    • name: 转换后Prometheus指标的名称。
    • help: 指标的描述信息,会在Prometheus的 /metrics 页面显示。
    • type: 指标类型(GAUGE, COUNTER, SUMMARY, HISTOGRAM)。
    • labels: 可以从Mbean名称或属性中提取值作为Prometheus指标的标签。$1, $2 等代表 pattern 中捕获组的值。

    举个例子,要监控Tomcat连接池:

    rules:
      - pattern: "Catalina<type=ThreadPool, name=\".*?\"><>currentThreadCount"
        name: "tomcat_thread_pool_current_threads"
        help: "Current number of threads in Tomcat thread pool"
        type: GAUGE
        labels:
          name: "$1" # 从name=\"(.*?)\"捕获组中提取线程池名称
      - pattern: "Catalina<type=DataSource, host=.*?, path=.*?, class=.*?, name=\"(.*?)\"><>NumActive"
        name: "tomcat_datasource_active_connections"
        help: "Number of active connections in Tomcat datasource"
        type: GAUGE
        labels:
          name: "$1"

    配置 rules 是JMX Exporter使用过程中最需要花时间的地方。因为不同的Java应用服务器(Tomcat, Jetty, WildFly等)或库(HikariCP, Druid等)暴露的JMX MBean名称和结构都不尽相同。你可能需要借助JConsole或VisualVM这样的工具来查看目标JVM的MBeans结构,然后根据它们来编写你的 pattern

  3. 启动Java应用时加载JMX Exporter:通过JVM参数 -javaagent 来加载JMX Exporter。

    java -javaagent:/path/to/jmx_prometheus_javaagent.jar=9090:/path/to/config.yaml -jar your-application.jar

    这里 9090 是JMX Exporter将暴露指标的端口,Prometheus会从这个端口抓取数据。

JMX Exporter的优点是侵入性极低,你不需要修改应用代码。但缺点也很明显,就是 config.yaml 的编写和调试可能比较繁琐,特别是当你需要监控的MBeans结构复杂或不明确时。有时候,一个正则表达式写不对,就可能导致一大堆指标无法被正确采集。不过,一旦配置好了,它就能非常稳定地工作,为你的老应用提供现代化的监控能力。

终于介绍完啦!小伙伴们,这篇关于《Prometheus监控Java应用指标采集指南》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布文章相关知识,快来关注吧!

PhpStorm版本控制连接失败解决方法PhpStorm版本控制连接失败解决方法
上一篇
PhpStorm版本控制连接失败解决方法
Ray框架实时异常检测管道搭建指南
下一篇
Ray框架实时异常检测管道搭建指南
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    542次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    511次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    498次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    484次学习
查看更多
AI推荐
  • 蛙蛙写作:AI智能写作助手,提升创作效率与质量
    蛙蛙写作
    蛙蛙写作是一款国内领先的AI写作助手,专为内容创作者设计,提供续写、润色、扩写、改写等服务,覆盖小说创作、学术教育、自媒体营销、办公文档等多种场景。
    8次使用
  • AI代码助手:Amazon CodeWhisperer,高效安全的代码生成工具
    CodeWhisperer
    Amazon CodeWhisperer,一款AI代码生成工具,助您高效编写代码。支持多种语言和IDE,提供智能代码建议、安全扫描,加速开发流程。
    20次使用
  • 畅图AI:AI原生智能图表工具 | 零门槛生成与高效团队协作
    畅图AI
    探索畅图AI:领先的AI原生图表工具,告别绘图门槛。AI智能生成思维导图、流程图等多种图表,支持多模态解析、智能转换与高效团队协作。免费试用,提升效率!
    49次使用
  • TextIn智能文字识别:高效文档处理,助力企业数字化转型
    TextIn智能文字识别平台
    TextIn智能文字识别平台,提供OCR、文档解析及NLP技术,实现文档采集、分类、信息抽取及智能审核全流程自动化。降低90%人工审核成本,提升企业效率。
    55次使用
  • SEO  简篇 AI 排版:3 秒生成精美文章,告别排版烦恼
    简篇AI排版
    SEO 简篇 AI 排版,一款强大的 AI 图文排版工具,3 秒生成专业文章。智能排版、AI 对话优化,支持工作汇报、家校通知等数百场景。会员畅享海量素材、专属客服,多格式导出,一键分享。
    52次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码