diff --git a/benchmarks/pom.xml b/benchmarks/pom.xml index 2eb9c7701..05e532600 100644 --- a/benchmarks/pom.xml +++ b/benchmarks/pom.xml @@ -33,7 +33,7 @@ 1.8 1.8 2.3.0.BUILD-SNAPSHOT - 5.12.2 + 5.12.3 3.14.6 diff --git a/pom.xml b/pom.xml index 17030f1b8..eca5fff4f 100644 --- a/pom.xml +++ b/pom.xml @@ -243,7 +243,7 @@ 3.1.0.BUILD-SNAPSHOT 3.0.0-SNAPSHOT 3.0.0-SNAPSHOT - 5.12.2 + 5.12.3 2.1.7.RELEASE false 3.14.6 diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/autoconfig/TraceAutoConfiguration.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/autoconfig/TraceAutoConfiguration.java index 68214098c..73baccf9c 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/autoconfig/TraceAutoConfiguration.java +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/autoconfig/TraceAutoConfiguration.java @@ -16,7 +16,9 @@ package org.springframework.cloud.sleuth.autoconfig; +import java.util.ArrayList; import java.util.Collections; +import java.util.Comparator; import java.util.List; import brave.CurrentSpanCustomizer; @@ -37,6 +39,7 @@ import zipkin2.Span; import zipkin2.reporter.InMemoryReporterMetrics; import zipkin2.reporter.Reporter; import zipkin2.reporter.ReporterMetrics; +import zipkin2.reporter.brave.ZipkinSpanHandler; import zipkin2.reporter.metrics.micrometer.MicrometerReporterMetrics; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; @@ -82,6 +85,22 @@ public class TraceAutoConfiguration { */ public static final String DEFAULT_SERVICE_NAME = "default"; + /** + * Sort Zipkin Handlers last, so that redactions etc happen prior. + */ + static final Comparator SPAN_HANDLER_COMPARATOR = (o1, o2) -> { + if (o1 instanceof ZipkinSpanHandler) { + if (o2 instanceof ZipkinSpanHandler) { + return 0; + } + return 1; + } + else if (o2 instanceof ZipkinSpanHandler) { + return -1; + } + return 0; + }; + @Bean @ConditionalOnMissingBean // NOTE: stable bean name as might be used outside sleuth @@ -110,9 +129,21 @@ public class TraceAutoConfiguration { customizer.customize(builder); } } + + reorderZipkinHandlersLast(builder); return builder.build(); } + private void reorderZipkinHandlersLast(Tracing.Builder builder) { + List configuredSpanHandlers = new ArrayList<>( + builder.spanHandlers()); + configuredSpanHandlers.sort(SPAN_HANDLER_COMPARATOR); + builder.clearSpanHandlers(); + for (SpanHandler spanHandler : configuredSpanHandlers) { + builder.addSpanHandler(spanHandler); + } + } + @Bean(name = TRACER_BEAN_NAME) @ConditionalOnMissingBean Tracer tracer(Tracing tracing) { diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/autoconfig/TraceBaggageConfiguration.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/autoconfig/TraceBaggageConfiguration.java index 8076b2df5..3675245db 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/autoconfig/TraceBaggageConfiguration.java +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/autoconfig/TraceBaggageConfiguration.java @@ -62,7 +62,7 @@ import org.springframework.lang.Nullable; * @since 2.0.0 */ @Configuration(proxyBeanMethods = false) -@EnableConfigurationProperties(SleuthBaggageProperties.class) +@EnableConfigurationProperties({ SleuthProperties.class, SleuthBaggageProperties.class }) class TraceBaggageConfiguration { static final Log logger = LogFactory.getLog(TraceBaggageConfiguration.class); diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/autoconfig/TraceAutoConfigurationPropagationCustomizationTests.java b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/autoconfig/TraceAutoConfigurationPropagationCustomizationTests.java index 75b3de59c..f7da8c5a6 100644 --- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/autoconfig/TraceAutoConfigurationPropagationCustomizationTests.java +++ b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/autoconfig/TraceAutoConfigurationPropagationCustomizationTests.java @@ -33,8 +33,7 @@ import org.springframework.context.annotation.Configuration; public class TraceAutoConfigurationPropagationCustomizationTests { // Default for spring-messaging is on 2.2.x is MULTI, though 3.x it is - // SINGLE_NO_PARENT - // spring-cloud/spring-cloud-sleuth#1607 + // SINGLE_NO_PARENT spring-cloud/spring-cloud-sleuth#1607 Propagation.Factory defaultB3Propagation = B3Propagation.newFactoryBuilder() .injectFormat(Format.SINGLE_NO_PARENT).build(); diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/autoconfig/TraceAutoConfigurationTests.java b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/autoconfig/TraceAutoConfigurationTests.java index cef306f1a..652df1a1f 100644 --- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/autoconfig/TraceAutoConfigurationTests.java +++ b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/autoconfig/TraceAutoConfigurationTests.java @@ -16,6 +16,7 @@ package org.springframework.cloud.sleuth.autoconfig; +import java.util.ArrayList; import java.util.List; import brave.Tracing; @@ -23,6 +24,7 @@ import brave.baggage.BaggageField; import brave.baggage.BaggagePropagation; import brave.baggage.BaggagePropagationConfig.SingleBaggageField; import brave.baggage.BaggagePropagationCustomizer; +import brave.handler.SpanHandler; import brave.propagation.B3SinglePropagation; import brave.propagation.Propagation; import brave.propagation.TraceContextOrSamplingFlags; @@ -35,6 +37,7 @@ import org.junit.jupiter.api.Test; import zipkin2.reporter.InMemoryReporterMetrics; import zipkin2.reporter.Reporter; import zipkin2.reporter.ReporterMetrics; +import zipkin2.reporter.brave.ZipkinSpanHandler; import zipkin2.reporter.metrics.micrometer.MicrometerReporterMetrics; import org.springframework.beans.factory.annotation.Autowired; @@ -44,11 +47,33 @@ import org.springframework.boot.test.context.runner.ApplicationContextRunner; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; +import static org.springframework.cloud.sleuth.autoconfig.TraceAutoConfiguration.SPAN_HANDLER_COMPARATOR; + public class TraceAutoConfigurationTests { private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withConfiguration(AutoConfigurations.of(TraceAutoConfiguration.class)); + @Test + void span_handler_comparator() { + SpanHandler handler1 = mock(SpanHandler.class); + SpanHandler handler2 = mock(SpanHandler.class); + ZipkinSpanHandler zipkin1 = mock(ZipkinSpanHandler.class); + ZipkinSpanHandler zipkin2 = mock(ZipkinSpanHandler.class); + + ArrayList spanHandlers = new ArrayList<>(); + spanHandlers.add(handler1); + spanHandlers.add(zipkin1); + spanHandlers.add(handler2); + spanHandlers.add(zipkin2); + + spanHandlers.sort(SPAN_HANDLER_COMPARATOR); + + assertThat(spanHandlers).containsExactly(handler1, handler2, zipkin1, zipkin2); + } + @Test void should_apply_micrometer_reporter_metrics_when_meter_registry_bean_present() { this.contextRunner.withUserConfiguration(WithMeterRegistry.class) diff --git a/spring-cloud-sleuth-dependencies/pom.xml b/spring-cloud-sleuth-dependencies/pom.xml index 04dcec616..c9bd7361e 100644 --- a/spring-cloud-sleuth-dependencies/pom.xml +++ b/spring-cloud-sleuth-dependencies/pom.xml @@ -31,7 +31,7 @@ spring-cloud-sleuth-dependencies Spring Cloud Sleuth Dependencies - 5.12.2 + 5.12.3 0.37.2 3.4.1 diff --git a/tests/spring-cloud-sleuth-instrumentation-reactor-tests/src/test/java/org/springframework/cloud/sleuth/instrument/web/client/ITSpringConfiguredReactorClient.java b/tests/spring-cloud-sleuth-instrumentation-reactor-tests/src/test/java/org/springframework/cloud/sleuth/instrument/web/client/ITSpringConfiguredReactorClient.java index b41ac1fc3..33176f790 100644 --- a/tests/spring-cloud-sleuth-instrumentation-reactor-tests/src/test/java/org/springframework/cloud/sleuth/instrument/web/client/ITSpringConfiguredReactorClient.java +++ b/tests/spring-cloud-sleuth-instrumentation-reactor-tests/src/test/java/org/springframework/cloud/sleuth/instrument/web/client/ITSpringConfiguredReactorClient.java @@ -170,7 +170,7 @@ abstract class ITSpringConfiguredReactorClient assertThat(server.getRequestCount()).isOne(); - this.spanHandler.takeRemoteSpanWithErrorMessage(CLIENT, "CANCELLED"); + this.testSpanHandler.takeRemoteSpanWithErrorMessage(CLIENT, "CANCELLED"); } }