@@ -2,8 +2,9 @@ use opentelemetry::global::{self, set_error_handler, Error as OtelError};
22use opentelemetry:: KeyValue ;
33use opentelemetry_appender_tracing:: layer;
44use opentelemetry_otlp:: WithExportConfig ;
5+ use tracing_subscriber:: filter:: { EnvFilter , LevelFilter } ;
6+ use tracing_subscriber:: fmt;
57use tracing_subscriber:: prelude:: * ;
6- use tracing_subscriber:: EnvFilter ;
78
89use std:: error:: Error ;
910use tracing:: error;
@@ -59,6 +60,7 @@ fn init_logger_provider() -> opentelemetry_sdk::logs::LoggerProvider {
5960 )
6061 . install_batch ( )
6162 . unwrap ( ) ;
63+ let cloned_provider = provider. clone ( ) ;
6264
6365 // Add a tracing filter to filter events from crates used by opentelemetry-otlp.
6466 // The filter levels are set as follows:
@@ -72,11 +74,34 @@ fn init_logger_provider() -> opentelemetry_sdk::logs::LoggerProvider {
7274 . add_directive ( "hyper=error" . parse ( ) . unwrap ( ) )
7375 . add_directive ( "tonic=error" . parse ( ) . unwrap ( ) )
7476 . add_directive ( "reqwest=error" . parse ( ) . unwrap ( ) ) ;
75- let cloned_provider = provider. clone ( ) ;
76- let layer = layer:: OpenTelemetryTracingBridge :: new ( & cloned_provider) ;
77+
78+ // Configuring the formatting layer specifically for OpenTelemetry internal logs.
79+ // These logs starts with "opentelemetry" prefix in target. This allows specific logs
80+ // from the OpenTelemetry-related components to be filtered and handled separately
81+ // from the application logs
82+
83+ let opentelemetry_filter = tracing_subscriber:: filter:: filter_fn ( |metadata| {
84+ metadata. target ( ) . starts_with ( "opentelemetry" )
85+ } ) ;
86+
87+ let fmt_opentelemetry_layer = fmt:: layer ( )
88+ . with_filter ( LevelFilter :: DEBUG )
89+ . with_filter ( opentelemetry_filter) ;
90+
91+ // Configures the appender tracing layer, filtering out OpenTelemetry internal logs
92+ // to prevent infinite logging loops.
93+
94+ let non_opentelemetry_filter = tracing_subscriber:: filter:: filter_fn ( |metadata| {
95+ !metadata. target ( ) . starts_with ( "opentelemetry" )
96+ } ) ;
97+
98+ let otel_layer = layer:: OpenTelemetryTracingBridge :: new ( & cloned_provider)
99+ . with_filter ( non_opentelemetry_filter. clone ( ) ) ;
100+
77101 tracing_subscriber:: registry ( )
78- . with ( filter)
79- . with ( layer)
102+ . with ( fmt_opentelemetry_layer)
103+ . with ( fmt:: layer ( ) . with_filter ( filter) )
104+ . with ( otel_layer)
80105 . init ( ) ;
81106 provider
82107}
0 commit comments