Skip to content

Commit 4d3fb7c

Browse files
committed
fix: fix trace id in logs when nested in tracing span with set_parent
1 parent dad11f1 commit 4d3fb7c

File tree

1 file changed

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

1 file changed

+35
-16
lines changed

opentelemetry-appender-tracing/src/layer.rs

Lines changed: 35 additions & 16 deletions
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 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,10 @@ 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 trace::TraceContextExt;
626+
use tracing_opentelemetry::OpenTelemetrySpanExt;
623627

624628
// Arrange
625629
let exporter: InMemoryLogExporter = InMemoryLogExporter::default();
@@ -646,7 +650,21 @@ mod tests {
646650
let _guard = tracing::subscriber::set_default(subscriber);
647651

648652
// Act
653+
let remote_trace_id = TraceId::from_u128(233);
654+
let remote_span_id = SpanId::from_u64(2333);
655+
let remote_span_context = SpanContext::new(
656+
remote_trace_id,
657+
remote_span_id,
658+
TraceFlags::SAMPLED,
659+
true,
660+
Default::default(),
661+
);
662+
649663
tracing::error_span!("outer-span", field1 = true).in_scope(|| {
664+
let span = tracing::Span::current();
665+
let parent_context = Context::current().with_remote_span_context(remote_span_context);
666+
span.set_parent(parent_context);
667+
650668
error!("first-event");
651669

652670
tracing::error_span!("inner-span", field2 = 233).in_scope(|| {
@@ -663,6 +681,7 @@ mod tests {
663681
assert_eq!(spans.len(), 2);
664682

665683
let trace_id = spans[0].span_context.trace_id();
684+
assert_eq!(trace_id, remote_trace_id);
666685
assert_eq!(trace_id, spans[1].span_context.trace_id());
667686
let inner_span_id = spans[0].span_context.span_id();
668687
let outer_span_id = spans[1].span_context.span_id();

0 commit comments

Comments
 (0)