OpenTelemetry Java自定义自动扩展示例未生效,求助排查
问题排查:OpenTelemetry自定义扩展未生效
我开发了一个包含自定义SpanProcessor和AutoConfigurationCustomizerProvider的OpenTelemetry扩展,已在TracerProvider中配置该自定义SpanProcessor。使用以下命令启动Java Agent与应用:
java -javaagent:C:/Users/abc/Desktop/auto-instrumentation/src/opentelemetry-javaagent.jar \ -Dotel.javaagent.extensions=C:/Users/abc/Desktop/auto-instrumentation/src/extension_example-1.0-SNAPSHOT.jar \ -Dotel.exporter.jaeger.endpoint=http://localhost:4317 \ -Dotel.traces.exporter=otlp \ -Dotel.metrics.exporter=none \ -Dotel.resource.attributes="service.name=MyApp" \ -jar MyApp-0.0.1-SNAPSHOT.jar
访问http://localhost:8080/myapp后,Jaeger后端仅显示默认Span属性,未出现自定义属性customAttribute:customValue,且控制台无扩展加载的打印信息。需排查原因并确认扩展是否执行。
自定义SpanProcessor代码
package org.example.javaagent; import io.opentelemetry.context.Context; import io.opentelemetry.sdk.common.CompletableResultCode; import io.opentelemetry.sdk.trace.ReadWriteSpan; import io.opentelemetry.sdk.trace.ReadableSpan; import io.opentelemetry.sdk.trace.SpanProcessor; public class ExampleSpanProcessor implements SpanProcessor { @Override public void onStart(Context parentContext, ReadWriteSpan span) { span.setAttribute("customAttribute", "customValue"); } @Override public boolean isStartRequired() { return true; } @Override public void onEnd(ReadableSpan span) {} @Override public boolean isEndRequired() { return false; } @Override public CompletableResultCode shutdown() { return CompletableResultCode.ofSuccess(); } @Override public CompletableResultCode forceFlush() { return CompletableResultCode.ofSuccess(); } }
自定义AutoConfigurationCustomizerProvider代码
package org.example.javaagent; import com.google.auto.service.AutoService; import io.opentelemetry.sdk.autoconfigure.spi.AutoConfigurationCustomizer; import io.opentelemetry.sdk.autoconfigure.spi.AutoConfigurationCustomizerProvider; import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; import io.opentelemetry.sdk.trace.SdkTracerProviderBuilder; import io.opentelemetry.sdk.trace.SpanLimits; import java.util.HashMap; import java.util.Map; @AutoService(AutoConfigurationCustomizerProvider.class) public class ExampleAutoConfigurationCustomizerProvider implements AutoConfigurationCustomizerProvider { @Override public void customize(AutoConfigurationCustomizer autoConfiguration) { System.out.printf("Called customize extension method"); autoConfiguration .addTracerProviderCustomizer(this::configureSdkTracerProvider) .addPropertiesSupplier(this::getDefaultProperties); } private SdkTracerProviderBuilder configureSdkTracerProvider( SdkTracerProviderBuilder tracerProvider, ConfigProperties config) { return tracerProvider .setSpanLimits(SpanLimits.builder().setMaxNumberOfAttributes(1024).build()) .addSpanProcessor(new ExampleSpanProcessor()); } private Map<String, String> getDefaultProperties() { Map<String, String> properties = new HashMap<>(); properties.put("otel.exporter.otlp.endpoint", "http://backend:8080"); properties.put("otel.exporter.otlp.insecure", "true"); properties.put("otel.config.max.attrs", "16"); return properties; } }
排查步骤与解决建议
- 检查扩展Jar的SPI元数据:
@AutoService注解需自动生成META-INF/services/io.opentelemetry.sdk.autoconfigure.spi.AutoConfigurationCustomizerProvider文件,文件内容必须是org.example.javaagent.ExampleAutoConfigurationCustomizerProvider。可通过jar tf extension_example-1.0-SNAPSHOT.jar命令查看Jar内是否存在该文件,若缺失需确认auto-service依赖是否正确配置,且编译时执行了注解处理器。 - 验证版本兼容性:确保扩展依赖的OpenTelemetry SDK(如
opentelemetry-sdk-autoconfigure、opentelemetry-sdk-trace)版本与Java Agent版本完全一致,版本不匹配会导致类加载冲突或SPI无法识别。 - 修正启动参数冲突:当前命令同时配置了
otel.traces.exporter=otlp和otel.exporter.jaeger.endpoint,OTLP exporter应使用otel.exporter.otlp.endpoint参数,建议将-Dotel.exporter.jaeger.endpoint=http://localhost:4317替换为-Dotel.exporter.otlp.endpoint=http://localhost:4317,避免数据发送异常。 - 开启Agent调试日志:添加
-Dotel.javaagent.debug=true启动参数,查看扩展加载的详细日志,确认Agent是否发现扩展类、是否有加载异常。 - 修复控制台输出缓冲问题:将自定义Provider中的
System.out.printf("Called customize extension method");改为System.out.println("Called customize extension method");,确保打印信息能立即输出到控制台。 - 检查Span属性过滤逻辑:确认是否存在其他SpanProcessor、Sampler或配置过滤了自定义属性,可通过调试日志查看Span创建时属性是否被成功添加。
内容的提问来源于stack exchange,提问作者Surabhi Patel
相关产品推荐
相关产品推荐

