diff --git a/opentelemetry-appender-tracing/CHANGELOG.md b/opentelemetry-appender-tracing/CHANGELOG.md index 5cd0414b92..3f07a0e8f0 100644 --- a/opentelemetry-appender-tracing/CHANGELOG.md +++ b/opentelemetry-appender-tracing/CHANGELOG.md @@ -6,6 +6,13 @@ `OpenTelemetryTracingBridge::builder_with_scope_attributes(..)`. [3415](https://github.com/open-telemetry/opentelemetry-rust/issues/3415) +- Fixes [#3543](https://github.com/open-telemetry/opentelemetry-rust/issues/3543): + Event metadata is now always normalized when `experimental_metadata_attributes` + is enabled. In particular, when using the feature the underlying OTEL logger + will receive the value of `log.target` as its log event `target` for events + generated from the `log` crate (e.g., via `tracing-log`) instead of the static + target value `"log"`. + ## 0.32.0 Released 2026-May-08 diff --git a/opentelemetry-appender-tracing/src/layer.rs b/opentelemetry-appender-tracing/src/layer.rs index fb5535473e..e534dae05b 100644 --- a/opentelemetry-appender-tracing/src/layer.rs +++ b/opentelemetry-appender-tracing/src/layer.rs @@ -477,7 +477,14 @@ where #[cfg_attr(not(feature = "experimental_span_attributes"), allow(unused_variables))] ctx: tracing_subscriber::layer::Context<'_, S>, ) { + #[cfg(feature = "experimental_metadata_attributes")] + let normalized_meta = event.normalized_metadata(); + #[cfg(feature = "experimental_metadata_attributes")] + let metadata = normalized_meta.as_ref().unwrap_or_else(|| event.metadata()); + + #[cfg(not(feature = "experimental_metadata_attributes"))] let metadata = event.metadata(); + let severity = severity_of_level(metadata.level()); let target = metadata.target(); let name = metadata.name(); @@ -486,15 +493,9 @@ where return; } - #[cfg(feature = "experimental_metadata_attributes")] - let normalized_meta = event.normalized_metadata(); - - #[cfg(feature = "experimental_metadata_attributes")] - let meta = normalized_meta.as_ref().unwrap_or_else(|| event.metadata()); - let mut log_record = self.logger.create_log_record(); - log_record.set_target(target); + log_record.set_target(target.to_string()); log_record.set_event_name(name); log_record.set_severity_number(severity); log_record.set_severity_text(metadata.level().as_str()); @@ -518,7 +519,7 @@ where let mut visitor = EventVisitor::new(&mut log_record); #[cfg(feature = "experimental_metadata_attributes")] - visitor.visit_experimental_metadata(meta); + visitor.visit_experimental_metadata(metadata); // Visit fields. event.record(&mut visitor); @@ -1009,13 +1010,21 @@ mod tests { // Validate common fields assert_eq!(log.instrumentation.name(), ""); assert_eq!(log.record.severity_number(), Some(Severity::Error)); - // Target and EventName from Log crate are "log" and "log event" respectively. // Validate target + #[cfg(feature = "experimental_metadata_attributes")] + // Target from Log crate are extracted from the log record. + assert_eq!( + log.record.target().expect("target is expected").to_string(), + "opentelemetry_appender_tracing::layer::tests" + ); + #[cfg(not(feature = "experimental_metadata_attributes"))] + // Target from Log crate is "log". assert_eq!( log.record.target().expect("target is expected").to_string(), "log" ); // Validate event name + // EventName from Log crate is "log event". assert_eq!( log.record.event_name().expect("event_name is expected"), "log event"