Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions opentelemetry/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
34 changes: 17 additions & 17 deletions opentelemetry/src/global/trace.rs
Original file line number Diff line number Diff line change
@@ -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;

Expand Down Expand Up @@ -373,10 +372,14 @@ fn global_tracer_provider() -> &'static RwLock<GlobalTracerProvider> {
/// [`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::new(NoopTracerProvider::new())
}
}

/// Creates a named instance of [`Tracer`] via the configured [`GlobalTracerProvider`].
Expand Down Expand Up @@ -419,22 +422,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<P, T, S>(new_provider: P) -> GlobalTracerProvider
pub fn set_tracer_provider<P, T, S>(new_provider: P)
where
S: trace::Span + Send + Sync + 'static,
T: trace::Tracer<Span = S> + Send + Sync + 'static,
P: trace::TracerProvider<Tracer = T> + 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.");
}
}
Loading