通過在應用中埋點來暴露JVM數(shù)據(jù),使用阿里云Prometheus采集JVM數(shù)據(jù),借助Prometheus Grafana大盤來展示JVM數(shù)據(jù),并創(chuàng)建報警,即可實現(xiàn)利用阿里云Prometheus監(jiān)控JVM的目的。本文以阿里云容器服務K8s集群和阿里云容器鏡像服務為例,介紹如何通過阿里云Prometheus監(jiān)控JVM。

前提條件

Demo

如需快速體驗如何通過阿里云Prometheus監(jiān)控JVM,您可以使用已埋點的Demo項目

操作流程

通過阿里云Prometheus監(jiān)控JVM的操作流程如下圖所示。

flow

步驟一:為應用埋點

為應用埋點以暴露JVM數(shù)據(jù)的操作步驟如下:

  1. pom.xml文件中添加Maven依賴。
    <dependency>
        <groupId>io.prometheus</groupId>
        <artifactId>simpleclient_hotspot</artifactId>
        <version>0.6.0</version>
    </dependency>
  2. 在應用代碼中添加初始化JVM Exporter的方法。
    @PostConstruct
        public void initJvmExporter() {
            io.prometheus.client.hotspot.DefaultExports.initialize();
        }

    您可以參考Demo項目的/src/main/java/com/monitise/prometheus_demo/DemoController.java文件。

  3. application.properties文件中配置用于可觀測監(jiān)控 Prometheus 版的端口和路徑。
    management.port: 8081
    endpoints.prometheus.path: prometheus-metrics

    您可以參考Demo項目的/src/main/resources/application.properties文件。

  4. 在應用代碼中添加打開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文件。

步驟二:上傳應用

將完成埋點的應用制作成鏡像并上傳至阿里云容器鏡像服務的鏡像倉庫的操作步驟如下:

  1. 執(zhí)行以下命令重新編譯模塊。
    mvn clean install -DskipTests
  2. 執(zhí)行以下命令構建鏡像。
    docker build -t <本地臨時Docker鏡像名稱>:<本地臨時Docker鏡像版本號> . --no-cache
    示例命令:
    docker build -t promethues-demo:v0 . --no-cache
  3. 執(zhí)行以下命令為鏡像打標。
    sudo docker tag <本地臨時Docker鏡像名稱>:<本地臨時Docker鏡像版本號> <Registry域名>/<命名空間>/<鏡像名稱>:<鏡像版本號>
    示例命令:
    sudo docker tag promethues-demo:v0 registry.cn-hangzhou.aliyuncs.com/testnamespace/promethues-demo:v0
  4. 執(zhí)行以下命令將鏡像推送至鏡像倉庫。
    sudo docker push <Registry域名>/<命名空間>/<鏡像名稱>:<鏡像版本號>
    示例命令:
    sudo docker push registry.cn-hangzhou.aliyuncs.com/testnamespace/promethues-demo:v0
    容器鏡像服務控制臺鏡像版本頁面顯示上傳的應用鏡像。鏡像

步驟三:部署應用

將應用部署至容器服務K8s集群的操作步驟如下:

  1. 登錄容器服務管理控制臺
  2. 在左側(cè)導航欄,選擇集群
  3. 集群列表頁面,找到目標集群,在其右側(cè)操作列單擊應用管理
  4. 創(chuàng)建容器組。
    1. 在左側(cè)導航欄,選擇工作負載 > 無狀態(tài)
    2. 無狀態(tài)頁面,單擊使用YAML創(chuàng)建資源
    3. 創(chuàng)建頁面的模板代碼框輸入以下內(nèi)容,然后單擊創(chuàng)建
      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
    無狀態(tài)頁面顯示創(chuàng)建的容器組。容器組
  5. 創(chuàng)建服務。
    1. 在左側(cè)導航欄,選擇網(wǎng)絡 > 服務
    2. 服務頁面,單擊使用YAML創(chuàng)建資源
    3. 創(chuàng)建頁面的模板代碼框輸入以下內(nèi)容,然后單擊創(chuàng)建
      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
    服務頁面顯示創(chuàng)建的服務。服務

步驟四:配置服務發(fā)現(xiàn)

通過ServiceMonitor配置可觀測監(jiān)控 Prometheus 版的服務發(fā)現(xiàn)以采集JVM數(shù)據(jù)。具體操作,請參見通過ServiceMonitor創(chuàng)建服務發(fā)現(xiàn)