Spring Boot 3 Webflux集成Micrometer Tracing无traceId/spanId输出排查
问题:WebFlux下Micrometer Tracing无法生成traceId/spanId,currentSpan为null
我正在将Spring Cloud Sleuth替换为Micrometer Tracing,为Spring Boot 3实现日志关联。按照官方配置示例完成后,WebFlux接口中currentSpan始终为null,控制台日志也未生成traceId和spanId。
接口代码
@GetMapping("/hello") fun hello(): String { val currentSpan: Span? = tracer.currentSpan() logger.info("Hello!") return "hello" }
日志输出
2022-11-28T14:53:05.335+01:00 INFO [server,,] 9176 --- [ctor-http-nio-2] d.DemotracingApplication$$SpringCGLIB$$0 : Hello!
配置信息
日志配置
logging.pattern.level=%5p [${spring.application.name:},%X{traceId:-},%X{spanId:-}]
依赖配置
dependencies { implementation("org.springframework.boot:spring-boot-starter-actuator") implementation("org.springframework.boot:spring-boot-starter-webflux") implementation("org.springframework.boot:spring-boot-starter-aop") implementation("com.fasterxml.jackson.module:jackson-module-kotlin") implementation("io.micrometer:micrometer-tracing-bridge-brave") implementation("io.projectreactor.kotlin:reactor-kotlin-extensions") implementation("io.micrometer:micrometer-registry-prometheus") implementation("org.jetbrains.kotlin:kotlin-reflect") implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8") implementation("org.jetbrains.kotlinx:kotlinx-coroutines-reactor") testImplementation("org.springframework.boot:spring-boot-starter-test") testImplementation("io.projectreactor:reactor-test") }
补充说明:WebMVC应用升级后可正常输出日志关联信息,仅WebFlux应用存在该问题。
问题原因
这个问题的核心是WebFlux + Kotlin协程场景下的Trace上下文传播失效,具体原因如下:
- 协程与Reactor上下文未打通:使用Kotlin协程时,Micrometer Tracing的Brave桥接器在早期Spring Boot 3版本中,没有自动将Reactor中的Trace上下文(包含traceId/spanId)同步到Kotlin协程上下文。导致协程执行时,无法从当前上下文获取到Span实例,
tracer.currentSpan()返回null,同时MDC中的traceId/spanId也无法填充。 - 线程模型差异导致上下文丢失:WebMVC基于阻塞模型,Trace上下文通过ThreadLocal传递;而WebFlux依赖Reactor Context在非阻塞线程间传播Trace信息。但Kotlin协程会切换执行上下文,若没有适配逻辑,Reactor中的Trace上下文无法自动传递到协程环境中。
- 版本适配缺陷:这是Spring Boot 3.x早期版本的已知适配问题,后续官方已修复了Micrometer Tracing与Kotlin协程WebFlux场景的上下文传播逻辑。
内容的提问来源于stack exchange,提问作者codependent
相关产品推荐
相关产品推荐

