@@ -20,6 +20,48 @@ use crate::config::SubscriberInstallPolicy;
2020use crate :: config:: SubscriberInstallStatus ;
2121use crate :: error:: ObservabilityError ;
2222
23+ #[ derive( Debug , Clone , PartialEq , Eq ) ]
24+ pub ( crate ) struct TelemetryProviderShutdownReport {
25+ pub ( crate ) logs_shutdown_ok : bool ,
26+ pub ( crate ) traces_shutdown_ok : bool ,
27+ pub ( crate ) metrics_shutdown_ok : bool ,
28+ pub ( crate ) logs_shutdown_error : Option < String > ,
29+ pub ( crate ) traces_shutdown_error : Option < String > ,
30+ pub ( crate ) metrics_shutdown_error : Option < String > ,
31+ }
32+
33+ impl Default for TelemetryProviderShutdownReport {
34+ fn default ( ) -> Self {
35+ Self {
36+ logs_shutdown_ok : true ,
37+ traces_shutdown_ok : true ,
38+ metrics_shutdown_ok : true ,
39+ logs_shutdown_error : None ,
40+ traces_shutdown_error : None ,
41+ metrics_shutdown_error : None ,
42+ }
43+ }
44+ }
45+
46+ impl TelemetryProviderShutdownReport {
47+ pub ( crate ) fn is_healthy ( & self ) -> bool {
48+ self . logs_shutdown_ok && self . traces_shutdown_ok && self . metrics_shutdown_ok
49+ }
50+
51+ pub ( crate ) fn into_result ( self ) -> Result < ( ) , ObservabilityError > {
52+ if let Some ( error) = self . logs_shutdown_error {
53+ return Err ( ObservabilityError :: logs_shutdown ( error) ) ;
54+ }
55+ if let Some ( error) = self . traces_shutdown_error {
56+ return Err ( ObservabilityError :: traces_shutdown ( error) ) ;
57+ }
58+ if let Some ( error) = self . metrics_shutdown_error {
59+ return Err ( ObservabilityError :: metrics_shutdown ( error) ) ;
60+ }
61+ Ok ( ( ) )
62+ }
63+ }
64+
2365#[ derive( Debug , Default ) ]
2466pub struct TelemetryGuard {
2567 subscriber_install_status : SubscriberInstallStatus ,
@@ -39,6 +81,10 @@ impl TelemetryGuard {
3981 }
4082
4183 pub fn shutdown ( self ) -> Result < ( ) , ObservabilityError > {
84+ self . shutdown_with_report ( ) . into_result ( )
85+ }
86+
87+ pub ( crate ) fn shutdown_with_report ( self ) -> TelemetryProviderShutdownReport {
4288 self . shutdown_inner ( )
4389 }
4490
@@ -51,33 +97,44 @@ impl TelemetryGuard {
5197 }
5298
5399 #[ cfg( any( feature = "otel-metrics" , feature = "otel-traces" , feature = "otel-logs" ) ) ]
54- fn shutdown_inner ( mut self ) -> Result < ( ) , ObservabilityError > {
55- #[ cfg( feature = "prometheus" ) ]
56- if let Some ( prometheus_http) = self . prometheus_http . take ( ) {
57- prometheus_http. shutdown ( ) ;
58- }
100+ fn shutdown_inner ( mut self ) -> TelemetryProviderShutdownReport {
101+ let mut report = TelemetryProviderShutdownReport :: default ( ) ;
59102
60- #[ cfg( feature = "otel-metrics" ) ]
61- if let Some ( provider) = self . meter_provider . take ( ) {
62- provider. shutdown ( ) . map_err ( ObservabilityError :: metrics_shutdown) ?;
103+ #[ cfg( feature = "otel-logs" ) ]
104+ if let Some ( provider) = self . logger_provider . take ( ) {
105+ if let Err ( error) = provider. shutdown ( ) {
106+ report. logs_shutdown_ok = false ;
107+ report. logs_shutdown_error = Some ( error. to_string ( ) ) ;
108+ }
63109 }
64110
65111 #[ cfg( feature = "otel-traces" ) ]
66112 if let Some ( provider) = self . tracer_provider . take ( ) {
67- provider. shutdown ( ) . map_err ( ObservabilityError :: traces_shutdown) ?;
113+ if let Err ( error) = provider. shutdown ( ) {
114+ report. traces_shutdown_ok = false ;
115+ report. traces_shutdown_error = Some ( error. to_string ( ) ) ;
116+ }
68117 }
69118
70- #[ cfg( feature = "otel-logs" ) ]
71- if let Some ( provider) = self . logger_provider . take ( ) {
72- provider. shutdown ( ) . map_err ( ObservabilityError :: logs_shutdown) ?;
119+ #[ cfg( feature = "otel-metrics" ) ]
120+ if let Some ( provider) = self . meter_provider . take ( ) {
121+ if let Err ( error) = provider. shutdown ( ) {
122+ report. metrics_shutdown_ok = false ;
123+ report. metrics_shutdown_error = Some ( error. to_string ( ) ) ;
124+ }
73125 }
74126
75- Ok ( ( ) )
127+ #[ cfg( feature = "prometheus" ) ]
128+ if let Some ( prometheus_http) = self . prometheus_http . take ( ) {
129+ prometheus_http. shutdown ( ) ;
130+ }
131+
132+ report
76133 }
77134
78135 #[ cfg( not( any( feature = "otel-metrics" , feature = "otel-traces" , feature = "otel-logs" ) ) ) ]
79- fn shutdown_inner ( self ) -> Result < ( ) , ObservabilityError > {
80- Ok ( ( ) )
136+ fn shutdown_inner ( self ) -> TelemetryProviderShutdownReport {
137+ TelemetryProviderShutdownReport :: default ( )
81138 }
82139
83140 #[ cfg( feature = "otel-metrics" ) ]
0 commit comments