通過prometheus監(jiān)控springboot程序運(yùn)行狀態(tài)的操作流程
jmx_exporter 主要用于從 Java 應(yīng)用程序中提取 JMX 指標(biāo),通常包括 JVM級別的信息,如內(nèi)存使用情況、線程狀態(tài)、垃圾回收次數(shù)等。
對于傳統(tǒng)的SpringBoot應(yīng)用,由于它默認(rèn)沒有內(nèi)置 Prometheus 監(jiān)控的指標(biāo),因此使用 jmx_exporter來抓取基礎(chǔ)的JVM相關(guān)指標(biāo)。
如果想要獲取更細(xì)粒度的應(yīng)用級別的業(yè)務(wù)指標(biāo),例如 HTTP 請求數(shù)、處理時(shí)間或業(yè)務(wù)操作的計(jì)數(shù),則需要在應(yīng)用中集成 Prometheus 客戶端庫,并自定義相應(yīng)的指標(biāo)。
1、下載jmx-exporter
1. 訪問github下載
下載地址:https://github.com/prometheus/jmx_exporter

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

我們使用0.20.0版本

創(chuàng)建個目錄
mkdir /etc/jmx_exporter
將下載好的jar包上傳上來

2. 準(zhǔn)備config.yml配置文件
規(guī)則文件可以定義要暴露哪些指標(biāo)給prometheus
[root@jingtian03 jmx_exporter ]#vim config.yaml rules: - pattern: ".*"

2、運(yùn)行SpringBoot應(yīng)用
1. 安裝java基礎(chǔ)環(huán)境
注意,下載的java版本和maven版本要對應(yīng),并且spring boot程序的版本也要對應(yīng)
yum install java-17-openjdk maven-openjdk17 -y
替換下maven的配置文件,連到阿里云,編譯項(xiàng)目會快一些
git clone https://github.com/littlefun91/mavendata.git cd mavendata/ cp settings.xml /etc/maven/


2. 下載java應(yīng)用然后進(jìn)行編譯
如果自己有,也可以用自己的java應(yīng)用測試
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

編譯成功標(biāo)志

編譯好之后會生成一個target目錄
里面有生成的jar包文件

3. 運(yùn)行java應(yīng)用,并加載jmx監(jiān)控,監(jiān)聽12345端口
<path_to_jmx_exporter.jar>=<exporter_port>:<path_to_config.yaml>
因此,工作中,我們?nèi)绻枰O(jiān)控java程序,則在java運(yùn)行時(shí)加上jmx監(jiān)控端口即可暴露出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. 檢查對應(yīng)的端口是否正常

查看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頁面,驗(yàn)證 jmx_exporter 是否已經(jīng)成功納入監(jiān)控中

4、JVM常用指標(biāo)與示例 1)JVM內(nèi)存使用相關(guān)指標(biāo)(Tomcat也有這些指標(biāo))
初始堆內(nèi)存和最大堆內(nèi)存都是啟動java程序的時(shí)候設(shè)置的



注意:最新版的jmx中的指標(biāo)對應(yīng)的是
jvm_memory_init_bytes{area=“heap”}
jvm_memory_used_bytes{area=“heap”}
jvm_memory_max_bytes{area=“heap”}
area=“heap” 為堆內(nèi)存
area=“nonheap” 為非堆內(nèi)存
我們主要看堆內(nèi)存


案例1:JVM堆內(nèi)存使用率。計(jì)算公式:已用堆內(nèi)存 / 總的堆內(nèi)存 * 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:計(jì)算JVM,新生代和老年代,每次GC所需時(shí)間,因?yàn)檫@兩個指標(biāo)是不斷累積的,因此計(jì)算公式:rate(JVMGC花費(fèi)總時(shí)間[1m]) / rate(JVMGC總次數(shù)[1m])
java采用分代回收,分為年輕代、老年代、永久代。年輕代又分為E區(qū)、S1區(qū)、S2區(qū)。
到j(luò)dk1.8,永久代被元空間取代了。
年輕代都使用復(fù)制算法,老年代的收集算法看具體用什么收集器。默認(rèn)是PS收集器,采用標(biāo)記-整理算法。
# 如果jvm_gc_collection_seconds_count是100次,而jvm_gc_collection_seconds_sum是50秒,那么平均每次GC耗時(shí)是0.5秒。 sum (rate(jvm_gc_collection_seconds_sum[5m]) / rate(jvm_gc_collection_seconds_count[5m])) by (gc, instance, job)

