【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

相关推荐
剽悍一小兔13 分钟前
Java8默认方法の终极奥义
后端
Emma歌小白17 分钟前
UML(Unified Modeling Language,统一建模语言)应用方向
后端
雷渊25 分钟前
mybatis底层为什么设计二层缓存?
java·后端·面试
不修×蝙蝠31 分钟前
SpringBoot 第一课(Ⅲ) 配置类注解
java·spring boot·spring·bean·propertysource·profile·importresource
祝瑾萱36 分钟前
Go语言的负载均衡
开发语言·后端·golang
奔跑吧邓邓子38 分钟前
【商城实战(39)】Spring Boot 携手微服务,商城架构焕新篇
spring boot·微服务·架构·商城实战
qq_139484288240 分钟前
springboot441-基于SpringBoot的校园自助交易系统(源码+数据库+纯前后端分离+部署讲解等)
java·spring boot·后端·mysql·spring·vue·intellij-idea
小小渔民1 小时前
Redis 主从复制:从原理到实践的深度解析
redis·后端
小华同学ai1 小时前
需要的效果它都有,让AI对话开发效率翻倍!这款Ant Design扩展组件库绝了
前端·后端·github
爱刷牙的鲨鱼辣椒1 小时前
简单且非常实用的代码优化技巧-会一直收集并增加
后端