Skip to content
Merged
Show file tree
Hide file tree
Changes from 4 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
4 changes: 2 additions & 2 deletions opentelemetry-sdk/src/trace/runtime_tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ async fn test_set_provider_in_tokio<R: RuntimeChannel>(
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| {});
Expand Down Expand Up @@ -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| {});
Expand Down
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 NoopTracerProvider.
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