通过prometheus监控springboot程序运行状态的操作流程

 更新时间:2025年02月09日 08:34:22   作者:景天科技苑  
jmx_exporter用于从Java应用程序中提取JMX指标,适用于SpringBoot应用,通过下载jar包和配置文件,可以抓取JVM基础指标,要获取应用级别指标,需要集成Prometheus客户端库并自定义指标,本文给大家介绍了如何通过prometheus监控springboot程序运行状态

jmx_exporter 主要用于从 Java 应用程序中提取 JMX 指标,通常包括 JVM级别的信息,如内存使用情况、线程状态、垃圾回收次数等。

对于传统的SpringBoot应用,由于它默认没有内置 Prometheus 监控的指标,因此使用 jmx_exporter来抓取基础的JVM相关指标。

如果想要获取更细粒度的应用级别的业务指标,例如 HTTP 请求数、处理时间或业务操作的计数,则需要在应用中集成 Prometheus 客户端库,并自定义相应的指标。

1、下载jmx-exporter

1. 访问github下载

下载地址:https://github.com/prometheus/jmx_exporter

在这里插入图片描述

在release里面下载jar包即可,如下是最新版本

在这里插入图片描述

我们使用0.20.0版本

在这里插入图片描述

创建个目录

mkdir /etc/jmx_exporter

将下载好的jar包上传上来

在这里插入图片描述

2. 准备config.yml配置文件

规则文件可以定义要暴露哪些指标给prometheus

[root@jingtian03 jmx_exporter ]#vim config.yaml
rules:
  - pattern: ".*"

在这里插入图片描述

2、运行SpringBoot应用

1. 安装java基础环境

注意,下载的java版本和maven版本要对应,并且spring boot程序的版本也要对应

yum install java-17-openjdk maven-openjdk17 -y

替换下maven的配置文件,连到阿里云,编译项目会快一些

git clone https://github.com/littlefun91/mavendata.git
cd mavendata/
cp settings.xml /etc/maven/

在这里插入图片描述

在这里插入图片描述

2. 下载java应用然后进行编译

如果自己有,也可以用自己的java应用测试

git clone https://github.com/littlefun91/springbootdemo.git

解压,打包

tar xf springboot-devops-myapp-java11-jar.tar.gz
cd springboot-devops-demo-jar-java17/
mvn package

在这里插入图片描述

编译成功标志

在这里插入图片描述

编译好之后会生成一个target目录

里面有生成的jar包文件

在这里插入图片描述

3. 运行java应用,并加载jmx监控,监听12345端口

<path_to_jmx_exporter.jar>=<exporter_port>:<path_to_config.yaml>

因此,工作中,我们如果需要监控java程序,则在java运行时加上jmx监控端口即可暴露出metrics

nohup java \
 -javaagent:/etc/jmx_exporter/jmx_prometheus_javaagent-0.20.0.jar=12345:/etc/jmx_exporter/config.yaml \
 -jar -Xms50m -Xmx50m target/jingtian-jar-1.0.0.jar \
 --server.port=8081 &>/var/log/springboot.log &

4. 检查对应的端口是否正常

在这里插入图片描述

查看metrics

在这里插入图片描述

3、配置prometheus

1)修改prometheus配置

vim /etc/prometheus/prometheus.yml
  - job_name: "jmx_exporter"
    static_configs:
      - targets: ["jingtian03:12345"]

2)重新加载Prometheus配置文件

curl -X POST http://localhost:9090/-/reload

3)检查Prometheus的Status->Targets页面,验证 jmx_exporter 是否已经成功纳入监控中

在这里插入图片描述

4、JVM常用指标与示例 1)JVM内存使用相关指标(Tomcat也有这些指标)

初始堆内存和最大堆内存都是启动java程序的时候设置的

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

注意:最新版的jmx中的指标对应的是
jvm_memory_init_bytes{area=“heap”}
jvm_memory_used_bytes{area=“heap”}
jvm_memory_max_bytes{area=“heap”}

area=“heap” 为堆内存
area=“nonheap” 为非堆内存
我们主要看堆内存

在这里插入图片描述

在这里插入图片描述

案例1:JVM堆内存使用率。计算公式:已用堆内存 / 总的堆内存 * 100

jvm_memory_used_bytes{<!--{C}%3C!%2D%2D%20%2D%2D%3E-->area="heap"} / jvm_memory_max_bytes{<!--{C}%3C!%2D%2D%20%2D%2D%3E-->area="heap"} *100

在这里插入图片描述

案例2:计算JVM,新生代和老年代,每次GC所需时间,因为这两个指标是不断累积的,因此计算公式:rate(JVMGC花费总时间[1m]) / rate(JVMGC总次数[1m])
java采用分代回收,分为年轻代、老年代、永久代。年轻代又分为E区、S1区、S2区。
到jdk1.8,永久代被元空间取代了。
年轻代都使用复制算法,老年代的收集算法看具体用什么收集器。默认是PS收集器,采用标记-整理算法。

# 如果jvm_gc_collection_seconds_count是100次,而jvm_gc_collection_seconds_sum是50秒,那么平均每次GC耗时是0.5秒。
sum (rate(jvm_gc_collection_seconds_sum[5m]) / rate(jvm_gc_collection_seconds_count[5m])) by (gc, instance, job)

