From 4cd2b3fba1400244fa38715e80a50e7faf6b327d Mon Sep 17 00:00:00 2001 From: Manoel Aranda Neto <marandaneto@gmail.com> Date: Tue, 11 Feb 2020 12:02:53 +0100 Subject: [PATCH 1/2] support mills timestamp --- .../adapters/DateDeserializerAdapter.java | 10 +++++++- .../android/core/AndroidSerializerTest.kt | 24 +++++++++++++++++++ .../main/java/io/sentry/core/DateUtils.java | 23 ++++++++++++++++-- 3 files changed, 54 insertions(+), 3 deletions(-) diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/adapters/DateDeserializerAdapter.java b/sentry-android-core/src/main/java/io/sentry/android/core/adapters/DateDeserializerAdapter.java index 1ec509810..01f632547 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/adapters/DateDeserializerAdapter.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/adapters/DateDeserializerAdapter.java @@ -27,7 +27,15 @@ public Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationConte try { return json == null ? null : DateUtils.getDateTime(json.getAsString()); } catch (Exception e) { - logger.log(SentryLevel.ERROR, "Error when deserializing Date", e); + logger.log( + SentryLevel.ERROR, + "Error when deserializing UTC timestamp format, might be mills timestamp format.", + e); + } + try { + return DateUtils.getDateTimeWithMillsPrecision(json.getAsString()); + } catch (Exception e) { + logger.log(SentryLevel.ERROR, "Error when deserializing mills timestamp format.", e); } return null; } diff --git a/sentry-android-core/src/test/java/io/sentry/android/core/AndroidSerializerTest.kt b/sentry-android-core/src/test/java/io/sentry/android/core/AndroidSerializerTest.kt index 715728f7c..fad6386d4 100644 --- a/sentry-android-core/src/test/java/io/sentry/android/core/AndroidSerializerTest.kt +++ b/sentry-android-core/src/test/java/io/sentry/android/core/AndroidSerializerTest.kt @@ -73,6 +73,30 @@ class AndroidSerializerTest { assertEquals(expected, actual.timestamp) } + @Test + fun `when deserializing mills timestamp, it should become a SentryEvent-Date`() { + val dateIsoFormat = "1581410911" + val expected = DateUtils.getDateTimeWithMillsPrecision(dateIsoFormat) + + val jsonEvent = "{\"timestamp\":\"$dateIsoFormat\"}" + + val actual = serializer.deserializeEvent(StringReader(jsonEvent)) + + assertEquals(expected, actual.timestamp) + } + + @Test + fun `when deserializing mills timestamp with mills precision, it should become a SentryEvent-Date`() { + val dateIsoFormat = "1581410911.988" + val expected = DateUtils.getDateTimeWithMillsPrecision(dateIsoFormat) + + val jsonEvent = "{\"timestamp\":\"$dateIsoFormat\"}" + + val actual = serializer.deserializeEvent(StringReader(jsonEvent)) + + assertEquals(expected, actual.timestamp) + } + @Test fun `when deserializing unknown properties, it should be added to unknown field`() { val sentryEvent = generateEmptySentryEvent() diff --git a/sentry-core/src/main/java/io/sentry/core/DateUtils.java b/sentry-core/src/main/java/io/sentry/core/DateUtils.java index b1825a1a4..c93bb8483 100644 --- a/sentry-core/src/main/java/io/sentry/core/DateUtils.java +++ b/sentry-core/src/main/java/io/sentry/core/DateUtils.java @@ -40,9 +40,9 @@ public static Date getCurrentDateTime() { } /** - * Get date + * Get Java Date from UTC timestamp format * - * @param timestamp already UTC format + * @param timestamp UTC format eg 2000-12-31T23:59:58Z * @return the Date */ public static Date getDateTime(String timestamp) throws IllegalArgumentException { @@ -54,6 +54,25 @@ public static Date getDateTime(String timestamp) throws IllegalArgumentException } } + /** + * Get Java Date from mills timestamp format + * + * @param timestamp mills format eg 1581410911.988 (1581410911 seconds and 988 mills) + * @return the Date + */ + public static Date getDateTimeWithMillsPrecision(String timestamp) + throws IllegalArgumentException { + try { + String[] times = timestamp.split("\\.", -1); + long seconds = Long.parseLong(times[0]); + long mills = times.length > 1 ? Long.parseLong(times[1]) : 0; + + return new Date((seconds * 1000) + mills); + } catch (NumberFormatException e) { + throw new IllegalArgumentException("timestamp is not mills format " + timestamp); + } + } + /** * Get date formatted as expected by Sentry. * From fecdf933b7a59b899f150bc7b3e0fcbd0eee1891 Mon Sep 17 00:00:00 2001 From: Manoel Aranda Neto <marandaneto@gmail.com> Date: Tue, 11 Feb 2020 14:18:27 +0100 Subject: [PATCH 2/2] change log level when deserializing UTC timestamp error --- .../sentry/android/core/adapters/DateDeserializerAdapter.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/adapters/DateDeserializerAdapter.java b/sentry-android-core/src/main/java/io/sentry/android/core/adapters/DateDeserializerAdapter.java index 01f632547..6733b2699 100644 --- a/sentry-android-core/src/main/java/io/sentry/android/core/adapters/DateDeserializerAdapter.java +++ b/sentry-android-core/src/main/java/io/sentry/android/core/adapters/DateDeserializerAdapter.java @@ -28,8 +28,8 @@ public Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationConte return json == null ? null : DateUtils.getDateTime(json.getAsString()); } catch (Exception e) { logger.log( - SentryLevel.ERROR, - "Error when deserializing UTC timestamp format, might be mills timestamp format.", + SentryLevel.DEBUG, + "Error when deserializing UTC timestamp format, it might be mills timestamp format.", e); } try {