Description
Context
After upgrading to Spring Boot 3, we had to switch our tracing library from spring cloud sleuth to micrometer tracing (referring to the migration guide https://github.com/micrometer-metrics/tracing/wiki/Spring-Cloud-Sleuth-3.1-Migration-Guide).
Expected Behavior
We expect that the migration from sleuth to micrometer should be smooth, providing good backward compatibility. In particular, as the project uses reactive programming extensively, tracing information such as traceId should be preserved in SL4J logs along the reactive chain.
Actual Behavior
Despite already calling Hooks.enableAutomaticContextPropagation()
, reactive chain involving reactive web client fails to preserve tracing information such as traceId in SLF4J logs when the chain is invoked using .subscribe
. The migration guide clearly suggests that calling Hooks.enableAutomaticContextPropagation()
is enough.
Reproductor
I have prepared a reproducer (spring boot test) to demonstrate the potential bug. Please refer to https://github.com/jhengy/my-simple-springboot-app/tree/demo-context-propagation
Follow up questions
- To solve the issue, it seems that we have to add
.contextCapture()
before.subscribe
explicitly in all the reactive chains. This seems too repetitive and it was expected that migration from sleuth to micrometer should involve minimall changes to the business code. Also, there seems to be a limitation to using.contextCapture()
: it only captures context for logs in the upstream, but not downstream. Is there a better and more convenient way (perhaps some kind of global setting) go about doing this? - It was mentioned in the blog that there is a plan for Spring Boot to configure context propagation out of the box. May we know how soon it can be?
- What would be the performance impact(if any) in using
Hooks.enableAutomaticContextPropagation()
with.contextCapture()
?
Thank you.