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..1e7cf207b6 --- /dev/null +++ b/opentelemetry-appender-tracing/tests/test_no_stack_overflow_after_shutdown.rs @@ -0,0 +1,23 @@ +use opentelemetry_appender_tracing::layer; +use opentelemetry_sdk::logs::SdkLoggerProvider; +use tracing::info; +use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt}; + +#[test] +fn test_logging_after_shutdown_does_not_cause_telemetry_induced_telemetry() { + //! Reproduces [#3161](https://github.com/open-telemetry/opentelemetry-rust/issues/3161) + 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(); + + // If logging causes telemetry-induced-telemetry after shutting down the provider, then a stack + // overflow may occur. + info!("Don't crash") +} diff --git a/opentelemetry-sdk/src/logs/batch_log_processor.rs b/opentelemetry-sdk/src/logs/batch_log_processor.rs index d104a0a221..9aae314f29 100644 --- a/opentelemetry-sdk/src/logs/batch_log_processor.rs +++ b/opentelemetry-sdk/src/logs/batch_log_processor.rs @@ -207,6 +207,10 @@ impl LogProcessor for BatchLogProcessor { } } Err(mpsc::TrySendError::Disconnected(_)) => { + // The following `otel_warn!` may cause an infinite feedback loop of + // 'telemetry-induced-telemetry', potentially causing a stack overflow + let _guard = Context::enter_telemetry_suppressed_scope(); + // Given background thread is the only receiver, and it's // disconnected, it indicates the thread is shutdown otel_warn!(