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.

Cómo crear un span de opentelemetry a partir de un traceid en formato de cadena.

Entiendo que debemos utilizar la propagación de contexto para obtener los traceids y spans padre que se crean como hijos entre sí, pero mi publicador está utilizando encabezados (nats y no http).

Mi sistema de mensajería utiliza encabezados, en los cuales estoy configurando un traceid y spanid como encabezados en la solicitud saliente, enviando el mensaje. Luego, el suscriptor DEBERÍA ser capaz de crear un nuevo span, configurando el traceid padre con el traceid de la solicitud. Enlazándolos.

Mi solicitud saliente se ve así:

        msg := new(nats.Msg)
        msg.Data = []byte("¡nueva solicitud enviada!")
        msg.Subject = subject
        getTraceID := requestSpan.SpanContext().TraceID().String()
        header := make(nats.Header)
        msg.Header = header
        header.Set("traceid", getTraceID)

        getSpanID := requestSpan.SpanContext().SpanID().String()
        header.Set("spanid", getSpanID)
        msg.Header = header

        reply, err := nc.RequestMsg(msg, time.Duration(5*time.Second))

Esto funciona y puedo obtener los valores de los encabezados para el trace y el span id desde el lado del suscriptor.

¿Cómo puedo construir un contexto/span en el lado del suscriptor utilizando el traceid?

Creí que podía hacer algo como esto dentro de un canal:

    var traceID trace.TraceID
    traceID, err = trace.TraceIDFromHex(request.TraceID)
    if err != nil {
        fmt.Println("error:", err)
        continue
    }
    var spanID trace.SpanID
    spanID, err = trace.SpanIDFromHex(request.SpanID)
    if err != nil {
        fmt.Println("error:", err)
        continue
    }

    spanContext := trace.NewSpanContext(trace.SpanContextConfig{
        TraceID:    traceID,
        SpanID:     spanID,
        TraceFlags: 01, 
    })

   ctx := context.Background()
   ctx = trace.ContextWithSpanContext(ctx, spanContext)
   var requestInLoopSpan trace.Span
   ctx2, requestInLoopSpan := otel.Tracer("requestInLoop").Start(ctx, "requestInLoopSpan")

   requestInLoopSpan.AddEvent("procesando....") // NO FUNCIONA
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Dado que su intermediario de mensajes utiliza encabezados para propagar información de traza y span, puede construir un contexto/span en el lado del suscriptor utilizando el traceid de la siguiente manera:

    1. Extraer los valores de encabezado para el id de traza y span del mensaje entrante.
    2. Convertirlos de cadena a los tipos trace.TraceID y trace.SpanID respectivamente.
    3. Crear un nuevo contexto de span utilizando trace.NewSpanContext() y pasar el trace.TraceID y trace.SpanID recuperados en el paso anterior.
    4. Crear un nuevo contexto utilizando context.Background() y agregar el contexto de span utilizando trace.ContextWithSpanContext().
    5. Iniciar un nuevo span utilizando otel.Tracer().Start() donde el primer argumento es el nombre del span y el segundo argumento es el nombre de la operación span.
    6. Luego, puede usar el span devuelto para agregar eventos y realizar otras actividades relacionadas con el span.

    Aquí hay un ejemplo de fragmento de código que muestra este proceso:

    func handleMessage(msg *nats.Msg) {
        // Extraer trace y span id de los encabezados
        traceIDHeader := msg.Header.Get("traceid")
        spanIDHeader := msg.Header.Get("spanid")
    
        // Convertir trace y span id a los tipos adecuados
        traceID, err := trace.TraceIDFromHex(traceIDHeader)
        if err != nil {
            fmt.Println("error:", err)
            return
        }
    
        spanID, err := trace.SpanIDFromHex(spanIDHeader)
        if err != nil {
            fmt.Println("error:", err)
            return
        }
    
        // Crear nuevo contexto de span utilizando los trace y span id extraídos
        spanContext := trace.NewSpanContext(trace.SpanContextConfig{
            TraceID: traceID,
            SpanID: spanID,
            TraceFlags: 01, // O utilizar los indicadores de traza apropiados según sus necesidades
        })
    
        // Crear nuevo contexto con el contexto de span
        ctx := context.Background()
        ctx = trace.ContextWithSpanContext(ctx, spanContext)
    
        // Iniciar un nuevo span y agregar eventos
        var span trace.Span
        ctx, span = otel.Tracer("suscriptor").Start(ctx, "manejadorDeMensajes")
        defer span.End()
    
        span.AddEvent("procesando....")
        // Realizar otras actividades con el span según sea necesario
    }
    

    Tenga en cuenta que este es solo un ejemplo de fragmento y es posible que deba modificarlo según su caso de uso específico, como agregar manejo de errores y modificar los nombres de span y los valores de contexto de manera apropiada.

Comments are closed.