1- use opentelemetry:: trace:: TracerProvider ;
1+ use opentelemetry:: trace:: TracerProvider as _ ;
22use opentelemetry:: { global, KeyValue } ;
33use opentelemetry_appender_tracing:: layer:: OpenTelemetryTracingBridge ;
44use opentelemetry_otlp:: WithExportConfig ;
@@ -7,7 +7,7 @@ use opentelemetry_sdk::metrics::reader::DefaultTemporalitySelector;
77use opentelemetry_sdk:: metrics:: { MeterProviderBuilder , PeriodicReader , SdkMeterProvider } ;
88use opentelemetry_sdk:: { runtime, trace:: BatchConfigBuilder } ;
99use opentelemetry_sdk:: {
10- trace:: { Config , Tracer } ,
10+ trace:: { Config , TracerProvider } ,
1111 Resource ,
1212} ;
1313use opentelemetry_semantic_conventions:: resource:: SERVICE_NAME ;
@@ -31,11 +31,26 @@ pub enum TelemetryError {
3131}
3232
3333pub struct ProviderSet {
34- pub tracer_provider : Option < Tracer > ,
34+ pub tracer_provider : Option < TracerProvider > ,
3535 pub logger_provider : Option < LoggerProvider > ,
3636 pub metrics_provider : Option < SdkMeterProvider > ,
3737}
3838
39+ impl ProviderSet {
40+ pub fn shutdown ( & mut self ) -> Result < ( ) , TelemetryError > {
41+ if let Some ( tracer_provider) = self . tracer_provider . take ( ) {
42+ tracer_provider. shutdown ( ) ?;
43+ }
44+ if let Some ( logger_provider) = self . logger_provider . take ( ) {
45+ logger_provider. shutdown ( ) ?;
46+ }
47+ if let Some ( metrics_provider) = self . metrics_provider . take ( ) {
48+ metrics_provider. shutdown ( ) ?;
49+ }
50+ Ok ( ( ) )
51+ }
52+ }
53+
3954pub fn init_telemetry (
4055 app_name : & str ,
4156 collection_endpoint : Option < String > ,
@@ -53,7 +68,9 @@ pub fn init_telemetry(
5368
5469 tracing_subscriber
5570 . with ( tracing_subscriber:: fmt:: layer ( ) )
56- . with ( OpenTelemetryLayer :: new ( tracer_provider. clone ( ) ) )
71+ . with ( OpenTelemetryLayer :: new (
72+ tracer_provider. tracer ( format ! ( "{app_name}-subscriber" ) ) ,
73+ ) )
5774 . with ( OpenTelemetryTracingBridge :: new ( & logger_provider) )
5875 . try_init ( ) ?;
5976
@@ -85,7 +102,7 @@ pub fn init_telemetry(
85102 }
86103}
87104
88- fn init_tracer_provider ( app_name : & str , collection_endpoint : & str ) -> Tracer {
105+ fn init_tracer_provider ( app_name : & str , collection_endpoint : & str ) -> TracerProvider {
89106 // Set a custom error handler to log OpenTelemetry errors with timestamps
90107 global:: set_error_handler ( |error| {
91108 tracing:: error!( error = %error, "OpenTelemetry error occurred" ) ;
@@ -114,7 +131,7 @@ fn init_tracer_provider(app_name: &str, collection_endpoint: &str) -> Tracer {
114131 . expect ( "Failed to install tracer provider" ) ;
115132
116133 global:: set_tracer_provider ( provider. clone ( ) ) ;
117- provider. tracer ( format ! ( "{app_name}-subscriber" ) )
134+ provider
118135}
119136
120137fn init_logs_provider (
0 commit comments