11use opentelemetry:: trace:: TracerProvider ;
22#[ cfg( feature = "metrics" ) ]
33use opentelemetry_sdk:: metrics:: SdkMeterProvider ;
4- use opentelemetry_sdk:: trace:: { SdkTracerProvider , Tracer } ;
4+ use opentelemetry_sdk:: {
5+ trace:: { SdkTracerProvider , Tracer } ,
6+ Resource ,
7+ } ;
58use tracing:: { level_filters:: LevelFilter , Subscriber } ;
69#[ cfg( feature = "metrics" ) ]
710use tracing_opentelemetry:: MetricsLayer ;
@@ -77,34 +80,51 @@ pub fn regiter_otel_layers<S>(
7780where
7881 S : Subscriber + for < ' a > LookupSpan < ' a > ,
7982{
80- let ( trace_layer , tracer_provider ) = build_tracer_layer ( ) ? ;
81- let subscriber = subscriber . with ( trace_layer ) ;
83+ register_otel_layers_with_resource ( subscriber , DetectResource :: default ( ) . build ( ) )
84+ }
8285
86+ pub fn register_otel_layers_with_resource < S > (
87+ subscriber : S ,
88+ otel_rsrc : Resource ,
89+ ) -> Result < ( impl Subscriber + for <' span > LookupSpan < ' span > , OtelGuard ) , Error >
90+ where
91+ S : Subscriber + for < ' a > LookupSpan < ' a > ,
92+ {
8393 #[ cfg( feature = "metrics" ) ]
84- {
85- let ( metrics_layer , meter_provider ) = build_metrics_layer ( ) ?;
86- let subscriber = subscriber. with ( metrics_layer ) ;
87- Ok ( (
88- subscriber,
89- OtelGuard {
90- meter_provider ,
91- tracer_provider ,
92- } ,
93- ) )
94- }
95- # [ cfg ( not ( feature = "metrics" ) ) ]
96- Ok ( ( subscriber , OtelGuard { tracer_provider } ) )
94+ let ( metrics_layer , meter_provider ) = build_metrics_layer_with_resource ( otel_rsrc . clone ( ) ) ? ;
95+ let ( trace_layer , tracer_provider ) = build_tracer_layer_with_resource ( otel_rsrc ) ?;
96+ let subscriber = subscriber. with ( trace_layer ) ;
97+ # [ cfg ( feature = "metrics" ) ]
98+ let subscriber = subscriber. with ( metrics_layer ) ;
99+ Ok ( (
100+ subscriber ,
101+ OtelGuard {
102+ # [ cfg ( feature = "metrics" ) ]
103+ meter_provider ,
104+ tracer_provider ,
105+ } ,
106+ ) )
97107}
98108
99109/// change (version 0.31): no longer set the glabal tracer
100110pub fn build_tracer_layer < S > ( ) -> Result < ( OpenTelemetryLayer < S , Tracer > , SdkTracerProvider ) , Error >
101111where
102112 S : Subscriber + for < ' span > LookupSpan < ' span > ,
103113{
104- let otel_rsrc = DetectResource :: default ( )
105- //.with_fallback_service_name(env!("CARGO_PKG_NAME"))
106- //.with_fallback_service_version(env!("CARGO_PKG_VERSION"))
107- . build ( ) ;
114+ build_tracer_layer_with_resource (
115+ DetectResource :: default ( )
116+ //.with_fallback_service_name(env!("CARGO_PKG_NAME"))
117+ //.with_fallback_service_version(env!("CARGO_PKG_VERSION"))
118+ . build ( ) ,
119+ )
120+ }
121+
122+ pub fn build_tracer_layer_with_resource < S > (
123+ otel_rsrc : Resource ,
124+ ) -> Result < ( OpenTelemetryLayer < S , Tracer > , SdkTracerProvider ) , Error >
125+ where
126+ S : Subscriber + for < ' span > LookupSpan < ' span > ,
127+ {
108128 let tracer_provider = otlp:: traces:: init_tracerprovider ( otel_rsrc, otlp:: traces:: identity) ?;
109129 // to not send trace somewhere, but continue to create and propagate,...
110130 // then send them to `init_tracing_opentelemetry::stdio::WriteNoWhere::default()`
@@ -126,10 +146,19 @@ where
126146#[ cfg( feature = "metrics" ) ]
127147pub fn build_metrics_layer < S > (
128148) -> Result < ( MetricsLayer < S , SdkMeterProvider > , SdkMeterProvider ) , Error >
149+ where
150+ S : Subscriber + for < ' span > LookupSpan < ' span > ,
151+ {
152+ build_metrics_layer_with_resource ( DetectResource :: default ( ) . build ( ) )
153+ }
154+
155+ #[ cfg( feature = "metrics" ) ]
156+ pub fn build_metrics_layer_with_resource < S > (
157+ otel_rsrc : Resource ,
158+ ) -> Result < ( MetricsLayer < S , SdkMeterProvider > , SdkMeterProvider ) , Error >
129159where
130160 S : Subscriber + for < ' a > LookupSpan < ' a > ,
131161{
132- let otel_rsrc = DetectResource :: default ( ) . build ( ) ;
133162 let meter_provider = otlp:: metrics:: init_meterprovider ( otel_rsrc, otlp:: metrics:: identity) ?;
134163 let layer = MetricsLayer :: new ( meter_provider. clone ( ) ) ;
135164 opentelemetry:: global:: set_meter_provider ( meter_provider. clone ( ) ) ;
0 commit comments