@@ -3,8 +3,6 @@ use opentelemetry::KeyValue;
33use opentelemetry_appender_tracing:: layer;
44use opentelemetry_otlp:: { LogExporter , MetricExporter , WithExportConfig } ;
55use opentelemetry_sdk:: metrics:: PeriodicReader ;
6- use tracing_subscriber:: filter:: EnvFilter ;
7- use tracing_subscriber:: fmt;
86use tracing_subscriber:: prelude:: * ;
97
108use std:: error:: Error ;
@@ -48,62 +46,42 @@ fn init_logger_provider() -> opentelemetry_sdk::logs::LoggerProvider {
4846
4947 let cloned_provider = provider. clone ( ) ;
5048
51- // Add a tracing filter to filter events from crates used by opentelemetry-otlp.
52- // The filter levels are set as follows:
53- // - Allow `info` level and above by default.
54- // - Restrict `hyper`, `tonic`, and `reqwest` to `error` level logs only.
55- // This ensures events generated from these crates within the OTLP Exporter are not looped back,
56- // thus preventing infinite event generation.
57- // Note: This will also drop events from these crates used outside the OTLP Exporter.
58- // For more details, see: https://github.com/open-telemetry/opentelemetry-rust/issues/761
59- let filter = EnvFilter :: new ( "info" )
60- . add_directive ( "hyper=error" . parse ( ) . unwrap ( ) )
61- . add_directive ( "tonic=error" . parse ( ) . unwrap ( ) )
62- . add_directive ( "reqwest=error" . parse ( ) . unwrap ( ) ) ;
63-
64- // Filter for logs with "opentelemetry_" target prefix to use eprintln,
65- // only if they haven't been logged before.
66- let opentelemetry_filter = tracing_subscriber:: filter:: filter_fn ( |metadata| {
67- if metadata. target ( ) . starts_with ( "opentelemetry_" ) {
68- // Ignore debug level logs
69- if metadata. level ( ) == & tracing:: Level :: DEBUG {
70- return false ;
71- }
72- let err = OtelError :: Other ( metadata. target ( ) . to_string ( ) ) ; // Convert target to an OtelError variant
73- if !GLOBAL_ERROR_STATE . mark_as_seen ( & err) {
74- eprintln ! (
75- "[{}] - {}: {}" ,
76- metadata. level( ) ,
77- metadata. target( ) ,
78- metadata. fields( )
79- ) ;
80- }
81- false // Prevent these logs from propagating further
82- } else {
83- true // Allow other logs to continue
84- }
49+ // Specialized filter for specific targets
50+ let specialized_filter = tracing_subscriber:: filter:: filter_fn ( |metadata| {
51+ let target = metadata. target ( ) ;
52+
53+ // Only allow ERROR logs from specific targets
54+ ( target. starts_with ( "hyper" )
55+ || target. starts_with ( "hyper_util" )
56+ || target. starts_with ( "tonic" )
57+ || target. starts_with ( "tower" )
58+ || target. starts_with ( "reqwest" )
59+ || target. starts_with ( "opentelemetry_" ) )
60+ && metadata. level ( ) == & tracing:: Level :: ERROR
8561 } ) ;
86-
87- // Layer for OpenTelemetry internal logs
88- let fmt_opentelemetry_layer = fmt:: layer ( ) . with_filter ( opentelemetry_filter) ;
89-
90- // Layer for application logs, excluding OpenTelemetry internal logs
91- let fmt_application_layer = fmt:: layer ( ) . with_filter ( filter) ;
92-
93- // Configures the appender tracing layer, filtering out OpenTelemetry internal logs
94- // to prevent infinite logging loops.
95-
96- let non_opentelemetry_filter = tracing_subscriber:: filter:: filter_fn ( |metadata| {
97- !metadata. target ( ) . starts_with ( "opentelemetry" )
62+ // Configure fmt::Layer to print detailed log information, including structured fields
63+ let fmt_opentelemetry_layer =
64+ tracing_subscriber:: fmt:: layer ( ) . with_filter ( specialized_filter. clone ( ) ) ;
65+
66+ // Application filter to exclude specific targets entirely, regardless of level
67+ let application_filter = tracing_subscriber:: filter:: filter_fn ( |metadata| {
68+ let target = metadata. target ( ) ;
69+
70+ // Exclude logs from specific targets for the application layer
71+ !( target. starts_with ( "hyper" )
72+ || target. starts_with ( "hyper_util" )
73+ || target. starts_with ( "tonic" )
74+ || target. starts_with ( "tower" )
75+ || target. starts_with ( "reqwest" )
76+ || target. starts_with ( "opentelemetry" ) )
9877 } ) ;
9978
100- let otel_layer = layer:: OpenTelemetryTracingBridge :: new ( & cloned_provider)
101- . with_filter ( non_opentelemetry_filter . clone ( ) ) ;
79+ let fmt_application_layer = layer:: OpenTelemetryTracingBridge :: new ( & cloned_provider)
80+ . with_filter ( application_filter . clone ( ) ) ;
10281
10382 tracing_subscriber:: registry ( )
10483 . with ( fmt_opentelemetry_layer)
10584 . with ( fmt_application_layer)
106- . with ( otel_layer)
10785 . init ( ) ;
10886 provider
10987}
0 commit comments