@@ -246,29 +246,30 @@ where
246
246
247
247
#[ cfg( feature = "experimental_use_tracing_span_context" ) ]
248
248
if let Some ( span) = _ctx. event_span ( event) {
249
+ use opentelemetry:: trace:: TraceContextExt ;
249
250
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 ) ;
264
- }
265
-
266
251
if let Some ( otd) = span. extensions ( ) . get :: < OtelData > ( ) {
267
252
if let Some ( attributes) = & otd. builder . attributes {
268
253
for attribute in attributes {
269
254
log_record. add_attribute ( attribute. key . clone ( ) , & attribute. value ) ;
270
255
}
271
256
}
257
+
258
+ if let Some ( span_id) = otd. builder . span_id {
259
+ let opt_trace_id = if otd. parent_cx . has_active_span ( ) {
260
+ Some ( otd. parent_cx . span ( ) . span_context ( ) . trace_id ( ) )
261
+ } else {
262
+ span. scope ( ) . last ( ) . and_then ( |root_span| {
263
+ root_span
264
+ . extensions ( )
265
+ . get :: < OtelData > ( )
266
+ . and_then ( |otd| otd. builder . trace_id )
267
+ } )
268
+ } ;
269
+ if let Some ( trace_id) = opt_trace_id {
270
+ log_record. set_trace_context ( trace_id, span_id, None ) ;
271
+ }
272
+ }
272
273
}
273
274
}
274
275
@@ -619,7 +620,9 @@ mod tests {
619
620
#[ cfg( feature = "experimental_use_tracing_span_context" ) ]
620
621
#[ test]
621
622
fn tracing_appender_inside_tracing_crate_context ( ) {
623
+ use opentelemetry:: { trace:: SpanContext , Context , SpanId , TraceId } ;
622
624
use opentelemetry_sdk:: trace:: InMemorySpanExporterBuilder ;
625
+ use tracing_opentelemetry:: OpenTelemetrySpanExt ;
623
626
624
627
// Arrange
625
628
let exporter: InMemoryLogExporter = InMemoryLogExporter :: default ( ) ;
@@ -646,7 +649,21 @@ mod tests {
646
649
let _guard = tracing:: subscriber:: set_default ( subscriber) ;
647
650
648
651
// Act
652
+ let remote_trace_id = TraceId :: from_u128 ( 233 ) ;
653
+ let remote_span_id = SpanId :: from_u64 ( 2333 ) ;
654
+ let remote_span_context = SpanContext :: new (
655
+ remote_trace_id,
656
+ remote_span_id,
657
+ TraceFlags :: SAMPLED ,
658
+ true ,
659
+ Default :: default ( ) ,
660
+ ) ;
661
+
649
662
tracing:: error_span!( "outer-span" , field1 = true ) . in_scope ( || {
663
+ let span = tracing:: Span :: current ( ) ;
664
+ let parent_context = Context :: current ( ) . with_remote_span_context ( remote_span_context) ;
665
+ span. set_parent ( parent_context) ;
666
+
650
667
error ! ( "first-event" ) ;
651
668
652
669
tracing:: error_span!( "inner-span" , field2 = 233 ) . in_scope ( || {
@@ -663,6 +680,7 @@ mod tests {
663
680
assert_eq ! ( spans. len( ) , 2 ) ;
664
681
665
682
let trace_id = spans[ 0 ] . span_context . trace_id ( ) ;
683
+ assert_eq ! ( trace_id, remote_trace_id) ;
666
684
assert_eq ! ( trace_id, spans[ 1 ] . span_context. trace_id( ) ) ;
667
685
let inner_span_id = spans[ 0 ] . span_context . span_id ( ) ;
668
686
let outer_span_id = spans[ 1 ] . span_context . span_id ( ) ;
0 commit comments