@@ -256,14 +256,17 @@ impl opentelemetry::logs::Logger for Logger {
256
256
fn emit ( & self , mut record : Self :: LogRecord ) {
257
257
let provider = self . provider ( ) ;
258
258
let processors = provider. log_processors ( ) ;
259
- let trace_context = Context :: map_current ( |cx| {
260
- cx. has_active_span ( )
261
- . then ( || TraceContext :: from ( cx. span ( ) . span_context ( ) ) )
262
- } ) ;
263
259
264
260
//let mut log_record = record;
265
- if let Some ( ref trace_context) = trace_context {
266
- record. trace_context = Some ( trace_context. clone ( ) ) ;
261
+ if record. trace_context . is_none ( ) {
262
+ let trace_context = Context :: map_current ( |cx| {
263
+ cx. has_active_span ( )
264
+ . then ( || TraceContext :: from ( cx. span ( ) . span_context ( ) ) )
265
+ } ) ;
266
+
267
+ if let Some ( ref trace_context) = trace_context {
268
+ record. trace_context = Some ( trace_context. clone ( ) ) ;
269
+ }
267
270
}
268
271
if record. observed_timestamp . is_none ( ) {
269
272
record. observed_timestamp = Some ( SystemTime :: now ( ) ) ;
@@ -293,13 +296,18 @@ impl opentelemetry::logs::Logger for Logger {
293
296
294
297
#[ cfg( test) ]
295
298
mod tests {
296
- use crate :: resource:: {
297
- SERVICE_NAME , TELEMETRY_SDK_LANGUAGE , TELEMETRY_SDK_NAME , TELEMETRY_SDK_VERSION ,
299
+ use crate :: {
300
+ resource:: {
301
+ SERVICE_NAME , TELEMETRY_SDK_LANGUAGE , TELEMETRY_SDK_NAME , TELEMETRY_SDK_VERSION ,
302
+ } ,
303
+ testing:: logs:: InMemoryLogsExporter ,
304
+ trace:: TracerProvider ,
305
+ Resource ,
298
306
} ;
299
- use crate :: Resource ;
300
307
301
308
use super :: * ;
302
- use opentelemetry:: logs:: { Logger , LoggerProvider as _} ;
309
+ use opentelemetry:: logs:: { AnyValue , LogRecord as _, Logger as _, LoggerProvider as _} ;
310
+ use opentelemetry:: trace:: { SpanId , TraceId , Tracer as _, TracerProvider as _} ;
303
311
use opentelemetry:: { Key , KeyValue , Value } ;
304
312
use std:: fmt:: { Debug , Formatter } ;
305
313
use std:: sync:: atomic:: AtomicU64 ;
@@ -461,6 +469,72 @@ mod tests {
461
469
assert_eq ! ( no_service_name. resource( ) . len( ) , 0 ) ;
462
470
}
463
471
472
+ #[ test]
473
+ fn trace_context_test ( ) {
474
+ let exporter = InMemoryLogsExporter :: default ( ) ;
475
+
476
+ let logger_provider = LoggerProvider :: builder ( )
477
+ . with_simple_exporter ( exporter. clone ( ) )
478
+ . build ( ) ;
479
+
480
+ let logger = logger_provider. logger ( "test-logger" ) ;
481
+
482
+ let tracer_provider = TracerProvider :: builder ( ) . build ( ) ;
483
+
484
+ let tracer = tracer_provider. tracer ( "test-tracer" ) ;
485
+
486
+ tracer. in_span ( "test-span" , |cx| {
487
+ let ambient_ctxt = cx. span ( ) . span_context ( ) . clone ( ) ;
488
+ let explicit_ctxt = TraceContext {
489
+ trace_id : TraceId :: from_u128 ( 13 ) ,
490
+ span_id : SpanId :: from_u64 ( 14 ) ,
491
+ trace_flags : None ,
492
+ } ;
493
+
494
+ let mut ambient_ctxt_record = logger. create_log_record ( ) ;
495
+ ambient_ctxt_record. set_body ( AnyValue :: String ( "ambient" . into ( ) ) ) ;
496
+
497
+ let mut explicit_ctxt_record = logger. create_log_record ( ) ;
498
+ explicit_ctxt_record. set_body ( AnyValue :: String ( "explicit" . into ( ) ) ) ;
499
+ explicit_ctxt_record. set_trace_context (
500
+ explicit_ctxt. trace_id ,
501
+ explicit_ctxt. span_id ,
502
+ explicit_ctxt. trace_flags ,
503
+ ) ;
504
+
505
+ logger. emit ( ambient_ctxt_record) ;
506
+ logger. emit ( explicit_ctxt_record) ;
507
+
508
+ let emitted = exporter. get_emitted_logs ( ) . unwrap ( ) ;
509
+
510
+ assert_eq ! (
511
+ Some ( AnyValue :: String ( "ambient" . into( ) ) ) ,
512
+ emitted[ 0 ] . record. body
513
+ ) ;
514
+ assert_eq ! (
515
+ ambient_ctxt. trace_id( ) ,
516
+ emitted[ 0 ] . record. trace_context. as_ref( ) . unwrap( ) . trace_id
517
+ ) ;
518
+ assert_eq ! (
519
+ ambient_ctxt. span_id( ) ,
520
+ emitted[ 0 ] . record. trace_context. as_ref( ) . unwrap( ) . span_id
521
+ ) ;
522
+
523
+ assert_eq ! (
524
+ Some ( AnyValue :: String ( "explicit" . into( ) ) ) ,
525
+ emitted[ 1 ] . record. body
526
+ ) ;
527
+ assert_eq ! (
528
+ explicit_ctxt. trace_id,
529
+ emitted[ 1 ] . record. trace_context. as_ref( ) . unwrap( ) . trace_id
530
+ ) ;
531
+ assert_eq ! (
532
+ explicit_ctxt. span_id,
533
+ emitted[ 1 ] . record. trace_context. as_ref( ) . unwrap( ) . span_id
534
+ ) ;
535
+ } ) ;
536
+ }
537
+
464
538
#[ test]
465
539
fn shutdown_test ( ) {
466
540
let counter = Arc :: new ( AtomicU64 :: new ( 0 ) ) ;
0 commit comments