案例3:計(jì)算JVM最近5分鐘,最小的死鎖線的程數(shù),是否高于10
min_over_time(jvm_threads_deadlocked[5m])

5)JVM堆內(nèi)存分配相關(guān)指標(biāo)(可以查看新生代、老年代分別使用了多少內(nèi)存,粒度更細(xì)一些)

最新版的jmx對應(yīng)的指標(biāo)是:
jvm_memory_pool_used_bytes
jvm_memory_pool_max_bytes

5、jmx告警規(guī)則文件
1)編寫JVM告警規(guī)則文件
cat /etc/prometheus/rules/jvm_rules.yml
groups:
- name: "JVM告警規(guī)則"
rules:
- alert: JVM堆內(nèi)存使用率過高
expr: jvm_memory_bytes_used{area="heap",} / jvm_memory_bytes_max{area="heap",} * 100 > 80
for: 1m
labels:
severity: critical
annotations:
summary: "JVM 堆內(nèi)存使用率過高, 實(shí)例:{{ $labels.instance }}, job:{{ $labels.job }} "
description: "JVM堆內(nèi)存使用率超過80%, 當(dāng)前值 {{ $value }}%"
- alert: JVMGC時(shí)間過長
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時(shí)間過長, 實(shí)例:{{ $labels.instance }}, job:{{ $labels.job }} "
description: "JVM {{ $labels.gc }} 的回收時(shí)間超過1s,當(dāng)前值 {{ $value}}s"
- alert: JVM死鎖線程過多
expr: min_over_time(jvm_threads_deadlocked[5m]) > 0
for: 1m
labels:
severity: critical
annotations:
summary: "JVM檢測到死鎖線程"
description: "在過去5分鐘內(nèi)JVM檢測到存在死鎖線程, 當(dāng)前值 {{ $value }}。"
2)驗(yàn)證規(guī)則文件

3)導(dǎo)入JMX圖形
導(dǎo)入一個JVM的Grafana模板。Dashboard ID為 14845

以上就是通過prometheus監(jiān)控springboot程序運(yùn)行狀態(tài)的操作流程的詳細(xì)內(nèi)容,更多關(guān)于prometheus監(jiān)控springboot運(yùn)行狀態(tài)的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
一文帶你了解微服務(wù)架構(gòu)中的"發(fā)件箱模式"
微服務(wù)架構(gòu)如今非常的流行,這個架構(gòu)下可能經(jīng)常會遇到“雙寫”的場景。本文就和大家分享一個“發(fā)件箱模式”,?感興趣的小伙伴可以了解一下2023-01-01
Springboot集成shiro之登錄攔截/權(quán)限控制方式
文章介紹了Shiro框架的的配置和使用,包括添加依賴、配置ShiroConfig、創(chuàng)建realm、配置安全管理器、配置過濾器和權(quán)限控制,還介紹了配置ehcache緩存、自定義加密和處理404重定向等問題,總結(jié)了Shiro框架中的常用配置和解決常見問題的方法2026-05-05
關(guān)于JDK15的新特性之TextBlocks文本塊的引入和使用
這篇文章主要介紹了關(guān)于JDK15的新特性之文本塊的引入和使用,如果具有一種語言學(xué)機(jī)制,可以比多行文字更直觀地表示字符串,而且可以跨越多行,而且不會出現(xiàn)轉(zhuǎn)義的視覺混亂,那么這將提高廣泛Java類程序的可讀性和可寫性,需要的朋友可以參考下2023-07-07
Java語言簡介(動力節(jié)點(diǎn)Java學(xué)院整理)
Java是一門面向?qū)ο缶幊陶Z言,不僅吸收了C++語言的各種優(yōu)點(diǎn),還摒棄了C++里難以理解的多繼承、指針等概念,因此Java語言具有功能強(qiáng)大和簡單易用兩個特征,下面通過本文給大家分享java語言的簡介,感興趣的朋友一起看看吧2017-03-03
IntelliJ IDEA進(jìn)行中文漢化的詳細(xì)教程(附圖文講解)
今天為大家?guī)淼氖?nbsp;IntelliJ IDEA 中文漢化教程以及中文插件包下載教程,經(jīng)常收到小伙伴在后臺給我留言,問 IDEA 怎么進(jìn)行中文漢化,因?yàn)楹芏嘈』锇槭莿側(cè)腴T Java,看到 IDEA 菜單全英文有些不太適應(yīng),需要的朋友可以參考下2024-12-12

