Skip to content

Commit 55799ee

Browse files
committed
fix: fix trace id in logs when nested in tracing span with set_parent
1 parent 1d9c33e commit 55799ee

File tree

1 file changed

+34
-16
lines changed
  • opentelemetry-appender-tracing/src

1 file changed

+34
-16
lines changed

opentelemetry-appender-tracing/src/layer.rs

+34-16
Original file line numberDiff line numberDiff line change
@@ -246,29 +246,30 @@ 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);
264-
}
265-
266251
if let Some(otd) = span.extensions().get::<OtelData>() {
267252
if let Some(attributes) = &otd.builder.attributes {
268253
for attribute in attributes {
269254
log_record.add_attribute(attribute.key.clone(), &attribute.value);
270255
}
271256
}
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+
}
272273
}
273274
}
274275

@@ -619,7 +620,9 @@ mod tests {
619620
#[cfg(feature = "experimental_use_tracing_span_context")]
620621
#[test]
621622
fn tracing_appender_inside_tracing_crate_context() {
623+
use opentelemetry::{trace::SpanContext, Context, SpanId, TraceId};
622624
use opentelemetry_sdk::trace::InMemorySpanExporterBuilder;
625+
use tracing_opentelemetry::OpenTelemetrySpanExt;
623626

624627
// Arrange
625628
let exporter: InMemoryLogExporter = InMemoryLogExporter::default();
@@ -646,7 +649,21 @@ mod tests {
646649
let _guard = tracing::subscriber::set_default(subscriber);
647650

648651
// 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+
649662
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+
650667
error!("first-event");
651668

652669
tracing::error_span!("inner-span", field2 = 233).in_scope(|| {
@@ -663,6 +680,7 @@ mod tests {
663680
assert_eq!(spans.len(), 2);
664681

665682
let trace_id = spans[0].span_context.trace_id();
683+
assert_eq!(trace_id, remote_trace_id);
666684
assert_eq!(trace_id, spans[1].span_context.trace_id());
667685
let inner_span_id = spans[0].span_context.span_id();
668686
let outer_span_id = spans[1].span_context.span_id();

0 commit comments

Comments
 (0)