1+ use opentelemetry:: global;
12use opentelemetry:: trace:: TracerProvider ;
3+ #[ cfg( feature = "metrics" ) ]
4+ use opentelemetry_sdk:: metrics:: SdkMeterProvider ;
25use opentelemetry_sdk:: trace:: { SdkTracerProvider , Tracer } ;
36use tracing:: { info, level_filters:: LevelFilter , Subscriber } ;
7+ #[ cfg( feature = "metrics" ) ]
8+ use tracing_opentelemetry:: MetricsLayer ;
49use tracing_opentelemetry:: OpenTelemetryLayer ;
510use tracing_subscriber:: { filter:: EnvFilter , layer:: SubscriberExt , registry:: LookupSpan , Layer } ;
611
7- use crate :: otlp:: OtelGuard ;
8- use crate :: Error ;
12+ use crate :: {
13+ init_propagator, //stdio,
14+ otlp,
15+ otlp:: OtelGuard ,
16+ resource:: DetectResource ,
17+ Error ,
18+ } ;
919
1020#[ cfg( not( feature = "logfmt" ) ) ]
1121#[ must_use]
@@ -81,16 +91,35 @@ pub fn build_level_filter_layer(log_directives: &str) -> Result<EnvFilter, Error
8191 . add_directive ( directive_to_allow_otel_trace) )
8292}
8393
84- pub fn build_otel_layer < S > ( ) -> Result < ( OpenTelemetryLayer < S , Tracer > , SdkTracerProvider ) , Error >
94+ pub fn regiter_otel_layers < S > (
95+ subscriber : S ,
96+ ) -> Result < ( impl Subscriber + for <' span > LookupSpan < ' span > , OtelGuard ) , Error >
8597where
8698 S : Subscriber + for < ' a > LookupSpan < ' a > ,
8799{
88- use crate :: {
89- init_propagator, //stdio,
90- otlp,
91- resource:: DetectResource ,
92- } ;
93- use opentelemetry:: global;
100+ let ( trace_layer, tracer_provider) = build_tracer_layer ( ) ?;
101+ let subscriber = subscriber. with ( trace_layer) ;
102+
103+ #[ cfg( feature = "metrics" ) ]
104+ {
105+ let ( metrics_layer, meter_provider) = build_metrics_layer ( ) ?;
106+ let subscriber = subscriber. with ( metrics_layer) ;
107+ Ok ( (
108+ subscriber,
109+ OtelGuard {
110+ meter_provider,
111+ tracer_provider,
112+ } ,
113+ ) )
114+ }
115+ #[ cfg( not( feature = "metrics" ) ) ]
116+ Ok ( ( subscriber, OtelGuard { tracer_provider } ) )
117+ }
118+
119+ pub fn build_tracer_layer < S > ( ) -> Result < ( OpenTelemetryLayer < S , Tracer > , SdkTracerProvider ) , Error >
120+ where
121+ S : Subscriber + for < ' span > LookupSpan < ' span > ,
122+ {
94123 let otel_rsrc = DetectResource :: default ( )
95124 //.with_fallback_service_name(env!("CARGO_PKG_NAME"))
96125 //.with_fallback_service_version(env!("CARGO_PKG_VERSION"))
@@ -113,6 +142,18 @@ where
113142 Ok ( ( layer, tracer_provider) )
114143}
115144
145+ #[ cfg( feature = "metrics" ) ]
146+ pub fn build_metrics_layer < S > ( ) -> Result < ( MetricsLayer < S > , SdkMeterProvider ) , Error >
147+ where
148+ S : Subscriber + for < ' a > LookupSpan < ' a > ,
149+ {
150+ let otel_rsrc = DetectResource :: default ( ) . build ( ) ;
151+ let meter_provider = otlp:: metrics:: init_meterprovider ( otel_rsrc, otlp:: metrics:: identity) ?;
152+ global:: set_meter_provider ( meter_provider. clone ( ) ) ;
153+ let layer = MetricsLayer :: new ( meter_provider. clone ( ) ) ;
154+ Ok ( ( layer, meter_provider) )
155+ }
156+
116157pub fn init_subscribers ( ) -> Result < OtelGuard , Error > {
117158 init_subscribers_and_loglevel ( "" )
118159}
@@ -126,30 +167,11 @@ pub fn init_subscribers_and_loglevel(log_directives: &str) -> Result<OtelGuard,
126167 let _guard = tracing:: subscriber:: set_default ( subscriber) ;
127168 info ! ( "init logging & tracing" ) ;
128169
129- let ( trace_layer, tracer_provider) = build_otel_layer ( ) ?;
130-
131- #[ cfg( not( feature = "metrics" ) ) ]
132- {
133- let subscriber = tracing_subscriber:: registry ( )
134- . with ( trace_layer)
135- . with ( build_level_filter_layer ( log_directives) ?)
136- . with ( build_logger_text ( ) ) ;
137- tracing:: subscriber:: set_global_default ( subscriber) ?;
138- Ok ( OtelGuard { tracer_provider } )
139- }
140- #[ cfg( feature = "metrics" ) ]
141- {
142- let ( metrics_layer, meter_provider) = crate :: otlp:: metrics:: build_metrics_layer ( ) ?;
143- info ! ( "init metrics" ) ;
144- let subscriber = tracing_subscriber:: registry ( )
145- . with ( metrics_layer)
146- . with ( trace_layer)
147- . with ( build_level_filter_layer ( log_directives) ?)
148- . with ( build_logger_text ( ) ) ;
149- tracing:: subscriber:: set_global_default ( subscriber) ?;
150- Ok ( OtelGuard {
151- meter_provider,
152- tracer_provider,
153- } )
154- }
170+ let subscriber = tracing_subscriber:: registry ( ) ;
171+ let ( subscriber, otel_guard) = regiter_otel_layers ( subscriber) ?;
172+ let subscriber = subscriber
173+ . with ( build_level_filter_layer ( log_directives) ?)
174+ . with ( build_logger_text ( ) ) ;
175+ tracing:: subscriber:: set_global_default ( subscriber) ?;
176+ Ok ( otel_guard)
155177}
0 commit comments