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

前提条件

您已完成以下操作:

操作流程

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

How it works

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

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

具体步骤如下:

  1. pom.xml文件中添加Maven依赖。
    <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
  4. /src/main/java/com/monitise/prometheus_demo/PrometheusDemoApplication.java文件中打开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. 逐行运行Demo工程中的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镜像,并将镜像推送至阿里云容器镜像服务ACR。
  2. 登录容器服务Kubernetes版控制台
  3. 在左侧导航栏选择集群 > 集群,在集群列表页面上的目标集群右侧操作列单击控制台
    K8s Cluster Console Button
  4. 在左侧导航栏选择工作负载 > 部署,在页面右上角单击创建,并在使用文本创建页签的文本框中填写以下内容。
    说明 以下配置文件中的prometheus.io/portprometheus.io/path的值分别为步骤一中暴露的ARMS 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:
        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

步骤三:配置ARMS Prometheus监控以采集JVM数据

您需要在ARMS控制台配置ARMS Prometheus监控以采集JVM数据。

具体步骤如下:

  1. 登录ARMS控制台
  2. 在左侧导航栏中单击Prometheus监控
  3. Prometheus监控页面顶部选择容器服务K8s集群所在的地域,并在目标集群右侧的操作列单击安装
    ARMS Prometheus Agent安装完毕后,请继续执行下一步操作。
  4. 在目标集群右侧的操作列单击设置
  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

步骤五:创建Prometheus监控报警

  1. 报警创建提供两个入口,您可根据需要自行选择其中一个入口进入创建报警环节:
    • ARMS Prometheus Grafana大盘New DashBoard页面,单击左侧的 图标,跳转至ARMS Prometheus 报警规则和历史页面,在右上角单击创建报警 > Prometheus
    • 在控制台左侧导航栏中选择报警管理 > 报警策略管理,进入报警规则和历史页面,在右上角单击创建报警 > Prometheus
  2. 创建报警对话框中输入所有必填信息,完成后单击保存
    Prometheus Monitoring Alarm

    在创建报警对话框中配置如下参数:

    1. 填写报警名称,例如:网络接收压力报警。
    2. 选择要创建报警的Prometheus监控对应的集群
    3. 选择类型grafana
    4. 选择要监控的具体大盘图表
    5. 设置报警规则。
      1. 选中同时满足下述规则
      2. 编辑报警规则,例如:N=5时网络接收数据字节(MB)的平均值大于等于3时则报警。
        说明 一个Grafana图表中可能有A、B、C等多条曲线数据,您可根据您的需求设置监控其中的一条线。
      3. PromQL输入框中编辑或重新输入PromQL语句。
        注意 PromQL语句中包含的$符号会导致报错,您需要删除包含$符号的语句中=左右两边的参数及=sum (rate (container_network_receive_bytes_total{instance=~"^$HostIp.*"}[1m]))修改为sum (rate (container_network_receive_bytes_total[1m]))
    6. 选中通知方式,例如:选中短信。
    7. 设置通知对象。在全部联系组中单击联系人分组的名称,该联系人分组出现在已选联系组中,即设置成功。

相关操作

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