使用OpenTelemetry监控Spring Web MVC应用:JVM指标缺失问题排查
核心原因
你提到的缺失的jvm_*系列指标,本质是Micrometer标准JVM指标。Spring Boot默认集成了Micrometer框架,OpenTelemetry Java Agent会自动适配Micrometer的指标导出流程,因此能直接采集到这些命名规范的指标;而纯Spring Web MVC项目没有内置Micrometer,自然不会生成这类指标。这和是否内置Tomcat无关——即使是外置Tomcat的Spring Boot项目,只要Micrometer存在,就能采集到jvm_*指标。
你当前采集到的process_runtime_jvm_*指标,是OpenTelemetry Java Agent通过JVM Runtime直接获取的原生指标,和Micrometer的jvm_*指标是同源数据,只是命名空间不同。
无侵入解决方案
方案1:启用OpenTelemetry JMX Instrumentation(推荐,完全无侵入)
通过配置开启Java Agent的JMX指标采集功能,直接从JVM的JMX MBean中获取数据,生成标准的jvm_*指标。
修改你的otel.properties,添加以下配置:
otel.instrumentation.jmx.enabled=true # 可选:默认已覆盖常用JVM指标,无需额外指定采集目标 # otel.instrumentation.jmx.targets=...
重启应用后,即可采集到你需要的jvm_memory_used_bytes、jvm_threads_live等指标。
方案2:复用现有等价指标
如果可以接受指标命名差异,你当前采集到的process_runtime_jvm_*指标完全覆盖了缺失的jvm_*指标的核心数据:
process_runtime_jvm_memory_used_bytes对应jvm_memory_used_bytesprocess_runtime_jvm_classes_current_loaded对应jvm_classes_loadedprocess_runtime_jvm_threads_count包含jvm_threads_live的核心统计
无需额外配置即可直接使用这些指标。
方案3:最小化依赖调整(若允许轻微修改)
如果可以添加少量依赖而不改动业务代码,引入Micrometer核心包和OTLP注册器:
<!-- pom.xml 示例 --> <dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-core</artifactId> <version>1.12.0</version> </dependency> <dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-registry-otlp</artifactId> <version>1.12.0</version> </dependency>
OpenTelemetry Java Agent会自动识别Micrometer并导出标准的jvm_*指标,无需额外配置。
关于你尝试操作的说明
opentelemetry-spring-webmvc依赖主要用于Web请求的链路追踪,对JVM指标采集无帮助;- 启用JMX是正确方向,但需通过Java Agent的配置开关(
otel.instrumentation.jmx.enabled=true)触发采集,而非单纯开启JMX服务。
内容的提问来源于stack exchange,提问作者purple coder

