0

I want to add sleuth traceId and spanId to response headers. And I try to do it in WebFilter, similar to suggestions in the documentation. But in filter currentSpan is yet null, latter in controller traceId and spanId I are present in logs. How can I add traceId and spanId to response headers?

Here is my code:

@Component
@Order(TraceWebServletAutoConfiguration.TRACING_FILTER_ORDER + 1)
@Slf4j
public class SleuthFilter implements WebFilter {

    @Autowired
    private Tracer tracer;

    @Override
    public Mono<Void> filter(ServerWebExchange serverWebExchange,
    WebFilterChain webFilterChain) {

        log.info("Filter executions"); // this log will not any traceId or spanId 

        Span currentSpan = tracer.currentSpan();
        if (currentSpan != null) {
            serverWebExchange.getResponse().getHeaders().add("ZIPKIN-TRACE-ID", currentSpan.context().traceIdString());
        }
        return webFilterChain.filter(serverWebExchange);
    }
}
Toerktumlare
  • 12,548
  • 3
  • 35
  • 54
Balconsky
  • 2,234
  • 3
  • 26
  • 39

1 Answers1

1

The problem was because in reactive flow Sleuth initializes traceId after all initial filters. I assigned the listener for the moment when the response is completed:

@Component
public class SleuthFilter implements WebFilter {

  public static final String XB3_TRACE_ID = "X-B3-TraceId";
  public static final String XB3_SPAN_ID = "X-B3-SpanId";

  @Autowired
  private Tracer tracer;

  @Override
  public Mono<Void> filter(ServerWebExchange serverWebExchange,
                           WebFilterChain webFilterChain) {
    ServerHttpResponse response = serverWebExchange.getResponse();
    response.beforeCommit(() -> {
      Span span = tracer.currentSpan();
      if (span != null) {
        HttpHeaders headers = response.getHeaders();
        headers.add(XB3_TRACE_ID, Long.toHexString(span.context().traceId()));
        headers.add(XB3_SPAN_ID, Long.toHexString(span.context().spanId()));
      }
      return Mono.empty();
    });
    return webFilterChain.filter(serverWebExchange);
  }
}
Balconsky
  • 2,234
  • 3
  • 26
  • 39