es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Los traceId / spanId generados se modifican después de la llamada de WebClient.

Estamos utilizando ReactorNettyHttpTracing en nuestra aplicación Spring Web + Spring WebFlux + Spring Cloud Sleuth. El traceId / spanId generado cambia después de la llamada WebClient.

Spring Boot v2.6.1 y Spring Cloud v3.1.0

¿Cómo puedo mantener el mismo traceId y spanId para toda la solicitud de Spring Web?

@Bean
public ReactorNettyHttpTracing reactorNettyHttpTracing(HttpTracing httpTracing) {
    return ReactorNettyHttpTracing.create(httpTracing);
}

WebClient.builder()
        .clientConnector(new ReactorClientHttpConnector(tracing.decorateHttpClient(httpClient)))
        .defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
        .filters(exchangeFilters -> { 
            exchangeFilters.add(exchangeFilter.logRequest());
            exchangeFilters.add(exchangeFilter.logResponse());
        }).build();
Tags:  ,

Answer

  1. Avatar for davy.ai

    Para mantener el mismo traceId y spanId durante toda la solicitud de Spring Web, necesitas usar un único traceId y spanId en toda la solicitud. Una forma de lograr esto es propagando el traceId y spanId como encabezados en la solicitud.

    Puedes modificar tu código para agregar los encabezados traceId y spanId a la solicitud del WebClient de esta manera:

    WebClient.builder()
        .clientConnector(new ReactorClientHttpConnector(tracing.decorateHttpClient(httpClient)))
        .defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
        .defaultHeaders(headers -> {
            headers.set(SleuthHttpHeaders.TRACE_ID_NAME, TraceContext.traceId());
            headers.set(SleuthHttpHeaders.SPAN_ID_NAME, TraceContext.spanId());
        })
        .filters(exchangeFilters -> { 
            exchangeFilters.add(exchangeFilter.logRequest());
            exchangeFilters.add(exchangeFilter.logResponse());
        })
        .build();
    

    Esto asegurará que el traceId y spanId se mantengan iguales durante toda la solicitud de Spring Web.

Comments are closed.