diff --git a/Cargo.toml b/Cargo.toml index ed60e4c3..bed67183 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,7 +13,7 @@ serde_json = "1.0" serde_plain = "0.3.0" url_serde = "0.2.0" chrono = { version = "0.4.0", features = ["serde"] } -uuid = { version = "0.6.2", features = ["serde"] } +uuid = { version = "0.6.2", features = ["serde", "v4"] } [patch.crates-io] serde = { git = "https://github.com/mitsuhiko/serde", branch = "feature/flatten" } diff --git a/src/protocol/v7.rs b/src/protocol/v7.rs index 5c82d205..b4664834 100644 --- a/src/protocol/v7.rs +++ b/src/protocol/v7.rs @@ -437,6 +437,10 @@ pub struct ClientSdkInfo { #[derive(Serialize, Deserialize, Debug, Clone, PartialEq)] #[serde(default)] pub struct Event { + /// The ID of the event + #[serde(serialize_with = "serialize_event_id", rename = "event_id", + skip_serializing_if = "Option::is_none")] + pub id: Option, /// The level of the event (defaults to error) #[serde(skip_serializing_if = "Level::is_error")] pub level: Level, @@ -537,6 +541,7 @@ fn is_default_fingerprint(vec: &Vec) -> bool { impl Default for Event { fn default() -> Event { Event { + id: None, level: Level::Error, fingerprint: vec!["{{ default }}".into()], culprit: None, @@ -569,15 +574,11 @@ impl Default for Event { } impl Event { - /// Creates a new event without timestamp. + /// Creates a new event with the current timestamp and random id. pub fn new() -> Event { - Default::default() - } - - /// Creates a new event with the current timestamp. - pub fn new_with_current_timestamp() -> Event { - let mut rv = Event::new(); + let mut rv: Event = Default::default(); rv.timestamp = Some(Utc::now()); + rv.id = Some(Uuid::new_v4()); rv } } @@ -699,6 +700,17 @@ impl ContextType { } } +fn serialize_event_id(value: &Option, serializer: S) -> Result +where + S: Serializer, +{ + if let &Some(uuid) = value { + serializer.serialize_some(&uuid.simple().to_string()) + } else { + serializer.serialize_none() + } +} + fn deserialize_context<'de, D>(deserializer: D) -> Result, D::Error> where D: Deserializer<'de>, diff --git a/tests/test_protocol_v7.rs b/tests/test_protocol_v7.rs index 99e93409..d8c94c51 100644 --- a/tests/test_protocol_v7.rs +++ b/tests/test_protocol_v7.rs @@ -1,9 +1,28 @@ extern crate sentry_types; extern crate serde; extern crate serde_json; +extern crate uuid; use sentry_types::protocol::v7; +fn reserialize(event: &v7::Event) -> v7::Event { + let json = serde_json::to_string(event).unwrap(); + serde_json::from_str(&json).unwrap() +} + + +#[test] +fn test_event_default_vs_new() { + let event_new = reserialize(&v7::Event::new()); + let event_default = reserialize(&Default::default()); + + assert_eq!(event_default.id, None); + assert_eq!(event_default.timestamp, None); + + assert!(event_new.id.unwrap() != uuid::Uuid::nil()); + assert!(event_new.timestamp.is_some()); +} + #[test] fn test_basic_event() { let mut event: v7::Event = Default::default(); @@ -72,3 +91,13 @@ fn test_multi_exception_list() { }); assert_eq!(event, ref_event); } + +#[test] +fn test_basic_message_event() { + let mut event: v7::Event = Default::default(); + event.level = v7::Level::Warning; + event.message = Some("Hello World!".into()); + event.logger = Some("root".into()); + let json = serde_json::to_string(&event).unwrap(); + assert_eq!(&json, "{\"level\":\"warning\",\"message\":\"Hello World!\",\"logger\":\"root\"}"); +}