From 0ce6a6dc36229e6cdfaf64d01ab19810da387506 Mon Sep 17 00:00:00 2001 From: Zhongyang Wu Date: Tue, 28 May 2024 07:04:06 -0700 Subject: [PATCH] fix: make `shutdown` `&self` in span processor (#1836) --- opentelemetry-sdk/CHANGELOG.md | 2 ++ opentelemetry-sdk/src/trace/provider.rs | 2 +- opentelemetry-sdk/src/trace/span_processor.rs | 16 ++++++++-------- stress/src/traces.rs | 2 +- 4 files changed, 12 insertions(+), 10 deletions(-) diff --git a/opentelemetry-sdk/CHANGELOG.md b/opentelemetry-sdk/CHANGELOG.md index 8460c89133..153ba72064 100644 --- a/opentelemetry-sdk/CHANGELOG.md +++ b/opentelemetry-sdk/CHANGELOG.md @@ -26,6 +26,8 @@ asynchronously, it should clone the log data to ensure it can be safely processed without lifetime issues. +- **Breaking** [1836](https://github.com/open-telemetry/opentelemetry-rust/pull/1836) `SpanProcessor::shutdown` now takes an immutable reference to self. Any reference can call shutdown on the processor. After the first call to `shutdown` the processor will not process any new spans. + ## v0.23.0 - Fix SimpleSpanProcessor to be consistent with log counterpart. Also removed diff --git a/opentelemetry-sdk/src/trace/provider.rs b/opentelemetry-sdk/src/trace/provider.rs index 1fbe22d628..1c6342d3b9 100644 --- a/opentelemetry-sdk/src/trace/provider.rs +++ b/opentelemetry-sdk/src/trace/provider.rs @@ -264,7 +264,7 @@ mod tests { } } - fn shutdown(&mut self) -> TraceResult<()> { + fn shutdown(&self) -> TraceResult<()> { self.force_flush() } } diff --git a/opentelemetry-sdk/src/trace/span_processor.rs b/opentelemetry-sdk/src/trace/span_processor.rs index ac24cff1b0..86381119b0 100644 --- a/opentelemetry-sdk/src/trace/span_processor.rs +++ b/opentelemetry-sdk/src/trace/span_processor.rs @@ -91,7 +91,7 @@ pub trait SpanProcessor: Send + Sync + std::fmt::Debug { fn force_flush(&self) -> TraceResult<()>; /// Shuts down the processor. Called when SDK is shut down. This is an /// opportunity for processors to do any cleanup required. - fn shutdown(&mut self) -> TraceResult<()>; + fn shutdown(&self) -> TraceResult<()>; } /// A [SpanProcessor] that passes finished spans to the configured @@ -137,7 +137,7 @@ impl SpanProcessor for SimpleSpanProcessor { Ok(()) } - fn shutdown(&mut self) -> TraceResult<()> { + fn shutdown(&self) -> TraceResult<()> { if let Ok(mut exporter) = self.exporter.lock() { exporter.shutdown(); Ok(()) @@ -249,7 +249,7 @@ impl SpanProcessor for BatchSpanProcessor { .and_then(|identity| identity) } - fn shutdown(&mut self) -> TraceResult<()> { + fn shutdown(&self) -> TraceResult<()> { let (res_sender, res_receiver) = oneshot::channel(); self.message_sender .try_send(BatchMessage::Shutdown(res_sender)) @@ -687,7 +687,7 @@ mod tests { #[test] fn simple_span_processor_on_end_calls_export() { let exporter = InMemorySpanExporterBuilder::new().build(); - let mut processor = SimpleSpanProcessor::new(Box::new(exporter.clone())); + let processor = SimpleSpanProcessor::new(Box::new(exporter.clone())); let span_data = new_test_export_span_data(); processor.on_end(span_data.clone()); assert_eq!(exporter.get_finished_spans().unwrap()[0], span_data); @@ -720,7 +720,7 @@ mod tests { #[test] fn simple_span_processor_shutdown_calls_shutdown() { let exporter = InMemorySpanExporterBuilder::new().build(); - let mut processor = SimpleSpanProcessor::new(Box::new(exporter.clone())); + let processor = SimpleSpanProcessor::new(Box::new(exporter.clone())); let span_data = new_test_export_span_data(); processor.on_end(span_data.clone()); assert!(!exporter.get_finished_spans().unwrap().is_empty()); @@ -876,7 +876,7 @@ mod tests { scheduled_delay: Duration::from_secs(60 * 60 * 24), // set the tick to 24 hours so we know the span must be exported via force_flush ..Default::default() }; - let mut processor = + let processor = BatchSpanProcessor::new(Box::new(exporter), config, runtime::TokioCurrentThread); let handle = tokio::spawn(async move { loop { @@ -976,7 +976,7 @@ mod tests { delay_for: Duration::from_millis(if !time_out { 5 } else { 60 }), delay_fn: async_std::task::sleep, }; - let mut processor = BatchSpanProcessor::new(Box::new(exporter), config, runtime::AsyncStd); + let processor = BatchSpanProcessor::new(Box::new(exporter), config, runtime::AsyncStd); processor.on_end(new_test_export_span_data()); let flush_res = processor.force_flush(); if time_out { @@ -1000,7 +1000,7 @@ mod tests { delay_for: Duration::from_millis(if !time_out { 5 } else { 60 }), delay_fn: tokio::time::sleep, }; - let mut processor = + let processor = BatchSpanProcessor::new(Box::new(exporter), config, runtime::TokioCurrentThread); tokio::time::sleep(Duration::from_secs(1)).await; // skip the first processor.on_end(new_test_export_span_data()); diff --git a/stress/src/traces.rs b/stress/src/traces.rs index 0dd992f708..9f9065d1a5 100644 --- a/stress/src/traces.rs +++ b/stress/src/traces.rs @@ -42,7 +42,7 @@ impl SpanProcessor for NoOpSpanProcessor { Ok(()) } - fn shutdown(&mut self) -> TraceResult<()> { + fn shutdown(&self) -> TraceResult<()> { Ok(()) } }