@@ -5,9 +5,7 @@ use crate::{
55 values:: { event_values:: * , * } ,
66} ;
77use chrono:: { Datelike , Timelike } ;
8- use std:: io:: { Cursor , Write } ;
98use std:: marker:: PhantomData ;
10- use std:: mem:: MaybeUninit ;
119use std:: { cell:: RefCell , ops:: DerefMut , pin:: Pin , sync:: Arc , time:: SystemTime } ;
1210use tracelogging:: * ;
1311use tracelogging_dynamic:: EventBuilder ;
@@ -299,6 +297,7 @@ impl<Mode: OutputMode> super::EventWriter<NormalOutput> for Provider<Mode> {
299297 keyword : u64 ,
300298 event_tag : u32 ,
301299 event : & tracing:: Event < ' _ > ,
300+ _otel_context : Option < ( [ u8 ; 32 ] , [ u8 ; 16 ] ) > ,
302301 ) {
303302 let mut activity_id: [ u8 ; 16 ] = * GLOBAL_ACTIVITY_SEED ;
304303 activity_id[ 0 ] = if current_span != 0 {
@@ -414,11 +413,33 @@ impl<Mode: OutputMode> super::EventWriter<CommonSchemaOutput> for Provider<Mode>
414413 {
415414 let span_name = span. name ( ) ;
416415
417- let span_id = unsafe {
418- let mut span_id = MaybeUninit :: < [ u8 ; 16 ] > :: uninit ( ) ;
419- let mut cur = Cursor :: new ( ( * span_id. as_mut_ptr ( ) ) . as_mut_slice ( ) ) ;
420- write ! ( & mut cur, "{:16x}" , span. id( ) . into_u64( ) ) . expect ( "!write" ) ;
421- span_id. assume_init ( )
416+ // Extract trace_id and span_id - prefer OpenTelemetry context when available
417+ #[ cfg( feature = "opentelemetry" ) ]
418+ let ( trace_id, span_id) = {
419+ let otel_ctx = crate :: otel:: extract_otel_context ( span) ;
420+ if otel_ctx. is_valid {
421+ ( otel_ctx. trace_id , otel_ctx. span_id )
422+ } else {
423+ // Fall back to local tracing span ID
424+ let mut span_id_buf = [ 0u8 ; 16 ] ;
425+ let trace_id_buf = [ 0u8 ; 32 ] ;
426+ let _ = std:: io:: Write :: write_fmt (
427+ & mut span_id_buf. as_mut_slice ( ) ,
428+ format_args ! ( "{:016x}" , span. id( ) . into_u64( ) ) ,
429+ ) ;
430+ ( trace_id_buf, span_id_buf)
431+ }
432+ } ;
433+
434+ #[ cfg( not( feature = "opentelemetry" ) ) ]
435+ let ( trace_id, span_id) = {
436+ let mut span_id_buf = [ 0u8 ; 16 ] ;
437+ let trace_id_buf = [ 0u8 ; 32 ] ;
438+ let _ = std:: io:: Write :: write_fmt (
439+ & mut span_id_buf. as_mut_slice ( ) ,
440+ format_args ! ( "{:016x}" , span. id( ) . into_u64( ) ) ,
441+ ) ;
442+ ( trace_id_buf, span_id_buf)
422443 } ;
423444
424445 EBW . with ( |eb| {
@@ -441,7 +462,7 @@ impl<Mode: OutputMode> super::EventWriter<CommonSchemaOutput> for Provider<Mode>
441462
442463 eb. add_struct ( "ext_dt" , 2 , 0 ) ;
443464 {
444- eb. add_str8 ( "traceId" , "" , OutType :: Utf8 , 0 ) ; // TODO
465+ eb. add_str8 ( "traceId" , trace_id , OutType :: Utf8 , 0 ) ;
445466 eb. add_str8 ( "spanId" , span_id, OutType :: Utf8 , 0 ) ;
446467 }
447468 }
@@ -465,11 +486,30 @@ impl<Mode: OutputMode> super::EventWriter<CommonSchemaOutput> for Provider<Mode>
465486 eb. add_str8 ( "_typeName" , "Span" , OutType :: Utf8 , 0 ) ;
466487
467488 if let Some ( parent) = span_parent {
468- let parent_span_id = unsafe {
469- let mut span_id = MaybeUninit :: < [ u8 ; 16 ] > :: uninit ( ) ;
470- let mut cur = Cursor :: new ( ( * span_id. as_mut_ptr ( ) ) . as_mut_slice ( ) ) ;
471- write ! ( & mut cur, "{:16x}" , parent. id( ) . into_u64( ) ) . expect ( "!write" ) ;
472- span_id. assume_init ( )
489+ // Extract parent span_id - prefer OpenTelemetry context when available
490+ #[ cfg( feature = "opentelemetry" ) ]
491+ let parent_span_id = {
492+ let otel_ctx = crate :: otel:: extract_otel_context ( & parent) ;
493+ if otel_ctx. is_valid {
494+ otel_ctx. span_id
495+ } else {
496+ let mut buf = [ 0u8 ; 16 ] ;
497+ let _ = std:: io:: Write :: write_fmt (
498+ & mut buf. as_mut_slice ( ) ,
499+ format_args ! ( "{:016x}" , parent. id( ) . into_u64( ) ) ,
500+ ) ;
501+ buf
502+ }
503+ } ;
504+
505+ #[ cfg( not( feature = "opentelemetry" ) ) ]
506+ let parent_span_id = {
507+ let mut buf = [ 0u8 ; 16 ] ;
508+ let _ = std:: io:: Write :: write_fmt (
509+ & mut buf. as_mut_slice ( ) ,
510+ format_args ! ( "{:016x}" , parent. id( ) . into_u64( ) ) ,
511+ ) ;
512+ buf
473513 } ;
474514
475515 eb. add_str8 ( "parentId" , parent_span_id, OutType :: Utf8 , 0 ) ;
@@ -518,6 +558,7 @@ impl<Mode: OutputMode> super::EventWriter<CommonSchemaOutput> for Provider<Mode>
518558 keyword : u64 ,
519559 event_tag : u32 ,
520560 event : & tracing:: Event < ' _ > ,
561+ otel_context : Option < ( [ u8 ; 32 ] , [ u8 ; 16 ] ) > ,
521562 ) {
522563 EBW . with ( |eb| {
523564 let mut eb = eb. borrow_mut ( ) ;
@@ -532,27 +573,33 @@ impl<Mode: OutputMode> super::EventWriter<CommonSchemaOutput> for Provider<Mode>
532573 eb. add_u16 ( "__csver__" , 0x0401 , OutType :: Signed , 0 ) ;
533574 eb. add_struct (
534575 "PartA" ,
535- 1 + if current_span != 0 { 1 } else { 0 } , /* + exts.len() as u8*/
576+ 1 + if current_span != 0 || otel_context . is_some ( ) { 1 } else { 0 } , /* + exts.len() as u8*/
536577 0 ,
537578 ) ;
538579 {
539580 let time: String =
540581 chrono:: DateTime :: to_rfc3339 ( & chrono:: DateTime :: < chrono:: Utc > :: from ( timestamp) ) ;
541582 eb. add_str8 ( "time" , time, OutType :: Utf8 , 0 ) ;
542583
543- if current_span != 0 {
584+ // Use OTel context if available, otherwise fall back to local span ID
585+ if let Some ( ( trace_id, span_id) ) = otel_context {
544586 eb. add_struct ( "ext_dt" , 2 , 0 ) ;
545587 {
546- let span_id = unsafe {
547- let mut span_id = MaybeUninit :: < [ u8 ; 16 ] > :: uninit ( ) ;
548- let mut cur = Cursor :: new ( ( * span_id. as_mut_ptr ( ) ) . as_mut_slice ( ) ) ;
549- write ! ( & mut cur, "{:16x}" , current_span) . expect ( "!write" ) ;
550- span_id. assume_init ( )
551- } ;
552-
553- eb. add_str8 ( "traceId" , "" , OutType :: Utf8 , 0 ) ; // TODO
588+ eb. add_str8 ( "traceId" , trace_id, OutType :: Utf8 , 0 ) ;
554589 eb. add_str8 ( "spanId" , span_id, OutType :: Utf8 , 0 ) ;
555590 }
591+ } else if current_span != 0 {
592+ eb. add_struct ( "ext_dt" , 2 , 0 ) ;
593+ {
594+ let mut span_id_buf = [ 0u8 ; 16 ] ;
595+ let _ = std:: io:: Write :: write_fmt (
596+ & mut span_id_buf. as_mut_slice ( ) ,
597+ format_args ! ( "{:016x}" , current_span) ,
598+ ) ;
599+
600+ eb. add_str8 ( "traceId" , [ 0u8 ; 32 ] , OutType :: Utf8 , 0 ) ;
601+ eb. add_str8 ( "spanId" , span_id_buf, OutType :: Utf8 , 0 ) ;
602+ }
556603 }
557604 }
558605
0 commit comments