您好,登錄后才能下訂單哦!
本篇文章為大家展示了如何使用Prometheus監(jiān)控JVM,內(nèi)容簡明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。
當(dāng)你的 Java 業(yè)務(wù)容器化上 K8S 后,如果對(duì)其進(jìn)行監(jiān)控呢?Prometheus 社區(qū)開發(fā)了 JMX Exporter 來導(dǎo)出 JVM 的監(jiān)控指標(biāo),以便使用 Prometheus 來采集監(jiān)控?cái)?shù)據(jù)。下面將介紹如何利用 Prometheus 與 JMX Exporter 來監(jiān)控你 Java 應(yīng)用的 JVM。
JMX Exporter 利用 Java 的 JMX 機(jī)制來讀取 JVM 運(yùn)行時(shí)的一些監(jiān)控?cái)?shù)據(jù),然后將其轉(zhuǎn)換為 Prometheus 所認(rèn)知的 metrics 格式,以便讓 Prometheus 對(duì)其進(jìn)行監(jiān)控采集。
那么,JMX 又是什么呢?它的全稱是:Java Management Extensions
。 顧名思義,是管理 Java 的一種擴(kuò)展框架,JMX Exporter 正是基于此框架來讀取 JVM 的運(yùn)行時(shí)狀態(tài)的。
下面介紹如何通過 JMX Exporter 來暴露 Java 應(yīng)用的 JVM 監(jiān)控指標(biāo)。
JMX-Exporter 提供了兩種用法:
啟動(dòng)獨(dú)立進(jìn)程。JVM 啟動(dòng)時(shí)指定參數(shù),暴露 JMX 的 RMI 接口,JMX-Exporter 調(diào)用 RMI 獲取 JVM 運(yùn)行時(shí)狀態(tài)數(shù)據(jù),轉(zhuǎn)換為 Prometheus metrics 格式,并暴露端口讓 Prometheus 采集。
JVM 進(jìn)程內(nèi)啟動(dòng)(in-process)。JVM 啟動(dòng)時(shí)指定參數(shù),通過 javaagent 的形式運(yùn)行 JMX-Exporter 的 jar 包,進(jìn)程內(nèi)讀取 JVM 運(yùn)行時(shí)狀態(tài)數(shù)據(jù),轉(zhuǎn)換為 Prometheus metrics 格式,并暴露端口讓 Prometheus 采集。
官方不推薦使用第一種方式,一方面配置復(fù)雜,另一方面因?yàn)樗枰粋€(gè)單獨(dú)的進(jìn)程,而這個(gè)進(jìn)程本身的監(jiān)控又成了新的問題,所以本文重點(diǎn)圍繞第二種用法講如何在 K8S 環(huán)境下使用 JMX Exporter 暴露 JVM 監(jiān)控指標(biāo)。
使用第二種用法,啟動(dòng) JVM 時(shí)需要指定 JMX Exporter 的 jar 包文件和配置文件。jar 包是二進(jìn)制文件,不好通過 configmap 掛載,配置文件我們幾乎不需要修改,所以建議是直接將 JMX Exporter 的 jar 包和配置文件都打包到業(yè)務(wù)容器鏡像中。
首先準(zhǔn)備一個(gè)制作鏡像的目錄,放入 JMX Exporter 配置文件 prometheus-jmx-config.yaml
:
--- ssl: false lowercaseOutputName: false lowercaseOutputLabelNames: false
注: 更多配置項(xiàng)請(qǐng)參考官方文檔。
然后準(zhǔn)備 jar 包文件,可以在 jmx_exporter 的 Github 頁面找到最新的 jar 包下載地址,下載到當(dāng)前目錄:
wget https://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/0.13.0/jmx_prometheus_javaagent-0.13.0.jar
再準(zhǔn)備 Dockerfile,這里以 tomcat 為例:
FROM tomcat:jdk8-openjdk-slim ADD prometheus-jmx-config.yaml /prometheus-jmx-config.yaml ADD jmx_prometheus_javaagent-0.13.0.jar /jmx_prometheus_javaagent-0.13.0.jar
最后編譯鏡像:
docker build . -t ccr.ccs.tencentyun.com/imroc/tomcat:jdk8
搞定!如果想要更簡單,可以利用 docker 多階段構(gòu)建,省掉手動(dòng)下載 jar 包的步驟,Dockerfile 示例:
FROM ubuntu:16.04 as jar WORKDIR / RUN apt-get update -y RUN DEBIAN_FRONTEND=noninteractive apt-get install -y wget RUN wget https://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/0.13.0/jmx_prometheus_javaagent-0.13.0.jar FROM tomcat:jdk8-openjdk-slim ADD prometheus-jmx-config.yaml /prometheus-jmx-config.yaml COPY --from=jar /jmx_prometheus_javaagent-0.13.0.jar /jmx_prometheus_javaagent-0.13.0.jar
有了打包好的鏡像,下一步我們看下如何部署應(yīng)用到 K8S,關(guān)鍵點(diǎn)在于如何修改 JVM 啟動(dòng)參數(shù)以便啟動(dòng)時(shí)加載 JMX Exporter。JVM 啟動(dòng)時(shí)會(huì)讀取 JAVA_OPTS
環(huán)境變量,作為額外的啟動(dòng)參數(shù),所以我們部署時(shí)可以為應(yīng)用增加一下這個(gè)環(huán)境變量,示例:
apiVersion: apps/v1 kind: Deployment metadata: name: tomcat spec: replicas: 1 selector: matchLabels: app: tomcat template: metadata: labels: app: tomcat spec: containers: - name: tomcat image: ccr.ccs.tencentyun.com/imroc/tomcat:jdk8 env: - name: JAVA_OPTS value: "-javaagent:/jmx_prometheus_javaagent-0.13.0.jar=8088:/prometheus-jmx-config.yaml" --- apiVersion: v1 kind: Service metadata: name: tomcat labels: app: tomcat spec: type: ClusterIP ports: - port: 8080 protocol: TCP name: http - port: 8088 protocol: TCP name: jmx-metrics selector: app: tomcat
啟動(dòng)參數(shù)格式: -javaagent:<jar>=<port>:<config>
。
這里使用了 8088 端口暴露 JVM 的監(jiān)控指標(biāo),可自行更改。
暴露了 JVM 的監(jiān)控指標(biāo),現(xiàn)在來配置下 Prometheus,讓監(jiān)控?cái)?shù)據(jù)被采集到,配置示例:
- job_name: tomcat scrape_interval: 5s kubernetes_sd_configs: - role: endpoints namespaces: names: - default relabel_configs: - action: keep source_labels: - __meta_kubernetes_service_label_app regex: tomcat - action: keep source_labels: - __meta_kubernetes_endpoint_port_name regex: jmx-metrics
如果是安裝了 prometheus-operator,也可以通過創(chuàng)建 ServiceMonitor 的 CRD 對(duì)象來配置 Prometheus:
apiVersion: monitoring.coreos.com/v1 kind: ServiceMonitor metadata: name: tomcat namespace: default labels: app: tomcat spec: endpoints: - port: jmx-metrics interval: 5s namespaceSelector: matchNames: - default selector: matchLabels: app: tomcat
采集到了數(shù)據(jù),下面看下如何展示數(shù)據(jù),如果熟悉 Prometheus 和 Grafana,可自行根據(jù)指標(biāo)設(shè)計(jì)需要的面板,社區(qū)也有提供現(xiàn)成的,不過都有些老了,部分視圖可能展示不出來,用的比較多的是 https://grafana.com/grafana/dashboards/8563 ,可以直接導(dǎo)入,面板效果圖:
上述內(nèi)容就是如何使用Prometheus監(jiān)控JVM,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。