Search code examples
spring-cloudslf4jspring-cloud-sleuth

correlationId propagated to spring sleuth 1.x


I have the following setup:

Proxy (P) -- HTTP --> Spring Boot 2 app (X) -- HTTP --> Spring Boot 1 app (Y)

The proxy sends the requestId as an HTTP header which I need to include in the logs of both X and Y.

For the X app I could easily do it with the support of Spring Cloud Sleuth 2 using

spring: sleuth: propagation-keys: requestId

and creating a CurrentTraceContext implementation with inspiration from Slf4jCurrentTraceContext where I add

MDC.put("requestId", ExtraFieldPropagation.get(currentSpan, "requestId"));

and then I can easily add it to the logs using the following log pattern:

%d{yy-MM-dd E HH:mm:ss.SSS} %5p [component=${springAppName},requestId=%X{requestId:-}] %m%n"

But now I need to propagate the requestId also to Y app.

Unfortunately there I cannot leverage the goodies introduced in Spring Cloud Sleuth 2.0, (like TraceContext from brave library) since that is a Spring Boot 1.x app.

Wondering what are the options?

I was thinking to extend the Slf4jSpanLogger and inject into DefaultTracer but not sure how to get the requestId there is no TraceContext in SpanLogger.


Solution

  • requestId has to be there in the headers. You would have to modify the current logic of parsing the HTTP headers for Boot 1.x and retrieve that value from the headers and put it in the span.

    The easiest way however would be to propagate that value as baggage cause baggage works out of the box for Boot 1.x. That way if we see the baggage- prefixed headers, Sleuth 1.3.x will automatically propagate it. Remember to whitelist the baggage in Boot 2.0.