如何让OpenTelemetry Java Agent采集导出Spring Boot自定义健康指标
解决Spring Boot自定义指标无法被OpenTelemetry Java Agent导出的问题
问题根源
你参考的博客代码已经过时——当前版本的OpenTelemetry Java Agent不再将OpenTelemetryMeterRegistry放入Metrics.globalRegistry,而是通过字节码注入直接拦截Micrometer的Meter创建流程,所以你找不到Registry是正常的。同时默认情况下Agent可能未开启Micrometer指标采集,导致自定义指标无法被导出。
解决方案
方案一:通过Agent配置自动采集自定义Micrometer指标
这是最简单的方式,无需修改代码,只需调整VM启动参数:
- 更新VM选项,添加Micrometer instrumentation启用配置和服务标识:
-javaagent:./opentelemetry-javaagent.jar -Dotel.instrumentation.micrometer.enabled=true -Dotel.metrics.exporter=otlp -Dotel.resource.attributes=service.name=你的服务名称
otel.instrumentation.micrometer.enabled=true:启用Agent对Micrometer指标的自动采集service.name必须设置,否则OTEL Collector可能会忽略无标识的指标
- 验证:启动应用后,查看OTEL Collector的指标接收日志,或通过Collector的导出目标(如Prometheus)查看
health指标是否存在。
方案二:手动绑定自定义指标到Agent的OpenTelemetry实例
如果自动采集未生效,可以直接使用Agent提供的OpenTelemetry实例注册指标,绕过Spring的MeterRegistry:
修改你的自定义指标配置类:
import io.opentelemetry.api.OpenTelemetry; import io.opentelemetry.api.metrics.Meter; import org.springframework.boot.actuate.health.HealthEndpoint; import org.springframework.boot.actuate.health.Status; import org.springframework.context.annotation.Configuration; import jakarta.annotation.PostConstruct; @Configuration(proxyBeanMethods = false) public class MyHealthMetricsExportConfiguration { private final HealthEndpoint healthEndpoint; private final OpenTelemetry openTelemetry; // 直接注入Agent初始化的OpenTelemetry实例 public MyHealthMetricsExportConfiguration(HealthEndpoint healthEndpoint, OpenTelemetry openTelemetry) { this.healthEndpoint = healthEndpoint; this.openTelemetry = openTelemetry; } @PostConstruct public void registerHealthMetric() { // 创建自定义Meter Meter meter = openTelemetry.meterBuilder("com.yourcompany.metrics").build(); // 注册health指标 meter.gaugeBuilder("health") .setDescription("服务健康状态码") .setUnit("1") .buildWithCallback(measurement -> { int statusCode = getStatusCode(healthEndpoint); measurement.record(statusCode); }); } private int getStatusCode(HealthEndpoint health) { Status status = health.health().getStatus(); if (Status.UP.equals(status)) { return 3; } if (Status.OUT_OF_SERVICE.equals(status)) { return 2; } if (Status.DOWN.equals(status)) { return 1; } return 0; } }
排查步骤
- 确认OTEL Collector配置正确:
确保Collector的otlp接收器同时支持gRPC和HTTP,且metrics pipeline包含该接收器:
receivers: otlp: protocols: grpc: http: pipelines: metrics: receivers: [otlp] exporters: [你的导出目标] # 如prometheus、logging等
- 开启Agent调试日志:添加
-Dotel.javaagent.debug=true到VM参数,查看日志中是否有Micrometer指标采集相关的记录,确认自定义指标是否被Agent捕获。 - 验证自定义指标本身正常:访问
/actuator/metrics/health,确认指标能正常返回。
内容的提问来源于stack exchange,提问作者user3529850
相关产品推荐
相关产品推荐

