11use crate :: trace:: { noop:: NoopTracerProvider , SpanContext , Status } ;
22use crate :: InstrumentationScope ;
33use crate :: { trace, trace:: TracerProvider , Context , KeyValue } ;
4- use once_cell:: sync:: Lazy ;
54use std:: borrow:: Cow ;
65use std:: fmt;
76use std:: mem;
8- use std:: sync:: { Arc , RwLock } ;
7+ use std:: sync:: { Arc , OnceLock , RwLock } ;
98use std:: time:: SystemTime ;
109
1110/// Allows a specific [`crate::trace::Span`] to be used generically by [`BoxedSpan`]
@@ -360,19 +359,22 @@ impl trace::TracerProvider for GlobalTracerProvider {
360359}
361360
362361/// The global `Tracer` provider singleton.
363- static GLOBAL_TRACER_PROVIDER : Lazy < RwLock < GlobalTracerProvider > > = Lazy :: new ( || {
364- RwLock :: new ( GlobalTracerProvider :: new (
365- trace:: noop:: NoopTracerProvider :: new ( ) ,
366- ) )
367- } ) ;
362+ static GLOBAL_TRACER_PROVIDER : OnceLock < RwLock < GlobalTracerProvider > > = OnceLock :: new ( ) ;
363+
364+ #[ inline]
365+ fn global_tracer_provider ( ) -> & ' static RwLock < GlobalTracerProvider > {
366+ GLOBAL_TRACER_PROVIDER
367+ . get_or_init ( || RwLock :: new ( GlobalTracerProvider :: new ( NoopTracerProvider :: new ( ) ) ) )
368+ }
368369
369370/// Returns an instance of the currently configured global [`TracerProvider`] through
370371/// [`GlobalTracerProvider`].
371372///
372373/// [`TracerProvider`]: crate::trace::TracerProvider
373374/// [`GlobalTracerProvider`]: crate::global::GlobalTracerProvider
374375pub fn tracer_provider ( ) -> GlobalTracerProvider {
375- GLOBAL_TRACER_PROVIDER
376+ let global_provider = global_tracer_provider ( ) ;
377+ global_provider
376378 . read ( )
377379 . expect ( "GLOBAL_TRACER_PROVIDER RwLock poisoned" )
378380 . clone ( )
@@ -428,7 +430,8 @@ where
428430 T : trace:: Tracer < Span = S > + Send + Sync + ' static ,
429431 P : trace:: TracerProvider < Tracer = T > + Send + Sync + ' static ,
430432{
431- let mut tracer_provider = GLOBAL_TRACER_PROVIDER
433+ let global_provider = global_tracer_provider ( ) ;
434+ let mut tracer_provider = global_provider
432435 . write ( )
433436 . expect ( "GLOBAL_TRACER_PROVIDER RwLock poisoned" ) ;
434437 mem:: replace (
@@ -440,7 +443,8 @@ where
440443/// Shut down the current tracer provider. This will invoke the shutdown method on all span processors.
441444/// span processors should export remaining spans before return
442445pub fn shutdown_tracer_provider ( ) {
443- let mut tracer_provider = GLOBAL_TRACER_PROVIDER
446+ let global_provider = global_tracer_provider ( ) ;
447+ let mut tracer_provider = global_provider
444448 . write ( )
445449 . expect ( "GLOBAL_TRACER_PROVIDER RwLock poisoned" ) ;
446450
0 commit comments