通过在应用中埋点来暴露JVM数据,使用阿里云Prometheus监控采集JVM数据,借助Prometheus Grafana大盘来展示JVM数据,并创建报警,即可实现利用Prometheus监控JVM的目的。本文以阿里云容器服务K8s集群和阿里云容器镜像服务为例,介绍如何通过Prometheus监控JVM。

前提条件

Demo

如需快速体验如何通过Prometheus监控JVM,您可以使用已埋点的Demo项目

操作流程

通过阿里云Prometheus监控JVM的操作流程如下图所示。

flow

步骤一:为应用埋点

为应用埋点以暴露JVM数据的操作步骤如下:

  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文件中配置用于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. 执行以下命令重新编译模块。
    mvn clean install -DskipTests
  2. 执行以下命令构建镜像。
    docker build -t <本地临时Docker镜像名称>:<本地临时Docker镜像版本号> . --no-cache
    示例命令:
    docker build -t promethues-demo:v0 . --no-cache
  3. 执行以下命令为镜像打标。
    sudo docker tag <本地临时Docker镜像名称>:<本地临时Docker镜像版本号> <Registry域名>/<命名空间>/<镜像名称>:<镜像版本号>
    示例命令:
    sudo docker tag promethues-demo:v0 registry.cn-hangzhou.aliyuncs.com/testnamespace/promethues-demo:v0
  4. 执行以下命令将镜像推送至镜像仓库。
    sudo docker push <Registry域名>/<命名空间>/<镜像名称>:<镜像版本号>
    示例命令:
    sudo docker push registry.cn-hangzhou.aliyuncs.com/testnamespace/promethues-demo:v0
    容器镜像服务控制台镜像版本页面显示上传的应用镜像。镜像

步骤三:部署应用

将应用部署至容器服务K8s集群的操作步骤如下:

  1. 登录容器服务管理控制台
  2. 在左侧导航栏,选择集群
  3. 集群列表页面,找到目标集群,在其右侧操作列单击应用管理
  4. 创建容器组。
    1. 在左侧导航栏,选择工作负载 > 无状态
    2. 无状态页面,单击使用模板创建
    3. 创建页面的模板代码框输入以下内容,然后单击创建
      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
    无状态页面显示创建的容器组。容器组
  5. 创建服务。
    1. 在左侧导航栏,选择服务与路由 > 服务
    2. 服务页面,单击使用YAML创建资源
    3. 创建页面的模板代码框输入以下内容,然后单击创建
      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创建服务发现