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
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:
trace.NewSpanContext()
y pasar el trace.TraceID y trace.SpanID recuperados en el paso anterior.context.Background()
y agregar el contexto de span utilizandotrace.ContextWithSpanContext()
.otel.Tracer().Start()
donde el primer argumento es el nombre del span y el segundo argumento es el nombre de la operación span.Aquí hay un ejemplo de fragmento de código que muestra este proceso:
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.