diff --git a/opentelemetry-sdk/src/attributes/set.rs b/opentelemetry-sdk/src/attributes/set.rs index 644f44e0f5..7775d20692 100644 --- a/opentelemetry-sdk/src/attributes/set.rs +++ b/opentelemetry-sdk/src/attributes/set.rs @@ -8,8 +8,6 @@ use std::{ use opentelemetry::{Array, Key, KeyValue, Value}; use ordered_float::OrderedFloat; -use crate::Resource; - #[derive(Clone, Debug)] struct HashKeyValue(KeyValue); @@ -87,17 +85,6 @@ impl From<&[KeyValue]> for AttributeSet { } } -impl From<&Resource> for AttributeSet { - fn from(values: &Resource) -> Self { - let vec = values - .iter() - .map(|(key, value)| HashKeyValue(KeyValue::new(key.clone(), value.clone()))) - .collect::<Vec<_>>(); - - AttributeSet::new(vec) - } -} - fn calculate_hash(values: &[HashKeyValue]) -> u64 { let mut hasher = DefaultHasher::new(); values.iter().fold(&mut hasher, |mut hasher, item| { @@ -146,3 +133,52 @@ impl Hash for AttributeSet { state.write_u64(self.1) } } + +#[cfg(test)] +mod tests { + use std::hash::DefaultHasher; + use std::hash::{Hash, Hasher}; + + use crate::attributes::set::HashKeyValue; + use opentelemetry::KeyValue; + + #[test] + fn equality_kv_float() { + let kv1 = HashKeyValue(KeyValue::new("key", 1.0)); + let kv2 = HashKeyValue(KeyValue::new("key", 1.0)); + assert_eq!(kv1, kv2); + + let kv1 = HashKeyValue(KeyValue::new("key", 1.0)); + let kv2 = HashKeyValue(KeyValue::new("key", 1.01)); + assert_ne!(kv1, kv2); + + let kv1 = HashKeyValue(KeyValue::new("key", std::f64::NAN)); + let kv2 = HashKeyValue(KeyValue::new("key", std::f64::NAN)); + assert_eq!(kv1, kv2); + + let kv1 = HashKeyValue(KeyValue::new("key", std::f64::INFINITY)); + let kv2 = HashKeyValue(KeyValue::new("key", std::f64::INFINITY)); + assert_eq!(kv1, kv2); + } + + #[test] + fn hash_kv_float() { + let kv1 = HashKeyValue(KeyValue::new("key", 1.0)); + let kv2 = HashKeyValue(KeyValue::new("key", 1.0)); + assert_eq!(hash_helper(&kv1), hash_helper(&kv2)); + + let kv1 = HashKeyValue(KeyValue::new("key", std::f64::NAN)); + let kv2 = HashKeyValue(KeyValue::new("key", std::f64::NAN)); + assert_eq!(hash_helper(&kv1), hash_helper(&kv2)); + + let kv1 = HashKeyValue(KeyValue::new("key", std::f64::INFINITY)); + let kv2 = HashKeyValue(KeyValue::new("key", std::f64::INFINITY)); + assert_eq!(hash_helper(&kv1), hash_helper(&kv2)); + } + + fn hash_helper<T: Hash>(item: &T) -> u64 { + let mut hasher = DefaultHasher::new(); + item.hash(&mut hasher); + hasher.finish() + } +} diff --git a/opentelemetry-stdout/src/logs/transform.rs b/opentelemetry-stdout/src/logs/transform.rs index 7beaa7cc76..b2f5a43a57 100644 --- a/opentelemetry-stdout/src/logs/transform.rs +++ b/opentelemetry-stdout/src/logs/transform.rs @@ -1,10 +1,9 @@ use std::{borrow::Cow, collections::HashMap, time::SystemTime}; use crate::common::{ - as_human_readable, as_opt_human_readable, as_opt_unix_nano, as_unix_nano, KeyValue, Resource, - Scope, Value, + as_human_readable, as_opt_human_readable, as_opt_unix_nano, as_unix_nano, AttributeSet, + KeyValue, Resource, Scope, Value, }; -use opentelemetry_sdk::AttributeSet; use serde::Serialize; /// Transformed logs data that can be serialized. diff --git a/opentelemetry-stdout/src/trace/transform.rs b/opentelemetry-stdout/src/trace/transform.rs index 73729606df..66a659de07 100644 --- a/opentelemetry-stdout/src/trace/transform.rs +++ b/opentelemetry-stdout/src/trace/transform.rs @@ -1,5 +1,4 @@ -use crate::common::{as_human_readable, as_unix_nano, KeyValue, Resource, Scope}; -use opentelemetry_sdk::AttributeSet; +use crate::common::{as_human_readable, as_unix_nano, AttributeSet, KeyValue, Resource, Scope}; use serde::{Serialize, Serializer}; use std::{borrow::Cow, collections::HashMap, time::SystemTime};