概述
當你的Java業(yè)務容器化上K8S后,如果對其進行監(jiān)控呢?Prometheus社區(qū)開發(fā)了JMX Exporter來導出JVM的監(jiān)控指標,以便使用Prometheus來采集監(jiān)控數(shù)據。本文將介紹如何利用Prometheus與JMX Exporter來監(jiān)控你Java應用的JVM。
什么是JMX Exporter?
JMX Exporter利用Java的JMX機制來讀取JVM運行時的一些監(jiān)控數(shù)據,然后將其轉換為Prometheus所認知的metrics格式,以便讓Prometheus對其進行監(jiān)控采集。
那么,JMX又是什么呢?它的全稱是:Java Management Extensions。顧名思義,是管理Java的一種擴展框架,JMX Exporter正是基于此框架來讀取JVM的運行時狀態(tài)的。
如何使用JMX Exporter 暴露JVM監(jiān)控指標?
下面介紹如何通過JMX Exporter來暴露Java應用的JVM監(jiān)控指標。
JMX Exporter的兩種用法
JMX-Exporter提供了兩種用法:
1.啟動獨立進程。JVM啟動時指定參數(shù),暴露JMX的RMI接口,JMX-Exporter調用RMI獲取JVM運行時狀態(tài)數(shù)據,轉換為Prometheus metrics格式,并暴露端口讓Prometheus采集。
2.JVM進程內啟動(in-process)。JVM啟動時指定參數(shù),通過javaagent的形式運行JMX-Exporter的jar包,進程內讀取JVM運行時狀態(tài)數(shù)據,轉換為Prometheus metrics格式,并暴露端口讓Prometheus采集。
官方不推薦使用第一種方式,一方面配置復雜,另一方面因為它需要一個單獨的進程,而這個進程本身的監(jiān)控又成了新的問題,所以本文重點圍繞第二種用法講如何在K8S環(huán)境下使用JMX Exporter暴露JVM監(jiān)控指標。
打包鏡像
使用第二種用法,啟動JVM時需要指定JMX Exporter的jar包文件和配置文件。jar包是二進制文件,不好通過configmap掛載,配置文件我們幾乎不需要修改,所以建議是直接將JMX Exporter的jar包和配置文件都打包到業(yè)務容器鏡像中。
首先準備一個制作鏡像的目錄,放入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啟動參數(shù)以便啟動時加載JMX Exporter。JVM啟動時會讀取JAVA_OPTS環(huán)境變量,作為額外的啟動參數(shù),所以我們部署時可以為應用增加一下這個環(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
·啟動參數(shù)格式:-javaagent:<jar>=<port>:<config>。
·這里使用了8088端口暴露JVM的監(jiān)控指標,可自行更改。
添加Prometheus監(jiān)控配置
暴露了JVM的監(jiān)控指標,現(xiàn)在來配置下Prometheus,讓監(jiān)控數(shù)據被采集到,配置示例:
- 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對象來配置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監(jiān)控面板
采集到了數(shù)據,下面看下如何展示數(shù)據,如果熟悉Prometheus和Grafana,可自行根據指標設計需要的面板,社區(qū)也有提供現(xiàn)成的,不過都有些老了,部分視圖可能展示不出來,用的比較多的是https://grafana.com/grafana/dashboards/8563,可以直接導入,面板效果圖:
參考資料
·JMX Exporter項目地址:https://github.com/prometheus/jmx_exporter
·JVM監(jiān)控面板:https://grafana.com/grafana/dashboards/8563