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