通过在应用中埋点来暴露 JVM 数据,使用 ARMS Prometheus 监控抓取 JVM 数据,并借助 ARMS Prometheus Grafana 大盘来展示 JVM 数据,即可实现通过 ARMS Prometheus 监控 JVM 的目的。

背景信息

本教程的操作流程如图所示。

How it works

步骤一:通过埋点暴露 JVM 数据

首先需要在应用中使用 JVM Exporter 暴露 JVM 数据。

  1. 在 pom.xml 文件中添加以下依赖。
    <dependency>
        <groupId>io.prometheus</groupId>
        <artifactId>simpleclient_hotspot</artifactId>
        <version>0.6.0</version>
    </dependency>
  2. 在可以执行初始化的位置添加对 JVM Exporter 的依赖。

    例如 Demo 工程的 \src\main\java\com\monitise\prometheus_demo\DemoController.java 文件。

    @PostConstruct
        public void initJvmExporter() {
            io.prometheus.client.hotspot.DefaultExports.initialize();
        }
  3. \src\main\resources\application.properties 文件中暴露用于 Prometheus 监控的端口(Port)和路径(Path)。
    management.port: 8081
    endpoints.prometheus.path: prometheus-metrics

    打开 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);
        }
    }

步骤二:将应用部署至阿里云容器服务 K8s 集群

其次需要将应用部署至容器服务 K8s 集群,以便 ARMS Prometheus 监控抓取 JVM 数据。

  1. 逐行运行 buildDockerImage.sh 中的以下命令。
    mvn clean install -DskipTests
    docker build -t <本地临时Docker镜像名称>:<本地临时Docker镜像版本号> . --no-cache
    sudo docker tag <本地临时Docker镜像名称>:<本地临时Docker镜像版本号> <Registry域名>/<命名空间>/<镜像名称>:<镜像版本号>
    sudo docker push <Registry域名>/<命名空间>/<镜像名称>:<镜像版本号>
    例如:
    mvn clean install -DskipTests
    docker build -t promethues-demo:v0 . --no-cache
    sudo docker tag promethues-demo:v0 registry.cn-hangzhou.aliyuncs.com/fuling/promethues-demo:v0
    sudo docker push registry.cn-hangzhou.aliyuncs.com/fuling/promethues-demo:v0
    此步骤构建了名为 promethues-demo 的 Docker 镜像,并将镜像推送至阿里云 Docker Registry。
  2. 登录容器服务 Kubernetes 版控制台
  3. 在左侧导航栏选择集群 > 集群,在集群列表页面上的目标集群右侧操作列单击控制台
    K8s Cluster Console Button
  4. 在左侧导航栏选择工作负载 > 部署,在页面右上角单击创建,并在使用文本创建页签上填写以下内容。
    说明 以下配置文件中的 prometheus.io/portprometheus.io/path 的值分别为步骤一:通过埋点暴露 JVM 数据中暴露的 Prometheus 监控端口和路径。
    apiVersion: extensions/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.cn-hangzhou.aliyuncs.com/fuling/promethues-demo:v0
            ports:
            - containerPort: 8080
              name: tomcat-normal
            - containerPort: 8081
              name: tomcat-monitor
    此步骤将步骤 1 中创建的 promethues-demo 这个 Docker 镜像部署至容器服务 K8s 集群中。
  5. 在左侧导航栏选择服务发现与负载均衡 > 服务,在页面右上角单击创建,并在使用文本创建页签上填写以下内容。
    apiVersion: v1
    kind: Service
    metadata:
      labels:
        name: 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

步骤三:配置 ARMS Prometheus 监控以抓取 JVM 数据

接下来需要在 ARMS 控制台配置 ARMS Prometheus 监控以抓取 JVM 数据。

  1. 登录 ARMS 控制台
  2. 在左侧导航栏中单击 Prometheus监控
  3. Prometheus监控页面顶部选择容器服务 K8s 集群所在的地域,并在目标集群右侧的操作列单击安装
  4. ARMS Prometheus Agent 安装完毕后,在目标集群右侧的操作列单击设置
  5. 配置详情页签上单击添加ServiceMonitor,在新增ServiceMonitor 对话框中填写以下内容。
    apiVersion: monitoring.coreos.com/v1
    kind: ServiceMonitor
    metadata:
      # 填写一个唯一名称
      name: tomcat-demo
      # 填写目标命名空间
      namespace: default
    spec:
      endpoints:
      - interval: 30s
        # 填写 Prometheus Exporter 对应的 Port 的 Name 字段的值
        port: tomcat-monitor
        # 填写 Prometheus Exporter 对应的 Path 的值
        path: /prometheus-metrics
      namespaceSelector:
        any: true
      selector:
        matchLabels:
          app: tomcat

步骤四:通过 Grafana 大盘展示 JVM 数据

最后需要在 ARMS 控制台导入 Grafana 大盘模板并指定 Prometheus 数据源所在的容器服务 K8s 集群。

  1. 打开 ARMS Prometheus Grafana 大盘概览页
  2. 在左侧导航栏中选择 + > Import,并在 Grafana.com Dashboard 文本框输入 10877,然后单击 Load
    Import Grafana Dashboard
  3. Import 页面输入以下信息,然后单击 Import
    Import Grafana Dashboard with Options
    1. Name 文本框中输入自定义的大盘名称。
    2. Folder 下拉框中选择您的阿里云容器服务 K8s 集群。
    3. Select a Prometheus data source 下拉框中选择您的阿里云容器服务 K8s 集群。

执行结果

配置完毕后的 ARMS Prometheus Grafana JVM 大盘如图所示。ARMS Prometheus Grafana Dashboard for JVM

后续步骤

ARMS Prometheus Grafana JVM 大盘配置完毕后,您可以查看 Prometheus 监控指标和进一步自定义大盘,详见相关文档。