tencent cloud

Prometheus 监控服务

产品简介
产品概述
产品优势
应用场景
基本概念
相关限制
功能特性
开服地域
购买指南
计费概述
按量付费(后付费)
免费试用介绍
托管采集器付费介绍
归档存储付费介绍
购买方式
欠费说明
快速入门
接入指南
抓取配置说明
自定义监控
EMR 接入
Java 应用接入
Golang 应用接入
Exporters 接入
Nacos 接入
通用组件监控
健康巡检
TKE 集群内安装组件说明
云监控
非腾讯云主机监控
通过 Remote Read 读取云托管 Prometheus 实例数据
Agent 自助接入
Pushgateway 接入
安全组开放说明
操作指南
实例
容器监控
集成中心
数据多写
预聚合
实例诊断
归档存储
告警策略
标签管理
访问控制
Grafana
API 使用指南
容器服务指标
相关资源使用及计费说明
实践教程
自建 Prometheus 迁入
云服务器场景下自定义接入
容器场景监控
TKE Serverless 集群如何放通外网
Prometheus 监控服务如何接入本地 Grafana
Prometheus 实例访问公网
配置 Prometheus 公网地址
Terraform
Terraform 概述
使用 Terraform 管理 Prometheus 实例
使用 Terraform 管理 Prometheus 实例的集成中心
使用 Terraform 采集容器监控数据
使用 Terraform 配置告警策略
常见问题
基础问题
集成容器服务相关
产品咨询
使用&技术问题
云监控问题
服务等级协议
TMP 政策
TMP 隐私协议
TMP 数据处理和安全协议

JVM 接入

PDF
聚焦模式
字号
最后更新时间: 2024-01-29 15:55:14

操作场景

在使用 Java 作为开发语言的时候,需要监控 JVM 的性能。 Prometheus 监控服务通过采集应用暴露出来的 JVM 监控数据,并提供了开箱即用的 Grafana 监控大盘。
本文以如何在容器服务上部署普通 Java 应用为例,介绍如何通过 Prometheus 监控服务监控其状态。
说明:
若已使用 Spring Boot 作为开发框架,请参见 Spring Boot 接入。

前提条件

创建腾讯云容器服务 托管版集群

操作步骤

说明:
Java 作为主流的开发语言其生态较为完善,其中 micrometer 作为指标打点 SDK 已经被广泛运行,本文以 micrometer 为例介绍如何监控 JVM。

修改应用的依赖及配置

步骤1:修改 pom 依赖

pom.xml 文件中添加相关的 Maven 依赖项,试情况调整相应的版本,示例如下:
<dependency>
<groupId>io.prometheus</groupId>
<artifactId>simpleclient</artifactId>
<version>0.9.0</version>
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
<version>1.1.7</version>
</dependency>


步骤2:修改代码

