From 1bdbb60a1562f8bdee658f191c85b0c0a6fae177 Mon Sep 17 00:00:00 2001 From: wreulicke <12907474+wreulicke@users.noreply.github.com> Date: Thu, 8 Apr 2021 19:56:58 +0900 Subject: [PATCH 1/9] Avoid NPE when MDC contains null values --- sentry-jul/src/main/java/io/sentry/jul/SentryHandler.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/sentry-jul/src/main/java/io/sentry/jul/SentryHandler.java b/sentry-jul/src/main/java/io/sentry/jul/SentryHandler.java index 564d0834b58..153e77d08c7 100644 --- a/sentry-jul/src/main/java/io/sentry/jul/SentryHandler.java +++ b/sentry-jul/src/main/java/io/sentry/jul/SentryHandler.java @@ -185,10 +185,11 @@ SentryEvent createEvent(final @NotNull LogRecord record) { if (throwable != null) { event.setThrowable(throwable); } - final Map mdcProperties = - CollectionUtils.shallowCopy(MDC.getMDCAdapter().getCopyOfContextMap()); + final Map mdcProperties = MDC.getMDCAdapter().getCopyOfContextMap(); if (mdcProperties != null && !mdcProperties.isEmpty()) { - event.getContexts().put("MDC", mdcProperties); + event.getContexts().put("MDC", mdcProperties.entrySet().stream() + .filter(it -> it.getValue() != null) + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue))); } event.setExtra(THREAD_ID, record.getThreadID()); return event; From 3a66a095d6e69a8889d7ff26ce3ae0e0aadfa3d6 Mon Sep 17 00:00:00 2001 From: wreulicke <12907474+wreulicke@users.noreply.github.com> Date: Thu, 8 Apr 2021 19:58:32 +0900 Subject: [PATCH 2/9] Remove unused import --- sentry-jul/src/main/java/io/sentry/jul/SentryHandler.java | 1 - 1 file changed, 1 deletion(-) diff --git a/sentry-jul/src/main/java/io/sentry/jul/SentryHandler.java b/sentry-jul/src/main/java/io/sentry/jul/SentryHandler.java index 153e77d08c7..c66f8c155de 100644 --- a/sentry-jul/src/main/java/io/sentry/jul/SentryHandler.java +++ b/sentry-jul/src/main/java/io/sentry/jul/SentryHandler.java @@ -8,7 +8,6 @@ import io.sentry.SentryOptions; import io.sentry.protocol.Message; import io.sentry.protocol.SdkVersion; -import io.sentry.util.CollectionUtils; import java.text.MessageFormat; import java.util.ArrayList; import java.util.Date; From 170893a05edc3b33cef190b65f80c393a20795ce Mon Sep 17 00:00:00 2001 From: wreulicke <12907474+wreulicke@users.noreply.github.com> Date: Thu, 8 Apr 2021 20:00:21 +0900 Subject: [PATCH 3/9] Add reference to changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cd5b4094400..54c1e5dbd1a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,7 @@ # Unreleased * Feat: Add option to ignore exceptions by type (#1352) -* Fix: Fix NPE when MDC contains null values (#1364) +* Fix: Fix NPE when MDC contains null values (#1364, #1385) * Feat: Sentry closes Android NDK and ShutdownHook integrations (#1358) * Enhancement: Allow inheritance of SentryHandler class in sentry-jul package(#1367) * Fix: Accept only non null value maps (#1368) From 9b38d748da37631a16476905c5c5b9a6061fa49b Mon Sep 17 00:00:00 2001 From: wreulicke Date: Thu, 8 Apr 2021 20:21:50 +0900 Subject: [PATCH 4/9] Apply spotless --- .../src/main/java/io/sentry/jul/SentryHandler.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/sentry-jul/src/main/java/io/sentry/jul/SentryHandler.java b/sentry-jul/src/main/java/io/sentry/jul/SentryHandler.java index c66f8c155de..66db4a4793a 100644 --- a/sentry-jul/src/main/java/io/sentry/jul/SentryHandler.java +++ b/sentry-jul/src/main/java/io/sentry/jul/SentryHandler.java @@ -186,9 +186,13 @@ SentryEvent createEvent(final @NotNull LogRecord record) { } final Map mdcProperties = MDC.getMDCAdapter().getCopyOfContextMap(); if (mdcProperties != null && !mdcProperties.isEmpty()) { - event.getContexts().put("MDC", mdcProperties.entrySet().stream() - .filter(it -> it.getValue() != null) - .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue))); + event + .getContexts() + .put( + "MDC", + mdcProperties.entrySet().stream() + .filter(it -> it.getValue() != null) + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue))); } event.setExtra(THREAD_ID, record.getThreadID()); return event; From 4fee690b98bb044f90cc1e66b4277a8d84f33612 Mon Sep 17 00:00:00 2001 From: wreulicke <12907474+wreulicke@users.noreply.github.com> Date: Thu, 8 Apr 2021 20:15:51 +0900 Subject: [PATCH 5/9] Update CHANGELOG.md --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 54c1e5dbd1a..8b9fae14e57 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,8 @@ # Unreleased * Feat: Add option to ignore exceptions by type (#1352) -* Fix: Fix NPE when MDC contains null values (#1364, #1385) +* Fix: Fix NPE when MDC contains null values (#1364) +* Fix: Avoid NPE when MDC contains null values(#1385) * Feat: Sentry closes Android NDK and ShutdownHook integrations (#1358) * Enhancement: Allow inheritance of SentryHandler class in sentry-jul package(#1367) * Fix: Accept only non null value maps (#1368) From 5f915ee9fd8b65257f28133727ef30f5dbdf3dbd Mon Sep 17 00:00:00 2001 From: wreulicke <12907474+wreulicke@users.noreply.github.com> Date: Thu, 8 Apr 2021 21:15:43 +0900 Subject: [PATCH 6/9] Add missing import --- sentry-jul/src/main/java/io/sentry/jul/SentryHandler.java | 1 + 1 file changed, 1 insertion(+) diff --git a/sentry-jul/src/main/java/io/sentry/jul/SentryHandler.java b/sentry-jul/src/main/java/io/sentry/jul/SentryHandler.java index 66db4a4793a..4d38b5207bf 100644 --- a/sentry-jul/src/main/java/io/sentry/jul/SentryHandler.java +++ b/sentry-jul/src/main/java/io/sentry/jul/SentryHandler.java @@ -19,6 +19,7 @@ import java.util.logging.Level; import java.util.logging.LogManager; import java.util.logging.LogRecord; +import java.util.stream.Collectors; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.TestOnly; From aa67f39d012b195e64ed7fc401677bbde29c4373 Mon Sep 17 00:00:00 2001 From: wreulicke <12907474+wreulicke@users.noreply.github.com> Date: Thu, 8 Apr 2021 21:39:19 +0900 Subject: [PATCH 7/9] Update CHANGELOG.md Co-authored-by: Manoel Aranda Neto <5731772+marandaneto@users.noreply.github.com> --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8b9fae14e57..c7058d2efd8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,8 @@ # Unreleased * Feat: Add option to ignore exceptions by type (#1352) -* Fix: Fix NPE when MDC contains null values (#1364) -* Fix: Avoid NPE when MDC contains null values(#1385) +* Fix: Fix NPE when MDC contains null values (sentry-logback) (#1364) +* Fix: Avoid NPE when MDC contains null values (sentry-jul) (#1385) * Feat: Sentry closes Android NDK and ShutdownHook integrations (#1358) * Enhancement: Allow inheritance of SentryHandler class in sentry-jul package(#1367) * Fix: Accept only non null value maps (#1368) From 7dec9709516615e432c5bbfdfd0697bbdc72eac3 Mon Sep 17 00:00:00 2001 From: wreulicke Date: Fri, 9 Apr 2021 10:05:04 +0900 Subject: [PATCH 8/9] Avoid NPE properly --- .../main/java/io/sentry/jul/SentryHandler.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/sentry-jul/src/main/java/io/sentry/jul/SentryHandler.java b/sentry-jul/src/main/java/io/sentry/jul/SentryHandler.java index 4d38b5207bf..97676815b72 100644 --- a/sentry-jul/src/main/java/io/sentry/jul/SentryHandler.java +++ b/sentry-jul/src/main/java/io/sentry/jul/SentryHandler.java @@ -185,15 +185,15 @@ SentryEvent createEvent(final @NotNull LogRecord record) { if (throwable != null) { event.setThrowable(throwable); } - final Map mdcProperties = MDC.getMDCAdapter().getCopyOfContextMap(); - if (mdcProperties != null && !mdcProperties.isEmpty()) { - event - .getContexts() - .put( - "MDC", - mdcProperties.entrySet().stream() - .filter(it -> it.getValue() != null) - .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue))); + Map mdcProperties = MDC.getMDCAdapter().getCopyOfContextMap(); + if (mdcProperties != null) { + mdcProperties = + mdcProperties.entrySet().stream() + .filter(it -> it.getValue() != null) + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); + if (!mdcProperties.isEmpty()) { + event.getContexts().put("MDC", mdcProperties); + } } event.setExtra(THREAD_ID, record.getThreadID()); return event; From cbe4ae4177ec3916a5cfde86ef73b95e73b5ba76 Mon Sep 17 00:00:00 2001 From: wreulicke Date: Fri, 9 Apr 2021 10:05:54 +0900 Subject: [PATCH 9/9] Add test to check avoiding NPE --- .../test/kotlin/io/sentry/jul/SentryHandlerTest.kt | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/sentry-jul/src/test/kotlin/io/sentry/jul/SentryHandlerTest.kt b/sentry-jul/src/test/kotlin/io/sentry/jul/SentryHandlerTest.kt index 622c409d5d5..f69390c9d5b 100644 --- a/sentry-jul/src/test/kotlin/io/sentry/jul/SentryHandlerTest.kt +++ b/sentry-jul/src/test/kotlin/io/sentry/jul/SentryHandlerTest.kt @@ -287,6 +287,19 @@ class SentryHandlerTest { } } + @Test + fun `ignore set tags with null values from MDC`() { + fixture = Fixture(minimumEventLevel = Level.WARNING) + MDC.put("key", null) + fixture.logger.warning("testing MDC tags") + + await.untilAsserted { + verify(fixture.transport).send(checkEvent { event -> + assertFalse(event.contexts.containsKey("MDC")) + }, anyOrNull()) + } + } + @Test fun `does not create MDC context when no MDC tags are set`() { fixture = Fixture(minimumEventLevel = Level.WARNING)