@@ -155,10 +155,12 @@ where
155155 event : & tracing:: Event < ' _ > ,
156156 _ctx : tracing_subscriber:: layer:: Context < ' _ , S > ,
157157 ) {
158- let severity = severity_of_level ( event. metadata ( ) . level ( ) ) ;
159- let target = event. metadata ( ) . target ( ) ;
158+ let metadata = event. metadata ( ) ;
159+ let severity = severity_of_level ( metadata. level ( ) ) ;
160+ let target = metadata. target ( ) ;
161+ let name = metadata. name ( ) ;
160162 #[ cfg( feature = "spec_unstable_logs_enabled" ) ]
161- if !self . logger . event_enabled ( severity, target) {
163+ if !self . logger . event_enabled ( severity, target, Some ( name ) ) {
162164 // TODO: See if we need internal logs or track the count.
163165 return ;
164166 }
@@ -169,16 +171,13 @@ where
169171 #[ cfg( feature = "experimental_metadata_attributes" ) ]
170172 let meta = normalized_meta. as_ref ( ) . unwrap_or_else ( || event. metadata ( ) ) ;
171173
172- #[ cfg( not( feature = "experimental_metadata_attributes" ) ) ]
173- let meta = event. metadata ( ) ;
174-
175174 let mut log_record = self . logger . create_log_record ( ) ;
176175
177176 // TODO: Fix heap allocation
178177 log_record. set_target ( target. to_string ( ) ) ;
179- log_record. set_event_name ( meta . name ( ) ) ;
178+ log_record. set_event_name ( name) ;
180179 log_record. set_severity_number ( severity) ;
181- log_record. set_severity_text ( meta . level ( ) . as_str ( ) ) ;
180+ log_record. set_severity_text ( metadata . level ( ) . as_str ( ) ) ;
182181 let mut visitor = EventVisitor :: new ( & mut log_record) ;
183182 #[ cfg( feature = "experimental_metadata_attributes" ) ]
184183 visitor. visit_experimental_metadata ( meta) ;
@@ -226,9 +225,10 @@ mod tests {
226225 use opentelemetry:: logs:: Severity ;
227226 use opentelemetry:: trace:: TracerProvider ;
228227 use opentelemetry:: trace:: { TraceContextExt , TraceFlags , Tracer } ;
228+ use opentelemetry:: InstrumentationScope ;
229229 use opentelemetry:: { logs:: AnyValue , Key } ;
230230 use opentelemetry_sdk:: error:: OTelSdkResult ;
231- use opentelemetry_sdk:: logs:: InMemoryLogExporter ;
231+ use opentelemetry_sdk:: logs:: { InMemoryLogExporter , LogProcessor } ;
232232 use opentelemetry_sdk:: logs:: { LogBatch , LogExporter } ;
233233 use opentelemetry_sdk:: logs:: { SdkLogRecord , SdkLoggerProvider } ;
234234 use opentelemetry_sdk:: trace:: { Sampler , SdkTracerProvider } ;
@@ -244,10 +244,7 @@ mod tests {
244244 }
245245
246246 #[ allow( impl_trait_overcaptures) ] // can only be fixed with Rust 1.82+
247- fn create_tracing_subscriber (
248- _exporter : InMemoryLogExporter ,
249- logger_provider : & SdkLoggerProvider ,
250- ) -> impl tracing:: Subscriber {
247+ fn create_tracing_subscriber ( logger_provider : & SdkLoggerProvider ) -> impl tracing:: Subscriber {
251248 let level_filter = tracing_subscriber:: filter:: LevelFilter :: WARN ; // Capture WARN and ERROR levels
252249 let layer =
253250 layer:: OpenTelemetryTracingBridge :: new ( logger_provider) . with_filter ( level_filter) ; // No filter based on target, only based on log level
@@ -327,7 +324,7 @@ mod tests {
327324 . with_simple_exporter ( exporter. clone ( ) )
328325 . build ( ) ;
329326
330- let subscriber = create_tracing_subscriber ( exporter . clone ( ) , & logger_provider) ;
327+ let subscriber = create_tracing_subscriber ( & logger_provider) ;
331328
332329 // avoiding setting tracing subscriber as global as that does not
333330 // play well with unit tests.
@@ -450,7 +447,7 @@ mod tests {
450447 . with_simple_exporter ( exporter. clone ( ) )
451448 . build ( ) ;
452449
453- let subscriber = create_tracing_subscriber ( exporter . clone ( ) , & logger_provider) ;
450+ let subscriber = create_tracing_subscriber ( & logger_provider) ;
454451
455452 // avoiding setting tracing subscriber as global as that does not
456453 // play well with unit tests.
@@ -627,7 +624,7 @@ mod tests {
627624 . with_simple_exporter ( exporter. clone ( ) )
628625 . build ( ) ;
629626
630- let subscriber = create_tracing_subscriber ( exporter . clone ( ) , & logger_provider) ;
627+ let subscriber = create_tracing_subscriber ( & logger_provider) ;
631628
632629 // avoiding setting tracing subscriber as global as that does not
633630 // play well with unit tests.
@@ -703,7 +700,7 @@ mod tests {
703700 . with_simple_exporter ( exporter. clone ( ) )
704701 . build ( ) ;
705702
706- let subscriber = create_tracing_subscriber ( exporter . clone ( ) , & logger_provider) ;
703+ let subscriber = create_tracing_subscriber ( & logger_provider) ;
707704
708705 // avoiding setting tracing subscriber as global as that does not
709706 // play well with unit tests.
@@ -785,4 +782,70 @@ mod tests {
785782 assert ! ( !attributes_key. contains( & Key :: new( "log.target" ) ) ) ;
786783 }
787784 }
785+
786+ #[ derive( Debug ) ]
787+ struct LogProcessorWithIsEnabled {
788+ severity_level : Severity ,
789+ name : String ,
790+ target : String ,
791+ }
792+
793+ impl LogProcessorWithIsEnabled {
794+ fn new ( severity_level : Severity , name : String , target : String ) -> Self {
795+ LogProcessorWithIsEnabled {
796+ severity_level,
797+ name,
798+ target,
799+ }
800+ }
801+ }
802+
803+ impl LogProcessor for LogProcessorWithIsEnabled {
804+ fn emit ( & self , _record : & mut SdkLogRecord , _scope : & InstrumentationScope ) {
805+ // no-op
806+ }
807+
808+ #[ cfg( feature = "spec_unstable_logs_enabled" ) ]
809+ fn event_enabled ( & self , level : Severity , target : & str , name : Option < & str > ) -> bool {
810+ // assert that passed in arguments are same as the ones set in the test.
811+ assert_eq ! ( self . severity_level, level) ;
812+ assert_eq ! ( self . target, target) ;
813+ assert_eq ! (
814+ self . name,
815+ name. expect( "name is expected from tracing appender" )
816+ ) ;
817+ true
818+ }
819+
820+ fn force_flush ( & self ) -> OTelSdkResult {
821+ Ok ( ( ) )
822+ }
823+
824+ fn shutdown ( & self ) -> OTelSdkResult {
825+ Ok ( ( ) )
826+ }
827+ }
828+
829+ #[ cfg( feature = "spec_unstable_logs_enabled" ) ]
830+ #[ test]
831+ fn is_enabled ( ) {
832+ // Arrange
833+ let logger_provider = SdkLoggerProvider :: builder ( )
834+ . with_log_processor ( LogProcessorWithIsEnabled :: new (
835+ Severity :: Error ,
836+ "my-event-name" . to_string ( ) ,
837+ "my-system" . to_string ( ) ,
838+ ) )
839+ . build ( ) ;
840+
841+ let subscriber = create_tracing_subscriber ( & logger_provider) ;
842+
843+ // avoiding setting tracing subscriber as global as that does not
844+ // play well with unit tests.
845+ let _guard = tracing:: subscriber:: set_default ( subscriber) ;
846+
847+ // Name, Target and Severity are expected to be passed to the IsEnabled check
848+ // The validation is done in the LogProcessorWithIsEnabled struct.
849+ error ! ( name
: "my-event-name" , target
: "my-system" , event_id =
20 , user_name =
"otel" , user_email =
"[email protected] " ) ; 850+ }
788851}
0 commit comments