迁移Java应用至OpenTelemetry:是否有simpleclient_hotspot替代方案?
OpenTelemetry 实现JVM指标自动采集的方案
完全有对应的实现,OpenTelemetry提供了官方的JVM指标自动采集能力,能替代Prometheus simpleclient_hotspot里的DefaultExports.initialize(),具体操作如下:
1. 添加依赖
以Maven为例,引入相关核心依赖:
<!-- OpenTelemetry SDK 核心 --> <dependency> <groupId>io.opentelemetry</groupId> <artifactId>opentelemetry-sdk</artifactId> <version>1.32.0</version> </dependency> <!-- JVM 指标自动采集扩展 --> <dependency> <groupId>io.opentelemetry.contrib</groupId> <artifactId>opentelemetry-jvm-metrics</artifactId> <version>1.32.0</version> </dependency> <!-- 语义规范依赖,确保指标符合标准 --> <dependency> <groupId>io.opentelemetry</groupId> <artifactId>opentelemetry-semconv</artifactId> <version>1.32.0-alpha</version> </dependency>
2. 代码初始化采集
在应用启动阶段,加入以下代码开启JVM指标自动采集:
import io.opentelemetry.contrib.jvmmetrics.JvmMetrics; import io.opentelemetry.sdk.OpenTelemetrySdk; import io.opentelemetry.sdk.metrics.SdkMeterProvider; // 初始化MeterProvider(如果应用还没初始化过) SdkMeterProvider meterProvider = SdkMeterProvider.builder().build(); OpenTelemetrySdk openTelemetry = OpenTelemetrySdk.builder() .setMeterProvider(meterProvider) .build(); // 注册JVM指标采集器,自动生成JVM相关指标 JvmMetrics.builder().build().registerMetrics(openTelemetry);
3. 覆盖的指标范围
这套方案采集的JVM指标完全覆盖你之前用Prometheus获取的内容,包括:
- 堆/非堆内存的初始化、最大、已用、提交字节数
- GC的执行次数、耗时统计
- 线程的活跃、阻塞、等待等状态计数
- 类加载、卸载的数量统计
- 其他JVM运行时核心指标
这些指标可以通过OpenTelemetry的Prometheus导出器,以和之前兼容的格式暴露出来,也能发送到其他OpenTelemetry支持的后端系统。
更省心的替代方案:自动探针
如果不想改代码,直接用OpenTelemetry Java自动探针(agent)就行。启动应用时加个JVM参数,探针会自动注入JVM指标采集逻辑,无需任何代码修改:
java -javaagent:opentelemetry-javaagent.jar -jar 你的应用.jar
自动探针默认就会开启JVM指标采集,还能自动支持很多常见框架的链路追踪和指标采集。
内容的提问来源于stack exchange,提问作者Gaël J
相关产品推荐
相关产品推荐

