@@ -57,13 +57,15 @@ pub fn dev(cfg: Config) -> Guard {
5757 let ( otel_layer, otlp_guard) = if cfg. otlp_endpoint . is_none ( ) {
5858 ( None , None )
5959 } else {
60+ let ( tracer, guard) = init_otel_tracer ( & cfg) ;
61+
6062 (
6163 Some (
6264 tracing_opentelemetry:: layer ( )
6365 . with_error_records_to_exceptions ( true )
64- . with_tracer ( init_otel_tracer ( & cfg ) ) ,
66+ . with_tracer ( tracer ) ,
6567 ) ,
66- Some ( OtlpGuard ) ,
68+ Some ( guard ) ,
6769 )
6870 } ;
6971
@@ -103,13 +105,15 @@ pub fn service(cfg: Config) -> Guard {
103105 let ( otel_layer, otlp_guard) = if cfg. otlp_endpoint . is_none ( ) {
104106 ( None , None )
105107 } else {
108+ let ( tracer, guard) = init_otel_tracer ( & cfg) ;
109+
106110 (
107111 Some (
108112 tracing_opentelemetry:: layer ( )
109113 . with_error_records_to_exceptions ( true )
110- . with_tracer ( init_otel_tracer ( & cfg ) ) ,
114+ . with_tracer ( tracer ) ,
111115 ) ,
112- Some ( OtlpGuard ) ,
116+ Some ( guard ) ,
113117 )
114118 } ;
115119
@@ -132,39 +136,42 @@ pub fn service(cfg: Config) -> Guard {
132136////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
133137
134138#[ cfg( feature = "opentelemetry" ) ]
135- fn init_otel_tracer ( cfg : & Config ) -> opentelemetry_sdk:: trace:: Tracer {
139+ fn init_otel_tracer ( cfg : & Config ) -> ( opentelemetry_sdk:: trace:: SdkTracer , OtlpGuard ) {
136140 use std:: time:: Duration ;
137141
138142 use opentelemetry:: KeyValue ;
143+ use opentelemetry:: trace:: TracerProvider ;
139144 use opentelemetry_otlp:: WithExportConfig as _;
140145 use opentelemetry_semantic_conventions:: resource as otel_resource;
141146
142- let otel_exporter = opentelemetry_otlp:: new_exporter ( )
143- . tonic ( )
147+ let otel_exporter = opentelemetry_otlp:: SpanExporter :: builder ( )
148+ . with_tonic ( )
144149 . with_endpoint ( cfg. otlp_endpoint . as_ref ( ) . unwrap ( ) )
145- . with_timeout ( Duration :: from_secs ( 5 ) ) ;
146-
147- use opentelemetry :: trace :: TracerProvider ;
148- opentelemetry_otlp :: new_pipeline ( )
149- . tracing ( )
150- . with_exporter ( otel_exporter)
151- . with_trace_config (
152- opentelemetry_sdk :: trace :: Config :: default ( )
153- . with_max_events_per_span ( cfg. span_limits . max_events_per_span )
154- . with_max_attributes_per_span ( cfg. span_limits . max_attributes_per_span )
155- . with_max_links_per_span ( cfg. span_limits . max_links_per_span )
156- . with_max_attributes_per_event ( cfg . span_limits . max_attributes_per_event )
157- . with_max_attributes_per_link ( cfg . span_limits . max_attributes_per_link )
158- . with_resource ( opentelemetry_sdk :: Resource :: new ( [
150+ . with_timeout ( Duration :: from_secs ( 5 ) )
151+ . build ( )
152+ . unwrap ( ) ;
153+
154+ let tracer_provider = opentelemetry_sdk :: trace :: SdkTracerProvider :: builder ( )
155+ . with_batch_exporter ( otel_exporter)
156+ . with_max_events_per_span ( cfg . span_limits . max_events_per_span )
157+ . with_max_attributes_per_span ( cfg . span_limits . max_attributes_per_span )
158+ . with_max_links_per_span ( cfg. span_limits . max_links_per_span )
159+ . with_max_attributes_per_event ( cfg. span_limits . max_attributes_per_event )
160+ . with_max_attributes_per_link ( cfg. span_limits . max_attributes_per_link )
161+ . with_resource (
162+ opentelemetry_sdk :: Resource :: builder_empty ( )
163+ . with_attributes ( [
159164 KeyValue :: new ( otel_resource:: SERVICE_NAME , cfg. service_name . clone ( ) ) ,
160165 KeyValue :: new ( otel_resource:: SERVICE_VERSION , cfg. service_version . clone ( ) ) ,
161- ] ) )
162- . with_sampler ( opentelemetry_sdk :: trace :: Sampler :: AlwaysOn ) ,
166+ ] )
167+ . build ( ) ,
163168 )
164- . install_batch ( opentelemetry_sdk:: runtime:: Tokio )
165- . expect ( "Creating tracer provider" )
166- . tracer_builder ( cfg. service_name . clone ( ) )
167- . build ( )
169+ . with_sampler ( opentelemetry_sdk:: trace:: Sampler :: AlwaysOn )
170+ . build ( ) ;
171+
172+ let tracer = tracer_provider. tracer ( cfg. service_name . clone ( ) ) ;
173+
174+ ( tracer, OtlpGuard { tracer_provider } )
168175}
169176
170177////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -178,11 +185,14 @@ pub struct Guard {
178185 pub otlp_guard : Option < OtlpGuard > ,
179186}
180187
181- pub struct OtlpGuard ;
188+ #[ cfg( feature = "opentelemetry" ) ]
189+ pub struct OtlpGuard {
190+ pub tracer_provider : opentelemetry_sdk:: trace:: SdkTracerProvider ,
191+ }
182192
183193#[ cfg( feature = "opentelemetry" ) ]
184194impl Drop for OtlpGuard {
185195 fn drop ( & mut self ) {
186- opentelemetry :: global :: shutdown_tracer_provider ( ) ;
196+ let _ = self . tracer_provider . shutdown ( ) ;
187197 }
188198}
0 commit comments