Skip to content

Commit 72c33f1

Browse files
committed
fix: fix trace id in logs when nested in tracing span with set_parent
1 parent 9cdc931 commit 72c33f1

File tree

2 files changed

+36
-15
lines changed

2 files changed

+36
-15
lines changed

opentelemetry-appender-tracing/Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ tokio = { workspace = true, features = ["full"]}
3434
pprof = { version = "0.14", features = ["flamegraph", "criterion"] }
3535

3636
[features]
37-
default = []
37+
default = ["experimental_use_tracing_span_context"]
3838
experimental_metadata_attributes = ["dep:tracing-log"]
3939
spec_unstable_logs_enabled = ["opentelemetry/spec_unstable_logs_enabled"]
4040
experimental_use_tracing_span_context = ["tracing-opentelemetry"]

opentelemetry-appender-tracing/src/layer.rs

+35-14
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)