From 2a0586d2063663317dee054da6f60cee6358883c Mon Sep 17 00:00:00 2001 From: Andrzej Ressel Date: Sun, 20 Jul 2025 00:13:03 +0200 Subject: [PATCH 1/5] Align global tracer provider API with meter --- opentelemetry/src/global/trace.rs | 36 ++++++++++++++++--------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/opentelemetry/src/global/trace.rs b/opentelemetry/src/global/trace.rs index 30018a576e..8ae95eec13 100644 --- a/opentelemetry/src/global/trace.rs +++ b/opentelemetry/src/global/trace.rs @@ -1,9 +1,8 @@ use crate::trace::{noop::NoopTracerProvider, SpanContext, Status}; -use crate::InstrumentationScope; +use crate::{otel_error, otel_info, InstrumentationScope}; use crate::{trace, trace::TracerProvider, Context, KeyValue}; use std::borrow::Cow; use std::fmt; -use std::mem; use std::sync::{Arc, OnceLock, RwLock}; use std::time::SystemTime; @@ -373,10 +372,16 @@ fn global_tracer_provider() -> &'static RwLock { /// [`TracerProvider`]: crate::trace::TracerProvider /// [`GlobalTracerProvider`]: crate::global::GlobalTracerProvider pub fn tracer_provider() -> GlobalTracerProvider { - global_tracer_provider() - .read() - .expect("GLOBAL_TRACER_PROVIDER RwLock poisoned") - .clone() + // Try to get the global tracer provider. If the RwLock is poisoned, we'll log an error and return a NoopMeterProvider. + let global_provider = global_tracer_provider().read(); + if let Ok(provider) = global_provider { + provider.clone() + } else { + otel_error!(name: "TracerProvider.GlobalGetFailed", message = "Getting global tracer provider failed. Traces created using global::tracer() or global::tracer_with_scope() will not function. Report this issue in OpenTelemetry repo."); + GlobalTracerProvider { + provider: Arc::new(crate::trace::noop::NoopTracerProvider::new()), + } + } } /// Creates a named instance of [`Tracer`] via the configured [`GlobalTracerProvider`]. @@ -419,22 +424,19 @@ pub fn tracer_with_scope(scope: InstrumentationScope) -> BoxedTracer { /// Sets the given [`TracerProvider`] instance as the current global provider. /// -/// It returns the [`TracerProvider`] instance that was previously mounted as global provider -/// (e.g. [`NoopTracerProvider`] if a provider had not been set before). -/// /// Libraries should NOT call this function. It is intended for applications/executables. /// [`TracerProvider`]: crate::trace::TracerProvider -pub fn set_tracer_provider(new_provider: P) -> GlobalTracerProvider +pub fn set_tracer_provider(new_provider: P) where S: trace::Span + Send + Sync + 'static, T: trace::Tracer + Send + Sync + 'static, P: trace::TracerProvider + Send + Sync + 'static, { - let mut tracer_provider = global_tracer_provider() - .write() - .expect("GLOBAL_TRACER_PROVIDER RwLock poisoned"); - mem::replace( - &mut *tracer_provider, - GlobalTracerProvider::new(new_provider), - ) + let mut global_provider = global_tracer_provider().write(); + if let Ok(ref mut provider) = global_provider { + **provider = GlobalTracerProvider::new(new_provider); + otel_info!(name: "TracerProvider.GlobalSet", message = "Global tracer provider is set. Traces can now be created using global::tracer() or global::tracer_with_scope()."); + } else { + otel_error!(name: "TracerProvider.GlobalSetFailed", message = "Setting global tracer provider failed. Traces created using global::tracer() or global::tracer_with_scope() will not function. Report this issue in OpenTelemetry repo."); + } } From 8c341730cfd65ce844c22213f6d5f40a4d49ab59 Mon Sep 17 00:00:00 2001 From: Andrzej Ressel Date: Sun, 20 Jul 2025 00:15:22 +0200 Subject: [PATCH 2/5] Align global tracer provider API with meter CHANGELOG.md --- opentelemetry/CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/opentelemetry/CHANGELOG.md b/opentelemetry/CHANGELOG.md index b7a356626a..3c240847a6 100644 --- a/opentelemetry/CHANGELOG.md +++ b/opentelemetry/CHANGELOG.md @@ -2,6 +2,7 @@ ## vNext +- Change return type of `opentelemetry::global::set_tracer_provider` to Unit to align with metrics counterpart - Add `get_all` method to `opentelemetry::propagation::Extractor` to return all values of the given propagation key and provide a default implementation. ## 0.30.0 From 58781b652c9033ffd60140e0916b4bb5ada4410e Mon Sep 17 00:00:00 2001 From: Andrzej Ressel Date: Sun, 20 Jul 2025 00:19:25 +0200 Subject: [PATCH 3/5] Align global tracer provider API with meter Use new function --- opentelemetry/src/global/trace.rs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/opentelemetry/src/global/trace.rs b/opentelemetry/src/global/trace.rs index 8ae95eec13..b8dc11ac29 100644 --- a/opentelemetry/src/global/trace.rs +++ b/opentelemetry/src/global/trace.rs @@ -378,9 +378,7 @@ pub fn tracer_provider() -> GlobalTracerProvider { provider.clone() } else { otel_error!(name: "TracerProvider.GlobalGetFailed", message = "Getting global tracer provider failed. Traces created using global::tracer() or global::tracer_with_scope() will not function. Report this issue in OpenTelemetry repo."); - GlobalTracerProvider { - provider: Arc::new(crate::trace::noop::NoopTracerProvider::new()), - } + GlobalTracerProvider::new(NoopTracerProvider::new()) } } From 74ea482be9199216a9d67f44d9cb3c32e96aba67 Mon Sep 17 00:00:00 2001 From: Andrzej Ressel Date: Sun, 20 Jul 2025 00:27:52 +0200 Subject: [PATCH 4/5] Align global tracer provider API with meter Bot findings --- opentelemetry-sdk/src/trace/runtime_tests.rs | 4 ++-- opentelemetry/src/global/trace.rs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/opentelemetry-sdk/src/trace/runtime_tests.rs b/opentelemetry-sdk/src/trace/runtime_tests.rs index f21284a90a..e068a377fe 100644 --- a/opentelemetry-sdk/src/trace/runtime_tests.rs +++ b/opentelemetry-sdk/src/trace/runtime_tests.rs @@ -70,7 +70,7 @@ async fn test_set_provider_in_tokio( let exporter = SpanCountExporter::new(); let span_count = exporter.span_count.clone(); let tracer_provider = build_batch_tracer_provider(exporter, runtime); - let _ = set_tracer_provider(tracer_provider.clone()); + set_tracer_provider(tracer_provider.clone()); let tracer = tracer("opentelemetery"); tracer.in_span("test", |_cx| {}); @@ -123,7 +123,7 @@ async fn test_set_provider_single_thread_tokio_with_simple_processor() { let exporter = SpanCountExporter::new(); let span_count = exporter.span_count.clone(); let tracer_provider = build_simple_tracer_provider(exporter); - let _ = set_tracer_provider(tracer_provider.clone()); + set_tracer_provider(tracer_provider.clone()); let tracer = tracer("opentelemetry"); tracer.in_span("test", |_cx| {}); diff --git a/opentelemetry/src/global/trace.rs b/opentelemetry/src/global/trace.rs index b8dc11ac29..cd9783f6b8 100644 --- a/opentelemetry/src/global/trace.rs +++ b/opentelemetry/src/global/trace.rs @@ -372,7 +372,7 @@ fn global_tracer_provider() -> &'static RwLock { /// [`TracerProvider`]: crate::trace::TracerProvider /// [`GlobalTracerProvider`]: crate::global::GlobalTracerProvider pub fn tracer_provider() -> GlobalTracerProvider { - // Try to get the global tracer provider. If the RwLock is poisoned, we'll log an error and return a NoopMeterProvider. + // Try to get the global tracer provider. If the RwLock is poisoned, we'll log an error and return a NoopTracerProvider. let global_provider = global_tracer_provider().read(); if let Ok(provider) = global_provider { provider.clone() From 178f1b1e56d65b8643c430e294071e942eda272d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=8BAndrzej=20Ressel?= Date: Mon, 21 Jul 2025 19:34:13 +0200 Subject: [PATCH 5/5] Update CHANGELOG.md --- opentelemetry/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/opentelemetry/CHANGELOG.md b/opentelemetry/CHANGELOG.md index 3c240847a6..80e1c3249c 100644 --- a/opentelemetry/CHANGELOG.md +++ b/opentelemetry/CHANGELOG.md @@ -2,7 +2,7 @@ ## vNext -- Change return type of `opentelemetry::global::set_tracer_provider` to Unit to align with metrics counterpart +- *Breaking* Change return type of `opentelemetry::global::set_tracer_provider` to Unit to align with metrics counterpart - Add `get_all` method to `opentelemetry::propagation::Extractor` to return all values of the given propagation key and provide a default implementation. ## 0.30.0