diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/log/Slf4jScopeDecorator.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/log/Slf4jScopeDecorator.java index 26d472710..4419b941b 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/log/Slf4jScopeDecorator.java +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/log/Slf4jScopeDecorator.java @@ -77,8 +77,8 @@ final class Slf4jScopeDecorator implements CurrentTraceContext.ScopeDecorator { final String legacyPreviousSpanId = MDC.get(LEGACY_SPAN_ID_NAME); final String legacySpanExportable = MDC.get(LEGACY_EXPORTABLE_NAME); final List> previousMdc = Stream - .concat(whitelistedBaggageKeys(currentSpan), - whitelistedPropagationKeys(currentSpan)) + .concat(whitelistedBaggageKeysWithValue(currentSpan), + whitelistedPropagationKeysWithValue(currentSpan)) .map((s) -> new AbstractMap.SimpleEntry<>(s, MDC.get(s))) .collect(Collectors.toList()); @@ -102,9 +102,9 @@ final class Slf4jScopeDecorator implements CurrentTraceContext.ScopeDecorator { log.trace("With parent: {}", currentSpan.parentId()); } } - whitelistedBaggageKeys(currentSpan).forEach( + whitelistedBaggageKeysWithValue(currentSpan).forEach( (s) -> MDC.put(s, ExtraFieldPropagation.get(currentSpan, s))); - whitelistedPropagationKeys(currentSpan).forEach( + whitelistedPropagationKeysWithValue(currentSpan).forEach( (s) -> MDC.put(s, ExtraFieldPropagation.get(currentSpan, s))); } else { @@ -116,8 +116,8 @@ final class Slf4jScopeDecorator implements CurrentTraceContext.ScopeDecorator { MDC.remove(LEGACY_PARENT_ID_NAME); MDC.remove(LEGACY_SPAN_ID_NAME); MDC.remove(LEGACY_EXPORTABLE_NAME); - whitelistedBaggageKeys(currentSpan).forEach(MDC::remove); - whitelistedPropagationKeys(currentSpan).forEach(MDC::remove); + whitelistedBaggageKeys().forEach(MDC::remove); + whitelistedPropagationKeys().forEach(MDC::remove); } /** @@ -146,18 +146,30 @@ final class Slf4jScopeDecorator implements CurrentTraceContext.ScopeDecorator { return new ThreadContextCurrentTraceContextScope(); } - private Stream whitelistedBaggageKeys(TraceContext context) { + private Stream whitelistedBaggageKeys() { return this.sleuthProperties.getBaggageKeys().stream().filter( - (s) -> this.sleuthSlf4jProperties.getWhitelistedMdcKeys().contains(s) - && context != null - && StringUtils.hasText(ExtraFieldPropagation.get(context, s))); + (s) -> this.sleuthSlf4jProperties.getWhitelistedMdcKeys().contains(s)); } - private Stream whitelistedPropagationKeys(TraceContext context) { + private Stream whitelistedBaggageKeysWithValue(TraceContext context) { + if (context == null) { + return Stream.empty(); + } + return whitelistedBaggageKeys().filter( + (s) -> StringUtils.hasText(ExtraFieldPropagation.get(context, s))); + } + + private Stream whitelistedPropagationKeys() { return this.sleuthProperties.getPropagationKeys().stream().filter( - (s) -> this.sleuthSlf4jProperties.getWhitelistedMdcKeys().contains(s) - && context != null - && StringUtils.hasText(ExtraFieldPropagation.get(context, s))); + (s) -> this.sleuthSlf4jProperties.getWhitelistedMdcKeys().contains(s)); + } + + private Stream whitelistedPropagationKeysWithValue(TraceContext context) { + if (context == null) { + return Stream.empty(); + } + return whitelistedPropagationKeys().filter( + (s) -> StringUtils.hasText(ExtraFieldPropagation.get(context, s))); } private void log(String text, TraceContext span) { diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/log/Slf4JSpanLoggerTest.java b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/log/Slf4JSpanLoggerTest.java index f016c8a41..8e818d409 100644 --- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/log/Slf4JSpanLoggerTest.java +++ b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/log/Slf4JSpanLoggerTest.java @@ -92,6 +92,26 @@ public class Slf4JSpanLoggerTest { assertThat(MDC.get("my-propagation")).isNullOrEmpty(); } + @Test + public void should_remove_entries_from_mdc_for_null_span() throws Exception { + ExtraFieldPropagation.set(this.span.context(), "my-baggage", "my-value"); + ExtraFieldPropagation.set(this.span.context(), "my-propagation", + "my-propagation-value"); + this.slf4jScopeDecorator.decorateScope(this.span.context(), () -> { + }); + + assertThat(MDC.get("my-baggage")).isEqualTo("my-value"); + assertThat(MDC.get("my-propagation")).isEqualTo("my-propagation-value"); + + Scope scope = this.slf4jScopeDecorator.decorateScope(null, () -> { + }); + + scope.close(); + + assertThat(MDC.get("my-baggage")).isNullOrEmpty(); + assertThat(MDC.get("my-propagation")).isNullOrEmpty(); + } + @Test public void should_remove_entries_from_mdc_from_null_span() throws Exception { MDC.put("X-B3-TraceId", "A");