diff --git a/opentelemetry-otlp/src/exporter/http/trace.rs b/opentelemetry-otlp/src/exporter/http/trace.rs index 129a0da7d8..5c7643d12d 100644 --- a/opentelemetry-otlp/src/exporter/http/trace.rs +++ b/opentelemetry-otlp/src/exporter/http/trace.rs @@ -61,7 +61,7 @@ impl SpanExporter for OtlpHttpClient { Ok(()) } - fn shutdown(&mut self) -> OTelSdkResult { + fn shutdown(&self) -> OTelSdkResult { let mut client_guard = self.client.lock().map_err(|e| { OTelSdkError::InternalFailure(format!("Failed to acquire client lock: {}", e)) })?; diff --git a/opentelemetry-otlp/src/exporter/tonic/trace.rs b/opentelemetry-otlp/src/exporter/tonic/trace.rs index 4ddad37b50..4a09e8491b 100644 --- a/opentelemetry-otlp/src/exporter/tonic/trace.rs +++ b/opentelemetry-otlp/src/exporter/tonic/trace.rs @@ -89,11 +89,17 @@ impl SpanExporter for TonicTracesClient { Ok(()) } - fn shutdown(&mut self) -> OTelSdkResult { - match self.inner.take() { - Some(_) => Ok(()), // Successfully took `inner`, indicating a successful shutdown. - None => Err(OTelSdkError::AlreadyShutdown), // `inner` was already `None`, meaning it's already shut down. - } + fn shutdown(&self) -> OTelSdkResult { + // ToDo: as part of https://github.com/open-telemetry/opentelemetry-rust/pull/2812 + // self is no longer mutable due to trait change for span exporter + // the shutdown for gRPC needs to implemented and tracked in + // https://github.com/open-telemetry/opentelemetry-rust/issues/2777 + // + // match self.inner.take() { + // Some(_) => Ok(()), // Successfully took `inner`, indicating a successful shutdown. + // None => Err(OTelSdkError::AlreadyShutdown), // `inner` was already `None`, meaning it's already shut down. + // } + Ok(()) } fn set_resource(&mut self, resource: &opentelemetry_sdk::Resource) { diff --git a/opentelemetry-otlp/src/span.rs b/opentelemetry-otlp/src/span.rs index 81c2cedd67..dfa92c4b5d 100644 --- a/opentelemetry-otlp/src/span.rs +++ b/opentelemetry-otlp/src/span.rs @@ -159,4 +159,12 @@ impl opentelemetry_sdk::trace::SpanExporter for SpanExporter { SupportedTransportClient::Http(client) => client.set_resource(resource), } } + fn shutdown(&self) -> OTelSdkResult { + match &self.client { + #[cfg(feature = "grpc-tonic")] + SupportedTransportClient::Tonic(client) => client.shutdown(), + #[cfg(any(feature = "http-proto", feature = "http-json"))] + SupportedTransportClient::Http(client) => client.shutdown(), + } + } } diff --git a/opentelemetry-sdk/CHANGELOG.md b/opentelemetry-sdk/CHANGELOG.md index dff2dd365a..4f956ac579 100644 --- a/opentelemetry-sdk/CHANGELOG.md +++ b/opentelemetry-sdk/CHANGELOG.md @@ -2,6 +2,10 @@ ## vNext +- **Breaking**: [#2779](https://github.com/open-telemetry/opentelemetry-rust/issues/2779) handle +shutdown for span exporter for `http` exporters, shutdown for `grpc` would be added +separately. + ## 0.29.0 Released 2025-Mar-21 diff --git a/opentelemetry-sdk/src/testing/trace/span_exporters.rs b/opentelemetry-sdk/src/testing/trace/span_exporters.rs index 0144d9b212..e2d2d8889a 100644 --- a/opentelemetry-sdk/src/testing/trace/span_exporters.rs +++ b/opentelemetry-sdk/src/testing/trace/span_exporters.rs @@ -49,7 +49,7 @@ impl SpanExporter for TokioSpanExporter { }) } - fn shutdown(&mut self) -> OTelSdkResult { + fn shutdown(&self) -> OTelSdkResult { self.tx_shutdown.send(()).map_err(|_| { OTelSdkError::InternalFailure("Failed to send shutdown signal".to_string()) }) diff --git a/opentelemetry-sdk/src/trace/export.rs b/opentelemetry-sdk/src/trace/export.rs index 15db1bdaf4..41ed44ddac 100644 --- a/opentelemetry-sdk/src/trace/export.rs +++ b/opentelemetry-sdk/src/trace/export.rs @@ -43,7 +43,7 @@ pub trait SpanExporter: Send + Sync + Debug { /// flush the data and the destination is unavailable). SDK authors /// can decide if they want to make the shutdown timeout /// configurable. - fn shutdown(&mut self) -> OTelSdkResult { + fn shutdown(&self) -> OTelSdkResult { Ok(()) } diff --git a/opentelemetry-sdk/src/trace/in_memory_exporter.rs b/opentelemetry-sdk/src/trace/in_memory_exporter.rs index 099f666a41..68d8a03f2f 100644 --- a/opentelemetry-sdk/src/trace/in_memory_exporter.rs +++ b/opentelemetry-sdk/src/trace/in_memory_exporter.rs @@ -140,7 +140,7 @@ impl SpanExporter for InMemorySpanExporter { result } - fn shutdown(&mut self) -> OTelSdkResult { + fn shutdown(&self) -> OTelSdkResult { self.reset(); Ok(()) } diff --git a/opentelemetry-sdk/src/trace/span_processor.rs b/opentelemetry-sdk/src/trace/span_processor.rs index d2253c1cb9..3fcc4d839a 100644 --- a/opentelemetry-sdk/src/trace/span_processor.rs +++ b/opentelemetry-sdk/src/trace/span_processor.rs @@ -155,7 +155,7 @@ impl SpanProcessor for SimpleSpanProcessor { } fn shutdown(&self) -> OTelSdkResult { - if let Ok(mut exporter) = self.exporter.lock() { + if let Ok(exporter) = self.exporter.lock() { exporter.shutdown() } else { Err(OTelSdkError::InternalFailure( @@ -1089,7 +1089,7 @@ mod tests { Ok(()) } - fn shutdown(&mut self) -> OTelSdkResult { + fn shutdown(&self) -> OTelSdkResult { Ok(()) } fn set_resource(&mut self, resource: &Resource) { diff --git a/opentelemetry-stdout/src/trace/exporter.rs b/opentelemetry-stdout/src/trace/exporter.rs index ea88ca1f95..bdbd637a56 100644 --- a/opentelemetry-stdout/src/trace/exporter.rs +++ b/opentelemetry-stdout/src/trace/exporter.rs @@ -59,7 +59,7 @@ impl opentelemetry_sdk::trace::SpanExporter for SpanExporter { } } - fn shutdown(&mut self) -> OTelSdkResult { + fn shutdown(&self) -> OTelSdkResult { self.is_shutdown.store(true, Ordering::SeqCst); Ok(()) }