通過(guò)prometheus監(jiān)控springboot程序運(yùn)行狀態(tài)的操作流程
jmx_exporter 主要用于從 Java 應(yīng)用程序中提取 JMX 指標(biāo),通常包括 JVM級(jí)別的信息,如內(nèi)存使用情況、線程狀態(tài)、垃圾回收次數(shù)等。
對(duì)于傳統(tǒng)的SpringBoot應(yīng)用,由于它默認(rèn)沒(méi)有內(nèi)置 Prometheus 監(jiān)控的指標(biāo),因此使用 jmx_exporter來(lái)抓取基礎(chǔ)的JVM相關(guān)指標(biāo)。
如果想要獲取更細(xì)粒度的應(yīng)用級(jí)別的業(yè)務(wù)指標(biāo),例如 HTTP 請(qǐng)求數(shù)、處理時(shí)間或業(yè)務(wù)操作的計(jì)數(shù),則需要在應(yīng)用中集成 Prometheus 客戶端庫(kù),并自定義相應(yīng)的指標(biāo)。
1、下載jmx-exporter
1. 訪問(wèn)github下載
下載地址:https://github.com/prometheus/jmx_exporter
在release里面下載jar包即可,如下是最新版本
我們使用0.20.0版本
創(chuàng)建個(gè)目錄
mkdir /etc/jmx_exporter
將下載好的jar包上傳上來(lái)
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版本要對(duì)應(yīng),并且spring boot程序的版本也要對(duì)應(yīng)
yum install java-17-openjdk maven-openjdk17 -y
替換下maven的配置文件,連到阿里云,編譯項(xiàng)目會(huì)快一些
git clone https://github.com/littlefun91/mavendata.git cd mavendata/ cp settings.xml /etc/maven/
2. 下載java應(yīng)用然后進(jìn)行編譯
如果自己有,也可以用自己的java應(yīng)用測(cè)試
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)志
編譯好之后會(huì)生成一個(gè)target目錄
里面有生成的jar包文件
3. 運(yùn)行java應(yīng)用,并加載jmx監(jiān)控,監(jiān)聽(tīng)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. 檢查對(duì)應(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è)面,驗(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)存都是啟動(dòng)java程序的時(shí)候設(shè)置的
注意:最新版的jmx中的指標(biāo)對(duì)應(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)檫@兩個(gè)指標(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對(duì)應(yīng)的指標(biāo)是:
jvm_memory_pool_used_bytes
jvm_memory_pool_max_bytes
5、jmx告警規(guī)則文件
1)編寫(xiě)JVM告警規(guī)則文件
cat /etc/prometheus/rules/jvm_rules.yml
groups: - name: "JVM告警規(guī)則" rules: - alert: JVM堆內(nèi)存使用率過(guò)高 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)存使用率過(guò)高, 實(shí)例:{{ $labels.instance }}, job:{{ $labels.job }} " description: "JVM堆內(nèi)存使用率超過(guò)80%, 當(dāng)前值 {{ $value }}%" - alert: JVMGC時(shí)間過(guò)長(zhǎng) 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í)間過(guò)長(zhǎng), 實(shí)例:{{ $labels.instance }}, job:{{ $labels.job }} " description: "JVM {{ $labels.gc }} 的回收時(shí)間超過(guò)1s,當(dāng)前值 {{ $value}}s" - alert: JVM死鎖線程過(guò)多 expr: min_over_time(jvm_threads_deadlocked[5m]) > 0 for: 1m labels: severity: critical annotations: summary: "JVM檢測(cè)到死鎖線程" description: "在過(guò)去5分鐘內(nèi)JVM檢測(cè)到存在死鎖線程, 當(dāng)前值 {{ $value }}。"
2)驗(yàn)證規(guī)則文件
3)導(dǎo)入JMX圖形
導(dǎo)入一個(gè)JVM的Grafana模板。Dashboard ID為 14845
以上就是通過(guò)prometheus監(jiān)控springboot程序運(yùn)行狀態(tài)的操作流程的詳細(xì)內(nèi)容,更多關(guān)于prometheus監(jiān)控springboot運(yùn)行狀態(tài)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
java實(shí)現(xiàn)將文件上傳到ftp服務(wù)器的方法
這篇文章主要介紹了java實(shí)現(xiàn)將文件上傳到ftp服務(wù)器的方法,結(jié)合實(shí)例形式分析了基于java實(shí)現(xiàn)的ftp文件傳輸類(lèi)定義與使用方法,需要的朋友可以參考下2016-08-08SpringCloud學(xué)習(xí)筆記之Feign遠(yuǎn)程調(diào)用
Feign是一個(gè)聲明式的http客戶端。其作用就是幫助我們優(yōu)雅的實(shí)現(xiàn)http請(qǐng)求的發(fā)送。本文將具體為大家介紹一下Feign的遠(yuǎn)程調(diào)用,感興趣的可以了解一下2021-12-12使用Java實(shí)現(xiàn)簡(jiǎn)單搭建內(nèi)網(wǎng)穿透
內(nèi)網(wǎng)穿透是一種網(wǎng)絡(luò)技術(shù),適用于需要遠(yuǎn)程訪問(wèn)本地部署服務(wù)的場(chǎng)景,本文主要為大家介紹了如何使用Java實(shí)現(xiàn)簡(jiǎn)單搭建內(nèi)網(wǎng)穿透,感興趣的可以了解下2024-02-02SpringBoot集成Graphql Query實(shí)戰(zhàn)示例
這篇文章主要為大家介紹了SpringBoot集成Graphql Query實(shí)戰(zhàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09SpringBoot使用布隆過(guò)濾器解決緩存穿透問(wèn)題
緩存穿透是指當(dāng)緩存系統(tǒng)中無(wú)法命中需要的數(shù)據(jù)時(shí),會(huì)直接請(qǐng)求底層存儲(chǔ)系統(tǒng)(如數(shù)據(jù)庫(kù)),但是如果請(qǐng)求的數(shù)據(jù)根本不存在,那么大量的請(qǐng)求就會(huì)直接穿透緩存層,本文將給大家介紹一下SpringBoot使用布隆過(guò)濾器解決緩存穿透問(wèn)題,需要的朋友可以參考下2023-10-10Java overload和override的區(qū)別分析
方法的重寫(xiě)(Overriding)和重載(Overloading)是Java多態(tài)性的不同表現(xiàn),想要了解更多請(qǐng)參考本文2012-11-11SpringBoot多數(shù)據(jù)源配置的全過(guò)程記錄
在用SpringBoot開(kāi)發(fā)項(xiàng)目時(shí),隨著業(yè)務(wù)量的擴(kuò)大,我們通常會(huì)進(jìn)行數(shù)據(jù)庫(kù)拆分或是引入其他數(shù)據(jù)庫(kù),從而我們需要配置多個(gè)數(shù)據(jù)源,下面這篇文章主要給大家介紹了關(guān)于SpringBoot多數(shù)據(jù)源配置的相關(guān)資料,需要的朋友可以參考下2021-11-11