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

Spring Boot不注入Jar包、无需JVM参数使用OpenTelemetry无追踪日志问题

问题原因

你添加的io.opentelemetry.javaagent:opentelemetry-javaagent是OpenTelemetry的Java Agent包,这类Agent必须通过JVM启动参数-javaagent:/path/to/opentelemetry-javaagent.jar加载才能生效,仅通过runtimeOnly依赖引入包,JVM不会自动加载Agent的字节码增强逻辑,所以你的配置完全没起作用。

解决方案:不依赖Java Agent的实现方式

要实现不注入Jar包、不使用JVM参数的OpenTelemetry集成,需要改用OpenTelemetry的手动初始化或Spring Boot Starter方案,具体步骤如下:

1. 替换Gradle依赖

移除原有的Java Agent依赖,添加OpenTelemetry核心API、SDK、Zipkin导出器及Spring Boot Starter依赖(版本保持与你原有的1.19.1一致):

implementation 'io.opentelemetry:opentelemetry-api:1.19.1'
implementation 'io.opentelemetry:opentelemetry-sdk:1.19.1'
implementation 'io.opentelemetry:opentelemetry-exporter-zipkin:1.19.1'
implementation 'io.opentelemetry.instrumentation:opentelemetry-spring-boot-starter:1.19.1'

2. 调整配置文件

保留原有的配置,可补充Zipkin地址等关键配置(如果你的Zipkin不是默认地址的话):

otel.service.name=your-service-name
otel.traces.exporter=zipkin
otel.exporter.zipkin.endpoint=http://localhost:9411/api/v2/spans
otel.metrics.exporter=none # 不需要指标的话可以关闭
otel.logs.exporter=none    # 不需要日志的话可以关闭

3. 可选:手动初始化OpenTelemetry(若Starter自动配置不满足需求)

如果需要自定义追踪逻辑,可编写配置类手动初始化OpenTelemetry实例:

import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.api.trace.Tracer;
import io.opentelemetry.exporter.zipkin.ZipkinSpanExporter;
import io.opentelemetry.sdk.OpenTelemetrySdk;
import io.opentelemetry.sdk.resources.Resource;
import io.opentelemetry.sdk.trace.SdkTracerProvider;
import io.opentelemetry.sdk.trace.export.BatchSpanProcessor;
import io.opentelemetry.semconv.resource.attributes.ResourceAttributes;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class OpenTelemetryConfig {

    @Bean
    public OpenTelemetry openTelemetry() {
        // 初始化Zipkin导出器
        ZipkinSpanExporter zipkinExporter = ZipkinSpanExporter.builder()
                .setEndpoint("http://localhost:9411/api/v2/spans")
                .build();

        // 配置Tracer Provider
        SdkTracerProvider tracerProvider = SdkTracerProvider.builder()
                .addSpanProcessor(BatchSpanProcessor.builder(zipkinExporter).build())
                .setResource(Resource.getDefault()
                        .merge(Resource.create(ResourceAttributes.SERVICE_NAME, "your-service-name")))
                .build();

        // 构建并注册全局OpenTelemetry实例
        OpenTelemetrySdk openTelemetry = OpenTelemetrySdk.builder()
                .setTracerProvider(tracerProvider)
                .buildAndRegisterGlobal();

        return openTelemetry;
    }

    @Bean
    public Tracer tracer(OpenTelemetry openTelemetry) {
        // 创建自定义Tracer,用于手动创建Span
        return openTelemetry.getTracer("your-service-custom-tracer");
    }
}

4. 验证追踪效果

可以编写一个测试接口手动创建Span,验证追踪是否生效:

import io.opentelemetry.api.trace.Span;
import io.opentelemetry.api.trace.Tracer;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestTraceController {

    private final Tracer tracer;

    public TestTraceController(Tracer tracer) {
        this.tracer = tracer;
    }

    @GetMapping("/trace-test")
    public String traceTest() {
        // 手动创建一个Span
        Span span = tracer.spanBuilder("trace-test-endpoint").startSpan();
        try (var scope = span.makeCurrent()) {
            // 模拟业务逻辑
            return "Trace test success";
        } finally {
            // 结束Span
            span.end();
        }
    }
}

启动应用后调用/trace-test接口,查看Zipkin控制台是否能看到对应的追踪数据,同时控制台会输出OpenTelemetry的初始化日志,说明配置生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 17:35:26