diff --git a/opentelemetry-appender-tracing/tests/test_no_stack_overflow_after_shutdown.rs b/opentelemetry-appender-tracing/tests/test_no_stack_overflow_after_shutdown.rs new file mode 100644 index 0000000000..3a08493bd9 --- /dev/null +++ b/opentelemetry-appender-tracing/tests/test_no_stack_overflow_after_shutdown.rs @@ -0,0 +1,20 @@ +use opentelemetry_appender_tracing::layer; +use opentelemetry_sdk::logs::SdkLoggerProvider; +use tracing::info; +use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt}; + +#[test] +fn test_no_stack_overflow_when_event_is_emitted_after_shutdown() { + let exporter = opentelemetry_stdout::LogExporter::default(); + let provider: SdkLoggerProvider = SdkLoggerProvider::builder() + .with_batch_exporter(exporter) + .build(); + + let otel_layer = layer::OpenTelemetryTracingBridge::new(&provider); + + tracing_subscriber::registry().with(otel_layer).init(); + + provider.shutdown().unwrap(); + + info!("Don't crash") +} diff --git a/opentelemetry-sdk/src/logs/logger.rs b/opentelemetry-sdk/src/logs/logger.rs index 860922adf0..cf65d1aa16 100644 --- a/opentelemetry-sdk/src/logs/logger.rs +++ b/opentelemetry-sdk/src/logs/logger.rs @@ -33,7 +33,7 @@ impl opentelemetry::logs::Logger for SdkLogger { /// Emit a `LogRecord`. fn emit(&self, mut record: Self::LogRecord) { - if Context::is_current_telemetry_suppressed() { + if Context::is_current_telemetry_suppressed() || self.provider.is_shutdown() { return; } let provider = &self.provider; diff --git a/opentelemetry-sdk/src/logs/logger_provider.rs b/opentelemetry-sdk/src/logs/logger_provider.rs index e7de152807..54f89f6e6d 100644 --- a/opentelemetry-sdk/src/logs/logger_provider.rs +++ b/opentelemetry-sdk/src/logs/logger_provider.rs @@ -129,6 +129,10 @@ impl SdkLoggerProvider { pub fn shutdown(&self) -> OTelSdkResult { self.shutdown_with_timeout(Duration::from_secs(5)) } + + pub(crate) fn is_shutdown(&self) -> bool { + self.inner.is_shutdown.load(Ordering::SeqCst) + } } #[derive(Debug)]