From af32dcee399c3e68a143e5c042619a83098672eb Mon Sep 17 00:00:00 2001 From: Matthew Boddewyn <31598686+mattbodd@users.noreply.github.com> Date: Tue, 30 Jan 2024 18:44:33 +0000 Subject: [PATCH 1/2] Add initial tests to opentelemetry-appender-log --- opentelemetry-appender-log/src/lib.rs | 95 +++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) diff --git a/opentelemetry-appender-log/src/lib.rs b/opentelemetry-appender-log/src/lib.rs index f3b3241c71..98bc83c060 100644 --- a/opentelemetry-appender-log/src/lib.rs +++ b/opentelemetry-appender-log/src/lib.rs @@ -69,3 +69,98 @@ const fn severity_of_level(level: Level) -> Severity { Level::Trace => Severity::Trace, } } + +#[cfg(all(test, feature = "testing", feature = "logs"))] +mod tests { + use super::OpenTelemetryLogBridge; + + use opentelemetry_sdk::{logs::LoggerProvider, testing::logs::InMemoryLogsExporter}; + + use log::Log; + + #[test] + fn logbridge_with_default_metadata_is_enabled() { + let exporter = InMemoryLogsExporter::default(); + + let logger_provider = LoggerProvider::builder() + .with_simple_exporter(exporter) + .build(); + + let otel_log_appender = OpenTelemetryLogBridge::new(&logger_provider); + + // As a result of using `with_simple_exporter` while building the logger provider, + // the processor used is a `SimpleLogProcessor` which has an implementation of `event_enabled` + // that always returns true. + #[cfg(feature = "logs_level_enabled")] + assert_eq!( + otel_log_appender.enabled(&log::Metadata::builder().build()), + true + ); + #[cfg(not(feature = "logs_level_enabled"))] + assert_eq!( + otel_log_appender.enabled(&log::Metadata::builder().build()), + true + ); + } + + #[test] + fn logbridge_with_record_can_log() { + let exporter = InMemoryLogsExporter::default(); + + let logger_provider = LoggerProvider::builder() + .with_simple_exporter(exporter.clone()) + .build(); + + let otel_log_appender = OpenTelemetryLogBridge::new(&logger_provider); + otel_log_appender.log( + &log::Record::builder() + .args(format_args!("test message")) + .build(), + ); + + let logs = exporter.get_emitted_logs().unwrap(); + + assert_eq!(logs.len(), 1); + let body: String = match logs.first().unwrap().record.body.as_ref().unwrap() { + super::AnyValue::String(s) => s.to_string(), + _ => panic!("AnyValue::String expected"), + }; + assert_eq!(body, "test message"); + } + + #[test] + fn test_flush() { + let exporter = InMemoryLogsExporter::default(); + + let logger_provider = LoggerProvider::builder() + .with_simple_exporter(exporter) + .build(); + + let otel_log_appender = OpenTelemetryLogBridge::new(&logger_provider); + otel_log_appender.flush(); + } + + #[test] + fn check_level_severities() { + assert_eq!( + super::severity_of_level(log::Level::Error), + opentelemetry::logs::Severity::Error + ); + assert_eq!( + super::severity_of_level(log::Level::Warn), + opentelemetry::logs::Severity::Warn + ); + assert_eq!( + super::severity_of_level(log::Level::Info), + opentelemetry::logs::Severity::Info + ); + assert_eq!( + super::severity_of_level(log::Level::Debug), + opentelemetry::logs::Severity::Debug + ); + assert_eq!( + super::severity_of_level(log::Level::Trace), + opentelemetry::logs::Severity::Trace + ); + } +} From 2f69ac254e958f0f851c6bb265e3f0262af2c636 Mon Sep 17 00:00:00 2001 From: Matthew Boddewyn <31598686+mattbodd@users.noreply.github.com> Date: Wed, 31 Jan 2024 02:00:44 +0000 Subject: [PATCH 2/2] Use log crate APIs in tests instead of calling OpenTelemetryLogBridge methods directly --- opentelemetry-appender-log/src/lib.rs | 30 ++++++++++++++++----------- 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/opentelemetry-appender-log/src/lib.rs b/opentelemetry-appender-log/src/lib.rs index 98bc83c060..66f58feb22 100644 --- a/opentelemetry-appender-log/src/lib.rs +++ b/opentelemetry-appender-log/src/lib.rs @@ -76,7 +76,7 @@ mod tests { use opentelemetry_sdk::{logs::LoggerProvider, testing::logs::InMemoryLogsExporter}; - use log::Log; + use log::{Level, Log}; #[test] fn logbridge_with_default_metadata_is_enabled() { @@ -112,20 +112,26 @@ mod tests { .build(); let otel_log_appender = OpenTelemetryLogBridge::new(&logger_provider); - otel_log_appender.log( - &log::Record::builder() - .args(format_args!("test message")) - .build(), - ); + + log::set_boxed_logger(Box::new(otel_log_appender)).unwrap(); + log::set_max_level(Level::Trace.to_level_filter()); + + log::trace!("TRACE"); + log::debug!("DEBUG"); + log::info!("INFO"); + log::warn!("WARN"); + log::error!("ERROR"); let logs = exporter.get_emitted_logs().unwrap(); - assert_eq!(logs.len(), 1); - let body: String = match logs.first().unwrap().record.body.as_ref().unwrap() { - super::AnyValue::String(s) => s.to_string(), - _ => panic!("AnyValue::String expected"), - }; - assert_eq!(body, "test message"); + assert_eq!(logs.len(), 5); + for log in logs { + let body: String = match log.record.body.as_ref().unwrap() { + super::AnyValue::String(s) => s.to_string(), + _ => panic!("AnyValue::String expected"), + }; + assert_eq!(body, log.record.severity_text.unwrap()); + } } #[test]