From 2a82f5fbbc52796a11fe95df2e8d71234227661b Mon Sep 17 00:00:00 2001 From: Lalit Date: Sun, 2 Feb 2025 00:12:45 -0800 Subject: [PATCH 1/6] create blocking within thread --- opentelemetry-otlp/src/exporter/http/mod.rs | 104 ++++++++++---------- 1 file changed, 52 insertions(+), 52 deletions(-) diff --git a/opentelemetry-otlp/src/exporter/http/mod.rs b/opentelemetry-otlp/src/exporter/http/mod.rs index 07a70bf57d..9ddee4dacb 100644 --- a/opentelemetry-otlp/src/exporter/http/mod.rs +++ b/opentelemetry-otlp/src/exporter/http/mod.rs @@ -44,15 +44,7 @@ mod trace; use opentelemetry_http::hyper::HyperClient; /// Configuration of the http transport -#[derive(Debug)] -#[cfg_attr( - all( - not(feature = "reqwest-client"), - not(feature = "reqwest-blocking-client"), - not(feature = "hyper-client") - ), - derive(Default) -)] +#[derive(Debug, Default)] pub struct HttpConfig { /// Select the HTTP client client: Option>, @@ -61,44 +53,6 @@ pub struct HttpConfig { headers: Option>, } -#[cfg(any( - feature = "reqwest-blocking-client", - feature = "reqwest-client", - feature = "hyper-client" -))] -impl Default for HttpConfig { - fn default() -> Self { - #[cfg(feature = "reqwest-blocking-client")] - let default_client = std::thread::spawn(|| { - Some(Arc::new(reqwest::blocking::Client::new()) as Arc) - }) - .join() - .expect("creating reqwest::blocking::Client on a new thread not to fail"); - #[cfg(all(not(feature = "reqwest-blocking-client"), feature = "reqwest-client"))] - let default_client = Some(Arc::new(reqwest::Client::new()) as Arc); - #[cfg(all( - not(feature = "reqwest-client"), - not(feature = "reqwest-blocking-client"), - feature = "hyper-client" - ))] - // TODO - support configuring custom connector and executor - let default_client = Some(Arc::new(HyperClient::with_default_connector( - Duration::from_secs(10), - None, - )) as Arc); - #[cfg(all( - not(feature = "reqwest-client"), - not(feature = "reqwest-blocking-client"), - not(feature = "hyper-client") - ))] - let default_client = None; - HttpConfig { - client: default_client, - headers: None, - } - } -} - /// Configuration for the OTLP HTTP exporter. /// /// ## Examples @@ -171,11 +125,57 @@ impl HttpExporterBuilder { }, None => self.exporter_config.timeout, }; - let http_client = self - .http_config - .client - .take() - .ok_or(crate::Error::NoHttpClient)?; + + #[allow(unused_mut)] // TODO - clippy thinks mut is not needed, but it is + let mut http_client = self.http_config.client.take(); + + if http_client.is_none() { + #[cfg(all( + not(feature = "reqwest-client"), + not(feature = "reqwest-blocking-client"), + feature = "hyper-client" + ))] + { + // TODO - support configuring custom connector and executor + http_client = Some(Arc::new(HyperClient::with_default_connector(timeout, None)) + as Arc); + } + #[cfg(all( + not(feature = "hyper-client"), + not(feature = "reqwest-blocking-client"), + feature = "reqwest-client" + ))] + { + http_client = Some(Arc::new( + reqwest::Client::builder() + .timeout(timeout) + .build() + .unwrap_or(reqwest::Client::new()), + ) as Arc); + } + #[cfg(all( + not(feature = "hyper-client"), + not(feature = "reqwest-client"), + feature = "reqwest-blocking-client" + ))] + { + let timeout_clone = timeout; + http_client = Some(Arc::new( + std::thread::spawn(move || { + reqwest::blocking::Client::builder() + .timeout(timeout_clone) + .build() + .unwrap_or_else(|_| reqwest::blocking::Client::new()) + // Handle error safely + }) + .join() + .unwrap(), // Unwrap thread result + ) as Arc); + } + } + + let http_client = http_client.ok_or(crate::Error::NoHttpClient)?; + #[allow(clippy::mutable_key_type)] // http headers are not mutated let mut headers: HashMap = self .http_config From 0d16ade7fc93f5fa530cb73962d832873633b326 Mon Sep 17 00:00:00 2001 From: Lalit Date: Sun, 2 Feb 2025 18:17:34 -0800 Subject: [PATCH 2/6] lint error --- opentelemetry-otlp/src/exporter/http/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/opentelemetry-otlp/src/exporter/http/mod.rs b/opentelemetry-otlp/src/exporter/http/mod.rs index 9ddee4dacb..18a3d41b84 100644 --- a/opentelemetry-otlp/src/exporter/http/mod.rs +++ b/opentelemetry-otlp/src/exporter/http/mod.rs @@ -150,7 +150,7 @@ impl HttpExporterBuilder { reqwest::Client::builder() .timeout(timeout) .build() - .unwrap_or(reqwest::Client::new()), + .unwrap_or_default(), ) as Arc); } #[cfg(all( From 24a6f4f8f83412a692111fae9a3dd062b0f56d7b Mon Sep 17 00:00:00 2001 From: Lalit Kumar Bhasin Date: Sun, 2 Feb 2025 23:09:02 -0800 Subject: [PATCH 3/6] Remove commented error handling in HTTP exporter --- opentelemetry-otlp/src/exporter/http/mod.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/opentelemetry-otlp/src/exporter/http/mod.rs b/opentelemetry-otlp/src/exporter/http/mod.rs index 18a3d41b84..650358533e 100644 --- a/opentelemetry-otlp/src/exporter/http/mod.rs +++ b/opentelemetry-otlp/src/exporter/http/mod.rs @@ -166,7 +166,6 @@ impl HttpExporterBuilder { .timeout(timeout_clone) .build() .unwrap_or_else(|_| reqwest::blocking::Client::new()) - // Handle error safely }) .join() .unwrap(), // Unwrap thread result From ff7c9c027b3737aa715e28db077385765ff738df Mon Sep 17 00:00:00 2001 From: Lalit Date: Mon, 3 Feb 2025 00:23:49 -0800 Subject: [PATCH 4/6] add changelog --- opentelemetry-otlp/CHANGELOG.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/opentelemetry-otlp/CHANGELOG.md b/opentelemetry-otlp/CHANGELOG.md index 8de456895c..570d7b79e8 100644 --- a/opentelemetry-otlp/CHANGELOG.md +++ b/opentelemetry-otlp/CHANGELOG.md @@ -13,6 +13,15 @@ - Remove unnecessarily public trait `opentelemetry_otlp::metrics::MetricsClient` and `MetricExporter::new(..)` method. Use `MetricExporter::builder()...build()` to obtain `MetricExporter`. +- The HTTP clients (reqwest, reqwest-blocking, hyper) now support the +timeout internal configured in below order + - Signal specific env variable `OTEL_EXPORTER_OTLP_TRACES_TIMEOUT`, + `OTEL_EXPORTER_OTLP_LOGS_TIMEOUT` or `OTEL_EXPORTER_OTLP_TIMEOUT`. + - `OTEL_EXPORTER_OTLP_TIMEOUT` env variable. + - `with_http().with_timeout()` API method of +`LogExporterBuilder` and `SpanExporterBuilder` and `MetricsExporterBuilder`. + - The default interval of 30sec is used if none is configured + ## 0.27.0 From 4deb02a2d05844fb671423e6919b24178d2cc3a9 Mon Sep 17 00:00:00 2001 From: Lalit Kumar Bhasin Date: Mon, 3 Feb 2025 00:25:34 -0800 Subject: [PATCH 5/6] Fix punctuation in CHANGELOG.md --- opentelemetry-otlp/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/opentelemetry-otlp/CHANGELOG.md b/opentelemetry-otlp/CHANGELOG.md index 570d7b79e8..116b350efe 100644 --- a/opentelemetry-otlp/CHANGELOG.md +++ b/opentelemetry-otlp/CHANGELOG.md @@ -20,7 +20,7 @@ timeout internal configured in below order - `OTEL_EXPORTER_OTLP_TIMEOUT` env variable. - `with_http().with_timeout()` API method of `LogExporterBuilder` and `SpanExporterBuilder` and `MetricsExporterBuilder`. - - The default interval of 30sec is used if none is configured + - The default interval of 30sec is used if none is configured. ## 0.27.0 From 1b68aea3c8ba6d0fc04743b1b5dd86e3f777e216 Mon Sep 17 00:00:00 2001 From: Lalit Kumar Bhasin Date: Mon, 3 Feb 2025 09:48:17 -0800 Subject: [PATCH 6/6] update timeout in changelog --- opentelemetry-otlp/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/opentelemetry-otlp/CHANGELOG.md b/opentelemetry-otlp/CHANGELOG.md index 116b350efe..0b1f8fd0b0 100644 --- a/opentelemetry-otlp/CHANGELOG.md +++ b/opentelemetry-otlp/CHANGELOG.md @@ -20,7 +20,7 @@ timeout internal configured in below order - `OTEL_EXPORTER_OTLP_TIMEOUT` env variable. - `with_http().with_timeout()` API method of `LogExporterBuilder` and `SpanExporterBuilder` and `MetricsExporterBuilder`. - - The default interval of 30sec is used if none is configured. + - The default interval of 10sec is used if none is configured. ## 0.27.0