概述
當你的 Java 業務容器化上 K8S 後,如果對其進行監控呢?Prometheus 社群開發了 JMX Exporter 來匯出 JVM 的監控指標,以便使用 Prometheus 來採集監控資料。本文將介紹如何利用 Prometheus 與 JMX Exporter 來監控你 Java 應用的 JVM。
什麼是 JMX Exporter ?
JMX Exporter 利用 Java 的 JMX 機制來讀取 JVM 執行時的一些監控資料,然後將其轉換為 Prometheus 所認知的 metrics 格式,以便讓 Prometheus 對其進行監控採集。
那麼,JMX 又是什麼呢?它的全稱是:Java Management Extensions
。 顧名思義,是管理 Java 的一種擴充套件框架,JMX Exporter 正是基於此框架來讀取 JVM 的執行時狀態的。
如何使用 JMX Exporter 暴露 JVM 監控指標 ?
下面介紹如何通過 JMX Exporter 來暴露 Java 應用的 JVM 監控指標。
JMX Exporter 的兩種用法
JMX-Exporter 提供了兩種用法:
- 啟動獨立程式。JVM 啟動時指定引數,暴露 JMX 的 RMI 介面,JMX-Exporter 呼叫 RMI 獲取 JVM 執行時狀態資料,轉換為 Prometheus metrics 格式,並暴露埠讓 Prometheus 採集。
- JVM 程式內啟動(in-process)。JVM 啟動時指定引數,通過 javaagent 的形式執行 JMX-Exporter 的 jar 包,程式內讀取 JVM 執行時狀態資料,轉換為 Prometheus metrics 格式,並暴露埠讓 Prometheus 採集。
官方不推薦使用第一種方式,一方面配置複雜,另一方面因為它需要一個單獨的程式,而這個程式本身的監控又成了新的問題,所以本文重點圍繞第二種用法講如何在 K8S 環境下使用 JMX Exporter 暴露 JVM 監控指標。
打包映象
使用第二種用法,啟動 JVM 時需要指定 JMX Exporter 的 jar 包檔案和配置檔案。jar 包是二進位制檔案,不好通過 configmap 掛載,配置檔案我們幾乎不需要修改,所以建議是直接將 JMX Exporter 的 jar 包和配置檔案都打包到業務容器映象中。
首先準備一個製作映象的目錄,放入 JMX Exporter 配置檔案 prometheus-jmx-config.yaml
:
---
ssl: false
lowercaseOutputName: false
lowercaseOutputLabelNames: false
注: 更多配置項請參考官方文件。
然後準備 jar 包檔案,可以在 jmx_exporter 的 Github 頁面找到最新的 jar 包下載地址,下載到當前目錄:
wget https://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/0.13.0/jmx_prometheus_javaagent-0.13.0.jar
再準備 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 多階段構建,省掉手動下載 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
部署 Java 應用
有了打包好的映象,下一步我們看下如何部署應用到 K8S,關鍵點在於如何修改 JVM 啟動引數以便啟動時載入 JMX Exporter。JVM 啟動時會讀取 JAVA_OPTS
環境變數,作為額外的啟動引數,所以我們部署時可以為應用增加一下這個環境變數,示例:
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
- 啟動引數格式:
-javaagent:<jar>=<port>:<config>
。 - 這裡使用了 8088 埠暴露 JVM 的監控指標,可自行更改。
新增 Prometheus 監控配置
暴露了 JVM 的監控指標,現在來配置下 Prometheus,讓監控資料被採集到,配置示例:
- 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,也可以通過建立 ServiceMonitor 的 CRD 物件來配置 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
新增 Grafana 監控皮膚
採集到了資料,下面看下如何展示資料,如果熟悉 Prometheus 和 Grafana,可自行根據指標設計需要的皮膚,社群也有提供現成的,不過都有些老了,部分檢視可能展示不出來,用的比較多的是 https://grafana.com/grafana/dashboards/8563 ,可以直接匯入,皮膚效果圖:
參考資料
- JMX Exporter 專案地址: https://github.com/prometheus/jmx_exporter
- JVM 監控皮膚: https://grafana.com/grafana/dashboards/8563
【騰訊雲原生】雲說新品、雲研新術、雲遊新活、雲賞資訊,掃碼關注同名公眾號,及時獲取更多幹貨!!