@@ -408,4 +408,43 @@ mod tests {
408408 let rate = rate_kv[ "value" ] [ "doubleValue" ] . as_f64 ( ) . unwrap ( ) ;
409409 assert ! ( ( rate - std:: f64 :: consts:: PI ) . abs( ) < 1e-9 ) ;
410410 }
411+
412+ #[ test]
413+ fn test_128bit_trace_id_from_dd_p_tid ( ) {
414+ // When "_dd.p.tid" is present it supplies the high 64 bits of the trace ID.
415+ // Low 64 bits come from span.trace_id; the two are concatenated to form a 128-bit hex ID.
416+ let resource_info = OtlpResourceInfo :: default ( ) ;
417+ let mut span: Span < BytesData > = Span {
418+ trace_id : 0xD269B633813FC60C_u128 , // low 64 bits
419+ span_id : 1 ,
420+ name : libdd_tinybytes:: BytesString :: from_static ( "s" ) ,
421+ start : 0 ,
422+ duration : 1 ,
423+ ..Default :: default ( )
424+ } ;
425+ span. meta . insert (
426+ "_dd.p.tid" . into ( ) ,
427+ libdd_tinybytes:: BytesString :: from_static ( "5b8efff798038103" ) ,
428+ ) ;
429+ let req = map_traces_to_otlp ( vec ! [ vec![ span] ] , & resource_info) ;
430+ let otlp_span = & req. resource_spans [ 0 ] . scope_spans [ 0 ] . spans [ 0 ] ;
431+ assert_eq ! ( otlp_span. trace_id, "5b8efff798038103d269b633813fc60c" ) ;
432+ }
433+
434+ #[ test]
435+ fn test_128bit_trace_id_without_dd_p_tid ( ) {
436+ // When "_dd.p.tid" is absent the high 64 bits default to zero.
437+ let resource_info = OtlpResourceInfo :: default ( ) ;
438+ let span: Span < BytesData > = Span {
439+ trace_id : 0xD269B633813FC60C_u128 ,
440+ span_id : 1 ,
441+ name : libdd_tinybytes:: BytesString :: from_static ( "s" ) ,
442+ start : 0 ,
443+ duration : 1 ,
444+ ..Default :: default ( )
445+ } ;
446+ let req = map_traces_to_otlp ( vec ! [ vec![ span] ] , & resource_info) ;
447+ let otlp_span = & req. resource_spans [ 0 ] . scope_spans [ 0 ] . spans [ 0 ] ;
448+ assert_eq ! ( otlp_span. trace_id, "0000000000000000d269b633813fc60c" ) ;
449+ }
411450}
0 commit comments