You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让OpenTelemetry Java Agent采集导出Spring Boot自定义健康指标

解决Spring Boot自定义指标无法被OpenTelemetry Java Agent导出的问题

问题根源

你参考的博客代码已经过时——当前版本的OpenTelemetry Java Agent不再将OpenTelemetryMeterRegistry放入Metrics.globalRegistry,而是通过字节码注入直接拦截Micrometer的Meter创建流程,所以你找不到Registry是正常的。同时默认情况下Agent可能未开启Micrometer指标采集,导致自定义指标无法被导出。

解决方案

方案一:通过Agent配置自动采集自定义Micrometer指标

这是最简单的方式,无需修改代码,只需调整VM启动参数:

  1. 更新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可能会忽略无标识的指标
  1. 验证:启动应用后,查看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;
    }
}

排查步骤

  1. 确认OTEL Collector配置正确:
    确保Collector的otlp接收器同时支持gRPC和HTTP,且metrics pipeline包含该接收器:
receivers:
  otlp:
    protocols:
      grpc:
      http:

pipelines:
  metrics:
    receivers: [otlp]
    exporters: [你的导出目标] # 如prometheus、logging等
  1. 开启Agent调试日志:添加-Dotel.javaagent.debug=true到VM参数,查看日志中是否有Micrometer指标采集相关的记录,确认自定义指标是否被Agent捕获。
  2. 验证自定义指标本身正常:访问/actuator/metrics/health,确认指标能正常返回。

内容的提问来源于stack exchange,提问作者user3529850

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 17:28:36