diff --git a/opentelemetry-sdk/src/attributes/set.rs b/opentelemetry-sdk/src/attributes/set.rs index 4dff0822f5..06490879a1 100644 --- a/opentelemetry-sdk/src/attributes/set.rs +++ b/opentelemetry-sdk/src/attributes/set.rs @@ -1,6 +1,6 @@ +use std::collections::HashSet; use std::{ cmp::Ordering, - collections::{BTreeSet, HashSet}, hash::{Hash, Hasher}, }; @@ -105,36 +105,37 @@ impl Eq for HashKeyValue {} /// This must implement [Hash], [PartialEq], and [Eq] so it may be used as /// HashMap keys and other de-duplication methods. #[derive(Clone, Default, Debug, Hash, PartialEq, Eq)] -pub struct AttributeSet(BTreeSet); +pub struct AttributeSet(Vec); impl From<&[KeyValue]> for AttributeSet { fn from(values: &[KeyValue]) -> Self { - let mut seen = HashSet::with_capacity(values.len()); - AttributeSet( - values - .iter() - .rev() - .filter_map(|kv| { - if seen.contains(&&kv.key) { - None - } else { - seen.insert(&kv.key); - Some(HashKeyValue(kv.clone())) - } - }) - .collect(), - ) + let mut seen_keys = HashSet::with_capacity(values.len()); + let mut vec = values + .iter() + .rev() + .filter_map(|kv| { + if seen_keys.insert(kv.key.clone()) { + Some(HashKeyValue(kv.clone())) + } else { + None + } + }) + .collect::>(); + vec.sort_unstable(); + + AttributeSet(vec) } } impl From<&Resource> for AttributeSet { fn from(values: &Resource) -> Self { - AttributeSet( - values - .iter() - .map(|(key, value)| HashKeyValue(KeyValue::new(key.clone(), value.clone()))) - .collect(), - ) + let mut vec = values + .iter() + .map(|(key, value)| HashKeyValue(KeyValue::new(key.clone(), value.clone()))) + .collect::>(); + vec.sort_unstable(); + + AttributeSet(vec) } }