diff --git a/opentelemetry-api/src/logs/record.rs b/opentelemetry-api/src/logs/record.rs index 6cd47c25bb..c98b3a7581 100644 --- a/opentelemetry-api/src/logs/record.rs +++ b/opentelemetry-api/src/logs/record.rs @@ -27,7 +27,7 @@ pub struct LogRecord { pub body: Option, /// Additional attributes associated with this record - pub attributes: Option>, + pub attributes: Option>, } impl LogRecord { @@ -326,8 +326,9 @@ impl LogRecordBuilder { } } - /// Assign attributes, overriding previously set attributes - pub fn with_attributes(self, attributes: OrderMap) -> Self { + /// Assign attributes. + /// The SDK doesn't carry on any deduplication on these attributes. + pub fn with_attributes(self, attributes: Vec<(Key, AnyValue)>) -> Self { Self { record: LogRecord { attributes: Some(attributes), @@ -336,18 +337,18 @@ impl LogRecordBuilder { } } - /// Set a single attribute for this record + /// Set a single attribute for this record. + /// The SDK doesn't carry on any deduplication on these attributes. pub fn with_attribute(mut self, key: K, value: V) -> Self where K: Into, V: Into, { - if let Some(ref mut map) = self.record.attributes { - map.insert(key.into(), value.into()); + if let Some(ref mut vec) = self.record.attributes { + vec.push((key.into(), value.into())); } else { - let mut map = OrderMap::with_capacity(1); - map.insert(key.into(), value.into()); - self.record.attributes = Some(map); + let vec = vec![(key.into(), value.into())]; + self.record.attributes = Some(vec); } self diff --git a/opentelemetry-appender-tracing/src/layer.rs b/opentelemetry-appender-tracing/src/layer.rs index 1719a5223c..14ff32a49d 100644 --- a/opentelemetry-appender-tracing/src/layer.rs +++ b/opentelemetry-appender-tracing/src/layer.rs @@ -1,7 +1,6 @@ -use opentelemetry_api::{ - logs::{AnyValue, LogRecord, Logger, LoggerProvider, Severity}, - Key, OrderMap, -}; +use std::vec; + +use opentelemetry_api::logs::{LogRecord, Logger, LoggerProvider, Severity}; use tracing_subscriber::Layer; @@ -16,52 +15,47 @@ impl<'a> tracing::field::Visit for EventVisitor<'a> { fn record_debug(&mut self, field: &tracing::field::Field, value: &dyn std::fmt::Debug) { if field.name() == "message" { self.log_record.body = Some(format!("{value:?}").into()); - } else if let Some(ref mut map) = self.log_record.attributes { - map.insert(field.name().into(), format!("{value:?}").into()); + } else if let Some(ref mut vec) = self.log_record.attributes { + vec.push((field.name().into(), format!("{value:?}").into())); } else { - let mut map = OrderMap::with_capacity(1); - map.insert(field.name().into(), format!("{value:?}").into()); - self.log_record.attributes = Some(map); + let vec = vec![(field.name().into(), format!("{value:?}").into())]; + self.log_record.attributes = Some(vec); } } fn record_str(&mut self, field: &tracing_core::Field, value: &str) { - if let Some(ref mut map) = self.log_record.attributes { - map.insert(field.name().into(), value.to_owned().into()); + if let Some(ref mut vec) = self.log_record.attributes { + vec.push((field.name().into(), value.to_owned().into())); } else { - let mut map: OrderMap = OrderMap::with_capacity(1); - map.insert(field.name().into(), value.to_owned().into()); - self.log_record.attributes = Some(map); + let vec = vec![(field.name().into(), value.to_owned().into())]; + self.log_record.attributes = Some(vec); } } fn record_bool(&mut self, field: &tracing_core::Field, value: bool) { - if let Some(ref mut map) = self.log_record.attributes { - map.insert(field.name().into(), value.into()); + if let Some(ref mut vec) = self.log_record.attributes { + vec.push((field.name().into(), value.into())); } else { - let mut map = OrderMap::with_capacity(1); - map.insert(field.name().into(), value.into()); - self.log_record.attributes = Some(map); + let vec = vec![(field.name().into(), value.into())]; + self.log_record.attributes = Some(vec); } } fn record_f64(&mut self, field: &tracing::field::Field, value: f64) { - if let Some(ref mut map) = self.log_record.attributes { - map.insert(field.name().into(), value.into()); + if let Some(ref mut vec) = self.log_record.attributes { + vec.push((field.name().into(), value.into())); } else { - let mut map = OrderMap::with_capacity(1); - map.insert(field.name().into(), value.into()); - self.log_record.attributes = Some(map); + let vec = vec![(field.name().into(), value.into())]; + self.log_record.attributes = Some(vec); } } fn record_i64(&mut self, field: &tracing::field::Field, value: i64) { - if let Some(ref mut map) = self.log_record.attributes { - map.insert(field.name().into(), value.into()); + if let Some(ref mut vec) = self.log_record.attributes { + vec.push((field.name().into(), value.into())); } else { - let mut map = OrderMap::with_capacity(1); - map.insert(field.name().into(), value.into()); - self.log_record.attributes = Some(map); + let vec = vec![(field.name().into(), value.into())]; + self.log_record.attributes = Some(vec); } } diff --git a/opentelemetry-user-events-logs/src/logs/exporter.rs b/opentelemetry-user-events-logs/src/logs/exporter.rs index 354b1830c4..a7853bbe58 100644 --- a/opentelemetry-user-events-logs/src/logs/exporter.rs +++ b/opentelemetry-user-events-logs/src/logs/exporter.rs @@ -107,22 +107,22 @@ impl UserEventsExporter { fn add_attributes_to_event( &self, eb: &mut EventBuilder, - attribs: &mut dyn Iterator, + attribs: &mut dyn Iterator, ) { for attrib in attribs { if attrib.0.to_string() == EVENT_ID || attrib.0.to_string() == EVENT_NAME { continue; } let field_name = &attrib.0.to_string(); - match attrib.1 { + match attrib.1.to_owned() { AnyValue::Boolean(b) => { - eb.add_value(field_name, *b, FieldFormat::Boolean, 0); + eb.add_value(field_name, b, FieldFormat::Boolean, 0); } AnyValue::Int(i) => { - eb.add_value(field_name, *i, FieldFormat::SignedInt, 0); + eb.add_value(field_name, i, FieldFormat::SignedInt, 0); } AnyValue::Double(f) => { - eb.add_value(field_name, *f, FieldFormat::Float, 0); + eb.add_value(field_name, f, FieldFormat::Float, 0); } AnyValue::String(s) => { eb.add_str(field_name, &s.to_string(), FieldFormat::Default, 0); @@ -221,7 +221,7 @@ impl UserEventsExporter { let (mut event_id, mut event_name) = (0, ""); let mut event_count = 0; if log_data.record.attributes.is_some() { - for (k, v) in log_data.record.attributes.as_ref().unwrap().into_iter() { + for (k, v) in log_data.record.attributes.as_ref().unwrap().iter() { if k.as_str() == EVENT_ID { event_id = match v { AnyValue::Int(value) => {