Skip to content

Commit 5c1c6da

Browse files
andrzejressellalitbcijothomas
authored
refactor: Align global trace with metrics (#3078)
Co-authored-by: Lalit Kumar Bhasin <[email protected]> Co-authored-by: Cijo Thomas <[email protected]>
1 parent f00456f commit 5c1c6da

File tree

3 files changed

+20
-19
lines changed

3 files changed

+20
-19
lines changed

opentelemetry-sdk/src/trace/runtime_tests.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ async fn test_set_provider_in_tokio<R: RuntimeChannel>(
7070
let exporter = SpanCountExporter::new();
7171
let span_count = exporter.span_count.clone();
7272
let tracer_provider = build_batch_tracer_provider(exporter, runtime);
73-
let _ = set_tracer_provider(tracer_provider.clone());
73+
set_tracer_provider(tracer_provider.clone());
7474
let tracer = tracer("opentelemetery");
7575

7676
tracer.in_span("test", |_cx| {});
@@ -123,7 +123,7 @@ async fn test_set_provider_single_thread_tokio_with_simple_processor() {
123123
let exporter = SpanCountExporter::new();
124124
let span_count = exporter.span_count.clone();
125125
let tracer_provider = build_simple_tracer_provider(exporter);
126-
let _ = set_tracer_provider(tracer_provider.clone());
126+
set_tracer_provider(tracer_provider.clone());
127127
let tracer = tracer("opentelemetry");
128128

129129
tracer.in_span("test", |_cx| {});

opentelemetry/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
## vNext
44

5+
- *Breaking* Change return type of `opentelemetry::global::set_tracer_provider` to Unit to align with metrics counterpart
56
- Add `get_all` method to `opentelemetry::propagation::Extractor` to return all values of the given propagation key and provide a default implementation.
67

78
## 0.30.0

opentelemetry/src/global/trace.rs

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
use crate::trace::{noop::NoopTracerProvider, SpanContext, Status};
2-
use crate::InstrumentationScope;
2+
use crate::{otel_error, otel_info, InstrumentationScope};
33
use crate::{trace, trace::TracerProvider, Context, KeyValue};
44
use std::borrow::Cow;
55
use std::fmt;
6-
use std::mem;
76
use std::sync::{Arc, OnceLock, RwLock};
87
use std::time::SystemTime;
98

@@ -373,10 +372,14 @@ fn global_tracer_provider() -> &'static RwLock<GlobalTracerProvider> {
373372
/// [`TracerProvider`]: crate::trace::TracerProvider
374373
/// [`GlobalTracerProvider`]: crate::global::GlobalTracerProvider
375374
pub fn tracer_provider() -> GlobalTracerProvider {
376-
global_tracer_provider()
377-
.read()
378-
.expect("GLOBAL_TRACER_PROVIDER RwLock poisoned")
379-
.clone()
375+
// Try to get the global tracer provider. If the RwLock is poisoned, we'll log an error and return a NoopTracerProvider.
376+
let global_provider = global_tracer_provider().read();
377+
if let Ok(provider) = global_provider {
378+
provider.clone()
379+
} else {
380+
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.");
381+
GlobalTracerProvider::new(NoopTracerProvider::new())
382+
}
380383
}
381384

382385
/// Creates a named instance of [`Tracer`] via the configured [`GlobalTracerProvider`].
@@ -419,22 +422,19 @@ pub fn tracer_with_scope(scope: InstrumentationScope) -> BoxedTracer {
419422

420423
/// Sets the given [`TracerProvider`] instance as the current global provider.
421424
///
422-
/// It returns the [`TracerProvider`] instance that was previously mounted as global provider
423-
/// (e.g. [`NoopTracerProvider`] if a provider had not been set before).
424-
///
425425
/// Libraries should NOT call this function. It is intended for applications/executables.
426426
/// [`TracerProvider`]: crate::trace::TracerProvider
427-
pub fn set_tracer_provider<P, T, S>(new_provider: P) -> GlobalTracerProvider
427+
pub fn set_tracer_provider<P, T, S>(new_provider: P)
428428
where
429429
S: trace::Span + Send + Sync + 'static,
430430
T: trace::Tracer<Span = S> + Send + Sync + 'static,
431431
P: trace::TracerProvider<Tracer = T> + Send + Sync + 'static,
432432
{
433-
let mut tracer_provider = global_tracer_provider()
434-
.write()
435-
.expect("GLOBAL_TRACER_PROVIDER RwLock poisoned");
436-
mem::replace(
437-
&mut *tracer_provider,
438-
GlobalTracerProvider::new(new_provider),
439-
)
433+
let mut global_provider = global_tracer_provider().write();
434+
if let Ok(ref mut provider) = global_provider {
435+
**provider = GlobalTracerProvider::new(new_provider);
436+
otel_info!(name: "TracerProvider.GlobalSet", message = "Global tracer provider is set. Traces can now be created using global::tracer() or global::tracer_with_scope().");
437+
} else {
438+
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.");
439+
}
440440
}

0 commit comments

Comments
 (0)