Spring Boot控制台Trace日志为空且启动失败问题求助
解决Spring Boot OpenTelemetry Trace上下文缺失及依赖错误的步骤
1. 补全OpenTelemetry核心依赖
你当前仅添加了Logback的Instrumentation依赖,缺少Spring Boot自动配置及OpenTelemetry核心组件依赖,这是otelRestTemplateBeanPostProcessor依赖缺失的核心原因。需补充以下与现有版本(0.16.1)匹配的依赖:
implementation 'io.opentelemetry.instrumentation:opentelemetry-spring-boot-autoconfigure:0.16.1' implementation 'io.opentelemetry:opentelemetry-api:0.16.1' implementation 'io.opentelemetry:opentelemetry-sdk:0.16.1'
2. 修正Logback配置
- 你的根日志直接绑定
STDOUTAppender,未经过OTELAppender处理,导致日志无法获取Trace上下文。需修改根日志的Appender引用:
<root> <level value="INFO" /> <appender-ref ref="OTEL" /> </root>
- 部分OpenTelemetry版本中,MDC上下文的键名为
traceId和spanId而非trace_id/span_id,可同步调整日志格式:
<pattern><![CDATA[%date{HH:mm:ss.SSS} [%thread] %-5level %logger{15}#%line %X{req.requestURI} traceId: %X{traceId} spanId: %X{spanId} %msg ]]></pattern>
3. 手动初始化OpenTelemetry核心Bean(可选,自动配置失效时使用)
若自动配置未生效,可手动创建核心Bean确保Trace上下文初始化:
import io.opentelemetry.api.OpenTelemetry; import io.opentelemetry.api.trace.Tracer; import io.opentelemetry.sdk.OpenTelemetrySdk; import io.opentelemetry.sdk.trace.SdkTracerProvider; import io.opentelemetry.sdk.trace.export.SimpleSpanProcessor; import io.opentelemetry.sdk.trace.export.SpanExporter; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class OpenTelemetryConfig { @Bean public OpenTelemetry openTelemetry(SdkTracerProvider sdkTracerProvider) { return OpenTelemetrySdk.builder() .setTracerProvider(sdkTracerProvider) .buildAndRegisterGlobal(); } @Bean public SdkTracerProvider sdkTracerProvider(SpanExporter spanExporter) { return SdkTracerProvider.builder() .addSpanProcessor(SimpleSpanProcessor.create(spanExporter)) .build(); } @Bean public SpanExporter spanExporter() { return SpanExporter.composite(); } @Bean public Tracer tracer(OpenTelemetry openTelemetry) { return openTelemetry.getTracer("your-service-name"); } }
4. 验证Web请求的Trace上下文
在Controller中通过注解或手动创建Span,确保Trace上下文能正确传递:
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 TestController { private final Tracer tracer; public TestController(Tracer tracer) { this.tracer = tracer; } @GetMapping("/test") public String test() { Span span = tracer.spanBuilder("test-endpoint").startSpan(); try (var scope = span.makeCurrent()) { // 业务逻辑代码 return "ok"; } finally { span.end(); } } }
内容的提问来源于stack exchange,提问作者codeX
相关产品推荐
相关产品推荐