在这里插入图片描述

案例3:计算JVM最近5分钟,最小的死锁线的程数,是否高于10

min_over_time(jvm_threads_deadlocked[5m])

在这里插入图片描述

5)JVM堆内存分配相关指标(可以查看新生代、老年代分别使用了多少内存,粒度更细一些)

在这里插入图片描述

最新版的jmx对应的指标是:
jvm_memory_pool_used_bytes
jvm_memory_pool_max_bytes

在这里插入图片描述

5、jmx告警规则文件

1)编写JVM告警规则文件

cat /etc/prometheus/rules/jvm_rules.yml
groups:
- name: "JVM告警规则"
  rules:
  - alert: JVM堆内存使用率过高
    expr: jvm_memory_bytes_used{area="heap",} / jvm_memory_bytes_max{area="heap",} * 100 > 80
    for: 1m
    labels:
      severity: critical
    annotations:
      summary: "JVM 堆内存使用率过高, 实例:{{ $labels.instance }}, job:{{ $labels.job }} "
      description: "JVM堆内存使用率超过80%, 当前值 {{ $value }}%"
  - alert: JVMGC时间过长
    expr: sum (rate(jvm_gc_collection_seconds_sum[5m]) / rate(jvm_gc_collection_seconds_count[5m])) by (gc, instance, job) > 1
    for: 1m
    labels:
      severity: critical
    annotations:
      summary: "JVM GC时间过长, 实例:{{ $labels.instance }}, job:{{ $labels.job }} "
      description: "JVM {{ $labels.gc }} 的回收时间超过1s,当前值 {{ $value}}s"
  - alert: JVM死锁线程过多
    expr: min_over_time(jvm_threads_deadlocked[5m]) > 0
    for: 1m
    labels:
      severity: critical
    annotations:
      summary: "JVM检测到死锁线程"
      description: "在过去5分钟内JVM检测到存在死锁线程, 当前值 {{ $value }}。"

2)验证规则文件

在这里插入图片描述

3)导入JMX图形

导入一个JVM的Grafana模板。Dashboard ID为 14845

在这里插入图片描述

以上就是通过prometheus监控springboot程序运行状态的操作流程的详细内容,更多关于prometheus监控springboot运行状态的资料请关注脚本之家其它相关文章!

相关文章

  • Java编程使用卡片布局管理器示例【基于swing组件】

    Java编程使用卡片布局管理器示例【基于swing组件】

    这篇文章主要介绍了Java编程使用卡片布局管理器,结合实例形式分析了java基于swing组件的卡片布局管理器具体实现与使用技巧,需要的朋友可以参考下
    2018-01-01
  • java实现将文件上传到ftp服务器的方法

    java实现将文件上传到ftp服务器的方法

    这篇文章主要介绍了java实现将文件上传到ftp服务器的方法,结合实例形式分析了基于java实现的ftp文件传输类定义与使用方法,需要的朋友可以参考下
    2016-08-08
  • SpringCloud学习笔记之Feign远程调用

    SpringCloud学习笔记之Feign远程调用

    Feign是一个声明式的http客户端。其作用就是帮助我们优雅的实现http请求的发送。本文将具体为大家介绍一下Feign的远程调用,感兴趣的可以了解一下
    2021-12-12
  • java内部类使用总结

    java内部类使用总结

    本文主要介绍了java内部类使用总结。具有很好的参考价值,下面跟着小编一起来看下吧
    2017-02-02
  • 使用Java实现简单搭建内网穿透

    使用Java实现简单搭建内网穿透

    内网穿透是一种网络技术,适用于需要远程访问本地部署服务的场景,本文主要为大家介绍了如何使用Java实现简单搭建内网穿透,感兴趣的可以了解下
    2024-02-02
  • SpringBoot集成Graphql Query实战示例

    SpringBoot集成Graphql Query实战示例

    这篇文章主要为大家介绍了SpringBoot集成Graphql Query实战示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • 浅谈java中==以及equals方法的用法

    浅谈java中==以及equals方法的用法

    这篇文章主要介绍了浅谈java中==以及equals方法的用法,涉及二者的用法示例,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • SpringBoot使用布隆过滤器解决缓存穿透问题

    SpringBoot使用布隆过滤器解决缓存穿透问题

    缓存穿透是指当缓存系统中无法命中需要的数据时,会直接请求底层存储系统(如数据库),但是如果请求的数据根本不存在,那么大量的请求就会直接穿透缓存层,本文将给大家介绍一下SpringBoot使用布隆过滤器解决缓存穿透问题,需要的朋友可以参考下
    2023-10-10
  • Java overload和override的区别分析

    Java overload和override的区别分析

    方法的重写(Overriding)和重载(Overloading)是Java多态性的不同表现,想要了解更多请参考本文
    2012-11-11
  • SpringBoot多数据源配置的全过程记录

    SpringBoot多数据源配置的全过程记录

    在用SpringBoot开发项目时,随着业务量的扩大,我们通常会进行数据库拆分或是引入其他数据库,从而我们需要配置多个数据源,下面这篇文章主要给大家介绍了关于SpringBoot多数据源配置的相关资料,需要的朋友可以参考下
    2021-11-11

最新评论