1
1
use std:: { any:: TypeId , time:: SystemTime } ;
2
2
3
3
use opentelemetry:: {
4
- KeyValue ,
4
+ Context , KeyValue ,
5
5
global:: ObjectSafeSpan ,
6
6
trace:: { SamplingDecision , TraceContextExt , Tracer } ,
7
7
} ;
8
8
use tracing:: { Subscriber , field:: Visit } ;
9
- use tracing_opentelemetry:: { OpenTelemetrySpanExt , OtelData , PreSampledTracer } ;
9
+ use tracing_opentelemetry:: { OtelData , PreSampledTracer } ;
10
10
use tracing_subscriber:: { Layer , registry:: LookupSpan } ;
11
11
12
12
use crate :: LogfireTracer ;
@@ -95,14 +95,21 @@ where
95
95
/// Tracing events currently are recorded as span events, so do not get printed by the span emitter.
96
96
///
97
97
/// 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 > ) {
103
99
// 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) ;
106
113
}
107
114
108
115
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 {
242
249
fn emit_event_as_log_span (
243
250
tracer : & LogfireTracer ,
244
251
event : & tracing:: Event < ' _ > ,
245
- parent_span : & tracing :: Span ,
252
+ parent_context : & Context ,
246
253
) {
247
254
let mut visitor = FieldsVisitor {
248
255
message : None ,
@@ -292,14 +299,13 @@ fn emit_event_as_log_span(
292
299
// FIXME add thread.id, thread.name
293
300
294
301
let ts = SystemTime :: now ( ) ;
295
-
296
302
tracer
297
303
. inner
298
304
. span_builder ( message)
299
305
. with_attributes ( attributes)
300
306
. with_start_time ( ts)
301
307
// .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 )
303
309
. end_with_timestamp ( ts) ;
304
310
}
305
311
@@ -1408,7 +1414,7 @@ mod tests {
1408
1414
},
1409
1415
SpanData {
1410
1416
span_context: SpanContext {
1411
- trace_id: 000000000000000000000000000000f3 ,
1417
+ trace_id: 000000000000000000000000000000f2 ,
1412
1418
span_id: 00000000000000fa,
1413
1419
trace_flags: TraceFlags(
1414
1420
1,
@@ -1418,7 +1424,7 @@ mod tests {
1418
1424
None,
1419
1425
),
1420
1426
},
1421
- parent_span_id: 0000000000000000 ,
1427
+ parent_span_id: 00000000000000f2 ,
1422
1428
span_kind: Internal,
1423
1429
name: "hello world log",
1424
1430
start_time: SystemTime {
@@ -1506,7 +1512,7 @@ mod tests {
1506
1512
},
1507
1513
SpanData {
1508
1514
span_context: SpanContext {
1509
- trace_id: 000000000000000000000000000000f4 ,
1515
+ trace_id: 000000000000000000000000000000f2 ,
1510
1516
span_id: 00000000000000fb,
1511
1517
trace_flags: TraceFlags(
1512
1518
1,
@@ -1516,7 +1522,7 @@ mod tests {
1516
1522
None,
1517
1523
),
1518
1524
},
1519
- parent_span_id: 0000000000000000 ,
1525
+ parent_span_id: 00000000000000f2 ,
1520
1526
span_kind: Internal,
1521
1527
name: "hello world log with value",
1522
1528
start_time: SystemTime {
0 commit comments