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.

Spring Cloud Sleuth: cómo propagar el ID de traza y el ID de span a un listener al usar Spring Cloud AWS S3.

Tengo un bean que es un MessageHandler para manejar un mensaje entrante. El manejador de mensajes es de tipo org.springframework.integration.aws.outbound.S3MessageHandler, que carga el mensaje en Amazon S3. El problema es que las operaciones de este manejador de mensajes se realizan en un hilo diferente. ¿Cómo puedo asegurarme de que puedo realizar un seguimiento de que el ID de transacción se propaga hasta el hilo que realiza esta transacción?

También adjunto a este manejador de mensajes un oyente de progreso de tipo com.amazonaws.services.s3.transfer.internal.S3ProgressListener. Las devoluciones de llamada a este oyente se realizan en un hilo completamente diferente. Necesito los IDs de rastreo también en este oyente.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para asegurarte de que el ID de transacción se propague hasta el hilo que realiza la transacción, puedes usar Spring Cloud Sleuth. Spring Cloud Sleuth es una solución de trazabilidad distribuida para aplicaciones de Spring Boot, que te ayuda a rastrear el flujo de solicitudes de tu aplicación a través de varios microservicios.

    Para usar Spring Cloud Sleuth, debes agregar las dependencias spring-cloud-starter-sleuth y spring-cloud-sleuth-zipkin a tu pom.xml o archivo de compilación, y configurar el bean del tracer Sleuth para propagar los IDs de trace y span en diferentes hilos.

    Aquí tienes un ejemplo de configuración:

    @Configuration
    public class TraceConfig {
    
      @Bean
      public Tracer tracer() {
        return BraveTracer.create();
      }
    
      @Bean(name = "s3MessageHandler")
      public S3MessageHandler s3MessageHandler() {
        S3MessageHandler handler = new S3MessageHandler(client, bucket);
        handler.setTracingEnabled(true); // habilitar trazabilidad Sleuth
        handler.setProgressListener(s3ProgressListener()); // agregar listener de progreso
        return handler;
      }
    
      @Bean
      public S3ProgressListener s3ProgressListener() {
        return new SleuthS3ProgressListener();
      }
    
      private static class SleuthS3ProgressListener implements S3ProgressListener {
    
        private static final Log log = LogFactory.getLog(SleuthS3ProgressListener.class);
    
        @Autowired
        private Tracer tracer;
    
        @Override
        public void progressChanged(ProgressEvent progressEvent) {
          String traceId = tracer.currentSpan().traceIdString(); // obtener ID de trace
          log.info("S3 progreso cambiado (traceId=" + traceId + "): " + progressEvent);
        }
      }
    }
    

    En esta configuración, creamos un bean para S3MessageHandler, establecemos el atributo tracingEnabled en true para habilitar la trazabilidad Sleuth, y añadimos un bean SleuthS3ProgressListener al handler para recibir eventos de progreso.

    La clase SleuthS3ProgressListener implementa la interfaz S3ProgressListener y añade el ID de trace a los mensajes de registro cuando se recibe un evento de progreso.

    Con esta configuración, puedes rastrear el ID de trace de la transacción hasta el controlador de mensajes S3 y el listener de progreso, y registrarlo para fines de depuración o monitoreo.

Comments are closed.