diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/reactor/ReactorSleuth.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/reactor/ReactorSleuth.java index 666f73bb0..e6dbaa3c1 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/reactor/ReactorSleuth.java +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/reactor/ReactorSleuth.java @@ -16,6 +16,8 @@ package org.springframework.cloud.sleuth.instrument.reactor; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; import java.util.function.BooleanSupplier; import java.util.function.Function; @@ -84,8 +86,7 @@ public abstract class ReactorSleuth { + "]"); } - return scopePassingSpanSubscription(beanFactory.getBean(Tracing.class), - sub); + return scopePassingSpanSubscription(beanFactory, sub); } if (log.isTraceEnabled()) { log.trace("Spring Context [" + beanFactory @@ -104,9 +105,12 @@ public abstract class ReactorSleuth { scannable.name()); } - static CoreSubscriber scopePassingSpanSubscription(Tracing tracing, - CoreSubscriber sub) { + private static Map CACHE = new ConcurrentHashMap<>(); + static CoreSubscriber scopePassingSpanSubscription( + BeanFactory beanFactory, CoreSubscriber sub) { + Tracing tracing = CACHE.computeIfAbsent(beanFactory, + beanFactory1 -> beanFactory1.getBean(Tracing.class)); Context context = sub.currentContext(); Span root = context.hasKey(Span.class) ? context.get(Span.class) diff --git a/tests/spring-cloud-sleuth-instrumentation-reactor-tests/src/test/java/org/springframework/cloud/sleuth/instrument/reactor/ScopePassingSpanSubscriberTests.java b/tests/spring-cloud-sleuth-instrumentation-reactor-tests/src/test/java/org/springframework/cloud/sleuth/instrument/reactor/ScopePassingSpanSubscriberTests.java index f37571e97..fd110e04a 100644 --- a/tests/spring-cloud-sleuth-instrumentation-reactor-tests/src/test/java/org/springframework/cloud/sleuth/instrument/reactor/ScopePassingSpanSubscriberTests.java +++ b/tests/spring-cloud-sleuth-instrumentation-reactor-tests/src/test/java/org/springframework/cloud/sleuth/instrument/reactor/ScopePassingSpanSubscriberTests.java @@ -21,11 +21,14 @@ import brave.Tracer; import brave.Tracing; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.BDDMockito; import org.mockito.junit.MockitoJUnitRunner; import reactor.core.CoreSubscriber; import reactor.core.publisher.BaseSubscriber; import reactor.util.context.Context; +import org.springframework.beans.factory.BeanFactory; + import static org.assertj.core.api.BDDAssertions.then; /** @@ -58,7 +61,7 @@ public class ScopePassingSpanSubscriberTests { try (Tracer.SpanInScope ws = this.tracing.tracer() .withSpanInScope(span.start())) { CoreSubscriber subscriber = ReactorSleuth.scopePassingSpanSubscription( - this.tracing, new BaseSubscriber() { + beanFactory(), new BaseSubscriber() { }); then(subscriber.currentContext().get(Span.class)).isEqualTo(span); @@ -66,4 +69,10 @@ public class ScopePassingSpanSubscriberTests { } + private BeanFactory beanFactory() { + BeanFactory beanFactory = BDDMockito.mock(BeanFactory.class); + BDDMockito.given(beanFactory.getBean(Tracing.class)).willReturn(this.tracing); + return beanFactory; + } + }