Skip to content

Commit 00d021f

Browse files
authored
fix parent span id for tracing events (#71)
1 parent 41e6fdf commit 00d021f

File tree

1 file changed

+22
-16
lines changed

1 file changed

+22
-16
lines changed

src/bridges/tracing.rs

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
use std::{any::TypeId, time::SystemTime};
22

33
use opentelemetry::{
4-
KeyValue,
4+
Context, KeyValue,
55
global::ObjectSafeSpan,
66
trace::{SamplingDecision, TraceContextExt, Tracer},
77
};
88
use tracing::{Subscriber, field::Visit};
9-
use tracing_opentelemetry::{OpenTelemetrySpanExt, OtelData, PreSampledTracer};
9+
use tracing_opentelemetry::{OtelData, PreSampledTracer};
1010
use tracing_subscriber::{Layer, registry::LookupSpan};
1111

1212
use crate::LogfireTracer;
@@ -95,14 +95,21 @@ where
9595
/// Tracing events currently are recorded as span events, so do not get printed by the span emitter.
9696
///
9797
/// Instead we need to handle them here and write them to the logfire writer.
98-
fn on_event(
99-
&self,
100-
event: &tracing::Event<'_>,
101-
_ctx: tracing_subscriber::layer::Context<'_, S>,
102-
) {
98+
fn on_event(&self, event: &tracing::Event<'_>, ctx: tracing_subscriber::layer::Context<'_, S>) {
10399
// Don't delegate events to OpenTelemetry layer, we emit them as log spans instead.
104-
// FIXME: can we get current span from `ctx`?
105-
emit_event_as_log_span(&self.tracer, event, &tracing::Span::current());
100+
let event_span = ctx.event_span(event).and_then(|span| ctx.span(&span.id()));
101+
let mut event_span_extensions = event_span.as_ref().map(|s| s.extensions_mut());
102+
103+
let context = if let Some(otel_data) = event_span_extensions
104+
.as_mut()
105+
.and_then(|e| e.get_mut::<OtelData>())
106+
{
107+
self.tracer.inner.sampled_context(otel_data)
108+
} else {
109+
Context::new()
110+
};
111+
112+
emit_event_as_log_span(&self.tracer, event, &context);
106113
}
107114

108115
fn on_exit(&self, id: &tracing::span::Id, ctx: tracing_subscriber::layer::Context<'_, S>) {
@@ -242,7 +249,7 @@ pub(crate) fn level_to_level_number(level: tracing::Level) -> i64 {
242249
fn emit_event_as_log_span(
243250
tracer: &LogfireTracer,
244251
event: &tracing::Event<'_>,
245-
parent_span: &tracing::Span,
252+
parent_context: &Context,
246253
) {
247254
let mut visitor = FieldsVisitor {
248255
message: None,
@@ -292,14 +299,13 @@ fn emit_event_as_log_span(
292299
// FIXME add thread.id, thread.name
293300

294301
let ts = SystemTime::now();
295-
296302
tracer
297303
.inner
298304
.span_builder(message)
299305
.with_attributes(attributes)
300306
.with_start_time(ts)
301307
// .with_end_time(ts) seems to not be respected, need to explicitly end as per below
302-
.start_with_context(&tracer.inner, &parent_span.context())
308+
.start_with_context(&tracer.inner, parent_context)
303309
.end_with_timestamp(ts);
304310
}
305311

@@ -1408,7 +1414,7 @@ mod tests {
14081414
},
14091415
SpanData {
14101416
span_context: SpanContext {
1411-
trace_id: 000000000000000000000000000000f3,
1417+
trace_id: 000000000000000000000000000000f2,
14121418
span_id: 00000000000000fa,
14131419
trace_flags: TraceFlags(
14141420
1,
@@ -1418,7 +1424,7 @@ mod tests {
14181424
None,
14191425
),
14201426
},
1421-
parent_span_id: 0000000000000000,
1427+
parent_span_id: 00000000000000f2,
14221428
span_kind: Internal,
14231429
name: "hello world log",
14241430
start_time: SystemTime {
@@ -1506,7 +1512,7 @@ mod tests {
15061512
},
15071513
SpanData {
15081514
span_context: SpanContext {
1509-
trace_id: 000000000000000000000000000000f4,
1515+
trace_id: 000000000000000000000000000000f2,
15101516
span_id: 00000000000000fb,
15111517
trace_flags: TraceFlags(
15121518
1,
@@ -1516,7 +1522,7 @@ mod tests {
15161522
None,
15171523
),
15181524
},
1519-
parent_span_id: 0000000000000000,
1525+
parent_span_id: 00000000000000f2,
15201526
span_kind: Internal,
15211527
name: "hello world log with value",
15221528
start_time: SystemTime {

0 commit comments

Comments
 (0)