Skip to content

Commit 2dacc47

Browse files
Use BatchSpanProcessor for console writer
1 parent f84e5a7 commit 2dacc47

File tree

4 files changed

+27
-8
lines changed

4 files changed

+27
-8
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ async-trait = "0.1.88"
4040
insta = "1.42.1"
4141
opentelemetry_sdk = { version = "0.29", default-features = false, features = ["testing"] }
4242
regex = "1.11.1"
43-
tokio = {version = "1.44.1", features = ["test-util"] }
43+
tokio = { version = "1.44.1", features = ["test-util"] }
4444
ulid = "1.2.0"
4545

4646
[features]

src/config.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -400,4 +400,19 @@ 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+
.local()
409+
.with_token("abc123")
410+
.install_panic_handler()
411+
.finish()
412+
.unwrap();
413+
414+
tokio::time::sleep(tokio::time::Duration::from_secs(1)).await;
415+
416+
shutdown_handler.shutdown().ok();
417+
}
403418
}

src/lib.rs

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -106,9 +106,7 @@ 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;
114112
use tracing::Subscriber;
@@ -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 {

tests/test_basic_exports.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1032,7 +1032,7 @@ fn test_basic_span() {
10321032
"code.lineno",
10331033
),
10341034
value: I64(
1035-
694,
1035+
698,
10361036
),
10371037
},
10381038
KeyValue {

0 commit comments

Comments
 (0)