diff --git a/opentelemetry-otlp/src/exporter/http/logs.rs b/opentelemetry-otlp/src/exporter/http/logs.rs index 8515796ee2..0cba45d99b 100644 --- a/opentelemetry-otlp/src/exporter/http/logs.rs +++ b/opentelemetry-otlp/src/exporter/http/logs.rs @@ -3,6 +3,7 @@ use http::{header::CONTENT_TYPE, Method}; use opentelemetry::otel_debug; use opentelemetry_sdk::error::{OTelSdkError, OTelSdkResult}; use opentelemetry_sdk::logs::{LogBatch, LogExporter}; +use std::time; impl LogExporter for OtlpHttpClient { async fn export(&self, batch: LogBatch<'_>) -> OTelSdkResult { @@ -46,7 +47,7 @@ impl LogExporter for OtlpHttpClient { Ok(()) } - fn shutdown(&self) -> OTelSdkResult { + fn shutdown_with_timeout(&self, _timeout: time::Duration) -> 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/logs.rs b/opentelemetry-otlp/src/exporter/tonic/logs.rs index cbcf5284b3..26765ef07a 100644 --- a/opentelemetry-otlp/src/exporter/tonic/logs.rs +++ b/opentelemetry-otlp/src/exporter/tonic/logs.rs @@ -5,6 +5,7 @@ use opentelemetry_proto::tonic::collector::logs::v1::{ }; use opentelemetry_sdk::error::{OTelSdkError, OTelSdkResult}; use opentelemetry_sdk::logs::{LogBatch, LogExporter}; +use std::time; use tokio::sync::Mutex; use tonic::{codegen::CompressionEncoding, service::Interceptor, transport::Channel, Request}; @@ -84,7 +85,7 @@ impl LogExporter for TonicLogsClient { Ok(()) } - fn shutdown(&self) -> OTelSdkResult { + fn shutdown_with_timeout(&self, _timeout: time::Duration) -> OTelSdkResult { // TODO: Implement actual shutdown // Due to the use of tokio::sync::Mutex to guard // the inner client, we need to await the call to lock the mutex diff --git a/opentelemetry-otlp/src/logs.rs b/opentelemetry-otlp/src/logs.rs index 7a8e66f6f8..bae7504331 100644 --- a/opentelemetry-otlp/src/logs.rs +++ b/opentelemetry-otlp/src/logs.rs @@ -4,9 +4,9 @@ #[cfg(feature = "grpc-tonic")] use opentelemetry::otel_debug; -use std::fmt::Debug; - use opentelemetry_sdk::{error::OTelSdkResult, logs::LogBatch}; +use std::fmt::Debug; +use std::time; use crate::{ExporterBuildError, HasExportConfig, NoExporterBuilderSet}; @@ -157,7 +157,7 @@ impl opentelemetry_sdk::logs::LogExporter for LogExporter { } } - fn shutdown(&self) -> OTelSdkResult { + fn shutdown_with_timeout(&self, _timeout: time::Duration) -> OTelSdkResult { match &self.client { #[cfg(feature = "grpc-tonic")] SupportedTransportClient::Tonic(client) => client.shutdown(), diff --git a/opentelemetry-sdk/CHANGELOG.md b/opentelemetry-sdk/CHANGELOG.md index 1012c77ddc..128cbc8c8f 100644 --- a/opentelemetry-sdk/CHANGELOG.md +++ b/opentelemetry-sdk/CHANGELOG.md @@ -25,6 +25,7 @@ also modified to suppress telemetry before invoking exporters. - Fixed the overflow attribute to correctly use the boolean value `true` instead of the string `"true"`. [#2878](https://github.com/open-telemetry/opentelemetry-rust/issues/2878) +- The `shutdown_with_timeout` method is added to LogExporter trait. - *Breaking* `MetricError`, `MetricResult` no longer public (except when `spec_unstable_metrics_views` feature flag is enabled). `OTelSdkResult` should be used instead, wherever applicable. [#2906](https://github.com/open-telemetry/opentelemetry-rust/pull/2906) diff --git a/opentelemetry-sdk/benches/log_enabled.rs b/opentelemetry-sdk/benches/log_enabled.rs index c5298cf928..164dccf0b3 100644 --- a/opentelemetry-sdk/benches/log_enabled.rs +++ b/opentelemetry-sdk/benches/log_enabled.rs @@ -29,10 +29,6 @@ impl LogExporter for NoopExporter { Ok(()) } - fn shutdown(&self) -> OTelSdkResult { - Ok(()) - } - #[inline] fn event_enabled( &self, diff --git a/opentelemetry-sdk/src/logs/export.rs b/opentelemetry-sdk/src/logs/export.rs index 5ef91c77c8..af0653d50c 100644 --- a/opentelemetry-sdk/src/logs/export.rs +++ b/opentelemetry-sdk/src/logs/export.rs @@ -6,6 +6,7 @@ use crate::Resource; use opentelemetry::logs::Severity; use opentelemetry::InstrumentationScope; use std::fmt::Debug; +use std::time; /// A batch of log records to be exported by a `LogExporter`. /// @@ -134,11 +135,14 @@ pub trait LogExporter: Send + Sync + Debug { &self, batch: LogBatch<'_>, ) -> impl std::future::Future + Send; - /// Shuts down the exporter. - fn shutdown(&self) -> OTelSdkResult { + fn shutdown_with_timeout(&self, _timeout: time::Duration) -> OTelSdkResult { Ok(()) } + /// Shuts down the exporter with a default timeout. + fn shutdown(&self) -> OTelSdkResult { + self.shutdown_with_timeout(time::Duration::from_secs(5)) + } #[cfg(feature = "spec_unstable_logs_enabled")] /// Check if logs are enabled. fn event_enabled(&self, _level: Severity, _target: &str, _name: Option<&str>) -> bool { diff --git a/opentelemetry-sdk/src/logs/in_memory_exporter.rs b/opentelemetry-sdk/src/logs/in_memory_exporter.rs index 63737997a9..fe988e26b0 100644 --- a/opentelemetry-sdk/src/logs/in_memory_exporter.rs +++ b/opentelemetry-sdk/src/logs/in_memory_exporter.rs @@ -7,6 +7,7 @@ use opentelemetry::InstrumentationScope; use std::borrow::Cow; use std::sync::atomic::AtomicBool; use std::sync::{Arc, Mutex}; +use std::time; /// An in-memory logs exporter that stores logs data in memory.. /// @@ -205,7 +206,7 @@ impl LogExporter for InMemoryLogExporter { Ok(()) } - fn shutdown(&self) -> OTelSdkResult { + fn shutdown_with_timeout(&self, _timeout: time::Duration) -> OTelSdkResult { self.shutdown_called .store(true, std::sync::atomic::Ordering::Relaxed); if self.should_reset_on_shutdown { diff --git a/opentelemetry-sdk/src/logs/log_processor.rs b/opentelemetry-sdk/src/logs/log_processor.rs index 3463c8be59..c37eefd9c5 100644 --- a/opentelemetry-sdk/src/logs/log_processor.rs +++ b/opentelemetry-sdk/src/logs/log_processor.rs @@ -92,10 +92,6 @@ pub(crate) mod tests { Ok(()) } - fn shutdown(&self) -> OTelSdkResult { - Ok(()) - } - fn set_resource(&mut self, resource: &Resource) { self.resource .lock() diff --git a/opentelemetry-sdk/src/logs/log_processor_with_async_runtime.rs b/opentelemetry-sdk/src/logs/log_processor_with_async_runtime.rs index 961fa99f9f..94fd26be5a 100644 --- a/opentelemetry-sdk/src/logs/log_processor_with_async_runtime.rs +++ b/opentelemetry-sdk/src/logs/log_processor_with_async_runtime.rs @@ -321,10 +321,6 @@ mod tests { Ok(()) } - fn shutdown(&self) -> OTelSdkResult { - Ok(()) - } - fn set_resource(&mut self, resource: &Resource) { self.resource .lock() diff --git a/opentelemetry-sdk/src/logs/logger_provider.rs b/opentelemetry-sdk/src/logs/logger_provider.rs index f70a4edb41..254f7378cf 100644 --- a/opentelemetry-sdk/src/logs/logger_provider.rs +++ b/opentelemetry-sdk/src/logs/logger_provider.rs @@ -291,7 +291,7 @@ mod tests { use std::fmt::{Debug, Formatter}; use std::sync::atomic::AtomicU64; use std::sync::Mutex; - use std::thread; + use std::{thread, time}; struct ShutdownTestLogProcessor { is_shutdown: Arc>, @@ -364,7 +364,7 @@ mod tests { *res = resource.clone(); } - fn shutdown(&self) -> OTelSdkResult { + fn shutdown_with_timeout(&self, _timeout: time::Duration) -> OTelSdkResult { Ok(()) } } diff --git a/opentelemetry-sdk/src/logs/simple_log_processor.rs b/opentelemetry-sdk/src/logs/simple_log_processor.rs index 5cbda696fc..a52bd548d8 100644 --- a/opentelemetry-sdk/src/logs/simple_log_processor.rs +++ b/opentelemetry-sdk/src/logs/simple_log_processor.rs @@ -164,6 +164,7 @@ mod tests { use opentelemetry::KeyValue; use std::sync::atomic::{AtomicUsize, Ordering}; use std::sync::{Arc, Mutex}; + use std::time; use std::time::Duration; #[derive(Debug, Clone)] @@ -195,6 +196,9 @@ mod tests { } Ok(()) } + fn shutdown_with_timeout(&self, _timeout: time::Duration) -> OTelSdkResult { + Ok(()) + } } #[test] @@ -460,10 +464,6 @@ mod tests { } impl LogExporter for ReentrantLogExporter { - fn shutdown(&self) -> OTelSdkResult { - Ok(()) - } - async fn export(&self, _batch: LogBatch<'_>) -> OTelSdkResult { let logger = self.logger.lock().unwrap(); if let Some(logger) = logger.as_ref() { diff --git a/opentelemetry-stdout/src/logs/exporter.rs b/opentelemetry-stdout/src/logs/exporter.rs index c7a8397a30..eacd986447 100644 --- a/opentelemetry-stdout/src/logs/exporter.rs +++ b/opentelemetry-stdout/src/logs/exporter.rs @@ -5,6 +5,7 @@ use opentelemetry_sdk::logs::LogBatch; use opentelemetry_sdk::Resource; use std::sync::atomic; use std::sync::atomic::Ordering; +use std::time; /// An OpenTelemetry exporter that writes Logs to stdout on export. pub struct LogExporter { @@ -57,7 +58,7 @@ impl opentelemetry_sdk::logs::LogExporter for LogExporter { } } - fn shutdown(&self) -> OTelSdkResult { + fn shutdown_with_timeout(&self, _timeout: time::Duration) -> OTelSdkResult { self.is_shutdown.store(true, atomic::Ordering::SeqCst); Ok(()) } diff --git a/stress/src/logs.rs b/stress/src/logs.rs index 8df5cb3ce4..88ec1ee5af 100644 --- a/stress/src/logs.rs +++ b/stress/src/logs.rs @@ -24,6 +24,7 @@ use opentelemetry_sdk::logs::concurrent_log_processor::SimpleConcurrentLogProces use opentelemetry_sdk::logs::SdkLoggerProvider; use opentelemetry_sdk::logs::{LogBatch, LogExporter}; use opentelemetry_sdk::Resource; +use std::time; use tracing::error; use tracing_subscriber::prelude::*; @@ -52,7 +53,7 @@ impl LogExporter for NoopExporter { Ok(()) } - fn shutdown(&self) -> OTelSdkResult { + fn shutdown_with_timeout(&self, _timeout: time::Duration) -> OTelSdkResult { Ok(()) }