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.

Transporte personalizado para rastros de Sleuth.

Mi proyecto utiliza Spring Cloud Sleuth para participar en la grabación de trazas distribuidas. La comunicación con otros sistemas se realiza a través de Dapr, que no es compatible con Spring Cloud Sleuth. Las aplicaciones se comunican entre sí a través de un sidecar (ofrecido por Dapr); la comunicación entre la aplicación y el sidecar es HTTP o gRPC.

Dapr espera que las trazas distribuidas se propaguen de acuerdo con el estándar W3C. Se puede usar el estándar W3C en Sleuth configurando lo siguiente en application.yml:

yml
spring:
sleuth:
propagation:
type: w3c

Sin embargo, esto solo funciona para transportes que son administrados por Spring. Dado que Dapr no está vinculado a Spring ni a ningún otro marco, ellos implementan sus propios clientes para la comunicación HTTP o gRPC con el sidecar. Como resultado, la instrumentación de Sleuth no funciona.

No puedo encontrar ninguna pista en la documentación de cómo escribir mi propia instrumentación.

Así que mi pregunta es: ¿cómo puedo propagar esos metadatos compatibles con W3C utilizando una conexión que no está administrada por Spring?

Tags:  

Answer

  1. Avatar for davy.ai

    Como Dapr no está ligado a Spring ni a ningún otro framework, necesitarías escribir tu propia instrumentación para propagar metadatos compatibles con W3C sobre una conexión no gestionada por Spring.

    Para hacer esto, puedes usar la API de OpenTracing para crear y propagar manualmente los contextos de span. OpenTracing es una API neutral del proveedor para el seguimiento distribuido y proporciona una forma estándar de crear y gestionar seguimientos distribuidos.

    Para crear y propagar contextos de span manualmente, tendrías que seguir los siguientes pasos:

    1. Crear un contexto de span cuando se inicie un nuevo seguimiento.
    2. Propagar el contexto de span a los sistemas descendentes utilizando encabezados HTTP o metadatos gRPC.

    3. Extraer el contexto de span de las solicitudes entrantes en los sistemas descendentes.

    4. Utilizar el contexto de span extraído para continuar el seguimiento en el sistema descendente.

    Para crear y propagar contextos de span utilizando OpenTracing, puedes usar la API de Tracer. La API de Tracer proporciona métodos para crear, gestionar y propagar contextos de span.

    Aquí tienes un ejemplo de cómo crear y propagar un contexto de span utilizando OpenTracing:

    import io.opentracing.Span;
    import io.opentracing.Tracer;
    import io.opentracing.propagation.Format;
    import io.opentracing.propagation.TextMapExtractAdapter;
    import io.opentracing.propagation.TextMapInjectAdapter;
    
    // Iniciar un span y obtener el objeto Tracer
    Tracer tracer = ...;
    Span span = tracer.buildSpan("mySpanName").start();
    
    // Establecer algunas etiquetas en el span
    span.setTag("myTag", "myValue");
    
    // Propagar el contexto de span a los sistemas descendentes utilizando encabezados HTTP o metadatos gRPC
    Map<string, string=""> headers = new HashMap<>();
    tracer.inject(span.context(), Format.Builtin.HTTP_HEADERS, new TextMapInjectAdapter(headers));
    
    // En el sistema descendente, extraer el contexto de span de la solicitud entrante
    SpanContext spanContext = tracer.extract(Format.Builtin.HTTP_HEADERS, new TextMapExtractAdapter(headers));
    
    // Utilizar el contexto de span extraído para continuar el seguimiento en el sistema descendente
    Span downstreamSpan = tracer.buildSpan("myDownstreamSpanName").asChildOf(spanContext).start();
    
    // Establecer algunas etiquetas en el span descendente
    downstreamSpan.setTag("myOtherTag", "myOtherValue");
    
    // Finalizar los spans
    downstreamSpan.finish();
    span.finish();
    

    Ten en cuenta que para utilizar OpenTracing, necesitarías agregar la dependencia de API de OpenTracing a tu proyecto.</string,>

Comments are closed.