@@ -21,51 +21,38 @@ use tracing::{debug, info, warn};
2121pub const TXN_ID_ATTR_KEY : & str = "txn_id" ;
2222
2323/// Calls provider shutdown exactly once when dropped.
24- pub struct TracerProviderGuard {
25- provider : Option < SdkTracerProvider > ,
24+ pub struct OtelGuard {
25+ tracer_provider : Option < SdkTracerProvider > ,
26+ tracer : Option < opentelemetry_sdk:: trace:: Tracer > ,
2627}
2728
28- impl TracerProviderGuard {
29- fn new ( provider : SdkTracerProvider ) -> Self {
29+ impl OtelGuard {
30+ fn new (
31+ trace_provider : SdkTracerProvider ,
32+ tracer : Option < opentelemetry_sdk:: trace:: Tracer > ,
33+ ) -> Self {
3034 Self {
31- provider : Some ( provider) ,
35+ tracer_provider : Some ( trace_provider) ,
36+ tracer,
3237 }
3338 }
3439
3540 fn shutdown_once ( & mut self ) {
36- if let Some ( provider) = self . provider . take ( ) {
41+ if let Some ( provider) = self . tracer_provider . take ( ) {
3742 if let Err ( err) = provider. shutdown ( ) {
3843 warn ! ( error = %err, "Failed to shutdown OTLP tracer provider" ) ;
3944 }
4045 }
4146 }
42- }
4347
44- impl Drop for TracerProviderGuard {
45- fn drop ( & mut self ) {
46- self . shutdown_once ( ) ;
48+ pub fn tracer ( & self ) -> Option < opentelemetry_sdk:: trace:: Tracer > {
49+ self . tracer . clone ( )
4750 }
4851}
4952
50- /// Runtime OTLP handles that must stay alive for the process lifetime.
51- pub struct OtelGuard {
52- tracer : Option < opentelemetry_sdk:: trace:: Tracer > ,
53- _shutdown_guard : TracerProviderGuard ,
54- }
55-
56- impl OtelGuard {
57- fn new (
58- tracer : Option < opentelemetry_sdk:: trace:: Tracer > ,
59- shutdown_guard : TracerProviderGuard ,
60- ) -> Self {
61- Self {
62- tracer,
63- _shutdown_guard : shutdown_guard,
64- }
65- }
66-
67- pub fn tracer ( & self ) -> Option < opentelemetry_sdk:: trace:: Tracer > {
68- self . tracer . clone ( )
53+ impl Drop for OtelGuard {
54+ fn drop ( & mut self ) {
55+ self . shutdown_once ( ) ;
6956 }
7057}
7158
@@ -96,10 +83,7 @@ pub fn init_otel(
9683
9784 let ( _tracer, trace_provider) = build_tracer_provider ( service_name, "otlp-layer" ) ?;
9885 install_global_tracer_provider ( trace_provider. clone ( ) ) ;
99- Ok ( Some ( OtelGuard :: new (
100- None ,
101- TracerProviderGuard :: new ( trace_provider) ,
102- ) ) )
86+ Ok ( Some ( OtelGuard :: new ( trace_provider, None ) ) )
10387}
10488
10589pub fn init_otel_tracing (
@@ -112,10 +96,7 @@ pub fn init_otel_tracing(
11296
11397 let ( tracer, trace_provider) = build_tracer_provider ( service_name, tracer_name) ?;
11498 install_global_tracer_provider ( trace_provider. clone ( ) ) ;
115- Ok ( Some ( OtelGuard :: new (
116- Some ( tracer) ,
117- TracerProviderGuard :: new ( trace_provider) ,
118- ) ) )
99+ Ok ( Some ( OtelGuard :: new ( trace_provider, Some ( tracer) ) ) )
119100}
120101
121102fn build_tracer_provider (
@@ -611,32 +592,32 @@ mod tests {
611592 use super :: * ;
612593
613594 #[ test]
614- fn tracer_provider_guard_shutdown_once_disarms_provider ( ) {
595+ fn otel_guard_shutdown_once_disarms_provider ( ) {
615596 let provider = SdkTracerProvider :: builder ( ) . build ( ) ;
616- let mut guard = TracerProviderGuard :: new ( provider) ;
617- assert ! ( guard. provider . is_some( ) ) ;
597+ let mut guard = OtelGuard :: new ( provider, None ) ;
598+ assert ! ( guard. tracer_provider . is_some( ) ) ;
618599
619600 guard. shutdown_once ( ) ;
620- assert ! ( guard. provider . is_none( ) ) ;
601+ assert ! ( guard. tracer_provider . is_none( ) ) ;
621602
622603 // A second shutdown is a no-op.
623604 guard. shutdown_once ( ) ;
624- assert ! ( guard. provider . is_none( ) ) ;
605+ assert ! ( guard. tracer_provider . is_none( ) ) ;
625606 }
626607
627608 #[ test]
628609 fn otel_guard_keeps_tracer_when_present ( ) {
629610 let provider = SdkTracerProvider :: builder ( ) . build ( ) ;
630611 let tracer = provider. tracer ( "test-tracer" ) ;
631- let runtime = OtelGuard :: new ( Some ( tracer ) , TracerProviderGuard :: new ( provider ) ) ;
612+ let runtime = OtelGuard :: new ( provider , Some ( tracer ) ) ;
632613
633614 assert ! ( runtime. tracer( ) . is_some( ) ) ;
634615 }
635616
636617 #[ test]
637618 fn otel_guard_handles_absent_tracer ( ) {
638619 let provider = SdkTracerProvider :: builder ( ) . build ( ) ;
639- let runtime = OtelGuard :: new ( None , TracerProviderGuard :: new ( provider ) ) ;
620+ let runtime = OtelGuard :: new ( provider , None ) ;
640621
641622 assert ! ( runtime. tracer( ) . is_none( ) ) ;
642623 }
0 commit comments