【Prometheus】如何通过prometheus监控springboot程序运行状态,并实时告警通知

✨✨ 欢迎大家来到景天科技苑✨✨

🎈🎈 养成好习惯,先赞后看哦~🎈🎈

🏆 作者简介:景天科技苑

🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。

🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi,flask等框架,云原生k8s,Prometheus监控,linux,shell脚本等实操经验,网站搭建,数据库等分享。

所属的专栏: Prometheus监控系统零基础到进阶
景天的主页: 景天科技苑

文章目录

prometheus监控spring boot程序

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版本

创建个目录

bash 复制代码
mkdir /etc/jmx_exporter

将下载好的jar包上传上来

2. 准备config.yml配置文件

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

bash 复制代码
[root@jingtian03 jmx_exporter ]#vim config.yaml
rules:
  - pattern: ".*"

2、运行SpringBoot应用

1. 安装java基础环境

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

bash 复制代码
yum install java-17-openjdk maven-openjdk17 -y

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

bash 复制代码
git clone https://github.com/littlefun91/mavendata.git
cd mavendata/
cp settings.xml /etc/maven/


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

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

bash 复制代码
git clone https://github.com/littlefun91/springbootdemo.git

解压,打包

bash 复制代码
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

bash 复制代码
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配置

bash 复制代码
vim /etc/prometheus/prometheus.yml
  - job_name: "jmx_exporter"
    static_configs:
      - targets: ["jingtian03:12345"]

2)重新加载Prometheus配置文件

bash 复制代码
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

bash 复制代码
jvm_memory_used_bytes{area="heap"} / jvm_memory_max_bytes{area="heap"} *100

案例2:计算JVM,新生代和老年代,每次GC所需时间,因为这两个指标是不断累积的,因此计算公式:rate(JVMGC花费总时间[1m]) / rate(JVMGC总次数[1m])

java采用分代回收,分为年轻代、老年代、永久代。年轻代又分为E区、S1区、S2区。

到jdk1.8,永久代被元空间取代了。

年轻代都使用复制算法,老年代的收集算法看具体用什么收集器。默认是PS收集器,采用标记-整理算法。

bash 复制代码
# 如果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

bash 复制代码
min_over_time(jvm_threads_deadlocked[5m])

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

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

jvm_memory_pool_used_bytes

jvm_memory_pool_max_bytes

5、jmx告警规则文件

1)编写JVM告警规则文件

bash 复制代码
cat /etc/prometheus/rules/jvm_rules.yml
yaml 复制代码
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

相关推荐
〆、风神24 分钟前
Spring Boot 整合 Lock4j + Redisson 实现分布式锁实战
spring boot·分布式·后端
Asthenia041227 分钟前
Select、Poll、Epoll 详细分析与面试深度剖析/C代码详解
后端
烛阴31 分钟前
Node.js中必备的中间件大全:提升性能、安全与开发效率的秘密武器
javascript·后端·express
南雨北斗35 分钟前
WMware虚拟机下载方法(2025年4月)
后端
朝阳5811 小时前
Rust项目GPG签名配置指南
开发语言·后端·rust
微网兔子1 小时前
伺服器用什么语言开发呢?做什么用什么?
服务器·c++·后端·游戏
朝阳5811 小时前
Rust实现高性能目录扫描工具ll的技术解析
开发语言·后端·rust
橘猫云计算机设计1 小时前
springboot基于hadoop的酷狗音乐爬虫大数据分析可视化系统(源码+lw+部署文档+讲解),源码可白嫖!
数据库·hadoop·spring boot·爬虫·python·数据分析·毕业设计
小希爸爸1 小时前
2、中医基础入门和养生
前端·后端
卓怡学长2 小时前
w304基于HTML5的民谣网站的设计与实现
java·前端·数据库·spring boot·spring·html5