@@ -71,51 +71,48 @@ fn init_metrics() -> Result<opentelemetry_sdk::metrics::SdkMeterProvider, Metric
7171
7272#[ tokio:: main]
7373async fn main ( ) -> Result < ( ) , Box < dyn Error + Send + Sync + ' static > > {
74- let result = init_tracer_provider ( ) ;
75- assert ! (
76- result. is_ok( ) ,
77- "Init tracer failed with error: {:?}" ,
78- result. err( )
79- ) ;
80-
81- let tracer_provider = result. unwrap ( ) ;
74+ let tracer_provider = init_tracer_provider ( ) ?;
8275 global:: set_tracer_provider ( tracer_provider. clone ( ) ) ;
8376
84- let result = init_metrics ( ) ;
85- assert ! (
86- result. is_ok( ) ,
87- "Init metrics failed with error: {:?}" ,
88- result. err( )
89- ) ;
90-
91- let meter_provider = result. unwrap ( ) ;
77+ let meter_provider = init_metrics ( ) ?;
9278 global:: set_meter_provider ( meter_provider. clone ( ) ) ;
9379
94- // Opentelemetry will not provide a global API to manage the logger
95- // provider. Application users must manage the lifecycle of the logger
96- // provider on their own. Dropping logger providers will disable log
97- // emitting.
98- let logger_provider = init_logs ( ) . unwrap ( ) ;
80+ let logger_provider = init_logs ( ) ?;
9981
10082 // Create a new OpenTelemetryTracingBridge using the above LoggerProvider.
101- let layer = OpenTelemetryTracingBridge :: new ( & logger_provider) ;
83+ let otel_layer = OpenTelemetryTracingBridge :: new ( & logger_provider) ;
10284
103- // Add a tracing filter to filter events from crates used by opentelemetry-otlp.
104- // The filter levels are set as follows:
85+ // For the OpenTelemetry layer, add a tracing filter to filter events from
86+ // OpenTelemetry and its dependent crates (opentelemetry-otlp uses crates
87+ // like reqwest/tonic etc.) from being sent back to OTel itself, thus
88+ // preventing infinite telemetry generation. The filter levels are set as
89+ // follows:
10590 // - Allow `info` level and above by default.
106- // - Restrict `hyper`, `tonic`, and `reqwest` to `error` level logs only.
107- // This ensures events generated from these crates within the OTLP Exporter are not looped back,
108- // thus preventing infinite event generation.
109- // Note: This will also drop events from these crates used outside the OTLP Exporter.
110- // For more details, see: https://github.com/open-telemetry/opentelemetry-rust/issues/761
111- let filter = EnvFilter :: new ( "info" )
112- . add_directive ( "hyper=error" . parse ( ) . unwrap ( ) )
113- . add_directive ( "tonic=error" . parse ( ) . unwrap ( ) )
114- . add_directive ( "reqwest=error" . parse ( ) . unwrap ( ) ) ;
115-
91+ // - Restrict `opentelemetry`, `hyper`, `tonic`, and `reqwest` completely.
92+ // Note: This will also drop events from crates like `tonic` etc. even when
93+ // they are used outside the OTLP Exporter. For more details, see:
94+ // https://github.com/open-telemetry/opentelemetry-rust/issues/761
95+ let filter_otel = EnvFilter :: new ( "info" )
96+ . add_directive ( "hyper=off" . parse ( ) . unwrap ( ) )
97+ . add_directive ( "opentelemetry=off" . parse ( ) . unwrap ( ) )
98+ . add_directive ( "tonic=off" . parse ( ) . unwrap ( ) )
99+ . add_directive ( "h2=off" . parse ( ) . unwrap ( ) )
100+ . add_directive ( "reqwest=off" . parse ( ) . unwrap ( ) ) ;
101+ let otel_layer = otel_layer. with_filter ( filter_otel) ;
102+
103+ // Create a new tracing::Fmt layer to print the logs to stdout. It has a
104+ // default filter of `info` level and above, and `debug` and above for logs
105+ // from OpenTelemtry crates. The filter levels can be customized as needed.
106+ let filter_fmt = EnvFilter :: new ( "info" ) . add_directive ( "opentelemetry=debug" . parse ( ) . unwrap ( ) ) ;
107+ let fmt_layer = tracing_subscriber:: fmt:: layer ( )
108+ . with_thread_names ( true )
109+ . with_filter ( filter_fmt) ;
110+
111+ // Initialize the tracing subscriber with the OpenTelemetry layer and the
112+ // Fmt layer.
116113 tracing_subscriber:: registry ( )
117- . with ( filter )
118- . with ( layer )
114+ . with ( otel_layer )
115+ . with ( fmt_layer )
119116 . init ( ) ;
120117
121118 let common_scope_attributes = vec ! [ KeyValue :: new( "scope-key" , "scope-value" ) ] ;
@@ -158,7 +155,7 @@ async fn main() -> Result<(), Box<dyn Error + Send + Sync + 'static>> {
158155
159156 tracer_provider. shutdown ( ) ?;
160157 logger_provider. shutdown ( ) ?;
161- meter_provider. shutdown ( ) ?;
158+ // meter_provider.shutdown()?;
162159
163160 Ok ( ( ) )
164161}
0 commit comments