@@ -2,7 +2,7 @@ use opentelemetry_appender_tracing::layer;
22use opentelemetry_sdk:: logs:: SdkLoggerProvider ;
33use opentelemetry_sdk:: Resource ;
44use tracing:: error;
5- use tracing_subscriber:: prelude:: * ;
5+ use tracing_subscriber:: { prelude:: * , EnvFilter } ;
66
77fn main ( ) {
88 let exporter = opentelemetry_stdout:: LogExporter :: default ( ) ;
@@ -14,8 +14,37 @@ fn main() {
1414 )
1515 . with_simple_exporter ( exporter)
1616 . build ( ) ;
17- let layer = layer:: OpenTelemetryTracingBridge :: new ( & provider) ;
18- tracing_subscriber:: registry ( ) . with ( layer) . init ( ) ;
17+
18+ // For the OpenTelemetry layer, add a tracing filter to filter events from
19+ // OpenTelemetry and its dependent crates (opentelemetry-otlp uses crates
20+ // like reqwest/tonic etc.) from being sent back to OTel itself, thus
21+ // preventing infinite telemetry generation. The filter levels are set as
22+ // follows:
23+ // - Allow `info` level and above by default.
24+ // - Restrict `opentelemetry`, `hyper`, `tonic`, and `reqwest` completely.
25+ // Note: This will also drop events from crates like `tonic` etc. even when
26+ // they are used outside the OTLP Exporter. For more details, see:
27+ // https://github.com/open-telemetry/opentelemetry-rust/issues/761
28+ let filter_otel = EnvFilter :: new ( "info" )
29+ . add_directive ( "hyper=off" . parse ( ) . unwrap ( ) )
30+ . add_directive ( "opentelemetry=off" . parse ( ) . unwrap ( ) )
31+ . add_directive ( "tonic=off" . parse ( ) . unwrap ( ) )
32+ . add_directive ( "h2=off" . parse ( ) . unwrap ( ) )
33+ . add_directive ( "reqwest=off" . parse ( ) . unwrap ( ) ) ;
34+ let otel_layer = layer:: OpenTelemetryTracingBridge :: new ( & provider) . with_filter ( filter_otel) ;
35+
36+ // Create a new tracing::Fmt layer to print the logs to stdout. It has a
37+ // default filter of `info` level and above, and `debug` and above for logs
38+ // from OpenTelemetry crates. The filter levels can be customized as needed.
39+ let filter_fmt = EnvFilter :: new ( "info" ) . add_directive ( "opentelemetry=debug" . parse ( ) . unwrap ( ) ) ;
40+ let fmt_layer = tracing_subscriber:: fmt:: layer ( )
41+ . with_thread_names ( true )
42+ . with_filter ( filter_fmt) ;
43+
44+ tracing_subscriber:: registry ( )
45+ . with ( otel_layer)
46+ . with ( fmt_layer)
47+ . init ( ) ;
1948
2049 error ! ( name
: "my-event-name" , target
: "my-system" , event_id =
20 , user_name =
"otel" , user_email =
"[email protected] " , message =
"This is an example message" ) ; 2150 let _ = provider. shutdown ( ) ;
0 commit comments