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 f2a6a80e8..0f7a8864e 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 @@ -30,7 +30,8 @@ import brave.propagation.ExtraFieldPropagation; import brave.propagation.Propagation; import brave.propagation.ThreadLocalCurrentTraceContext; import brave.sampler.Sampler; -import org.springframework.util.StringUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import zipkin2.Span; import zipkin2.reporter.InMemoryReporterMetrics; import zipkin2.reporter.Reporter; @@ -46,6 +47,7 @@ import org.springframework.cloud.sleuth.SpanAdjuster; import org.springframework.cloud.sleuth.SpanNamer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.util.StringUtils; /** * {@link org.springframework.boot.autoconfigure.EnableAutoConfiguration @@ -95,9 +97,11 @@ public class TraceAutoConfiguration { Sampler sampler, ErrorParser errorParser, SleuthProperties sleuthProperties) { Tracing.Builder builder = Tracing.newBuilder().sampler(sampler) .errorParser(errorParser) - .localServiceName(StringUtils.isEmpty(serviceName) ? DEFAULT_SERVICE_NAME : serviceName) + .localServiceName(StringUtils.isEmpty(serviceName) ? DEFAULT_SERVICE_NAME + : serviceName) .propagationFactory(factory).currentTraceContext(currentTraceContext) - .spanReporter(compositeReporter()) + .spanReporter( + new CompositeReporter(this.spanAdjusters, this.spanReporters)) .traceId128Bit(sleuthProperties.isTraceId128()) .supportsJoin(sleuthProperties.isSupportsJoin()); for (FinishedSpanHandler finishedSpanHandlerFactory : this.finishedSpanHandlers) { @@ -106,16 +110,64 @@ public class TraceAutoConfiguration { return builder.build(); } - private Reporter compositeReporter() { - return (span) -> { + private static class CompositeReporter implements Reporter { + + private static final Log log = LogFactory.getLog(CompositeReporter.class); + + private final List spanAdjusters; + + private final Reporter spanReporter; + + private CompositeReporter(List spanAdjusters, + List> spanReporters) { + this.spanAdjusters = spanAdjusters; + this.spanReporter = spanReporters.size() == 1 ? spanReporters.get(0) + : new ListReporter(spanReporters); + } + + private static class ListReporter implements Reporter { + + private final List> spanReporters; + + private ListReporter(List> spanReporters) { + this.spanReporters = spanReporters; + } + + @Override + public void report(Span span) { + for (Reporter spanReporter : this.spanReporters) { + try { + spanReporter.report(span); + } + catch (Exception ex) { + log.warn("Exception occurred while trying to report the span " + + span, ex); + } + } + } + + @Override + public String toString() { + return "ListReporter{" + "spanReporters=" + this.spanReporters + '}'; + } + + } + + @Override + public void report(Span span) { Span spanToAdjust = span; for (SpanAdjuster spanAdjuster : this.spanAdjusters) { spanToAdjust = spanAdjuster.adjust(spanToAdjust); } - for (Reporter spanReporter : this.spanReporters) { - spanReporter.report(spanToAdjust); - } - }; + this.spanReporter.report(spanToAdjust); + } + + @Override + public String toString() { + return "CompositeReporter{" + "spanAdjusters=" + this.spanAdjusters + + ", spanReporters=" + this.spanReporter + '}'; + } + } @Bean(name = TRACER_BEAN_NAME)