@@ -106,13 +106,11 @@ use bridges::tracing::LogfireTracingPendingSpanNotSentLayer;
106
106
use config:: get_base_url_from_token;
107
107
use opentelemetry:: trace:: TracerProvider ;
108
108
use opentelemetry_sdk:: metrics:: { PeriodicReader , SdkMeterProvider } ;
109
- use opentelemetry_sdk:: trace:: {
110
- BatchConfigBuilder , BatchSpanProcessor , SimpleSpanProcessor , SpanProcessor ,
111
- } ;
109
+ use opentelemetry_sdk:: trace:: { BatchConfigBuilder , BatchSpanProcessor , SpanProcessor } ;
112
110
use opentelemetry_sdk:: trace:: { SdkTracerProvider , Tracer } ;
113
111
use thiserror:: Error ;
114
- use tracing:: Subscriber ;
115
112
use tracing:: level_filters:: LevelFilter ;
113
+ use tracing:: Subscriber ;
116
114
use tracing_subscriber:: layer:: SubscriberExt ;
117
115
118
116
use crate :: bridges:: tracing:: LogfireTracingLayer ;
@@ -531,12 +529,12 @@ impl LogfireConfigBuilder {
531
529
logfire_base_url,
532
530
http_headers. clone ( ) ,
533
531
) ?)
534
- . with_batch_config (
535
- BatchConfigBuilder :: default ( )
536
- . with_scheduled_delay ( Duration :: from_millis ( 500 ) ) // 500 matches Python
537
- . build ( ) ,
538
- )
539
- . build ( ) ,
532
+ . with_batch_config (
533
+ BatchConfigBuilder :: default ( )
534
+ . with_scheduled_delay ( Duration :: from_millis ( 500 ) ) // 500 matches Python
535
+ . build ( ) ,
536
+ )
537
+ . build ( ) ,
540
538
) ;
541
539
}
542
540
@@ -551,9 +549,15 @@ impl LogfireConfigBuilder {
551
549
. map ( Arc :: new) ;
552
550
553
551
if let Some ( console_writer) = console_writer. clone ( ) {
554
- tracer_provider_builder = tracer_provider_builder. with_span_processor (
555
- SimpleSpanProcessor :: new ( SimpleConsoleSpanExporter :: new ( console_writer) ) ,
556
- ) ;
552
+ // Use BatchSpanProcessor instead of SimpleSpanProcessor to avoid deadlocks.
553
+ // BatchSpanProcessor uses a dedicated background thread, making it safer in async environments.
554
+ tracer_provider_builder =
555
+ tracer_provider_builder. with_span_processor ( BatchSpanProcessor :: new (
556
+ SimpleConsoleSpanExporter :: new ( console_writer) ,
557
+ BatchConfigBuilder :: default ( )
558
+ . with_scheduled_delay ( Duration :: ZERO )
559
+ . build ( ) ,
560
+ ) ) ;
557
561
}
558
562
559
563
for span_processor in self . additional_span_processors {
@@ -593,7 +597,7 @@ impl LogfireConfigBuilder {
593
597
logfire_base_url,
594
598
http_headers,
595
599
) ?)
596
- . build ( ) ;
600
+ . build ( ) ;
597
601
598
602
meter_provider_builder = meter_provider_builder. with_reader ( metric_reader) ;
599
603
}
@@ -816,7 +820,7 @@ mod test_utils;
816
820
817
821
#[ cfg( test) ]
818
822
mod tests {
819
- use crate :: { ConfigureError , config:: SendToLogfire } ;
823
+ use crate :: { config:: SendToLogfire , ConfigureError } ;
820
824
821
825
#[ test]
822
826
fn test_send_to_logfire ( ) {
0 commit comments