Skip to content

Commit

Permalink
fix(spans): Accept a UNIX timestamp for measurements (#3667)
Browse files Browse the repository at this point in the history
  • Loading branch information
phacops committed May 31, 2024
1 parent 703a2e1 commit 0be3ef2
Showing 1 changed file with 54 additions and 12 deletions.
66 changes: 54 additions & 12 deletions relay-profiling/src/measurements.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,24 @@ pub struct Measurement {
}

#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct MeasurementValue {
// nanoseconds elapsed since the start of the profile
#[serde(deserialize_with = "deserialize_number_from_string")]
elapsed_since_start_ns: u64,
#[serde(untagged)]
pub enum MeasurementValue {
Default {
// nanoseconds elapsed since the start of the profile
#[serde(deserialize_with = "deserialize_number_from_string")]
elapsed_since_start_ns: u64,

// Android 6.8.0 sends a string instead of a float64 so we need to accept both
#[serde(deserialize_with = "deserialize_number_from_string")]
value: f64,
// Android 6.8.0 sends a string instead of a float64 so we need to accept both
#[serde(deserialize_with = "deserialize_number_from_string")]
value: f64,
},
SampleV2 {
// UNIX timestamp in seconds as a float
timestamp: f64,

#[serde(deserialize_with = "deserialize_number_from_string")]
value: f64,
},
}

#[derive(Clone, Debug, Serialize, Deserialize)]
Expand All @@ -36,44 +46,69 @@ pub enum MeasurementUnit {
mod tests {
use super::*;

#[test]
fn test_roundtrip() {
let raw_value = r#"{"elapsed_since_start_ns":1234567890,"value":1234.56789}"#;
let parsed_value = serde_json::from_str::<MeasurementValue>(raw_value);
assert!(parsed_value.is_ok());
let value = parsed_value.unwrap();
let encoded_value = serde_json::to_string(&value).unwrap();
assert_eq!(encoded_value, raw_value);
}

#[test]
fn test_value_as_float() {
let measurement_json = r#"{"elapsed_since_start_ns":1234567890,"value":1234.56789}"#;
let measurement = serde_json::from_str::<MeasurementValue>(measurement_json);
assert!(measurement.is_ok());
assert_eq!(measurement.unwrap().value, 1234.56789);
match measurement.unwrap() {
MeasurementValue::Default { value, .. } => assert_eq!(value, 1234.56789),
_ => panic!("measurement wasn't properly decoded"),
}
}

#[test]
fn test_value_as_string() {
let measurement_json = r#"{"elapsed_since_start_ns":1234567890,"value":"1234.56789"}"#;
let measurement = serde_json::from_str::<MeasurementValue>(measurement_json);
assert!(measurement.is_ok());
assert_eq!(measurement.unwrap().value, 1234.56789);
match measurement.unwrap() {
MeasurementValue::Default { value, .. } => assert_eq!(value, 1234.56789),
_ => panic!("measurement wasn't properly decoded"),
}
}

#[test]
fn test_value_as_string_scientific_notation() {
let measurement_json = r#"{"elapsed_since_start_ns":1234567890,"value":"1e3"}"#;
let measurement = serde_json::from_str::<MeasurementValue>(measurement_json);
assert!(measurement.is_ok());
assert_eq!(measurement.unwrap().value, 1e3f64);
match measurement.unwrap() {
MeasurementValue::Default { value, .. } => assert_eq!(value, 1e3f64),
_ => panic!("measurement wasn't properly decoded"),
}
}

#[test]
fn test_value_as_string_infinity() {
let measurement_json = r#"{"elapsed_since_start_ns":1234567890,"value":"+Infinity"}"#;
let measurement = serde_json::from_str::<MeasurementValue>(measurement_json);
assert!(measurement.is_ok());
assert_eq!(measurement.unwrap().value, f64::INFINITY);
match measurement.unwrap() {
MeasurementValue::Default { value, .. } => assert_eq!(value, f64::INFINITY),
_ => panic!("measurement wasn't properly decoded"),
}
}

#[test]
fn test_value_as_float_scientific_notation() {
let measurement_json = r#"{"elapsed_since_start_ns":1234567890,"value":1e3}"#;
let measurement = serde_json::from_str::<MeasurementValue>(measurement_json);
assert!(measurement.is_ok());
assert_eq!(measurement.unwrap().value, 1e3f64);
match measurement.unwrap() {
MeasurementValue::Default { value, .. } => assert_eq!(value, 1e3f64),
_ => panic!("measurement wasn't properly decoded"),
}
}

#[test]
Expand All @@ -82,4 +117,11 @@ mod tests {
let measurement = serde_json::from_str::<MeasurementValue>(measurement_json);
assert!(measurement.is_err());
}

#[test]
fn test_with_timestamp_only() {
let measurement_json = r#"{"timestamp":1717161756.408,"value":10.3}"#;
let measurement = serde_json::from_str::<MeasurementValue>(measurement_json);
assert!(measurement.is_ok());
}
}

0 comments on commit 0be3ef2

Please sign in to comment.