【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

相关推荐
泉城老铁9 分钟前
Spring Boot中实现多线程分片下载
java·spring boot·后端
泉城老铁10 分钟前
Spring Boot中实现多文件打包下载
spring boot·后端·架构
泉城老铁11 分钟前
Spring Boot中实现大文件分片下载和断点续传功能
java·spring boot·后端
友莘居士13 分钟前
长流程、复杂业务流程分布式事务管理实战
spring boot·rocketmq·saga·复杂流程分布式事务·长流程
码事漫谈18 分钟前
C++中虚函数与构造/析构函数的深度解析
后端
百思可瑞教育19 分钟前
Spring Boot 参数校验全攻略:从基础到进阶
运维·服务器·spring boot·后端·百思可瑞教育·北京百思教育
武子康37 分钟前
大数据-89 Spark应用必备:进程通信、序列化机制与RDD执行原理
大数据·后端·spark
shark_chili1 小时前
JITWatch实战指南:深入Java即时编译优化的黑科技工具
后端
绝无仅有1 小时前
从拉取代码到前端运行访问:Vue 前端项目的常规启动流程
后端·面试·github
小蒜学长1 小时前
spring boot驴友结伴游网站的设计与实现(代码+数据库+LW)
java·数据库·spring boot·后端