在项目启动时,添加相应的监控配置,同时 micrometer 也提供了部分常用的监控数据采集,具体在 io.micrometer.core.instrument.binder 包下,可以按实际情况添加。示例如下:
public class Application {
// 作为全局变量,可以在自定义监控中使用
public static final PrometheusMeterRegistry registry = new PrometheusMeterRegistry(PrometheusConfig.DEFAULT);
static {
// 添加 Prometheus 全局 Label,建议加一上对应的应用名
registry.config().commonTags("application", "java-demo");
}

public static void main(String[] args) throws Exception {
// 添加 JVM 监控
new ClassLoaderMetrics().bindTo(registry);
new JvmMemoryMetrics().bindTo(registry);
new JvmGcMetrics().bindTo(registry);
new ProcessorMetrics().bindTo(registry);
new JvmThreadMetrics().bindTo(registry);
new UptimeMetrics().bindTo(registry);
new FileDescriptorMetrics().bindTo(registry);
System.gc(); // Test GC
try {
// 暴露 Prometheus HTTP 服务,如果已经有,可以使用已有的 HTTP Server
HttpServer server = HttpServer.create(new InetSocketAddress(8080), 0);
server.createContext("/metrics", httpExchange -> {
String response = registry.scrape();
httpExchange.sendResponseHeaders(200, response.getBytes().length);
try (OutputStream os = httpExchange.getResponseBody()) {
os.write(response.getBytes());
}
});

new Thread(server::start).start();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
说明:
由于 JVM GC Pause 监控是通过 GarbageCollector Notification 机制实现,因此只有发生 GC 之后才有监控数据。上述示例为了测试更直观,主动调用了 System.gc()

步骤3:本地验证

本地启动之后,可以通过 http://localhost:8080/metrics 访问到 Prometheus 协议的指标数据。

将应用发布到腾讯云容器服务上

步骤1:本地配置 Docker 镜像环境

如果本地之前未配置过 Docker 镜像环境,可以参见容器镜像服务 快速入门 文档进行配置。若已配置请执行下一步。

步骤2:打包及上传镜像

1. 在项目根目录下添加 Dockerfile,请根据实际项目进行修改。示例如下:
FROM openjdk:8-jdk
WORKDIR /java-demo
ADD target/java-demo-*.jar /java-demo/java-demo.jar
CMD ["java","-jar","java-demo.jar"]

2. 打包镜像,在项目根目录下运行如下命令,需要替换对应的 namespace/ImageName/镜像版本号
mvn clean package
docker build . -t ccr.ccs.tencentyun.com/[namespace]/[ImageName]:[镜像版本号]
docker push ccr.ccs.tencentyun.com/[namespace]/[ImageName]:[镜像版本号]

示例如下:
mvn clean package
docker build . -t ccr.ccs.tencentyun.com/prom_spring_demo/java-demo:latest
docker push ccr.ccs.tencentyun.com/prom_spring_demo/-demo:latest

步骤3:应用部署

1. 登录 容器服务控制台,选择需要部署的容器集群。
2. 通过工作负载 > Deployment进入 Deployment 管理页面,选择对应的 命名空间 来进行部署服务,通过 YAML 来创建对应的 Deployment,YAML 配置如下。
说明:
如需通过控制台创建,请参见Spring Boot 接入。
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
k8s-app: java-demo
name: java-demo
namespace: spring-demo
spec:
replicas: 1
selector:
matchLabels:
k8s-app: java-demo
template:
metadata:
labels:
k8s-app: java-demo
spec:
containers:
- image: ccr.ccs.tencentyun.com/prom_spring_demo/java-demo
imagePullPolicy: Always
name: java-demo
ports:
- containerPort: 8080
name: metric-port
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
dnsPolicy: ClusterFirst
imagePullSecrets:
- name: qcloudregistrykey
restartPolicy: Always
schedulerName: default-scheduler
terminationGracePeriodSeconds: 30


步骤4:添加采取任务

1. 登录 Prometheus 控制台,选择对应 Prometheus 实例进入管理页面。
2. 通过集成容器服务列表单击集群 ID 进入到容器服务集成管理页面。
3. 通过服务发现添加 Pod Monitor 来定义 Prometheus 抓取任务,YAML 配置示例如下:
apiVersion: monitoring.coreos.com/v1
kind: PodMonitor
metadata:
name: java-demo
namespace: cm-prometheus
spec:
namespaceSelector:
matchNames:
- java-demo
podMetricsEndpoints:
- interval: 30s
path: /metrics
port: metric-port
selector:
matchLabels:
k8s-app: java-demo


步骤5:查看监控

1. 在对应 Prometheus 实例 >集成中心中找到 JVM 监控,安装对应的 Grafana Dashboard 即可开启 JVM 监控大盘。
2. 打开 Prometheus 实例对应的 Grafana 地址,在 Dashboards/Manage/Application 下查看应用相关的监控大屏。
应用 JVM:从应用角度出发,查看该应用下所有实例是否有问题,当发现某个实例有问题时可以下钻到对应的实例监控。
实例 JVM:单实例 JVM 详细的监控数据。





帮助和支持

本页内容是否解决了您的问题?

填写满意度调查问卷,共创更好文档体验。

文档反馈