@@ -43,7 +43,7 @@ fn init_logs() -> Result<sdklogs::LoggerProvider, opentelemetry_sdk::logs::LogEr
43
43
. build ( ) )
44
44
}
45
45
46
- fn init_tracer_provider ( ) -> Result < sdktrace:: TracerProvider , TraceError > {
46
+ fn init_traces ( ) -> Result < sdktrace:: TracerProvider , TraceError > {
47
47
let exporter = SpanExporter :: builder ( )
48
48
. with_http ( )
49
49
. with_protocol ( Protocol :: HttpBinary ) //can be changed to `Protocol::HttpJson` to export in JSON format
@@ -71,51 +71,48 @@ fn init_metrics() -> Result<opentelemetry_sdk::metrics::SdkMeterProvider, Metric
71
71
72
72
#[ tokio:: main]
73
73
async 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_traces ( ) ?;
82
75
global:: set_tracer_provider ( tracer_provider. clone ( ) ) ;
83
76
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 ( ) ?;
92
78
global:: set_meter_provider ( meter_provider. clone ( ) ) ;
93
79
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 ( ) ?;
99
81
100
82
// Create a new OpenTelemetryTracingBridge using the above LoggerProvider.
101
- let layer = OpenTelemetryTracingBridge :: new ( & logger_provider) ;
83
+ let otel_layer = OpenTelemetryTracingBridge :: new ( & logger_provider) ;
102
84
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:
105
90
// - 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.
116
113
tracing_subscriber:: registry ( )
117
- . with ( filter )
118
- . with ( layer )
114
+ . with ( otel_layer )
115
+ . with ( fmt_layer )
119
116
. init ( ) ;
120
117
121
118
let common_scope_attributes = vec ! [ KeyValue :: new( "scope-key" , "scope-value" ) ] ;
0 commit comments