diff --git a/CHANGELOG.md b/CHANGELOG.md index cd5b4094400..c7058d2efd8 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) +* 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) 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..97676815b72 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; @@ -20,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; @@ -185,10 +185,15 @@ SentryEvent createEvent(final @NotNull LogRecord record) { if (throwable != null) { event.setThrowable(throwable); } - final Map mdcProperties = - CollectionUtils.shallowCopy(MDC.getMDCAdapter().getCopyOfContextMap()); - if (mdcProperties != null && !mdcProperties.isEmpty()) { - event.getContexts().put("MDC", mdcProperties); + 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; 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)