Skip to content

Commit e198636

Browse files
Use BatchSpanProcessor for console writer
1 parent f84e5a7 commit e198636

File tree

2 files changed

+33
-15
lines changed

2 files changed

+33
-15
lines changed

src/config.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -400,4 +400,18 @@ mod tests {
400400
super::ConsoleOptions::default().with_min_log_level(tracing::Level::DEBUG);
401401
assert_eq!(console_options.min_log_level, tracing::Level::DEBUG);
402402
}
403+
404+
#[tokio::test]
405+
async fn test_console_with_tokio_sleep() {
406+
// token is invalid, so exports will fail, but it was a necessary part of reproducing the issue
407+
let shutdown_handler = crate::configure()
408+
.with_token("abc123")
409+
.install_panic_handler()
410+
.finish()
411+
.unwrap();
412+
413+
tokio::time::sleep(tokio::time::Duration::from_secs(1)).await;
414+
415+
shutdown_handler.shutdown().ok();
416+
}
403417
}

src/lib.rs

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -106,13 +106,11 @@ use bridges::tracing::LogfireTracingPendingSpanNotSentLayer;
106106
use config::get_base_url_from_token;
107107
use opentelemetry::trace::TracerProvider;
108108
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};
112110
use opentelemetry_sdk::trace::{SdkTracerProvider, Tracer};
113111
use thiserror::Error;
114-
use tracing::Subscriber;
115112
use tracing::level_filters::LevelFilter;
113+
use tracing::Subscriber;
116114
use tracing_subscriber::layer::SubscriberExt;
117115

118116
use crate::bridges::tracing::LogfireTracingLayer;
@@ -531,12 +529,12 @@ impl LogfireConfigBuilder {
531529
logfire_base_url,
532530
http_headers.clone(),
533531
)?)
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(),
540538
);
541539
}
542540

@@ -551,9 +549,15 @@ impl LogfireConfigBuilder {
551549
.map(Arc::new);
552550

553551
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+
));
557561
}
558562

559563
for span_processor in self.additional_span_processors {
@@ -593,7 +597,7 @@ impl LogfireConfigBuilder {
593597
logfire_base_url,
594598
http_headers,
595599
)?)
596-
.build();
600+
.build();
597601

598602
meter_provider_builder = meter_provider_builder.with_reader(metric_reader);
599603
}
@@ -816,7 +820,7 @@ mod test_utils;
816820

817821
#[cfg(test)]
818822
mod tests {
819-
use crate::{ConfigureError, config::SendToLogfire};
823+
use crate::{config::SendToLogfire, ConfigureError};
820824

821825
#[test]
822826
fn test_send_to_logfire() {

0 commit comments

Comments
 (0)