@@ -155,10 +155,12 @@ where
155
155
event : & tracing:: Event < ' _ > ,
156
156
_ctx : tracing_subscriber:: layer:: Context < ' _ , S > ,
157
157
) {
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 ( ) ;
160
162
#[ cfg( feature = "spec_unstable_logs_enabled" ) ]
161
- if !self . logger . event_enabled ( severity, target) {
163
+ if !self . logger . event_enabled ( severity, target, Some ( name ) ) {
162
164
// TODO: See if we need internal logs or track the count.
163
165
return ;
164
166
}
@@ -169,16 +171,13 @@ where
169
171
#[ cfg( feature = "experimental_metadata_attributes" ) ]
170
172
let meta = normalized_meta. as_ref ( ) . unwrap_or_else ( || event. metadata ( ) ) ;
171
173
172
- #[ cfg( not( feature = "experimental_metadata_attributes" ) ) ]
173
- let meta = event. metadata ( ) ;
174
-
175
174
let mut log_record = self . logger . create_log_record ( ) ;
176
175
177
176
// TODO: Fix heap allocation
178
177
log_record. set_target ( target. to_string ( ) ) ;
179
- log_record. set_event_name ( meta . name ( ) ) ;
178
+ log_record. set_event_name ( name) ;
180
179
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 ( ) ) ;
182
181
let mut visitor = EventVisitor :: new ( & mut log_record) ;
183
182
#[ cfg( feature = "experimental_metadata_attributes" ) ]
184
183
visitor. visit_experimental_metadata ( meta) ;
@@ -226,9 +225,10 @@ mod tests {
226
225
use opentelemetry:: logs:: Severity ;
227
226
use opentelemetry:: trace:: TracerProvider ;
228
227
use opentelemetry:: trace:: { TraceContextExt , TraceFlags , Tracer } ;
228
+ use opentelemetry:: InstrumentationScope ;
229
229
use opentelemetry:: { logs:: AnyValue , Key } ;
230
230
use opentelemetry_sdk:: error:: OTelSdkResult ;
231
- use opentelemetry_sdk:: logs:: InMemoryLogExporter ;
231
+ use opentelemetry_sdk:: logs:: { InMemoryLogExporter , LogProcessor } ;
232
232
use opentelemetry_sdk:: logs:: { LogBatch , LogExporter } ;
233
233
use opentelemetry_sdk:: logs:: { SdkLogRecord , SdkLoggerProvider } ;
234
234
use opentelemetry_sdk:: trace:: { Sampler , SdkTracerProvider } ;
@@ -244,10 +244,7 @@ mod tests {
244
244
}
245
245
246
246
#[ 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 {
251
248
let level_filter = tracing_subscriber:: filter:: LevelFilter :: WARN ; // Capture WARN and ERROR levels
252
249
let layer =
253
250
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 {
327
324
. with_simple_exporter ( exporter. clone ( ) )
328
325
. build ( ) ;
329
326
330
- let subscriber = create_tracing_subscriber ( exporter . clone ( ) , & logger_provider) ;
327
+ let subscriber = create_tracing_subscriber ( & logger_provider) ;
331
328
332
329
// avoiding setting tracing subscriber as global as that does not
333
330
// play well with unit tests.
@@ -450,7 +447,7 @@ mod tests {
450
447
. with_simple_exporter ( exporter. clone ( ) )
451
448
. build ( ) ;
452
449
453
- let subscriber = create_tracing_subscriber ( exporter . clone ( ) , & logger_provider) ;
450
+ let subscriber = create_tracing_subscriber ( & logger_provider) ;
454
451
455
452
// avoiding setting tracing subscriber as global as that does not
456
453
// play well with unit tests.
@@ -627,7 +624,7 @@ mod tests {
627
624
. with_simple_exporter ( exporter. clone ( ) )
628
625
. build ( ) ;
629
626
630
- let subscriber = create_tracing_subscriber ( exporter . clone ( ) , & logger_provider) ;
627
+ let subscriber = create_tracing_subscriber ( & logger_provider) ;
631
628
632
629
// avoiding setting tracing subscriber as global as that does not
633
630
// play well with unit tests.
@@ -703,7 +700,7 @@ mod tests {
703
700
. with_simple_exporter ( exporter. clone ( ) )
704
701
. build ( ) ;
705
702
706
- let subscriber = create_tracing_subscriber ( exporter . clone ( ) , & logger_provider) ;
703
+ let subscriber = create_tracing_subscriber ( & logger_provider) ;
707
704
708
705
// avoiding setting tracing subscriber as global as that does not
709
706
// play well with unit tests.
@@ -785,4 +782,70 @@ mod tests {
785
782
assert ! ( !attributes_key. contains( & Key :: new( "log.target" ) ) ) ;
786
783
}
787
784
}
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
+ }
788
851
}
0 commit comments