通過在應用中埋點來暴露JVM資料,使用阿里雲Prometheus採集JVM資料,藉助Prometheus Grafana大盤來展示JVM資料,並建立警示,即可實現利用阿里雲Prometheus監控JVM的目的。本文以阿里雲Container ServiceK8s叢集和阿里雲Container Registry為例,介紹如何通過阿里雲Prometheus監控JVM。
前提條件
阿里雲Container ServiceK8s叢集已接入可觀測監控 Prometheus 版。如何接入,請參見容器可觀測。
已建立阿里雲Container Registry鏡像倉庫。如何建立,請參見步驟二:建立鏡像倉庫。
Demo
如需快速體驗如何通過阿里雲Prometheus監控JVM,您可以使用已埋點的Demo專案。
操作流程
通過阿里雲Prometheus監控JVM的操作流程如下圖所示。

步驟一:為應用埋點
為應用埋點以暴露JVM資料的操作步驟如下:
在pom.xml檔案中添加Maven依賴。
<dependency> <groupId>io.prometheus</groupId> <artifactId>simpleclient_hotspot</artifactId> <version>0.6.0</version> </dependency>在應用代碼中添加初始化JVM Exporter的方法。
@PostConstruct public void initJvmExporter() { io.prometheus.client.hotspot.DefaultExports.initialize(); }您可以參考Demo專案的/src/main/java/com/monitise/prometheus_demo/DemoController.java檔案。
在application.properties檔案中配置用於可觀測監控 Prometheus 版的連接埠和路徑。
management.port: 8081 endpoints.prometheus.path: prometheus-metrics您可以參考Demo專案的/src/main/resources/application.properties檔案。
在應用代碼中添加開啟HTTP連接埠的方法。
@SpringBootApplication // sets up the prometheus endpoint /prometheus-metrics @EnablePrometheusEndpoint // exports the data at /metrics at a prometheus endpoint @EnableSpringBootMetricsCollector public class PrometheusDemoApplication { public static void main(String[] args) { SpringApplication.run(PrometheusDemoApplication.class, args); } }您可以參考Demo專案的/src/main/java/com/monitise/prometheus_demo/PrometheusDemoApplication.java檔案。
步驟二:上傳應用
將完成埋點的應用製作成鏡像並上傳至阿里雲Container Registry的鏡像倉庫的操作步驟如下:
執行以下命令重新編譯模組。
mvn clean install -DskipTests執行以下命令構建鏡像。
docker build -t <本地臨時Docker鏡像名稱>:<本地臨時Docker鏡像版本號碼> . --no-cache樣本命令:
docker build -t promethues-demo:v0 . --no-cache執行以下命令為鏡像打標。
sudo docker tag <本地臨時Docker鏡像名稱>:<本地臨時Docker鏡像版本號碼> <Registry網域名稱>/<命名空間>/<鏡像名稱>:<鏡像版本號碼>樣本命令:
sudo docker tag promethues-demo:v0 registry.cn-hangzhou.aliyuncs.com/testnamespace/promethues-demo:v0執行以下命令將鏡像推送至鏡像倉庫。
sudo docker push <Registry網域名稱>/<命名空間>/<鏡像名稱>:<鏡像版本號碼>樣本命令:
sudo docker push registry.cn-hangzhou.aliyuncs.com/testnamespace/promethues-demo:v0Container Registry控制台的鏡像版本頁面顯示上傳的應用鏡像。

步驟三:部署應用
將應用部署至Container ServiceK8s叢集的操作步驟如下:
登入Container Service管理主控台,在左側導覽列選擇叢集列表。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇。
在無狀態頁面,單擊使用YAML建立資源,然後建立應用。
apiVersion: apps/v1 # for versions before 1.8.0 use apps/v1beta1 kind: Deployment metadata: name: prometheus-demo spec: replicas: 2 template: metadata: annotations: prometheus.io/scrape: 'true' prometheus.io/path: '/prometheus-metrics' prometheus.io/port: '8081' labels: app: tomcat spec: containers: - name: tomcat imagePullPolicy: Always image: <Registry網域名稱>/<命名空間>/<鏡像名稱>:<鏡像版本號碼> ports: - containerPort: 8080 name: tomcat-normal - containerPort: 8081 name: tomcat-monitor範例程式碼:
apiVersion: apps/v1 # for versions before 1.8.0 use apps/v1beta1 kind: Deployment metadata: name: prometheus-demo labels: app: tomcat spec: replicas: 2 selector: matchLabels: app: tomcat template: metadata: annotations: prometheus.io/scrape: 'true' prometheus.io/path: '/prometheus-metrics' prometheus.io/port: '8081' labels: app: tomcat spec: containers: - name: tomcat imagePullPolicy: Always image: registry.cn-hangzhou.aliyuncs.com/peiyu-test/prometheus-demo:v0 ports: - containerPort: 8080 name: tomcat-normal - containerPort: 8081 name: tomcat-monitor無狀態頁面顯示建立的容器組。

建立服務。
在左側導覽列,選擇。
在服務頁面,單擊使用YAML建立資源。
在建立頁面的模板代碼框輸入以下內容,然後單擊建立。
apiVersion: v1 kind: Service metadata: labels: app: tomcat name: tomcat namespace: default spec: ports: - name: tomcat-normal port: 8080 protocol: TCP targetPort: 8080 - name: tomcat-monitor port: 8081 protocol: TCP targetPort: 8081 type: NodePort selector: app: tomcat
服務頁面顯示建立的服務。

步驟四:佈建服務發現
通過ServiceMonitor配置可觀測監控 Prometheus 版的服務發現以採集JVM資料。具體操作,請參見通過ServiceMonitor建立服務發現。