一、操作场景
这篇说说了通过 client_java 或 jmx_exporter 两种方式输出 JVM 指标,用 Prometheus 监控服务监控其状态。
注意:说明:
注意:若已使用 Spring Boot 作为开发框架,请参见 Spring Boot 接入。
二、前提条件
·创建腾讯云容器服务 托管版集群。
·使用 容器镜像服务 管理应用镜像。
三、client_java
client_java 是 Prometheus 提供的采集 SDK,提供简洁的 API 自定义指标埋点,还有开箱即用的 JVM 指标,是开发者接入 Prometheus 监控服务的首选方式。
四、修改应用的依赖及配置
1. 修改 pom 依赖。在 pom.xml 文件中添加相关的 Maven 依赖项,1.x 版本做了重构和老版本已经不兼容,优先选择最新版本,示例如下:
<dependency> <groupId>io.prometheus</groupId> <artifactId>prometheus-metrics-core</artifactId> <version>1.3.3</version>
</dependency>
<dependency> <groupId>io.prometheus</groupId> <artifactId>prometheus-metrics-instrumentation-jvm</artifactId> <version>1.3.3</version>
</dependency>
<dependency> <groupId>io.prometheus</groupId> <artifactId>prometheus-metrics-exporter-httpserver</artifactId> <version>1.3.3</version>
</dependency>
2. 修改代码。初始化并注册 Metrics,示例如下:
package org.example;
import io.prometheus.metrics.core.metrics.Counter;
import io.prometheus.metrics.exporter.httpserver.HTTPServer;
import io.prometheus.metrics.instrumentation.jvm.JvmMetrics;
import java.io.IOException;
public class Main { public static void main(String[] args) throws InterruptedException, IOException { JvmMetrics.builder().register(); // 初始化并注册 JVM 指标 // 初始化并注册业务自定义指标 Counter counter = Counter.builder() .name("my_count_total") .help("example counter") .labelNames("status") .register(); counter.labelValues("ok").inc(); counter.labelValues("ok").inc(); counter.labelValues("error").inc(); // 启动 metrics http server HTTPServer server = HTTPServer.builder() .port(9400) .buildAndStart(); System.out.println("HTTPServer listening on port http://localhost:" + server.getPort() + "/metrics") Thread.currentThread().join(); }
}
3. 本地验证。本地启动之后,可以通过 http://localhost:9400/metrics 访问到 Prometheus 协议的指标数据。
http://localhost:9400/metrics
五、将应用发布到腾讯云容器服务上
1. 本地配置 Docker 镜像环境。如果本地之前未配置过 Docker 镜像环境,可以参见容器镜像服务 Docker 镜像操作快速入门 进行配置。若已配置请执行下一步。
2. 打包及上传镜像。
2.1 在项目根目录下添加 Dockerfile,请根据实际项目进行修改。示例如下:
FROM openjdk:8-jdkWORKDIR /java-demoADD target/java-demo-*.jar /java-demo/java-demo.jarCMD ["java","-jar","java-demo.jar"]
2.2 打包镜像,在项目根目录下运行如下命令,需要替换对应的 [namespace]、[ImageName] 和 [镜像版本号]。
mvn clean package mkdir target cp demo.jar target/application.jar docker build . -t ccr.ccs.tencentyun.com/[namespace]/[ImageName]:[镜像版本号] docker push ccr.ccs.tencentyun.com/[namespace]/[ImageName]:[镜像版本号]
六、jmx_exporter
jmx_exporter 是 Prometheus exporter,把 JVM 原生 MBeans 数据转换为 Prometheus 格式的指标并通过 HTTP 服务暴露出来。jmx_exporter 以 Java Agent 无代码侵入方式运行,但是只能暴露已经注册到 MBeans 上的指标,无法做业务自定义埋点。对于绝大部分的开发者,client_java 是最常用的接入手段。
七、准备 jmx_exporter 资源
1. 下载 jar 包。在项目 发布页 下载最新版本的 Java Agent Jar 包,这里以1.0.1为例。
wget https://repo.maven.apache.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/1.0.1/jmx_prometheus_javaagent-1.0.1.jar
2. 准备配置文件 jmx.yml。此处使用最少可用配置,各个配置项的详细说明请参见 文档。
rules:- pattern: ".*"
3. 本地验证。jmx_exporter 启动格式是 -javaagent:<jmx_exporter jar 路径>=< metric 暴露端口>:< jmx_exporter 配置文件路径>。
java -javaagent:./jmx_prometheus_javaagent-1.0.1.jar=9400:./jmx.yml -jar demo.jar
4. 正常启动后,访问 http://localhost:9400/metrics 会返回 jvm 开头的指标。
http://localhost:9400/metrics
八、将应用发布到腾讯云容器服务上
1. 本地配置 Docker 镜像环境。如果本地之前未配置过 Docker 镜像环境,请参见容器镜像服务 Docker 镜像操作快速入门 进行配置。若已配置请执行下一步。
2. 打包及上传镜像。
2.1 在项目根目录下添加Dockerfile,请根据实际项目进行修改。示例如下:
FROM openjdk:8-jdkWORKDIR /java-demo# 添加下载的 jmx_exporter jar 包ADD ./jmx_prometheus_javaagent-1.0.1.jar /java-demo/jmx_prometheus_javaagent-1.0.1.jar# 添加准备的 jmx_exporter 配置文件ADD ./jmx.yml /java-demo/jmx.ymlADD ./target/application.jar /java-demo/java-demo.jar# 通过 java agent 注入 jmx_exporterCMD ["java", "-javaagent:/java-demo/jmx_prometheus_javaagent-1.0.1.jar=9400:/java-demo/jmx.yml", "-jar", "java-demo.jar"]
2.2 打包镜像,在项目根目录下运行如下命令,需要替换对应的 [namespace]、[ImageName] 和 [镜像版本号],与容器镜像服务中一致。
docker build . -t ccr.ccs.tencentyun.com/[namespace]/[ImageName]:[镜像版本号] docker push ccr.ccs.tencentyun.com/[namespace]/[ImageName]:[镜像版本号]
九、应用部署
1. 登录 容器服务控制台,在左侧菜单栏中集群页面,选择需要部署的容器集群。
2. 通过工作负载 > Deployment 进入 Deployment 管理页面,选择对应的命名空间进行部署服务,通过 YAML 来创建对应的 Deployment,YAML 配置如下。
注意:说明:
apiVersion: apps/v1kind: Deploymentmetadata: labels: k8s-app: java-demo name: java-demo namespace: java-demospec: replicas: 1 selector: matchLabels: k8s-app: java-demo template: metadata: labels: k8s-app: java-demo spec: containers: – image: ccr.ccs.tencentyun.com/prometheus-demo/java-demo imagePullPolicy: Always name: java-demo ports: – containerPort: 9400 name: metric-port
十、添加采集任务
1. 登录 腾讯云可观测平台。
2. 在左侧菜单栏中选择 Prometheus 监控,选择对应 Prometheus 实例进入管理页面。
3. 选择数据采集 > 集成容器服务,进入到容器服务集成管理页面。
4. 选择数据采集配置 > 新增自定义监控 > yaml 编辑 > PodMonitors 新增抓取任务,YAML 配置示例如下:
apiVersion: monitoring.coreos.com/v1kind: PodMonitormetadata: name: java-demo namespace: java-demospec: namespaceSelector: matchNames: – java-demo podMetricsEndpoints: – interval: 15s path: /metrics port: metric-port relabelings: – action: replace sourceLabels: – __meta_kubernetes_pod_label_k8s_app targetLabel: application selector: matchLabels: k8s-app: java-demo
十一、查看监控
1. 进入对应 Prometheus 实例,在数据采集 > 集成中心中找到 JVM 监控,安装对应的 Grafana Dashboard 即可开启 JVM 监控大盘。
2. 打开 Prometheus 实例对应的 Grafana 地址,在 Dashboards 下查看应用相关的监控大屏。
·应用 JVM:从应用角度出发,查看该应用下所有实例是否存在异常,当发现某个实例有异常时,可以下钻到对应的实例监控。
·实例 JVM:单实例 JVM 详细的监控数据。