通过在应用中埋点来暴露 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
  2. 创建报警对话框中输入所有必填信息,完成后单击保存
    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. 设置通知对象。在全部联系组中单击联系人分组的名称,该联系人分组出现在已选联系组中,即设置成功。
    Prometheus Monitoring Alarm

后续步骤

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