Estoy tratando de correlacionar los rastros que se originan en el RUM SDK de DataDog, que BE instrumenta con OpenTelemetry. Esencialmente tratando de implementar el reverso de la documentación de DD en Connect OpenTelemetry Traces And Logs
Las propiedades TraceId y SpanId de OpenTelemetry difieren de las convenciones de Datadog. Por lo tanto, es necesario traducir TraceId y SpanId de sus formatos OpenTelemetry (un int sin firmar de 128 bits y un int sin firmar de 64 bits representado como una cadena en minúsculas de 32 caracteres hexadecimales y 16 caracteres hexadecimales, respectivamente) a sus formatos Datadog (un int sin firmar de 64 bits) .
El contexto se establece en mi BE de la siguiente manera;
(event:any) => { if(event.headers) { const traceId = event.headers['x-datadog-trace-id'] const spanId = event.headers['x-datadog-parent-id'] if(traceId && spanId) { const convertedTraceId = convertToOtelId(traceId, 32); const convertedSpanId = convertToOtelId(spanId, 16); const spanContext: SpanContext = { traceId: convertedTraceId, spanId: convertedSpanId, traceFlags: 1, isRemote: true, }; return propagation.extract(context.active(), spanContext); } } return ROOT_CONTEXT; }convertToOtelId está produciendo estos resultados;
trace id - In: 2245099779221068633, Out: 00000000000000001f28325aa9c79b59
span id - In: 4011377516575614177, Out: 37ab46991f7a64e1
Obviamente, el uint de 128 bits para trace_id no parece correcto con sus ceros iniciales. ¿Estoy entendiendo esta conversión correctamente?
Sí, lo estás haciendo correctamente. Los ceros iniciales adicionales indican los bits restantes no utilizados. Aquí hay una verificación cruzada simple en python.
>>> >>> format(2245099779221068633, "032x") # The trace ID as 32-byte hexadecimal string '00000000000000001f28325aa9c79b59' >>> >>> format(4011377516575614177, "016x") # The span ID as 16-byte hexadecimal string '37ab46991f7a64e1'