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");
}
}