@@ -246,21 +246,24 @@ where
246246
247247 #[ cfg( feature = "experimental_use_tracing_span_context" ) ]
248248 if let Some ( span) = _ctx. event_span ( event) {
249+ use opentelemetry:: trace:: TraceContextExt ;
249250 use tracing_opentelemetry:: OtelData ;
250- let opt_span_id = span
251- . extensions ( )
252- . get :: < OtelData > ( )
253- . and_then ( |otd| otd. builder . span_id ) ;
254-
255- let opt_trace_id = span. scope ( ) . last ( ) . and_then ( |root_span| {
256- root_span
257- . extensions ( )
258- . get :: < OtelData > ( )
259- . and_then ( |otd| otd. builder . trace_id )
260- } ) ;
261-
262- if let Some ( ( trace_id, span_id) ) = opt_trace_id. zip ( opt_span_id) {
263- log_record. set_trace_context ( trace_id, span_id, None ) ;
251+ if let Some ( otd) = span. extensions ( ) . get :: < OtelData > ( ) {
252+ if let Some ( span_id) = otd. builder . span_id {
253+ let opt_trace_id = if otd. parent_cx . has_active_span ( ) {
254+ Some ( otd. parent_cx . span ( ) . span_context ( ) . trace_id ( ) )
255+ } else {
256+ span. scope ( ) . last ( ) . and_then ( |root_span| {
257+ root_span
258+ . extensions ( )
259+ . get :: < OtelData > ( )
260+ . and_then ( |otd| otd. builder . trace_id )
261+ } )
262+ } ;
263+ if let Some ( trace_id) = opt_trace_id {
264+ log_record. set_trace_context ( trace_id, span_id, None ) ;
265+ }
266+ }
264267 }
265268 }
266269
@@ -611,7 +614,9 @@ mod tests {
611614 #[ cfg( feature = "experimental_use_tracing_span_context" ) ]
612615 #[ test]
613616 fn tracing_appender_inside_tracing_crate_context ( ) {
617+ use opentelemetry:: { trace:: SpanContext , Context , SpanId , TraceId } ;
614618 use opentelemetry_sdk:: trace:: InMemorySpanExporterBuilder ;
619+ use tracing_opentelemetry:: OpenTelemetrySpanExt ;
615620
616621 // Arrange
617622 let exporter: InMemoryLogExporter = InMemoryLogExporter :: default ( ) ;
@@ -637,8 +642,23 @@ mod tests {
637642 // Avoiding global subscriber.init() as that does not play well with unit tests.
638643 let _guard = tracing:: subscriber:: set_default ( subscriber) ;
639644
645+ // Set context from remote.
646+ let remote_trace_id = TraceId :: from_u128 ( 233 ) ;
647+ let remote_span_id = SpanId :: from_u64 ( 2333 ) ;
648+ let remote_span_context = SpanContext :: new (
649+ remote_trace_id,
650+ remote_span_id,
651+ TraceFlags :: SAMPLED ,
652+ true ,
653+ Default :: default ( ) ,
654+ ) ;
655+
640656 // Act
641657 tracing:: error_span!( "outer-span" ) . in_scope ( || {
658+ let span = tracing:: Span :: current ( ) ;
659+ let parent_context = Context :: current ( ) . with_remote_span_context ( remote_span_context) ;
660+ span. set_parent ( parent_context) ;
661+
642662 error ! ( "first-event" ) ;
643663
644664 tracing:: error_span!( "inner-span" ) . in_scope ( || {
@@ -655,6 +675,7 @@ mod tests {
655675 assert_eq ! ( spans. len( ) , 2 ) ;
656676
657677 let trace_id = spans[ 0 ] . span_context . trace_id ( ) ;
678+ assert_eq ! ( trace_id, remote_trace_id) ;
658679 assert_eq ! ( trace_id, spans[ 1 ] . span_context. trace_id( ) ) ;
659680 let inner_span_id = spans[ 0 ] . span_context . span_id ( ) ;
660681 let outer_span_id = spans[ 1 ] . span_context . span_id ( ) ;
0 commit comments