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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 22:46:33