1
1
use crate :: trace:: { noop:: NoopTracerProvider , SpanContext , Status } ;
2
2
use crate :: InstrumentationScope ;
3
3
use crate :: { trace, trace:: TracerProvider , Context , KeyValue } ;
4
- use once_cell:: sync:: Lazy ;
5
4
use std:: borrow:: Cow ;
6
5
use std:: fmt;
7
6
use std:: mem;
8
- use std:: sync:: { Arc , RwLock } ;
7
+ use std:: sync:: { Arc , OnceLock , RwLock } ;
9
8
use std:: time:: SystemTime ;
10
9
11
10
/// Allows a specific [`crate::trace::Span`] to be used generically by [`BoxedSpan`]
@@ -360,19 +359,21 @@ impl trace::TracerProvider for GlobalTracerProvider {
360
359
}
361
360
362
361
/// 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
+ }
368
369
369
370
/// Returns an instance of the currently configured global [`TracerProvider`] through
370
371
/// [`GlobalTracerProvider`].
371
372
///
372
373
/// [`TracerProvider`]: crate::trace::TracerProvider
373
374
/// [`GlobalTracerProvider`]: crate::global::GlobalTracerProvider
374
375
pub fn tracer_provider ( ) -> GlobalTracerProvider {
375
- GLOBAL_TRACER_PROVIDER
376
+ global_tracer_provider ( )
376
377
. read ( )
377
378
. expect ( "GLOBAL_TRACER_PROVIDER RwLock poisoned" )
378
379
. clone ( )
@@ -428,7 +429,7 @@ where
428
429
T : trace:: Tracer < Span = S > + Send + Sync + ' static ,
429
430
P : trace:: TracerProvider < Tracer = T > + Send + Sync + ' static ,
430
431
{
431
- let mut tracer_provider = GLOBAL_TRACER_PROVIDER
432
+ let mut tracer_provider = global_tracer_provider ( )
432
433
. write ( )
433
434
. expect ( "GLOBAL_TRACER_PROVIDER RwLock poisoned" ) ;
434
435
mem:: replace (
@@ -440,7 +441,7 @@ where
440
441
/// Shut down the current tracer provider. This will invoke the shutdown method on all span processors.
441
442
/// span processors should export remaining spans before return
442
443
pub fn shutdown_tracer_provider ( ) {
443
- let mut tracer_provider = GLOBAL_TRACER_PROVIDER
444
+ let mut tracer_provider = global_tracer_provider ( )
444
445
. write ( )
445
446
. expect ( "GLOBAL_TRACER_PROVIDER RwLock poisoned" ) ;
446
447
0 commit comments