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
相关产品推荐
相关产品推荐

