exporters) {
+ return new CompositeSpanHandler(exporters);
+ }
+
+}
diff --git a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/sampler/SamplerAutoConfiguration.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/brave/BraveSamplerConfiguration.java
similarity index 88%
rename from spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/sampler/SamplerAutoConfiguration.java
rename to spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/brave/BraveSamplerConfiguration.java
index 389dce920..1369a02e2 100644
--- a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/sampler/SamplerAutoConfiguration.java
+++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/brave/BraveSamplerConfiguration.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.brave.sampler;
+package org.springframework.cloud.sleuth.autoconfig.brave;
import brave.sampler.CountingSampler;
import brave.sampler.Sampler;
@@ -24,6 +24,8 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.cloud.context.config.annotation.RefreshScope;
+import org.springframework.cloud.sleuth.brave.sampler.ProbabilityBasedSampler;
+import org.springframework.cloud.sleuth.brave.sampler.RateLimitingSampler;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
@@ -37,10 +39,7 @@ import org.springframework.context.annotation.Configuration;
*/
@Configuration(proxyBeanMethods = false)
@EnableConfigurationProperties(SamplerProperties.class)
-// This is not auto-configuration, but it was in the past. Leaving the name as
-// SamplerAutoConfiguration because those not using Zipkin formerly had to
-// import this directly. A less precise name is better than rev-locking code.
-public class SamplerAutoConfiguration {
+class BraveSamplerConfiguration {
@Bean
@ConditionalOnMissingBean
@@ -81,9 +80,9 @@ public class SamplerAutoConfiguration {
// TODO: Rewrite: refresh should replace the sampler, not change its state
// internally
if (config.getProbability() != null) {
- return new ProbabilityBasedSampler(config);
+ return new ProbabilityBasedSampler(config::getProbability);
}
- return new RateLimitingSampler(config);
+ return new RateLimitingSampler(config::getRate);
}
}
diff --git a/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/brave/ConditionalOnBraveEnabled.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/brave/ConditionalOnBraveEnabled.java
new file mode 100644
index 000000000..a74ed8636
--- /dev/null
+++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/brave/ConditionalOnBraveEnabled.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2013-2020 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.springframework.cloud.sleuth.autoconfig.brave;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+import org.springframework.boot.autoconfigure.condition.AnyNestedCondition;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.context.annotation.Conditional;
+
+/**
+ * Conditional on Brave tracer.
+ *
+ * @author Marcin Grzejszczak
+ * @since 3.0.0
+ */
+@Target({ ElementType.TYPE, ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER })
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+@Conditional(AnyTracerModePropertySetCondition.class)
+public @interface ConditionalOnBraveEnabled {
+
+}
+
+final class AnyTracerModePropertySetCondition extends AnyNestedCondition {
+
+ private AnyTracerModePropertySetCondition() {
+ super(ConfigurationPhase.REGISTER_BEAN);
+ }
+
+ @ConditionalOnProperty(value = "spring.sleuth.tracer.mode", havingValue = "AUTO", matchIfMissing = true)
+ static class OnAutoTracerMode {
+
+ }
+
+ @ConditionalOnProperty(value = "spring.sleuth.tracer.mode", havingValue = "BRAVE")
+ static class OnConcreteTracerMode {
+
+ }
+
+}
diff --git a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/sampler/SamplerCondition.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/brave/SamplerCondition.java
similarity index 53%
rename from spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/sampler/SamplerCondition.java
rename to spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/brave/SamplerCondition.java
index e7a8508cf..3f5284399 100644
--- a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/sampler/SamplerCondition.java
+++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/brave/SamplerCondition.java
@@ -14,14 +14,21 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.brave.sampler;
+package org.springframework.cloud.sleuth.autoconfig.brave;
import brave.TracingCustomizer;
import brave.handler.SpanHandler;
import brave.sampler.Sampler;
+import org.springframework.beans.factory.ListableBeanFactory;
import org.springframework.boot.autoconfigure.condition.AnyNestedCondition;
+import org.springframework.boot.autoconfigure.condition.ConditionOutcome;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
+import org.springframework.boot.autoconfigure.condition.SpringBootCondition;
+import org.springframework.context.annotation.ConditionContext;
+import org.springframework.context.annotation.Conditional;
+import org.springframework.context.annotation.ConfigurationCondition;
+import org.springframework.core.type.AnnotatedTypeMetadata;
/**
* Sleuth 1.x optimized for log-correlation only. Unless "spring-cloud-sleuth-zipkin" was
@@ -30,14 +37,14 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
*
*
* "spring-cloud-sleuth-zipkin" obviated the {@link Sampler#NEVER_SAMPLE} default by
- * importing {@link SamplerAutoConfiguration}. Nothing else did, so sampling properties
- * were effectively ignored unless "spring-cloud-sleuth-zipkin" was in use, or something
- * else similarly imported {@link SamplerAutoConfiguration}.
+ * importing {@link SamplerConfiguration}. Nothing else did, so sampling properties were
+ * effectively ignored unless "spring-cloud-sleuth-zipkin" was in use, or something else
+ * similarly imported {@link SamplerConfiguration}.
*
*
* During a review of Wavefront integration, it was considered not correct to have other
- * code import {@link SamplerAutoConfiguration}. To avoid that, retain the old behaviour
- * about log only nodes, and also not pin configuration to Zipkin involves a more complex
+ * code import {@link SamplerConfiguration}. To avoid that, retain the old behaviour about
+ * log only nodes, and also not pin configuration to Zipkin involves a more complex
* condition.
*
*
@@ -55,7 +62,7 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
*
* An integrated test that shows {@link Sampler#NEVER_SAMPLE} is default on fail exists in
* {@code TraceAutoConfigurationTests} intentionally, as users now needn't import
- * {@link SamplerAutoConfiguration} directly.
+ * {@link SamplerConfiguration} directly.
*/
final class SamplerCondition extends AnyNestedCondition {
@@ -69,7 +76,7 @@ final class SamplerCondition extends AnyNestedCondition {
}
- @ConditionalOnBean(SpanHandler.class)
+ @Conditional(SpanHandlerOtherThanCompositePresent.class)
static final class SpanHandlerAvailable {
}
@@ -79,4 +86,31 @@ final class SamplerCondition extends AnyNestedCondition {
}
+ static class SpanHandlerOtherThanCompositePresent extends SpringBootCondition implements ConfigurationCondition {
+
+ @Override
+ public ConditionOutcome getMatchOutcome(ConditionContext context, AnnotatedTypeMetadata metadata) {
+ String[] spanHandlers = ((ListableBeanFactory) context.getBeanFactory())
+ .getBeanNamesForType(SpanHandler.class);
+ boolean moreThanSingleHandler = spanHandlers.length > 1;
+ if (moreThanSingleHandler) {
+ return ConditionOutcome.match("More than one handler present");
+ }
+ if (spanHandlers.length == 0) {
+ return ConditionOutcome.noMatch("No span handler is available");
+ }
+ // bean name is set in Brave bridge configuration
+ boolean singleCompositeSpanHandler = spanHandlers.length == 1
+ && spanHandlers[0].equals("traceCompositeSpanHandler");
+ return singleCompositeSpanHandler ? ConditionOutcome.noMatch("Composite handler found")
+ : ConditionOutcome.match("Composite handler not found");
+ }
+
+ @Override
+ public ConfigurationPhase getConfigurationPhase() {
+ return ConfigurationPhase.REGISTER_BEAN;
+ }
+
+ }
+
}
diff --git a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/sampler/SamplerProperties.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/brave/SamplerProperties.java
similarity index 95%
rename from spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/sampler/SamplerProperties.java
rename to spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/brave/SamplerProperties.java
index 51efe1992..ca0968ecf 100644
--- a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/sampler/SamplerProperties.java
+++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/brave/SamplerProperties.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.brave.sampler;
+package org.springframework.cloud.sleuth.autoconfig.brave;
import org.springframework.boot.context.properties.ConfigurationProperties;
@@ -26,7 +26,7 @@ import org.springframework.boot.context.properties.ConfigurationProperties;
* @since 1.0.0
*/
@ConfigurationProperties("spring.sleuth.sampler")
-class SamplerProperties {
+public class SamplerProperties {
/**
* Probability of requests that should be sampled. E.g. 1.0 - 100% requests should be
diff --git a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/propagation/SleuthPropagationProperties.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/brave/SleuthPropagationProperties.java
similarity index 80%
rename from spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/propagation/SleuthPropagationProperties.java
rename to spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/brave/SleuthPropagationProperties.java
index f9d78000b..958742d22 100644
--- a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/propagation/SleuthPropagationProperties.java
+++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/brave/SleuthPropagationProperties.java
@@ -14,12 +14,13 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.brave.propagation;
+package org.springframework.cloud.sleuth.autoconfig.brave;
import java.util.Collections;
import java.util.List;
import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.cloud.sleuth.brave.propagation.PropagationType;
/**
* Sleuth settings for OpenTelemetry.
@@ -43,28 +44,4 @@ public class SleuthPropagationProperties {
this.type = type;
}
- public enum PropagationType {
-
- /**
- * AWS propagation type.
- */
- AWS,
-
- /**
- * B3 propagation type.
- */
- B3,
-
- /**
- * W3C propagation type.
- */
- W3C,
-
- /**
- * Custom propagation type.
- */
- CUSTOM
-
- }
-
}
diff --git a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/autoconfig/SleuthProperties.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/brave/SleuthProperties.java
similarity index 94%
rename from spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/autoconfig/SleuthProperties.java
rename to spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/brave/SleuthProperties.java
index 5c3c6f3c5..9efa97349 100644
--- a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/autoconfig/SleuthProperties.java
+++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/brave/SleuthProperties.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.brave.autoconfig;
+package org.springframework.cloud.sleuth.autoconfig.brave;
import org.springframework.boot.context.properties.ConfigurationProperties;
@@ -25,7 +25,7 @@ import org.springframework.boot.context.properties.ConfigurationProperties;
* @since 1.0.11
*/
@ConfigurationProperties("spring.sleuth")
-class SleuthProperties {
+public class SleuthProperties {
private boolean enabled = true;
diff --git a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/instrument/grpc/TraceGrpcAutoConfiguration.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/brave/instrument/grpc/BraveGrpcAutoConfiguration.java
similarity index 76%
rename from spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/instrument/grpc/TraceGrpcAutoConfiguration.java
rename to spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/brave/instrument/grpc/BraveGrpcAutoConfiguration.java
index 66369ac12..d671441b9 100644
--- a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/instrument/grpc/TraceGrpcAutoConfiguration.java
+++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/brave/instrument/grpc/BraveGrpcAutoConfiguration.java
@@ -14,11 +14,12 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.brave.instrument.grpc;
+package org.springframework.cloud.sleuth.autoconfig.brave.instrument.grpc;
import java.util.List;
import java.util.Optional;
+import brave.Tracing;
import brave.grpc.GrpcTracing;
import brave.rpc.RpcTracing;
import io.grpc.ServerInterceptor;
@@ -29,7 +30,10 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
-import org.springframework.cloud.sleuth.brave.instrument.rpc.TraceRpcAutoConfiguration;
+import org.springframework.cloud.sleuth.autoconfig.brave.instrument.rpc.BraveRpcAutoConfiguration;
+import org.springframework.cloud.sleuth.brave.instrument.grpc.GrpcManagedChannelBuilderCustomizer;
+import org.springframework.cloud.sleuth.brave.instrument.grpc.SpringAwareManagedChannelBuilder;
+import org.springframework.cloud.sleuth.brave.instrument.grpc.TracingManagedChannelBuilderCustomizer;
import org.springframework.context.annotation.Bean;
/**
@@ -43,12 +47,12 @@ import org.springframework.context.annotation.Bean;
*/
@ConditionalOnClass({ GrpcTracing.class, GRpcGlobalInterceptor.class })
@ConditionalOnProperty(value = "spring.sleuth.grpc.enabled", matchIfMissing = true)
-@ConditionalOnBean(RpcTracing.class)
-@AutoConfigureAfter(TraceRpcAutoConfiguration.class)
-class TraceGrpcAutoConfiguration {
+@ConditionalOnBean({ Tracing.class, RpcTracing.class })
+@AutoConfigureAfter(BraveRpcAutoConfiguration.class)
+public class BraveGrpcAutoConfiguration {
@Bean
- public GrpcTracing grpcTracing(RpcTracing rpcTracing) {
+ GrpcTracing grpcTracing(RpcTracing rpcTracing) {
return GrpcTracing.create(rpcTracing);
}
@@ -62,7 +66,7 @@ class TraceGrpcAutoConfiguration {
// This is wrapper around gRPC's managed channel builder that is spring-aware
@Bean
@ConditionalOnMissingBean(SpringAwareManagedChannelBuilder.class)
- public SpringAwareManagedChannelBuilder managedChannelBuilder(
+ SpringAwareManagedChannelBuilder managedChannelBuilder(
Optional> customizers) {
return new SpringAwareManagedChannelBuilder(customizers);
}
diff --git a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/instrument/messaging/SleuthKafkaStreamsConfiguration.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/brave/instrument/messaging/BraveKafkaStreamsAutoConfiguration.java
similarity index 91%
rename from spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/instrument/messaging/SleuthKafkaStreamsConfiguration.java
rename to spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/brave/instrument/messaging/BraveKafkaStreamsAutoConfiguration.java
index 1b2cf9010..4e5068bb7 100644
--- a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/instrument/messaging/SleuthKafkaStreamsConfiguration.java
+++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/brave/instrument/messaging/BraveKafkaStreamsAutoConfiguration.java
@@ -14,9 +14,10 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.brave.instrument.messaging;
+package org.springframework.cloud.sleuth.autoconfig.brave.instrument.messaging;
import brave.Tracing;
+import brave.kafka.clients.KafkaTracing;
import brave.kafka.streams.KafkaStreamsTracing;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -25,12 +26,11 @@ import org.apache.kafka.streams.KafkaStreams;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.beans.factory.config.BeanPostProcessor;
-import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
-import org.springframework.cloud.sleuth.autoconfig.TraceAutoConfiguration;
+import org.springframework.cloud.sleuth.brave.instrument.messaging.ConditionalOnMessagingEnabled;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.kafka.config.StreamsBuilderFactoryBean;
@@ -42,14 +42,13 @@ import org.springframework.kafka.config.StreamsBuilderFactoryBean;
* @author Tim te Beek
*/
@Configuration(proxyBeanMethods = false)
+@ConditionalOnMessagingEnabled
@ConditionalOnBean(Tracing.class)
-@AutoConfigureAfter({ TraceAutoConfiguration.class })
-@OnMessagingEnabled
@ConditionalOnProperty(value = "spring.sleuth.messaging.kafka.streams.enabled", matchIfMissing = true)
-@ConditionalOnClass(KafkaStreams.class)
-class SleuthKafkaStreamsConfiguration {
+@ConditionalOnClass({ KafkaStreams.class, KafkaTracing.class })
+class BraveKafkaStreamsAutoConfiguration {
- protected SleuthKafkaStreamsConfiguration() {
+ protected BraveKafkaStreamsAutoConfiguration() {
}
/**
diff --git a/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/brave/instrument/messaging/BraveMessagingAutoConfiguration.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/brave/instrument/messaging/BraveMessagingAutoConfiguration.java
new file mode 100644
index 000000000..43b25a9c8
--- /dev/null
+++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/brave/instrument/messaging/BraveMessagingAutoConfiguration.java
@@ -0,0 +1,179 @@
+/*
+ * Copyright 2013-2020 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.springframework.cloud.sleuth.autoconfig.brave.instrument.messaging;
+
+import java.util.List;
+
+import brave.Tracer;
+import brave.Tracing;
+import brave.jms.JmsTracing;
+import brave.kafka.clients.KafkaTracing;
+import brave.messaging.MessagingRequest;
+import brave.messaging.MessagingTracing;
+import brave.messaging.MessagingTracingCustomizer;
+import brave.sampler.SamplerFunction;
+import brave.spring.rabbit.SpringRabbitTracing;
+
+import org.springframework.amqp.rabbit.core.RabbitTemplate;
+import org.springframework.beans.factory.BeanFactory;
+import org.springframework.beans.factory.config.BeanDefinition;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.cloud.sleuth.brave.instrument.messaging.ConditionalOnMessagingEnabled;
+import org.springframework.cloud.sleuth.brave.instrument.messaging.ConsumerSampler;
+import org.springframework.cloud.sleuth.brave.instrument.messaging.KafkaFactoryBeanPostProcessor;
+import org.springframework.cloud.sleuth.brave.instrument.messaging.ProducerSampler;
+import org.springframework.cloud.sleuth.brave.instrument.messaging.SleuthKafkaAspect;
+import org.springframework.cloud.sleuth.brave.instrument.messaging.SleuthRabbitBeanPostProcessor;
+import org.springframework.cloud.sleuth.brave.instrument.messaging.TracingConnectionFactoryBeanPostProcessor;
+import org.springframework.cloud.sleuth.brave.instrument.messaging.TracingJmsBeanPostProcessor;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Role;
+import org.springframework.jms.annotation.JmsListenerConfigurer;
+import org.springframework.jms.config.JmsListenerEndpointRegistry;
+import org.springframework.kafka.core.ProducerFactory;
+import org.springframework.lang.Nullable;
+
+/**
+ * {@link org.springframework.boot.autoconfigure.EnableAutoConfiguration
+ * Auto-configuration} that registers a tracing instrumentation of messaging components.
+ *
+ * @author Marcin Grzejszczak
+ * @since 2.0.0
+ */
+@Configuration(proxyBeanMethods = false)
+@ConditionalOnClass(MessagingTracing.class)
+@ConditionalOnMessagingEnabled
+@ConditionalOnBean(Tracing.class)
+@EnableConfigurationProperties(SleuthMessagingProperties.class)
+public class BraveMessagingAutoConfiguration {
+
+ @Bean
+ @ConditionalOnMissingBean
+ // NOTE: stable bean name as might be used outside sleuth
+ MessagingTracing messagingTracing(Tracing tracing,
+ @Nullable @ProducerSampler SamplerFunction producerSampler,
+ @Nullable @ConsumerSampler SamplerFunction consumerSampler,
+ @Nullable List messagingTracingCustomizers) {
+
+ MessagingTracing.Builder builder = MessagingTracing.newBuilder(tracing);
+ if (producerSampler != null) {
+ builder.producerSampler(producerSampler);
+ }
+ if (consumerSampler != null) {
+ builder.consumerSampler(consumerSampler);
+ }
+ if (messagingTracingCustomizers != null) {
+ for (MessagingTracingCustomizer customizer : messagingTracingCustomizers) {
+ customizer.customize(builder);
+ }
+ }
+ return builder.build();
+ }
+
+ @Configuration(proxyBeanMethods = false)
+ @ConditionalOnProperty(value = "spring.sleuth.messaging.rabbit.enabled", matchIfMissing = true)
+ @ConditionalOnClass(RabbitTemplate.class)
+ protected static class SleuthRabbitConfiguration {
+
+ @Bean
+ // for tests
+ @ConditionalOnMissingBean
+ static SleuthRabbitBeanPostProcessor sleuthRabbitBeanPostProcessor(BeanFactory beanFactory) {
+ return new SleuthRabbitBeanPostProcessor(beanFactory);
+ }
+
+ @Bean
+ @ConditionalOnMissingBean
+ SpringRabbitTracing springRabbitTracing(MessagingTracing messagingTracing,
+ SleuthMessagingProperties properties) {
+ return SpringRabbitTracing.newBuilder(messagingTracing)
+ .remoteServiceName(properties.getMessaging().getRabbit().getRemoteServiceName()).build();
+ }
+
+ }
+
+ @Configuration(proxyBeanMethods = false)
+ @ConditionalOnProperty(value = "spring.sleuth.messaging.kafka.enabled", matchIfMissing = true)
+ @ConditionalOnClass(ProducerFactory.class)
+ protected static class SleuthKafkaConfiguration {
+
+ @Bean
+ @ConditionalOnMissingBean
+ KafkaTracing kafkaTracing(MessagingTracing messagingTracing, SleuthMessagingProperties properties) {
+ return KafkaTracing.newBuilder(messagingTracing)
+ .remoteServiceName(properties.getMessaging().getKafka().getRemoteServiceName()).build();
+ }
+
+ @Bean
+ // for tests
+ @ConditionalOnMissingBean
+ SleuthKafkaAspect sleuthKafkaAspect(KafkaTracing kafkaTracing, Tracer tracer) {
+ return new SleuthKafkaAspect(kafkaTracing, tracer);
+ }
+
+ @Bean
+ KafkaFactoryBeanPostProcessor kafkaFactoryBeanPostProcessor(BeanFactory beanFactory) {
+ return new KafkaFactoryBeanPostProcessor(beanFactory);
+ }
+
+ }
+
+ @Configuration(proxyBeanMethods = false)
+ @ConditionalOnProperty(value = "spring.sleuth.messaging.jms.enabled", matchIfMissing = true)
+ @ConditionalOnClass(JmsListenerConfigurer.class)
+ @ConditionalOnBean(JmsListenerEndpointRegistry.class)
+ @Role(BeanDefinition.ROLE_INFRASTRUCTURE)
+ protected static class SleuthJmsConfiguration {
+
+ @Bean
+ @ConditionalOnMissingBean
+ JmsTracing jmsTracing(MessagingTracing messagingTracing, SleuthMessagingProperties properties) {
+ return JmsTracing.newBuilder(messagingTracing)
+ .remoteServiceName(properties.getMessaging().getJms().getRemoteServiceName()).build();
+ }
+
+ @Bean
+ // for tests
+ @ConditionalOnMissingBean
+ TracingConnectionFactoryBeanPostProcessor tracingConnectionFactoryBeanPostProcessor(BeanFactory beanFactory) {
+ return new TracingConnectionFactoryBeanPostProcessor(beanFactory);
+ }
+
+ @Bean
+ JmsListenerConfigurer configureTracing(BeanFactory beanFactory, JmsListenerEndpointRegistry defaultRegistry) {
+ return registrar -> {
+ TracingJmsBeanPostProcessor processor = beanFactory.getBean(TracingJmsBeanPostProcessor.class);
+ JmsListenerEndpointRegistry registry = registrar.getEndpointRegistry();
+ registrar.setEndpointRegistry((JmsListenerEndpointRegistry) processor
+ .postProcessAfterInitialization(registry == null ? defaultRegistry : registry, ""));
+ };
+ }
+
+ // Setup the tracing endpoint registry.
+ @Bean
+ TracingJmsBeanPostProcessor tracingJmsBeanPostProcessor(BeanFactory beanFactory) {
+ return new TracingJmsBeanPostProcessor(beanFactory);
+ }
+
+ }
+
+}
diff --git a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/instrument/messaging/SleuthMessagingProperties.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/brave/instrument/messaging/SleuthMessagingProperties.java
similarity index 96%
rename from spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/instrument/messaging/SleuthMessagingProperties.java
rename to spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/brave/instrument/messaging/SleuthMessagingProperties.java
index b162684b6..2e0cfaa1c 100644
--- a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/instrument/messaging/SleuthMessagingProperties.java
+++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/brave/instrument/messaging/SleuthMessagingProperties.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.brave.instrument.messaging;
+package org.springframework.cloud.sleuth.autoconfig.brave.instrument.messaging;
import org.springframework.boot.context.properties.ConfigurationProperties;
@@ -25,7 +25,7 @@ import org.springframework.boot.context.properties.ConfigurationProperties;
* @since 2.0.0
*/
@ConfigurationProperties("spring.sleuth.messaging")
-class SleuthMessagingProperties {
+public class SleuthMessagingProperties {
private Messaging messaging = new Messaging();
diff --git a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/instrument/mongodb/TraceMongoDbAutoConfiguration.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/brave/instrument/mongodb/BraveMongoDbAutoConfiguration.java
similarity index 74%
rename from spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/instrument/mongodb/TraceMongoDbAutoConfiguration.java
rename to spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/brave/instrument/mongodb/BraveMongoDbAutoConfiguration.java
index 959b45543..bb119746a 100644
--- a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/instrument/mongodb/TraceMongoDbAutoConfiguration.java
+++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/brave/instrument/mongodb/BraveMongoDbAutoConfiguration.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.brave.instrument.mongodb;
+package org.springframework.cloud.sleuth.autoconfig.brave.instrument.mongodb;
import brave.Tracing;
import brave.mongodb.MongoDBTracing;
@@ -28,7 +28,8 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration;
import org.springframework.boot.autoconfigure.mongo.MongoClientSettingsBuilderCustomizer;
-import org.springframework.cloud.sleuth.brave.autoconfig.TraceBraveAutoConfiguration;
+import org.springframework.cloud.sleuth.autoconfig.brave.BraveAutoConfiguration;
+import org.springframework.cloud.sleuth.brave.instrument.mongodb.TraceMongoClientSettingsBuilderCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@@ -41,11 +42,11 @@ import org.springframework.context.annotation.Configuration;
*/
@Configuration(proxyBeanMethods = false)
@ConditionalOnBean(Tracing.class)
-@AutoConfigureAfter(TraceBraveAutoConfiguration.class)
+@AutoConfigureAfter(BraveAutoConfiguration.class)
@AutoConfigureBefore(MongoAutoConfiguration.class)
@ConditionalOnProperty(value = "spring.sleuth.mongodb.enabled", matchIfMissing = true)
-@ConditionalOnClass(MongoClientSettings.Builder.class)
-class TraceMongoDbAutoConfiguration {
+@ConditionalOnClass({ MongoClientSettings.Builder.class, MongoDBTracing.class })
+public class BraveMongoDbAutoConfiguration {
@Bean
// for tests
@@ -55,18 +56,3 @@ class TraceMongoDbAutoConfiguration {
}
}
-
-class TraceMongoClientSettingsBuilderCustomizer implements MongoClientSettingsBuilderCustomizer {
-
- private final Tracing tracing;
-
- TraceMongoClientSettingsBuilderCustomizer(Tracing tracing) {
- this.tracing = tracing;
- }
-
- @Override
- public void customize(MongoClientSettings.Builder clientSettingsBuilder) {
- clientSettingsBuilder.addCommandListener(MongoDBTracing.create(this.tracing).commandListener());
- }
-
-}
diff --git a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/instrument/opentracing/OpentracingAutoConfiguration.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/brave/instrument/opentracing/BraveOpentracingAutoConfiguration.java
similarity index 82%
rename from spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/instrument/opentracing/OpentracingAutoConfiguration.java
rename to spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/brave/instrument/opentracing/BraveOpentracingAutoConfiguration.java
index d12bf2d36..6e8048e0b 100644
--- a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/instrument/opentracing/OpentracingAutoConfiguration.java
+++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/brave/instrument/opentracing/BraveOpentracingAutoConfiguration.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.brave.instrument.opentracing;
+package org.springframework.cloud.sleuth.autoconfig.brave.instrument.opentracing;
import brave.Tracing;
import brave.opentracing.BraveTracer;
@@ -26,8 +26,8 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
-import org.springframework.cloud.sleuth.brave.autoconfig.TraceBraveAutoConfiguration;
-import org.springframework.cloud.sleuth.opentracing.SleuthOpentracingProperties;
+import org.springframework.cloud.sleuth.autoconfig.SleuthOpentracingProperties;
+import org.springframework.cloud.sleuth.autoconfig.brave.BraveAutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@@ -42,10 +42,10 @@ import org.springframework.context.annotation.Configuration;
@Configuration(proxyBeanMethods = false)
@ConditionalOnProperty(value = "spring.sleuth.opentracing.enabled", matchIfMissing = true)
@ConditionalOnBean(Tracing.class)
-@ConditionalOnClass(Tracer.class)
-@AutoConfigureAfter(TraceBraveAutoConfiguration.class)
+@ConditionalOnClass({ Tracer.class, BraveTracer.class })
+@AutoConfigureAfter(BraveAutoConfiguration.class)
@EnableConfigurationProperties(SleuthOpentracingProperties.class)
-class OpentracingAutoConfiguration {
+public class BraveOpentracingAutoConfiguration {
@Bean
@ConditionalOnMissingBean
diff --git a/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/brave/instrument/redis/BraveRedisAutoConfiguration.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/brave/instrument/redis/BraveRedisAutoConfiguration.java
new file mode 100644
index 000000000..8ec84377d
--- /dev/null
+++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/brave/instrument/redis/BraveRedisAutoConfiguration.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2013-2020 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.springframework.cloud.sleuth.autoconfig.brave.instrument.redis;
+
+import brave.Tracing;
+import io.lettuce.core.resource.ClientResources;
+import io.lettuce.core.tracing.BraveTracing;
+
+import org.springframework.beans.factory.BeanFactory;
+import org.springframework.boot.autoconfigure.AutoConfigureAfter;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.cloud.sleuth.autoconfig.brave.BraveAutoConfiguration;
+import org.springframework.cloud.sleuth.autoconfig.instrument.redis.TraceLettuceClientResourcesBeanPostProcessor;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * {@link org.springframework.boot.autoconfigure.EnableAutoConfiguration
+ * Auto-configuration} enables Redis span information propagation.
+ *
+ * @author Chao Chang
+ * @since 2.2.0
+ */
+@Configuration(proxyBeanMethods = false)
+@ConditionalOnProperty(value = "spring.sleuth.redis.enabled", matchIfMissing = true)
+@ConditionalOnBean({ Tracing.class, ClientResources.class })
+@AutoConfigureAfter({ BraveAutoConfiguration.class })
+@EnableConfigurationProperties(TraceRedisProperties.class)
+@ConditionalOnClass(BraveTracing.class)
+public class BraveRedisAutoConfiguration {
+
+ @Bean
+ static TraceLettuceClientResourcesBeanPostProcessor traceLettuceClientResourcesBeanPostProcessor(
+ BeanFactory beanFactory, TraceRedisProperties traceRedisProperties) {
+ return new TraceLettuceClientResourcesBeanPostProcessor(beanFactory, traceRedisProperties);
+ }
+
+}
diff --git a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/instrument/redis/TraceRedisProperties.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/brave/instrument/redis/TraceRedisProperties.java
similarity index 92%
rename from spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/instrument/redis/TraceRedisProperties.java
rename to spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/brave/instrument/redis/TraceRedisProperties.java
index a5ebe33b0..3350917e8 100644
--- a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/instrument/redis/TraceRedisProperties.java
+++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/brave/instrument/redis/TraceRedisProperties.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.brave.instrument.redis;
+package org.springframework.cloud.sleuth.autoconfig.brave.instrument.redis;
import org.springframework.boot.context.properties.ConfigurationProperties;
@@ -24,7 +24,7 @@ import org.springframework.boot.context.properties.ConfigurationProperties;
* @author Daniel Albuquerque
*/
@ConfigurationProperties("spring.sleuth.redis")
-class TraceRedisProperties {
+public class TraceRedisProperties {
/**
* Enable span information propagation when using Redis.
diff --git a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/instrument/rpc/TraceRpcAutoConfiguration.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/brave/instrument/rpc/BraveRpcAutoConfiguration.java
similarity index 85%
rename from spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/instrument/rpc/TraceRpcAutoConfiguration.java
rename to spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/brave/instrument/rpc/BraveRpcAutoConfiguration.java
index 58bf0c111..2bb708d81 100644
--- a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/instrument/rpc/TraceRpcAutoConfiguration.java
+++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/brave/instrument/rpc/BraveRpcAutoConfiguration.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.brave.instrument.rpc;
+package org.springframework.cloud.sleuth.autoconfig.brave.instrument.rpc;
import java.util.List;
@@ -29,7 +29,9 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
-import org.springframework.cloud.sleuth.brave.autoconfig.TraceBraveAutoConfiguration;
+import org.springframework.cloud.sleuth.autoconfig.brave.BraveAutoConfiguration;
+import org.springframework.cloud.sleuth.brave.instrument.rpc.RpcClientSampler;
+import org.springframework.cloud.sleuth.brave.instrument.rpc.RpcServerSampler;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.lang.Nullable;
@@ -44,10 +46,8 @@ import org.springframework.lang.Nullable;
@ConditionalOnProperty(name = "spring.sleuth.rpc.enabled", havingValue = "true", matchIfMissing = true)
@ConditionalOnBean(Tracing.class)
@ConditionalOnClass(RpcTracing.class)
-@AutoConfigureAfter(TraceBraveAutoConfiguration.class)
-// public allows @AutoConfigureAfter(TraceRpcAutoConfiguration)
-// for components needing RpcTracing
-public class TraceRpcAutoConfiguration {
+@AutoConfigureAfter(BraveAutoConfiguration.class)
+public class BraveRpcAutoConfiguration {
@Bean
@ConditionalOnMissingBean
@@ -55,7 +55,6 @@ public class TraceRpcAutoConfiguration {
RpcTracing rpcTracing(Tracing tracing, @Nullable @RpcClientSampler SamplerFunction clientSampler,
@Nullable @RpcServerSampler SamplerFunction serverSampler,
@Nullable List rpcTracingCustomizers) {
-
RpcTracing.Builder builder = RpcTracing.newBuilder(tracing);
if (clientSampler != null) {
builder.clientSampler(clientSampler);
diff --git a/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/brave/instrument/web/BraveHttpBridgeConfiguration.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/brave/instrument/web/BraveHttpBridgeConfiguration.java
new file mode 100644
index 000000000..4fedd8f34
--- /dev/null
+++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/brave/instrument/web/BraveHttpBridgeConfiguration.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2013-2020 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.springframework.cloud.sleuth.autoconfig.brave.instrument.web;
+
+import brave.http.HttpTracing;
+
+import org.springframework.cloud.sleuth.brave.bridge.BraveHttpClientHandler;
+import org.springframework.cloud.sleuth.brave.bridge.BraveHttpServerHandler;
+import org.springframework.cloud.sleuth.http.HttpClientHandler;
+import org.springframework.cloud.sleuth.http.HttpServerHandler;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration(proxyBeanMethods = false)
+class BraveHttpBridgeConfiguration {
+
+ @Bean
+ HttpClientHandler braveHttpClientHandler(HttpTracing httpTracing) {
+ return new BraveHttpClientHandler(brave.http.HttpClientHandler.create(httpTracing));
+ }
+
+ @Bean
+ HttpServerHandler braveHttpServerHandler(HttpTracing httpTracing) {
+ return new BraveHttpServerHandler(brave.http.HttpServerHandler.create(httpTracing));
+ }
+
+}
diff --git a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/instrument/web/TraceHttpAutoConfiguration.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/brave/instrument/web/BraveHttpConfiguration.java
similarity index 69%
rename from spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/instrument/web/TraceHttpAutoConfiguration.java
rename to spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/brave/instrument/web/BraveHttpConfiguration.java
index a18359523..6e355fe7a 100644
--- a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/instrument/web/TraceHttpAutoConfiguration.java
+++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/brave/instrument/web/BraveHttpConfiguration.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.brave.instrument.web;
+package org.springframework.cloud.sleuth.autoconfig.brave.instrument.web;
import java.util.List;
import java.util.regex.Pattern;
@@ -29,33 +29,30 @@ import brave.sampler.SamplerFunction;
import brave.sampler.SamplerFunctions;
import org.springframework.beans.factory.BeanFactory;
-import org.springframework.boot.autoconfigure.AutoConfigureAfter;
-import org.springframework.boot.autoconfigure.AutoConfigureBefore;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
-import org.springframework.cloud.sleuth.api.http.HttpRequestParser;
-import org.springframework.cloud.sleuth.api.http.HttpResponseParser;
-import org.springframework.cloud.sleuth.brave.autoconfig.TraceBraveAutoConfiguration;
+import org.springframework.cloud.sleuth.autoconfig.instrument.web.ConditionalOnSleuthHttp;
+import org.springframework.cloud.sleuth.autoconfig.instrument.web.SleuthHttpProperties;
+import org.springframework.cloud.sleuth.autoconfig.instrument.web.SleuthWebProperties;
+import org.springframework.cloud.sleuth.brave.bridge.BraveHttpRequestParser;
+import org.springframework.cloud.sleuth.brave.bridge.BraveHttpResponseParser;
import org.springframework.cloud.sleuth.brave.bridge.BraveSamplerFunction;
-import org.springframework.cloud.sleuth.brave.bridge.http.BraveHttpRequestParser;
-import org.springframework.cloud.sleuth.brave.bridge.http.BraveHttpResponseParser;
-import org.springframework.cloud.sleuth.brave.bridge.http.TraceBraveHttpBridgeAutoConfiguration;
+import org.springframework.cloud.sleuth.brave.instrument.web.CompositeHttpSampler;
+import org.springframework.cloud.sleuth.brave.instrument.web.SkipPatternHttpClientSampler;
+import org.springframework.cloud.sleuth.brave.instrument.web.SkipPatternHttpServerSampler;
+import org.springframework.cloud.sleuth.http.HttpRequestParser;
+import org.springframework.cloud.sleuth.http.HttpResponseParser;
import org.springframework.cloud.sleuth.instrument.web.HttpClientRequestParser;
import org.springframework.cloud.sleuth.instrument.web.HttpClientResponseParser;
import org.springframework.cloud.sleuth.instrument.web.HttpClientSampler;
import org.springframework.cloud.sleuth.instrument.web.HttpServerRequestParser;
import org.springframework.cloud.sleuth.instrument.web.HttpServerResponseParser;
import org.springframework.cloud.sleuth.instrument.web.HttpServerSampler;
-import org.springframework.cloud.sleuth.instrument.web.SkipPatternConfiguration;
import org.springframework.cloud.sleuth.instrument.web.SkipPatternProvider;
-import org.springframework.cloud.sleuth.instrument.web.SleuthHttpProperties;
-import org.springframework.cloud.sleuth.instrument.web.SleuthWebProperties;
-import org.springframework.cloud.sleuth.instrument.web.client.feign.TraceFeignClientAutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Import;
import org.springframework.lang.Nullable;
/**
@@ -66,16 +63,11 @@ import org.springframework.lang.Nullable;
* @since 2.0.0
*/
@Configuration(proxyBeanMethods = false)
-@ConditionalOnProperty(name = { "spring.sleuth.http.enabled", "spring.sleuth.web.enabled" }, havingValue = "true",
- matchIfMissing = true)
-@ConditionalOnBean(Tracing.class)
+@ConditionalOnSleuthHttp
@ConditionalOnClass(HttpTracing.class)
-@AutoConfigureAfter({ TraceBraveAutoConfiguration.class, SkipPatternConfiguration.class })
@EnableConfigurationProperties({ SleuthWebProperties.class, SleuthHttpProperties.class })
-// public allows @AutoConfigureAfter(TraceHttpAutoConfiguration)
-// for components needing HttpTracing
-@AutoConfigureBefore({ TraceFeignClientAutoConfiguration.class, TraceBraveHttpBridgeAutoConfiguration.class })
-public class TraceHttpAutoConfiguration {
+@Import(BraveHttpBridgeConfiguration.class)
+public class BraveHttpConfiguration {
@Bean
@ConditionalOnMissingBean
@@ -143,6 +135,7 @@ public class TraceHttpAutoConfiguration {
return HttpTracing.newBuilder(tracing).clientSampler(httpClientSampler).serverSampler(combinedSampler);
}
+ @Nullable
private SamplerFunction httpServerSampler(BeanFactory beanFactory) {
return beanFactory.containsBean(HttpServerSampler.NAME) ? toBraveSampler(beanFactory, HttpServerSampler.NAME)
: null;
@@ -168,14 +161,14 @@ public class TraceHttpAutoConfiguration {
Object bean = beanFactory.getBean(beanName);
SamplerFunction braveSampler = bean instanceof SamplerFunction
? (SamplerFunction) bean
- : bean instanceof org.springframework.cloud.sleuth.api.SamplerFunction
- ? BraveSamplerFunction.toHttpBrave(
- (org.springframework.cloud.sleuth.api.SamplerFunction) bean)
+ : bean instanceof org.springframework.cloud.sleuth.SamplerFunction ? BraveSamplerFunction.toHttpBrave(
+ (org.springframework.cloud.sleuth.SamplerFunction) bean)
: null;
return returnOrThrow(bean, braveSampler, beanName, SamplerFunction.class,
- org.springframework.cloud.sleuth.api.SamplerFunction.class);
+ org.springframework.cloud.sleuth.SamplerFunction.class);
}
+ @NotNull
private T returnOrThrow(Object bean, T convertedBean, String name, Class brave, Class sleuth) {
if (convertedBean == null) {
throw new IllegalStateException(
@@ -213,78 +206,3 @@ public class TraceHttpAutoConfiguration {
}
}
-
-/**
- * Composite Http Sampler.
- *
- * @author Adrian Cole
- */
-final class CompositeHttpSampler implements SamplerFunction {
-
- final SamplerFunction left;
-
- final SamplerFunction right;
-
- CompositeHttpSampler(SamplerFunction left, SamplerFunction right) {
- this.left = left;
- this.right = right;
- }
-
- @Override
- public Boolean trySample(brave.http.HttpRequest request) {
- // If either decision is false, return false
- Boolean leftDecision = this.left.trySample(request);
- if (Boolean.FALSE.equals(leftDecision)) {
- return false;
- }
- Boolean rightDecision = this.right.trySample(request);
- if (Boolean.FALSE.equals(rightDecision)) {
- return false;
- }
- // If either decision is null, return the other
- if (leftDecision == null) {
- return rightDecision;
- }
- if (rightDecision == null) {
- return leftDecision;
- }
- // Neither are null and at least one is true
- return rightDecision;
- }
-
-}
-
-/**
- * Http Sampler that looks at paths.
- *
- * @author Marcin Grzejszczak
- */
-final class SkipPatternHttpServerSampler extends SkipPatternSampler {
-
- private final SkipPatternProvider provider;
-
- SkipPatternHttpServerSampler(SkipPatternProvider provider) {
- this.provider = provider;
- }
-
- @Override
- Pattern getPattern() {
- return this.provider.skipPattern();
- }
-
-}
-
-final class SkipPatternHttpClientSampler extends SkipPatternSampler {
-
- private final Pattern skipPattern;
-
- SkipPatternHttpClientSampler(Pattern skipPattern) {
- this.skipPattern = skipPattern;
- }
-
- @Override
- Pattern getPattern() {
- return skipPattern;
- }
-
-}
diff --git a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/instrument/web/client/TraceWebClientAutoConfiguration.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/brave/instrument/web/client/BraveWebClientAutoConfiguration.java
similarity index 84%
rename from spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/instrument/web/client/TraceWebClientAutoConfiguration.java
rename to spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/brave/instrument/web/client/BraveWebClientAutoConfiguration.java
index 23b046715..ee98c220e 100644
--- a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/instrument/web/client/TraceWebClientAutoConfiguration.java
+++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/brave/instrument/web/client/BraveWebClientAutoConfiguration.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.brave.instrument.web.client;
+package org.springframework.cloud.sleuth.autoconfig.brave.instrument.web.client;
import brave.http.HttpTracing;
import brave.httpasyncclient.TracingHttpAsyncClientBuilder;
@@ -22,14 +22,12 @@ import brave.httpclient.TracingHttpClientBuilder;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.nio.client.HttpAsyncClientBuilder;
-import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.cloud.commons.httpclient.HttpClientConfiguration;
-import org.springframework.cloud.sleuth.brave.instrument.web.TraceHttpAutoConfiguration;
-import org.springframework.cloud.sleuth.instrument.web.client.SleuthWebClientEnabled;
+import org.springframework.cloud.sleuth.autoconfig.instrument.web.client.ConditionalnOnSleuthWebClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@@ -43,11 +41,10 @@ import org.springframework.web.client.RestTemplate;
* @since 1.0.0
*/
@Configuration(proxyBeanMethods = false)
-@SleuthWebClientEnabled
+@ConditionalnOnSleuthWebClient
@ConditionalOnBean(HttpTracing.class)
-@AutoConfigureAfter(TraceHttpAutoConfiguration.class)
@AutoConfigureBefore(HttpClientConfiguration.class)
-class TraceWebClientAutoConfiguration {
+public class BraveWebClientAutoConfiguration {
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(HttpClientBuilder.class)
diff --git a/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/async/ExecutorBeanPostProcessor.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/async/ExecutorBeanPostProcessor.java
new file mode 100644
index 000000000..d15f15679
--- /dev/null
+++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/async/ExecutorBeanPostProcessor.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2013-2020 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.springframework.cloud.sleuth.autoconfig.instrument.async;
+
+import java.util.concurrent.Executor;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import org.springframework.beans.BeansException;
+import org.springframework.beans.factory.BeanFactory;
+import org.springframework.beans.factory.config.BeanPostProcessor;
+import org.springframework.cloud.sleuth.instrument.async.ExecutorInstrumentor;
+
+/**
+ * Bean post processor that wraps a call to an {@link Executor} either in a JDK or CGLIB
+ * proxy. Depending on whether the implementation has a final method or is final.
+ *
+ * @author Marcin Grzejszczak
+ * @author Jesus Alonso
+ * @author Denys Ivano
+ * @author Vladislav Fefelov
+ * @since 1.1.4
+ */
+public class ExecutorBeanPostProcessor implements BeanPostProcessor {
+
+ private static final Log log = LogFactory.getLog(ExecutorBeanPostProcessor.class);
+
+ private final BeanFactory beanFactory;
+
+ private SleuthAsyncProperties sleuthAsyncProperties;
+
+ public ExecutorBeanPostProcessor(BeanFactory beanFactory) {
+ this.beanFactory = beanFactory;
+ }
+
+ @Override
+ public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
+ return bean;
+ }
+
+ @Override
+ public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
+ if (!ExecutorInstrumentor.isApplicableForInstrumentation(bean)) {
+ return bean;
+ }
+ return new ExecutorInstrumentor(() -> sleuthAsyncProperties().getIgnoredBeans(), this.beanFactory)
+ .instrument(bean, beanName);
+ }
+
+ private SleuthAsyncProperties sleuthAsyncProperties() {
+ if (this.sleuthAsyncProperties == null) {
+ this.sleuthAsyncProperties = this.beanFactory.getBean(SleuthAsyncProperties.class);
+ }
+ return this.sleuthAsyncProperties;
+ }
+
+}
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/SleuthAsyncProperties.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/async/SleuthAsyncProperties.java
similarity index 93%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/SleuthAsyncProperties.java
rename to spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/async/SleuthAsyncProperties.java
index 10450e663..5f6033846 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/SleuthAsyncProperties.java
+++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/async/SleuthAsyncProperties.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.instrument.async;
+package org.springframework.cloud.sleuth.autoconfig.instrument.async;
import java.util.Collections;
import java.util.List;
@@ -28,7 +28,7 @@ import org.springframework.boot.context.properties.ConfigurationProperties;
* @since 2.1.0
*/
@ConfigurationProperties(prefix = "spring.sleuth.async")
-class SleuthAsyncProperties {
+public class SleuthAsyncProperties {
private boolean enabled;
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/AsyncAutoConfiguration.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/async/TraceAsyncAutoConfiguration.java
similarity index 72%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/AsyncAutoConfiguration.java
rename to spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/async/TraceAsyncAutoConfiguration.java
index fcc2439a5..fb93c31b4 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/AsyncAutoConfiguration.java
+++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/async/TraceAsyncAutoConfiguration.java
@@ -14,12 +14,16 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.instrument.async;
+package org.springframework.cloud.sleuth.autoconfig.instrument.async;
+import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
-import org.springframework.cloud.sleuth.api.Tracer;
+import org.springframework.cloud.sleuth.Tracer;
+import org.springframework.cloud.sleuth.autoconfig.brave.BraveAutoConfiguration;
+import org.springframework.cloud.sleuth.autoconfig.otel.OtelAutoConfiguration;
+import org.springframework.cloud.sleuth.instrument.async.SleuthContextListener;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@@ -34,7 +38,8 @@ import org.springframework.context.annotation.Configuration;
@ConditionalOnBean(Tracer.class)
@ConditionalOnProperty(value = "spring.sleuth.async.enabled", matchIfMissing = true)
@EnableConfigurationProperties(SleuthAsyncProperties.class)
-class AsyncAutoConfiguration {
+@AutoConfigureAfter({ BraveAutoConfiguration.class, OtelAutoConfiguration.class })
+public class TraceAsyncAutoConfiguration {
@Bean
SleuthContextListener traceContextClosedListener() {
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/AsyncCustomAutoConfiguration.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/async/TraceAsyncCustomAutoConfiguration.java
similarity index 76%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/AsyncCustomAutoConfiguration.java
rename to spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/async/TraceAsyncCustomAutoConfiguration.java
index 084d4742b..056f462a9 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/AsyncCustomAutoConfiguration.java
+++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/async/TraceAsyncCustomAutoConfiguration.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.instrument.async;
+package org.springframework.cloud.sleuth.autoconfig.instrument.async;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
@@ -23,7 +23,11 @@ import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.cloud.sleuth.autoconfig.brave.BraveAutoConfiguration;
+import org.springframework.cloud.sleuth.autoconfig.otel.OtelAutoConfiguration;
+import org.springframework.cloud.sleuth.instrument.async.LazyTraceAsyncCustomizer;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.AsyncConfigurer;
@@ -36,11 +40,13 @@ import org.springframework.scheduling.annotation.AsyncConfigurer;
* @since 1.0.0
*/
@Configuration(proxyBeanMethods = false)
+@ConditionalOnClass(AsyncConfigurer.class)
@ConditionalOnBean(AsyncConfigurer.class)
-@AutoConfigureBefore(AsyncDefaultAutoConfiguration.class)
+@AutoConfigureBefore(TraceAsyncDefaultAutoConfiguration.class)
@ConditionalOnProperty(value = "spring.sleuth.async.enabled", matchIfMissing = true)
-@AutoConfigureAfter(name = "org.springframework.cloud.sleuth.instrument.scheduling.TraceSchedulingAutoConfiguration")
-class AsyncCustomAutoConfiguration implements BeanPostProcessor {
+@AutoConfigureAfter(name = "org.springframework.cloud.sleuth.instrument.scheduling.TraceSchedulingAutoConfiguration",
+ value = { BraveAutoConfiguration.class, OtelAutoConfiguration.class })
+public class TraceAsyncCustomAutoConfiguration implements BeanPostProcessor {
@Autowired
private BeanFactory beanFactory;
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/AsyncDefaultAutoConfiguration.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/async/TraceAsyncDefaultAutoConfiguration.java
similarity index 86%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/AsyncDefaultAutoConfiguration.java
rename to spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/async/TraceAsyncDefaultAutoConfiguration.java
index 6f1eb3505..351983675 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/AsyncDefaultAutoConfiguration.java
+++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/async/TraceAsyncDefaultAutoConfiguration.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.instrument.async;
+package org.springframework.cloud.sleuth.autoconfig.instrument.async;
import java.util.concurrent.Executor;
@@ -27,12 +27,18 @@ import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.beans.factory.NoUniqueBeanDefinitionException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.BeanDefinition;
+import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.cloud.sleuth.SpanNamer;
-import org.springframework.cloud.sleuth.api.Tracer;
+import org.springframework.cloud.sleuth.Tracer;
+import org.springframework.cloud.sleuth.autoconfig.brave.BraveAutoConfiguration;
+import org.springframework.cloud.sleuth.autoconfig.otel.OtelAutoConfiguration;
+import org.springframework.cloud.sleuth.instrument.async.LazyTraceExecutor;
+import org.springframework.cloud.sleuth.instrument.async.TraceAsyncAspect;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Role;
@@ -55,16 +61,17 @@ import org.springframework.scheduling.annotation.AsyncConfigurerSupport;
@EnableConfigurationProperties(SleuthAsyncProperties.class)
@ConditionalOnProperty(value = "spring.sleuth.async.enabled", matchIfMissing = true)
@ConditionalOnBean(Tracer.class)
-class AsyncDefaultAutoConfiguration {
+@AutoConfigureAfter({ BraveAutoConfiguration.class, OtelAutoConfiguration.class })
+public class TraceAsyncDefaultAutoConfiguration {
@Bean
@ConditionalOnProperty(value = "spring.sleuth.scheduled.enabled", matchIfMissing = true)
- public static ExecutorBeanPostProcessor executorBeanPostProcessor(BeanFactory beanFactory) {
+ static ExecutorBeanPostProcessor executorBeanPostProcessor(BeanFactory beanFactory) {
return new ExecutorBeanPostProcessor(beanFactory);
}
@Bean
- public TraceAsyncAspect traceAsyncAspect(Tracer tracer, SpanNamer spanNamer) {
+ TraceAsyncAspect traceAsyncAspect(Tracer tracer, SpanNamer spanNamer) {
return new TraceAsyncAspect(tracer, spanNamer);
}
@@ -72,6 +79,7 @@ class AsyncDefaultAutoConfiguration {
* Wrapper for the async executor.
*/
@Configuration(proxyBeanMethods = false)
+ @ConditionalOnClass(AsyncConfigurer.class)
@ConditionalOnMissingBean(AsyncConfigurer.class)
@ConditionalOnProperty(value = "spring.sleuth.async.configurer.enabled", matchIfMissing = true)
@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/circuitbreaker/SleuthCircuitBreakerProperties.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/circuitbreaker/SleuthCircuitBreakerProperties.java
similarity index 89%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/circuitbreaker/SleuthCircuitBreakerProperties.java
rename to spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/circuitbreaker/SleuthCircuitBreakerProperties.java
index e637cf7ae..f18e802d4 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/circuitbreaker/SleuthCircuitBreakerProperties.java
+++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/circuitbreaker/SleuthCircuitBreakerProperties.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.instrument.circuitbreaker;
+package org.springframework.cloud.sleuth.autoconfig.instrument.circuitbreaker;
import org.springframework.boot.context.properties.ConfigurationProperties;
@@ -25,7 +25,7 @@ import org.springframework.boot.context.properties.ConfigurationProperties;
* @since 2.2.1
*/
@ConfigurationProperties("spring.sleuth.circuitbreaker")
-class SleuthCircuitBreakerProperties {
+public class SleuthCircuitBreakerProperties {
/**
* Enable Spring Cloud CircuitBreaker instrumentation.
diff --git a/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/circuitbreaker/TraceCircuitBreakerAutoConfiguration.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/circuitbreaker/TraceCircuitBreakerAutoConfiguration.java
new file mode 100644
index 000000000..2df507fbc
--- /dev/null
+++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/circuitbreaker/TraceCircuitBreakerAutoConfiguration.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2013-2020 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.springframework.cloud.sleuth.autoconfig.instrument.circuitbreaker;
+
+import org.springframework.boot.autoconfigure.AutoConfigureAfter;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.cloud.client.circuitbreaker.CircuitBreaker;
+import org.springframework.cloud.sleuth.Tracer;
+import org.springframework.cloud.sleuth.autoconfig.brave.BraveAutoConfiguration;
+import org.springframework.cloud.sleuth.autoconfig.otel.OtelAutoConfiguration;
+import org.springframework.cloud.sleuth.instrument.circuitbreaker.TraceCircuitBreakerFactoryAspect;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * {@link org.springframework.boot.autoconfigure.EnableAutoConfiguration
+ * Auto-configuration} that registers instrumentation for circuit breakers.
+ *
+ * @author Marcin Grzejszczak
+ * @since 2.2.1
+ */
+@Configuration(proxyBeanMethods = false)
+@ConditionalOnClass(CircuitBreaker.class)
+@ConditionalOnBean(Tracer.class)
+@ConditionalOnProperty(value = "spring.sleuth.circuitbreaker.enabled", matchIfMissing = true)
+@EnableConfigurationProperties(SleuthCircuitBreakerProperties.class)
+@AutoConfigureAfter({ BraveAutoConfiguration.class, OtelAutoConfiguration.class })
+public class TraceCircuitBreakerAutoConfiguration {
+
+ @Bean
+ TraceCircuitBreakerFactoryAspect traceCircuitBreakerFactoryAspect(Tracer tracer) {
+ return new TraceCircuitBreakerFactoryAspect(tracer);
+ }
+
+}
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/SleuthIntegrationMessagingProperties.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/messaging/SleuthIntegrationMessagingProperties.java
similarity index 92%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/SleuthIntegrationMessagingProperties.java
rename to spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/messaging/SleuthIntegrationMessagingProperties.java
index 403d64845..86d5a7477 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/SleuthIntegrationMessagingProperties.java
+++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/messaging/SleuthIntegrationMessagingProperties.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.instrument.messaging;
+package org.springframework.cloud.sleuth.autoconfig.instrument.messaging;
import org.springframework.boot.context.properties.ConfigurationProperties;
@@ -25,7 +25,7 @@ import org.springframework.boot.context.properties.ConfigurationProperties;
* @since 2.0.0
*/
@ConfigurationProperties("spring.sleuth.integration")
-class SleuthIntegrationMessagingProperties {
+public class SleuthIntegrationMessagingProperties {
/**
* An array of patterns against which channel names will be matched.
diff --git a/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/messaging/TraceFunctionAutoConfiguration.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/messaging/TraceFunctionAutoConfiguration.java
new file mode 100644
index 000000000..05d749de5
--- /dev/null
+++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/messaging/TraceFunctionAutoConfiguration.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2013-2020 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.springframework.cloud.sleuth.autoconfig.instrument.messaging;
+
+import org.springframework.boot.autoconfigure.AutoConfigureAfter;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.cloud.context.scope.refresh.RefreshScopeRefreshedEvent;
+import org.springframework.cloud.function.context.catalog.FunctionAroundWrapper;
+import org.springframework.cloud.sleuth.Tracer;
+import org.springframework.cloud.sleuth.autoconfig.brave.BraveAutoConfiguration;
+import org.springframework.cloud.sleuth.autoconfig.otel.OtelAutoConfiguration;
+import org.springframework.cloud.sleuth.instrument.messaging.TraceFunctionAroundWrapper;
+import org.springframework.cloud.sleuth.propagation.Propagator;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.env.Environment;
+import org.springframework.messaging.support.MessageHeaderAccessor;
+
+/**
+ * {@link org.springframework.boot.autoconfigure.EnableAutoConfiguration
+ * Auto-configuration} to enable tracing via Spring Cloud Function.
+ *
+ * @author Oleg Zhurakousky
+ * @author Marcin Grzejszczak
+ * @since 3.0.0
+ */
+@Configuration(proxyBeanMethods = false)
+@ConditionalOnProperty(value = "spring.sleuth.function.enabled", matchIfMissing = true)
+@ConditionalOnBean(Tracer.class)
+@ConditionalOnClass({ FunctionAroundWrapper.class, RefreshScopeRefreshedEvent.class })
+@AutoConfigureAfter({ BraveAutoConfiguration.class, OtelAutoConfiguration.class })
+public class TraceFunctionAutoConfiguration {
+
+ @Bean
+ TraceFunctionAroundWrapper traceFunctionAroundWrapper(Environment environment, Tracer tracer, Propagator propagator,
+ Propagator.Setter injector, Propagator.Getter extractor) {
+ return new TraceFunctionAroundWrapper(environment, tracer, propagator, injector, extractor);
+ }
+
+}
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/TraceSpringIntegrationAutoConfiguration.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/messaging/TraceSpringIntegrationAutoConfiguration.java
similarity index 85%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/TraceSpringIntegrationAutoConfiguration.java
rename to spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/messaging/TraceSpringIntegrationAutoConfiguration.java
index 9b159b22a..cf38f7fed 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/TraceSpringIntegrationAutoConfiguration.java
+++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/messaging/TraceSpringIntegrationAutoConfiguration.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.instrument.messaging;
+package org.springframework.cloud.sleuth.autoconfig.instrument.messaging;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.condition.AnyNestedCondition;
@@ -24,9 +24,11 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClas
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.cloud.function.context.FunctionCatalog;
-import org.springframework.cloud.sleuth.api.Tracer;
-import org.springframework.cloud.sleuth.api.propagation.Propagator;
-import org.springframework.cloud.sleuth.autoconfig.TraceAutoConfiguration;
+import org.springframework.cloud.sleuth.Tracer;
+import org.springframework.cloud.sleuth.autoconfig.brave.BraveAutoConfiguration;
+import org.springframework.cloud.sleuth.autoconfig.otel.OtelAutoConfiguration;
+import org.springframework.cloud.sleuth.instrument.messaging.TracingChannelInterceptor;
+import org.springframework.cloud.sleuth.propagation.Propagator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.context.annotation.Conditional;
@@ -50,14 +52,15 @@ import org.springframework.util.ObjectUtils;
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(GlobalChannelInterceptor.class)
@ConditionalOnBean(Tracer.class)
-@AutoConfigureAfter({ TraceAutoConfiguration.class, TraceSpringMessagingAutoConfiguration.class })
+@AutoConfigureAfter({ BraveAutoConfiguration.class, OtelAutoConfiguration.class,
+ TraceSpringMessagingAutoConfiguration.class })
@ConditionalOnProperty(value = "spring.sleuth.messaging.enabled", matchIfMissing = true)
@EnableConfigurationProperties(SleuthIntegrationMessagingProperties.class)
@Conditional(TracingChannelInterceptorCondition.class)
-class TraceSpringIntegrationAutoConfiguration {
+public class TraceSpringIntegrationAutoConfiguration {
@Bean
- public GlobalChannelInterceptorWrapper tracingGlobalChannelInterceptorWrapper(TracingChannelInterceptor interceptor,
+ GlobalChannelInterceptorWrapper traceGlobalChannelInterceptorWrapper(TracingChannelInterceptor interceptor,
SleuthIntegrationMessagingProperties properties) {
GlobalChannelInterceptorWrapper wrapper = new GlobalChannelInterceptorWrapper(interceptor);
wrapper.setPatterns(properties.getPatterns());
@@ -66,10 +69,9 @@ class TraceSpringIntegrationAutoConfiguration {
@Bean
TracingChannelInterceptor traceChannelInterceptor(Tracer tracer, Propagator propagator,
- SleuthIntegrationMessagingProperties properties,
Propagator.Setter traceMessagePropagationSetter,
Propagator.Getter traceMessagePropagationGetter) {
- return new TracingChannelInterceptor(tracer, propagator, properties, traceMessagePropagationSetter,
+ return new TracingChannelInterceptor(tracer, propagator, traceMessagePropagationSetter,
traceMessagePropagationGetter);
}
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/TraceSpringMessagingAutoConfiguration.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/messaging/TraceSpringMessagingAutoConfiguration.java
similarity index 88%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/TraceSpringMessagingAutoConfiguration.java
rename to spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/messaging/TraceSpringMessagingAutoConfiguration.java
index ac78b8484..b2fb30f7f 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/TraceSpringMessagingAutoConfiguration.java
+++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/messaging/TraceSpringMessagingAutoConfiguration.java
@@ -14,13 +14,14 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.instrument.messaging;
+package org.springframework.cloud.sleuth.autoconfig.instrument.messaging;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
-import org.springframework.cloud.sleuth.api.propagation.Propagator;
+import org.springframework.cloud.sleuth.instrument.messaging.MessageHeaderPropagation;
+import org.springframework.cloud.sleuth.propagation.Propagator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.support.MessageHeaderAccessor;
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/TraceWebSocketAutoConfiguration.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/messaging/TraceWebSocketAutoConfiguration.java
similarity index 69%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/TraceWebSocketAutoConfiguration.java
rename to spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/messaging/TraceWebSocketAutoConfiguration.java
index cbf094849..d9e995369 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/TraceWebSocketAutoConfiguration.java
+++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/messaging/TraceWebSocketAutoConfiguration.java
@@ -14,17 +14,22 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.instrument.messaging;
+package org.springframework.cloud.sleuth.autoconfig.instrument.messaging;
import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
-import org.springframework.cloud.sleuth.api.Tracer;
-import org.springframework.cloud.sleuth.api.propagation.Propagator;
+import org.springframework.cloud.sleuth.Tracer;
+import org.springframework.cloud.sleuth.autoconfig.brave.BraveAutoConfiguration;
+import org.springframework.cloud.sleuth.autoconfig.otel.OtelAutoConfiguration;
+import org.springframework.cloud.sleuth.instrument.messaging.TracingChannelInterceptor;
+import org.springframework.cloud.sleuth.propagation.Propagator;
import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.ChannelRegistration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
+import org.springframework.messaging.support.MessageHeaderAccessor;
import org.springframework.web.socket.config.annotation.AbstractWebSocketMessageBrokerConfigurer;
import org.springframework.web.socket.config.annotation.DelegatingWebSocketMessageBrokerConfiguration;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
@@ -41,6 +46,7 @@ import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
@ConditionalOnClass(DelegatingWebSocketMessageBrokerConfiguration.class)
@ConditionalOnBean(Tracer.class)
@ConditionalOnProperty(value = "spring.sleuth.integration.websockets.enabled", matchIfMissing = true)
+@AutoConfigureAfter({ BraveAutoConfiguration.class, OtelAutoConfiguration.class })
class TraceWebSocketAutoConfiguration extends AbstractWebSocketMessageBrokerConfigurer {
@Autowired
@@ -50,7 +56,10 @@ class TraceWebSocketAutoConfiguration extends AbstractWebSocketMessageBrokerConf
Propagator propagator;
@Autowired
- SleuthIntegrationMessagingProperties properties;
+ Propagator.Setter setter;
+
+ @Autowired
+ Propagator.Getter getter;
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
@@ -60,17 +69,19 @@ class TraceWebSocketAutoConfiguration extends AbstractWebSocketMessageBrokerConf
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.configureBrokerChannel()
- .setInterceptors(TracingChannelInterceptor.create(this.tracer, this.propagator, this.properties));
+ .setInterceptors(new TracingChannelInterceptor(this.tracer, this.propagator, this.setter, this.getter));
}
@Override
public void configureClientOutboundChannel(ChannelRegistration registration) {
- registration.setInterceptors(TracingChannelInterceptor.create(this.tracer, this.propagator, this.properties));
+ registration
+ .setInterceptors(new TracingChannelInterceptor(this.tracer, this.propagator, this.setter, this.getter));
}
@Override
public void configureClientInboundChannel(ChannelRegistration registration) {
- registration.setInterceptors(TracingChannelInterceptor.create(this.tracer, this.propagator, this.properties));
+ registration
+ .setInterceptors(new TracingChannelInterceptor(this.tracer, this.propagator, this.setter, this.getter));
}
}
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/quartz/TraceQuartzAutoConfiguration.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/quartz/TraceQuartzAutoConfiguration.java
similarity index 74%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/quartz/TraceQuartzAutoConfiguration.java
rename to spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/quartz/TraceQuartzAutoConfiguration.java
index 1643f471b..7a14a39cf 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/quartz/TraceQuartzAutoConfiguration.java
+++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/quartz/TraceQuartzAutoConfiguration.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.instrument.quartz;
+package org.springframework.cloud.sleuth.autoconfig.instrument.quartz;
import org.quartz.Scheduler;
@@ -25,9 +25,11 @@ import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration;
-import org.springframework.cloud.sleuth.api.Tracer;
-import org.springframework.cloud.sleuth.api.propagation.Propagator;
-import org.springframework.cloud.sleuth.autoconfig.TraceAutoConfiguration;
+import org.springframework.cloud.sleuth.Tracer;
+import org.springframework.cloud.sleuth.autoconfig.brave.BraveAutoConfiguration;
+import org.springframework.cloud.sleuth.autoconfig.otel.OtelAutoConfiguration;
+import org.springframework.cloud.sleuth.instrument.quartz.TracingJobListener;
+import org.springframework.cloud.sleuth.propagation.Propagator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@@ -40,9 +42,9 @@ import org.springframework.context.annotation.Configuration;
*/
@Configuration(proxyBeanMethods = false)
@ConditionalOnBean({ Tracer.class, Scheduler.class })
-@AutoConfigureAfter({ TraceAutoConfiguration.class, QuartzAutoConfiguration.class })
@ConditionalOnProperty(value = "spring.sleuth.quartz.enabled", matchIfMissing = true)
-class TraceQuartzAutoConfiguration implements InitializingBean {
+@AutoConfigureAfter({ BraveAutoConfiguration.class, OtelAutoConfiguration.class, QuartzAutoConfiguration.class })
+public class TraceQuartzAutoConfiguration implements InitializingBean {
private final Scheduler scheduler;
@@ -50,7 +52,7 @@ class TraceQuartzAutoConfiguration implements InitializingBean {
private final Propagator propagator;
- TraceQuartzAutoConfiguration(Scheduler scheduler, Tracer tracer, Propagator propagator) {
+ public TraceQuartzAutoConfiguration(Scheduler scheduler, Tracer tracer, Propagator propagator) {
this.scheduler = scheduler;
this.tracer = tracer;
this.propagator = propagator;
@@ -60,7 +62,7 @@ class TraceQuartzAutoConfiguration implements InitializingBean {
BeanFactory beanFactory;
@Bean
- public TracingJobListener tracingJobListener() {
+ TracingJobListener tracingJobListener() {
return new TracingJobListener(this.tracer, this.propagator);
}
diff --git a/tests/brave/spring-cloud-sleuth-instrumentation-reactor-tests/src/test/java/org/springframework/cloud/sleuth/instrument/reactor/Issue866Configuration.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/reactor/Issue866Configuration.java
similarity index 84%
rename from tests/brave/spring-cloud-sleuth-instrumentation-reactor-tests/src/test/java/org/springframework/cloud/sleuth/instrument/reactor/Issue866Configuration.java
rename to spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/reactor/Issue866Configuration.java
index ee7d18cd5..9da3931e9 100644
--- a/tests/brave/spring-cloud-sleuth-instrumentation-reactor-tests/src/test/java/org/springframework/cloud/sleuth/instrument/reactor/Issue866Configuration.java
+++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/reactor/Issue866Configuration.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.instrument.reactor;
+package org.springframework.cloud.sleuth.autoconfig.instrument.reactor;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -33,10 +33,11 @@ public class Issue866Configuration {
private static final Log log = LogFactory.getLog(Issue866Configuration.class);
- // we don't want to force direct dependencies between components
- // because Spring might just properly setup the context
- // we want to ensure that the HRBDRPP is always executed before
- // any other object is started
+ /**
+ * We don't want to force direct dependencies between components because Spring might
+ * just properly setup the context we want to ensure that the HRBDRPP is always
+ * executed before any other object is started.
+ */
public static TestHook hook;
@Bean
@@ -48,8 +49,14 @@ public class Issue866Configuration {
return hook;
}
+ /**
+ * Test Hook.
+ */
public static class TestHook extends HookRegisteringBeanDefinitionRegistryPostProcessor {
+ /**
+ * Whether the hook was called.
+ */
public boolean executed = false;
public TestHook(ConfigurableApplicationContext context) {
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/reactor/SleuthReactorProperties.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/reactor/SleuthReactorProperties.java
similarity index 97%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/reactor/SleuthReactorProperties.java
rename to spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/reactor/SleuthReactorProperties.java
index 0f3887310..8d22b5175 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/reactor/SleuthReactorProperties.java
+++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/reactor/SleuthReactorProperties.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.instrument.reactor;
+package org.springframework.cloud.sleuth.autoconfig.instrument.reactor;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/reactor/TraceReactorAutoConfiguration.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/reactor/TraceReactorAutoConfiguration.java
similarity index 91%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/reactor/TraceReactorAutoConfiguration.java
rename to spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/reactor/TraceReactorAutoConfiguration.java
index be98de5b8..97e2ceda0 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/reactor/TraceReactorAutoConfiguration.java
+++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/reactor/TraceReactorAutoConfiguration.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.instrument.reactor;
+package org.springframework.cloud.sleuth.autoconfig.instrument.reactor;
import java.io.Closeable;
import java.io.IOException;
@@ -39,15 +39,18 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.cloud.context.scope.refresh.RefreshScope;
import org.springframework.cloud.context.scope.refresh.RefreshScopeRefreshedEvent;
-import org.springframework.cloud.sleuth.api.Tracer;
+import org.springframework.cloud.sleuth.Tracer;
+import org.springframework.cloud.sleuth.autoconfig.brave.BraveAutoConfiguration;
+import org.springframework.cloud.sleuth.autoconfig.otel.OtelAutoConfiguration;
import org.springframework.cloud.sleuth.instrument.async.TraceableScheduledExecutorService;
+import org.springframework.cloud.sleuth.instrument.reactor.ReactorSleuth;
import org.springframework.context.ApplicationListener;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.ConfigurableEnvironment;
-import static org.springframework.cloud.sleuth.instrument.reactor.TraceReactorAutoConfiguration.TraceReactorConfiguration.SLEUTH_TRACE_REACTOR_KEY;
+import static org.springframework.cloud.sleuth.autoconfig.instrument.reactor.TraceReactorAutoConfiguration.TraceReactorConfiguration.SLEUTH_TRACE_REACTOR_KEY;
/**
* {@link org.springframework.boot.autoconfigure.EnableAutoConfiguration
@@ -60,9 +63,10 @@ import static org.springframework.cloud.sleuth.instrument.reactor.TraceReactorAu
@Configuration(proxyBeanMethods = false)
@ConditionalOnProperty(value = "spring.sleuth.reactor.enabled", matchIfMissing = true)
@ConditionalOnClass(Mono.class)
-@AutoConfigureAfter(name = "org.springframework.cloud.sleuth.instrument.web.TraceWebFluxAutoConfiguration")
+@AutoConfigureAfter(name = "org.springframework.cloud.sleuth.autoconfig.instrument.web.TraceWebAutoConfiguration",
+ value = { BraveAutoConfiguration.class, OtelAutoConfiguration.class })
@EnableConfigurationProperties(SleuthReactorProperties.class)
-class TraceReactorAutoConfiguration {
+public class TraceReactorAutoConfiguration {
static final String SLEUTH_REACTOR_EXECUTOR_SERVICE_KEY = "sleuth";
diff --git a/tests/brave/spring-cloud-sleuth-instrumentation-reactor-tests/src/test/java/org/springframework/cloud/sleuth/instrument/reactor/TraceReactorAutoConfigurationAccessorConfiguration.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/reactor/TraceReactorAutoConfigurationAccessorConfiguration.java
similarity index 82%
rename from tests/brave/spring-cloud-sleuth-instrumentation-reactor-tests/src/test/java/org/springframework/cloud/sleuth/instrument/reactor/TraceReactorAutoConfigurationAccessorConfiguration.java
rename to spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/reactor/TraceReactorAutoConfigurationAccessorConfiguration.java
index eb34632c3..64faaea9d 100644
--- a/tests/brave/spring-cloud-sleuth-instrumentation-reactor-tests/src/test/java/org/springframework/cloud/sleuth/instrument/reactor/TraceReactorAutoConfigurationAccessorConfiguration.java
+++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/reactor/TraceReactorAutoConfigurationAccessorConfiguration.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.instrument.reactor;
+package org.springframework.cloud.sleuth.autoconfig.instrument.reactor;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -23,8 +23,8 @@ import reactor.core.scheduler.Schedulers;
import org.springframework.context.ConfigurableApplicationContext;
-import static org.springframework.cloud.sleuth.instrument.reactor.TraceReactorAutoConfiguration.SLEUTH_REACTOR_EXECUTOR_SERVICE_KEY;
-import static org.springframework.cloud.sleuth.instrument.reactor.TraceReactorAutoConfiguration.TraceReactorConfiguration.SLEUTH_TRACE_REACTOR_KEY;
+import static org.springframework.cloud.sleuth.autoconfig.instrument.reactor.TraceReactorAutoConfiguration.SLEUTH_REACTOR_EXECUTOR_SERVICE_KEY;
+import static org.springframework.cloud.sleuth.autoconfig.instrument.reactor.TraceReactorAutoConfiguration.TraceReactorConfiguration.SLEUTH_TRACE_REACTOR_KEY;
/**
* @author Marcin Grzejszczak
diff --git a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/instrument/redis/TraceRedisAutoConfiguration.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/redis/TraceLettuceClientResourcesBeanPostProcessor.java
similarity index 59%
rename from spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/instrument/redis/TraceRedisAutoConfiguration.java
rename to spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/redis/TraceLettuceClientResourcesBeanPostProcessor.java
index 6d73b94c3..c85718937 100644
--- a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/instrument/redis/TraceRedisAutoConfiguration.java
+++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/redis/TraceLettuceClientResourcesBeanPostProcessor.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.brave.instrument.redis;
+package org.springframework.cloud.sleuth.autoconfig.instrument.redis;
import brave.Tracing;
import io.lettuce.core.resource.ClientResources;
@@ -25,42 +25,15 @@ import org.apache.commons.logging.LogFactory;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.config.BeanPostProcessor;
-import org.springframework.boot.autoconfigure.AutoConfigureAfter;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
-import org.springframework.boot.context.properties.EnableConfigurationProperties;
-import org.springframework.cloud.sleuth.brave.autoconfig.TraceBraveAutoConfiguration;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
+import org.springframework.cloud.sleuth.autoconfig.brave.instrument.redis.TraceRedisProperties;
/**
- * {@link org.springframework.boot.autoconfigure.EnableAutoConfiguration
- * Auto-configuration} enables Redis span information propagation.
+ * {@link BeanPostProcessor} for wrapping Lettuce components in a tracing representation.
*
- * @author Chao Chang
- * @since 2.2.0
+ * @author Marcin Grzejszczak
+ * @since 3.0.0
*/
-@Configuration(proxyBeanMethods = false)
-@ConditionalOnProperty(value = "spring.sleuth.redis.enabled", matchIfMissing = true)
-@ConditionalOnBean({ Tracing.class, ClientResources.class })
-@AutoConfigureAfter({ TraceBraveAutoConfiguration.class })
-@EnableConfigurationProperties(TraceRedisProperties.class)
-class TraceRedisAutoConfiguration {
-
- @Configuration(proxyBeanMethods = false)
- static class LettuceConfig {
-
- @Bean
- static TraceLettuceClientResourcesBeanPostProcessor traceLettuceClientResourcesBeanPostProcessor(
- BeanFactory beanFactory, TraceRedisProperties traceRedisProperties) {
- return new TraceLettuceClientResourcesBeanPostProcessor(beanFactory, traceRedisProperties);
- }
-
- }
-
-}
-
-class TraceLettuceClientResourcesBeanPostProcessor implements BeanPostProcessor {
+public class TraceLettuceClientResourcesBeanPostProcessor implements BeanPostProcessor {
private static final Log log = LogFactory.getLog(TraceLettuceClientResourcesBeanPostProcessor.class);
@@ -70,7 +43,8 @@ class TraceLettuceClientResourcesBeanPostProcessor implements BeanPostProcessor
private Tracing tracing;
- TraceLettuceClientResourcesBeanPostProcessor(BeanFactory beanFactory, TraceRedisProperties traceRedisProperties) {
+ public TraceLettuceClientResourcesBeanPostProcessor(BeanFactory beanFactory,
+ TraceRedisProperties traceRedisProperties) {
this.beanFactory = beanFactory;
this.traceRedisProperties = traceRedisProperties;
}
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/rxjava/SleuthRxJavaSchedulersProperties.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/rxjava/SleuthRxJavaSchedulersProperties.java
similarity index 91%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/rxjava/SleuthRxJavaSchedulersProperties.java
rename to spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/rxjava/SleuthRxJavaSchedulersProperties.java
index e071094af..04bfa9f0c 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/rxjava/SleuthRxJavaSchedulersProperties.java
+++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/rxjava/SleuthRxJavaSchedulersProperties.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.instrument.rxjava;
+package org.springframework.cloud.sleuth.autoconfig.instrument.rxjava;
import org.springframework.boot.context.properties.ConfigurationProperties;
@@ -25,7 +25,7 @@ import org.springframework.boot.context.properties.ConfigurationProperties;
* @since 1.0.12
*/
@ConfigurationProperties("spring.sleuth.rxjava.schedulers")
-class SleuthRxJavaSchedulersProperties {
+public class SleuthRxJavaSchedulersProperties {
/**
* Thread names for which spans will not be sampled.
@@ -50,7 +50,7 @@ class SleuthRxJavaSchedulersProperties {
this.hook = hook;
}
- private static class Hook {
+ public static class Hook {
/**
* Enable support for RxJava via RxJavaSchedulersHook.
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/rxjava/RxJavaAutoConfiguration.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/rxjava/TraceRxJavaAutoConfiguration.java
similarity index 80%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/rxjava/RxJavaAutoConfiguration.java
rename to spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/rxjava/TraceRxJavaAutoConfiguration.java
index 5d47d3184..b2c1612fd 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/rxjava/RxJavaAutoConfiguration.java
+++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/rxjava/TraceRxJavaAutoConfiguration.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.instrument.rxjava;
+package org.springframework.cloud.sleuth.autoconfig.instrument.rxjava;
import java.util.Arrays;
@@ -25,8 +25,10 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
-import org.springframework.cloud.sleuth.api.Tracer;
-import org.springframework.cloud.sleuth.autoconfig.TraceAutoConfiguration;
+import org.springframework.cloud.sleuth.Tracer;
+import org.springframework.cloud.sleuth.autoconfig.brave.BraveAutoConfiguration;
+import org.springframework.cloud.sleuth.autoconfig.otel.OtelAutoConfiguration;
+import org.springframework.cloud.sleuth.instrument.rxjava.SleuthRxJavaSchedulersHook;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@@ -38,12 +40,12 @@ import org.springframework.context.annotation.Configuration;
* @since 1.0.0
*/
@Configuration(proxyBeanMethods = false)
-@AutoConfigureAfter(TraceAutoConfiguration.class)
@ConditionalOnBean(Tracer.class)
@ConditionalOnClass(RxJavaSchedulersHook.class)
@ConditionalOnProperty(value = "spring.sleuth.rxjava.schedulers.hook.enabled", matchIfMissing = true)
@EnableConfigurationProperties(SleuthRxJavaSchedulersProperties.class)
-class RxJavaAutoConfiguration {
+@AutoConfigureAfter({ BraveAutoConfiguration.class, OtelAutoConfiguration.class })
+class TraceRxJavaAutoConfiguration {
@Bean
SleuthRxJavaSchedulersHook sleuthRxJavaSchedulersHook(Tracer tracer,
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/scheduling/SleuthSchedulingProperties.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/scheduling/SleuthSchedulingProperties.java
similarity index 93%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/scheduling/SleuthSchedulingProperties.java
rename to spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/scheduling/SleuthSchedulingProperties.java
index afcaaeea8..194293575 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/scheduling/SleuthSchedulingProperties.java
+++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/scheduling/SleuthSchedulingProperties.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.instrument.scheduling;
+package org.springframework.cloud.sleuth.autoconfig.instrument.scheduling;
import org.springframework.boot.context.properties.ConfigurationProperties;
@@ -26,7 +26,7 @@ import org.springframework.boot.context.properties.ConfigurationProperties;
* @since 1.0.12
*/
@ConfigurationProperties("spring.sleuth.scheduled")
-class SleuthSchedulingProperties {
+public class SleuthSchedulingProperties {
/**
* Enable tracing for {@link org.springframework.scheduling.annotation.Scheduled}.
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/scheduling/TraceSchedulingAutoConfiguration.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/scheduling/TraceSchedulingAutoConfiguration.java
similarity index 75%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/scheduling/TraceSchedulingAutoConfiguration.java
rename to spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/scheduling/TraceSchedulingAutoConfiguration.java
index 1c424f9f0..72a46d7b0 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/scheduling/TraceSchedulingAutoConfiguration.java
+++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/scheduling/TraceSchedulingAutoConfiguration.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.instrument.scheduling;
+package org.springframework.cloud.sleuth.autoconfig.instrument.scheduling;
import java.util.regex.Pattern;
@@ -23,8 +23,10 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
-import org.springframework.cloud.sleuth.api.Tracer;
-import org.springframework.cloud.sleuth.autoconfig.TraceAutoConfiguration;
+import org.springframework.cloud.sleuth.Tracer;
+import org.springframework.cloud.sleuth.autoconfig.brave.BraveAutoConfiguration;
+import org.springframework.cloud.sleuth.autoconfig.otel.OtelAutoConfiguration;
+import org.springframework.cloud.sleuth.instrument.scheduling.TraceSchedulingAspect;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@@ -40,13 +42,12 @@ import org.springframework.context.annotation.Configuration;
@ConditionalOnClass(name = "org.aspectj.lang.ProceedingJoinPoint")
@ConditionalOnProperty(value = "spring.sleuth.scheduled.enabled", matchIfMissing = true)
@ConditionalOnBean(Tracer.class)
-@AutoConfigureAfter(TraceAutoConfiguration.class)
@EnableConfigurationProperties(SleuthSchedulingProperties.class)
-class TraceSchedulingAutoConfiguration {
+@AutoConfigureAfter({ BraveAutoConfiguration.class, OtelAutoConfiguration.class })
+public class TraceSchedulingAutoConfiguration {
@Bean
- public TraceSchedulingAspect traceSchedulingAspect(Tracer tracer,
- SleuthSchedulingProperties sleuthSchedulingProperties) {
+ TraceSchedulingAspect traceSchedulingAspect(Tracer tracer, SleuthSchedulingProperties sleuthSchedulingProperties) {
String skipPatternString = sleuthSchedulingProperties.getSkipPattern();
Pattern skipPattern = skipPatternString != null ? Pattern.compile(skipPatternString) : null;
return new TraceSchedulingAspect(tracer, skipPattern);
diff --git a/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/web/ConditionalOnSleuthHttp.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/web/ConditionalOnSleuthHttp.java
new file mode 100644
index 000000000..4bbc6d0bd
--- /dev/null
+++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/web/ConditionalOnSleuthHttp.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2013-2020 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.springframework.cloud.sleuth.autoconfig.instrument.web;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+
+/**
+ * Helper annotation to enable Sleuth web.
+ *
+ * @author Marcin Grzejszczak
+ * @since 3.0.0
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ ElementType.TYPE, ElementType.METHOD })
+@Documented
+@ConditionalOnProperty(value = "spring.sleuth.http.enabled", matchIfMissing = true)
+@ConditionalOnSleuthWeb
+public @interface ConditionalOnSleuthHttp {
+
+}
diff --git a/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/web/ConditionalOnSleuthWeb.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/web/ConditionalOnSleuthWeb.java
new file mode 100644
index 000000000..a2ee82685
--- /dev/null
+++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/web/ConditionalOnSleuthWeb.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2013-2020 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.springframework.cloud.sleuth.autoconfig.instrument.web;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+
+/**
+ * Helper annotation to enable Sleuth web.
+ *
+ * @author Marcin Grzejszczak
+ * @since 3.0.0
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ ElementType.TYPE, ElementType.METHOD })
+@Documented
+@ConditionalOnProperty(value = "spring.sleuth.web.enabled", matchIfMissing = true)
+public @interface ConditionalOnSleuthWeb {
+
+}
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/SkipPatternConfiguration.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/web/SkipPatternConfiguration.java
similarity index 92%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/SkipPatternConfiguration.java
rename to spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/web/SkipPatternConfiguration.java
index 10c2bc74f..1600add7f 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/SkipPatternConfiguration.java
+++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/web/SkipPatternConfiguration.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.instrument.web;
+package org.springframework.cloud.sleuth.autoconfig.instrument.web;
import java.util.Collection;
import java.util.List;
@@ -30,15 +30,14 @@ import org.springframework.boot.actuate.autoconfigure.web.server.ManagementPortT
import org.springframework.boot.actuate.autoconfigure.web.server.ManagementServerProperties;
import org.springframework.boot.actuate.endpoint.EndpointsSupplier;
import org.springframework.boot.actuate.endpoint.web.ExposableWebEndpoint;
-import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.autoconfigure.web.ServerProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
-import org.springframework.cloud.sleuth.api.Tracer;
-import org.springframework.cloud.sleuth.autoconfig.TraceAutoConfiguration;
+import org.springframework.cloud.sleuth.autoconfig.SingleSkipPattern;
+import org.springframework.cloud.sleuth.instrument.web.SkipPatternProvider;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
@@ -55,11 +54,9 @@ import org.springframework.util.StringUtils;
* @since 1.0.0
*/
@Configuration(proxyBeanMethods = false)
-@ConditionalOnProperty(value = "spring.sleuth.web.enabled", matchIfMissing = true)
-@ConditionalOnBean(Tracer.class)
-@AutoConfigureAfter(TraceAutoConfiguration.class)
+@ConditionalOnSleuthWeb
@EnableConfigurationProperties(SleuthWebProperties.class)
-public class SkipPatternConfiguration {
+class SkipPatternConfiguration {
@Bean
@ConditionalOnMissingBean
@@ -134,7 +131,7 @@ public class SkipPatternConfiguration {
@Bean
@ConditionalOnBean(ManagementServerProperties.class)
- public SingleSkipPattern skipPatternForManagementServerProperties(Environment environment,
+ SingleSkipPattern skipPatternForManagementServerProperties(Environment environment,
final ManagementServerProperties managementServerProperties) {
return () -> getPatternForManagementServerProperties(environment, managementServerProperties);
}
@@ -202,7 +199,7 @@ public class SkipPatternConfiguration {
@Bean
@ConditionalOnManagementPort(ManagementPortType.SAME)
- public SingleSkipPattern skipPatternForActuatorEndpointsSamePort(Environment environment,
+ SingleSkipPattern skipPatternForActuatorEndpointsSamePort(Environment environment,
final ServerProperties serverProperties, final WebEndpointProperties webEndpointProperties,
final EndpointsSupplier endpointsSupplier) {
return () -> getEndpointsPatterns(environment, serverProperties.getServlet().getContextPath(),
@@ -213,7 +210,7 @@ public class SkipPatternConfiguration {
@ConditionalOnManagementPort(ManagementPortType.DIFFERENT)
@ConditionalOnProperty(name = "management.server.servlet.context-path", havingValue = "/",
matchIfMissing = true)
- public SingleSkipPattern skipPatternForActuatorEndpointsDifferentPort(Environment environment,
+ SingleSkipPattern skipPatternForActuatorEndpointsDifferentPort(Environment environment,
final ServerProperties serverProperties, final WebEndpointProperties webEndpointProperties,
final EndpointsSupplier endpointsSupplier) {
return () -> getEndpointsPatterns(environment, null, webEndpointProperties, endpointsSupplier);
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/SleuthHttpProperties.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/web/SleuthHttpProperties.java
similarity index 93%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/SleuthHttpProperties.java
rename to spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/web/SleuthHttpProperties.java
index 5364552e4..03f7f77ee 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/SleuthHttpProperties.java
+++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/web/SleuthHttpProperties.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.instrument.web;
+package org.springframework.cloud.sleuth.autoconfig.instrument.web;
import org.springframework.boot.context.properties.ConfigurationProperties;
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/SleuthWebProperties.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/web/SleuthWebProperties.java
similarity index 85%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/SleuthWebProperties.java
rename to spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/web/SleuthWebProperties.java
index 5e45ea619..bcafd6b16 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/SleuthWebProperties.java
+++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/web/SleuthWebProperties.java
@@ -14,10 +14,12 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.instrument.web;
+package org.springframework.cloud.sleuth.autoconfig.instrument.web;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.NestedConfigurationProperty;
+import org.springframework.cloud.sleuth.instrument.web.TraceWebFilter;
+import org.springframework.core.Ordered;
/**
* Configuration properties for web tracing.
@@ -33,7 +35,7 @@ public class SleuthWebProperties {
* have the tracing context passed for you out of the box. That means that e.g. your
* logs will not get correlated.
*/
- public static final int TRACING_FILTER_ORDER = 5;
+ public static final int TRACING_FILTER_ORDER = Ordered.HIGHEST_PRECEDENCE + 5;
/**
* Default set of skip patterns.
@@ -58,14 +60,12 @@ public class SleuthWebProperties {
private String additionalSkipPattern;
/**
- * Order in which the tracing filters should be registered. Defaults to
- * {@link TraceWebServletAutoConfiguration#TRACING_FILTER_ORDER}.
+ * Order in which the tracing filters should be registered.
*/
- private int filterOrder = TraceWebServletAutoConfiguration.TRACING_FILTER_ORDER;
+ private int filterOrder = TRACING_FILTER_ORDER;
/**
* If set to true, auto-configured skip patterns will be ignored.
- * @see SkipPatternConfiguration
*/
private boolean ignoreAutoConfiguredSkipPatterns = false;
@@ -74,6 +74,11 @@ public class SleuthWebProperties {
*/
private Client client = new Client();
+ /**
+ * Properties related to servlets.
+ */
+ private Servlet servlet = new Servlet();
+
public static String getDefaultSkipPattern() {
return DEFAULT_SKIP_PATTERN;
}
@@ -126,6 +131,14 @@ public class SleuthWebProperties {
this.client = client;
}
+ public Servlet getServlet() {
+ return this.servlet;
+ }
+
+ public void setServlet(Servlet servlet) {
+ this.servlet = servlet;
+ }
+
static String emptyToNull(String skipPattern) {
if (skipPattern != null && skipPattern.isEmpty()) {
skipPattern = null; // otherwise this would skip paths named ""!
@@ -169,6 +182,28 @@ public class SleuthWebProperties {
}
+ /**
+ * Web client properties.
+ *
+ * @author Marcin Grzejszczak
+ */
+ public static class Servlet {
+
+ /**
+ * Enable servlet instrumentation.
+ */
+ private boolean enabled = true;
+
+ public boolean isEnabled() {
+ return this.enabled;
+ }
+
+ public void setEnabled(boolean enabled) {
+ this.enabled = enabled;
+ }
+
+ }
+
/**
* Async computing properties.
*
diff --git a/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/web/TraceWebAutoConfiguration.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/web/TraceWebAutoConfiguration.java
new file mode 100644
index 000000000..22eb72fb1
--- /dev/null
+++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/web/TraceWebAutoConfiguration.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2013-2020 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.springframework.cloud.sleuth.autoconfig.instrument.web;
+
+import org.springframework.boot.autoconfigure.AutoConfigureAfter;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.cloud.sleuth.Tracer;
+import org.springframework.cloud.sleuth.autoconfig.brave.BraveAutoConfiguration;
+import org.springframework.cloud.sleuth.autoconfig.otel.OtelAutoConfiguration;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Import;
+
+/**
+ * {@link org.springframework.boot.autoconfigure.EnableAutoConfiguration
+ * Auto-configuration} that enables support for web applications.
+ *
+ * @author Marcin Grzejszczak
+ * @since 3.0.0
+ */
+@Configuration(proxyBeanMethods = false)
+@ConditionalOnBean(Tracer.class)
+@ConditionalOnSleuthWeb
+@Import({ SkipPatternConfiguration.class, TraceWebFluxConfiguration.class, TraceWebServletConfiguration.class })
+@EnableConfigurationProperties(SleuthWebProperties.class)
+@AutoConfigureAfter({ BraveAutoConfiguration.class, OtelAutoConfiguration.class })
+public class TraceWebAutoConfiguration {
+
+}
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/TraceWebFluxAutoConfiguration.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/web/TraceWebFluxConfiguration.java
similarity index 69%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/TraceWebFluxAutoConfiguration.java
rename to spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/web/TraceWebFluxConfiguration.java
index b37a1135e..0b64a2435 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/TraceWebFluxAutoConfiguration.java
+++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/web/TraceWebFluxConfiguration.java
@@ -14,14 +14,13 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.instrument.web;
+package org.springframework.cloud.sleuth.autoconfig.instrument.web;
-import org.springframework.beans.factory.BeanFactory;
-import org.springframework.boot.autoconfigure.AutoConfigureAfter;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
-import org.springframework.cloud.sleuth.api.Tracer;
+import org.springframework.cloud.sleuth.Tracer;
+import org.springframework.cloud.sleuth.http.HttpServerHandler;
+import org.springframework.cloud.sleuth.instrument.web.TraceWebFilter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@@ -35,13 +34,14 @@ import org.springframework.context.annotation.Configuration;
@Configuration(proxyBeanMethods = false)
@ConditionalOnProperty(value = "spring.sleuth.web.enabled", matchIfMissing = true)
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.REACTIVE)
-@ConditionalOnBean(Tracer.class)
-@AutoConfigureAfter(SkipPatternConfiguration.class)
-class TraceWebFluxAutoConfiguration {
+class TraceWebFluxConfiguration {
@Bean
- public TraceWebFilter traceFilter(BeanFactory beanFactory) {
- return new TraceWebFilter(beanFactory);
+ TraceWebFilter traceFilter(Tracer tracer, HttpServerHandler httpServerHandler,
+ SleuthWebProperties sleuthWebProperties) {
+ TraceWebFilter traceWebFilter = new TraceWebFilter(tracer, httpServerHandler);
+ traceWebFilter.setOrder(sleuthWebProperties.getFilterOrder());
+ return traceWebFilter;
}
}
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/TraceWebMvcConfigurer.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/web/TraceWebMvcConfigurer.java
similarity index 96%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/TraceWebMvcConfigurer.java
rename to spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/web/TraceWebMvcConfigurer.java
index 5d6c4c524..cda9c2af2 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/TraceWebMvcConfigurer.java
+++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/web/TraceWebMvcConfigurer.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.instrument.web;
+package org.springframework.cloud.sleuth.autoconfig.instrument.web;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.sleuth.instrument.web.mvc.SpanCustomizingAsyncHandlerInterceptor;
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/TraceWebServletAutoConfiguration.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/web/TraceWebServletConfiguration.java
similarity index 60%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/TraceWebServletAutoConfiguration.java
rename to spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/web/TraceWebServletConfiguration.java
index 2d9b53c92..541a3371c 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/TraceWebServletAutoConfiguration.java
+++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/web/TraceWebServletConfiguration.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.instrument.web;
+package org.springframework.cloud.sleuth.autoconfig.instrument.web;
import java.io.IOException;
@@ -27,24 +27,21 @@ import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import org.springframework.beans.factory.BeanFactory;
-import org.springframework.boot.autoconfigure.AutoConfigureAfter;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
+import org.springframework.cloud.sleuth.CurrentTraceContext;
import org.springframework.cloud.sleuth.SpanNamer;
-import org.springframework.cloud.sleuth.api.CurrentTraceContext;
-import org.springframework.cloud.sleuth.api.Tracer;
-import org.springframework.cloud.sleuth.api.http.HttpServerHandler;
-import org.springframework.cloud.sleuth.autoconfig.TraceAutoConfiguration;
+import org.springframework.cloud.sleuth.Tracer;
+import org.springframework.cloud.sleuth.http.HttpServerHandler;
+import org.springframework.cloud.sleuth.instrument.web.TraceWebAspect;
import org.springframework.cloud.sleuth.instrument.web.mvc.SpanCustomizingAsyncHandlerInterceptor;
import org.springframework.cloud.sleuth.instrument.web.servlet.TracingFilter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
-import org.springframework.core.Ordered;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
@@ -56,46 +53,46 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
* @since 1.0.0
*/
@Configuration(proxyBeanMethods = false)
-@ConditionalOnProperty(value = "spring.sleuth.web.enabled", matchIfMissing = true)
+@ConditionalOnSleuthWeb
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
-@ConditionalOnBean(Tracer.class)
-@AutoConfigureAfter(TraceAutoConfiguration.class)
@Import(SpanCustomizingAsyncHandlerInterceptor.class)
-public class TraceWebServletAutoConfiguration {
+class TraceWebServletConfiguration {
- /**
- * Default filter order for the Http tracing filter.
- */
- public static final int TRACING_FILTER_ORDER = Ordered.HIGHEST_PRECEDENCE + 5;
-
- @Bean
- TraceWebAspect traceWebAspect(Tracer tracer, CurrentTraceContext currentTraceContext, SpanNamer spanNamer) {
- return new TraceWebAspect(tracer, currentTraceContext, spanNamer);
- }
-
- @Bean
- public FilterRegistrationBean traceWebFilter(BeanFactory beanFactory, SleuthWebProperties webProperties) {
- FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new LazyTracingFilter(beanFactory));
- filterRegistrationBean.setDispatcherTypes(DispatcherType.ASYNC, DispatcherType.ERROR, DispatcherType.FORWARD,
- DispatcherType.INCLUDE, DispatcherType.REQUEST);
- filterRegistrationBean.setOrder(webProperties.getFilterOrder());
- return filterRegistrationBean;
- }
-
- @Bean
- @ConditionalOnMissingBean
- public TracingFilter tracingFilter(CurrentTraceContext currentTraceContext, HttpServerHandler httpServerHandler) {
- return TracingFilter.create(currentTraceContext, httpServerHandler);
- }
-
- /**
- * Nested config that configures Web MVC if it's present (without adding a runtime
- * dependency to it).
- */
@Configuration(proxyBeanMethods = false)
- @ConditionalOnClass(WebMvcConfigurer.class)
- @Import(TraceWebMvcConfigurer.class)
- protected static class TraceWebMvcAutoConfiguration {
+ @ConditionalOnProperty(value = "spring.sleuth.web.servlet.enabled", matchIfMissing = true)
+ static class ServletConfiguration {
+
+ @Bean
+ TraceWebAspect traceWebAspect(Tracer tracer, CurrentTraceContext currentTraceContext, SpanNamer spanNamer) {
+ return new TraceWebAspect(tracer, currentTraceContext, spanNamer);
+ }
+
+ @Bean
+ FilterRegistrationBean traceWebFilter(BeanFactory beanFactory, SleuthWebProperties webProperties) {
+ FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(
+ new LazyTracingFilter(beanFactory));
+ filterRegistrationBean.setDispatcherTypes(DispatcherType.ASYNC, DispatcherType.ERROR,
+ DispatcherType.FORWARD, DispatcherType.INCLUDE, DispatcherType.REQUEST);
+ filterRegistrationBean.setOrder(webProperties.getFilterOrder());
+ return filterRegistrationBean;
+ }
+
+ @Bean
+ @ConditionalOnMissingBean
+ TracingFilter tracingFilter(CurrentTraceContext currentTraceContext, HttpServerHandler httpServerHandler) {
+ return TracingFilter.create(currentTraceContext, httpServerHandler);
+ }
+
+ /**
+ * Nested config that configures Web MVC if it's present (without adding a runtime
+ * dependency to it).
+ */
+ @Configuration(proxyBeanMethods = false)
+ @ConditionalOnClass(WebMvcConfigurer.class)
+ @Import(TraceWebMvcConfigurer.class)
+ protected static class TraceWebMvcAutoConfiguration {
+
+ }
}
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/SleuthWebClientEnabled.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/web/client/ConditionalnOnSleuthWebClient.java
similarity index 83%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/SleuthWebClientEnabled.java
rename to spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/web/client/ConditionalnOnSleuthWebClient.java
index 0f9d1ca26..b87e09ef4 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/SleuthWebClientEnabled.java
+++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/web/client/ConditionalnOnSleuthWebClient.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.instrument.web.client;
+package org.springframework.cloud.sleuth.autoconfig.instrument.web.client;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
@@ -23,6 +23,7 @@ import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.cloud.sleuth.autoconfig.instrument.web.ConditionalOnSleuthHttp;
/**
* Helper annotation to enable Sleuth web client.
@@ -34,6 +35,7 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
@Target({ ElementType.TYPE, ElementType.METHOD })
@Documented
@ConditionalOnProperty(value = "spring.sleuth.web.client.enabled", matchIfMissing = true)
-public @interface SleuthWebClientEnabled {
+@ConditionalOnSleuthHttp
+public @interface ConditionalnOnSleuthWebClient {
}
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/TraceGatewayEnvironmentPostProcessor.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/web/client/TraceGatewayEnvironmentPostProcessor.java
similarity index 97%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/TraceGatewayEnvironmentPostProcessor.java
rename to spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/web/client/TraceGatewayEnvironmentPostProcessor.java
index bc68f9a03..7956868c6 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/TraceGatewayEnvironmentPostProcessor.java
+++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/web/client/TraceGatewayEnvironmentPostProcessor.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.instrument.web.client;
+package org.springframework.cloud.sleuth.autoconfig.instrument.web.client;
import java.util.HashMap;
import java.util.Map;
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/TraceWebAsyncClientAutoConfiguration.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/web/client/TraceWebAsyncClientAutoConfiguration.java
similarity index 84%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/TraceWebAsyncClientAutoConfiguration.java
rename to spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/web/client/TraceWebAsyncClientAutoConfiguration.java
index c00621f00..9e4ad99f3 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/TraceWebAsyncClientAutoConfiguration.java
+++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/web/client/TraceWebAsyncClientAutoConfiguration.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.instrument.web.client;
+package org.springframework.cloud.sleuth.autoconfig.instrument.web.client;
import java.util.ArrayList;
import java.util.Collection;
@@ -27,11 +27,11 @@ import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
-import org.springframework.cloud.sleuth.api.CurrentTraceContext;
-import org.springframework.cloud.sleuth.api.Tracer;
-import org.springframework.cloud.sleuth.api.http.HttpClientHandler;
-import org.springframework.cloud.sleuth.autoconfig.TraceAutoConfiguration;
-import org.springframework.cloud.sleuth.instrument.web.TraceHttpAutoConfiguration;
+import org.springframework.cloud.sleuth.CurrentTraceContext;
+import org.springframework.cloud.sleuth.Tracer;
+import org.springframework.cloud.sleuth.autoconfig.brave.BraveAutoConfiguration;
+import org.springframework.cloud.sleuth.autoconfig.otel.OtelAutoConfiguration;
+import org.springframework.cloud.sleuth.http.HttpClientHandler;
import org.springframework.cloud.sleuth.instrument.web.mvc.TracingAsyncClientHttpRequestInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@@ -48,12 +48,12 @@ import org.springframework.web.client.AsyncRestTemplate;
* @since 1.0.0
*/
@Configuration(proxyBeanMethods = false)
-@SleuthWebClientEnabled
+@ConditionalnOnSleuthWebClient
@ConditionalOnProperty(value = "spring.sleuth.web.async.client.enabled", matchIfMissing = true)
@ConditionalOnClass(AsyncRestTemplate.class)
@ConditionalOnBean(Tracer.class)
-@AutoConfigureAfter({ TraceAutoConfiguration.class, TraceHttpAutoConfiguration.class })
-class TraceWebAsyncClientAutoConfiguration {
+@AutoConfigureAfter({ BraveAutoConfiguration.class, OtelAutoConfiguration.class })
+public class TraceWebAsyncClientAutoConfiguration {
@Configuration(proxyBeanMethods = false)
@ConditionalOnBean(AsyncRestTemplate.class)
diff --git a/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/web/client/TraceWebClientAutoConfiguration.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/web/client/TraceWebClientAutoConfiguration.java
new file mode 100644
index 000000000..5dfa08e9c
--- /dev/null
+++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/web/client/TraceWebClientAutoConfiguration.java
@@ -0,0 +1,166 @@
+/*
+ * Copyright 2013-2020 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.springframework.cloud.sleuth.autoconfig.instrument.web.client;
+
+import reactor.netty.http.client.HttpClient;
+
+import org.springframework.beans.factory.BeanFactory;
+import org.springframework.beans.factory.ListableBeanFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.AutoConfigureAfter;
+import org.springframework.boot.autoconfigure.AutoConfigureBefore;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.boot.autoconfigure.security.oauth2.resource.UserInfoRestTemplateCustomizer;
+import org.springframework.boot.web.client.RestTemplateCustomizer;
+import org.springframework.cloud.commons.httpclient.HttpClientConfiguration;
+import org.springframework.cloud.gateway.filter.headers.HttpHeadersFilter;
+import org.springframework.cloud.sleuth.CurrentTraceContext;
+import org.springframework.cloud.sleuth.Tracer;
+import org.springframework.cloud.sleuth.autoconfig.brave.BraveAutoConfiguration;
+import org.springframework.cloud.sleuth.autoconfig.otel.OtelAutoConfiguration;
+import org.springframework.cloud.sleuth.http.HttpClientHandler;
+import org.springframework.cloud.sleuth.instrument.web.client.HttpClientBeanPostProcessor;
+import org.springframework.cloud.sleuth.instrument.web.client.LazyTraceClientHttpRequestInterceptor;
+import org.springframework.cloud.sleuth.instrument.web.client.TraceRequestHttpHeadersFilter;
+import org.springframework.cloud.sleuth.instrument.web.client.TraceResponseHttpHeadersFilter;
+import org.springframework.cloud.sleuth.instrument.web.client.TraceRestTemplateBeanPostProcessor;
+import org.springframework.cloud.sleuth.instrument.web.client.TraceRestTemplateCustomizer;
+import org.springframework.cloud.sleuth.instrument.web.client.TraceUserInfoRestTemplateCustomizer;
+import org.springframework.cloud.sleuth.instrument.web.client.TraceWebClientBeanPostProcessor;
+import org.springframework.cloud.sleuth.instrument.web.client.UserInfoRestTemplateCustomizerBeanPostProcessor;
+import org.springframework.cloud.sleuth.instrument.web.mvc.TracingClientHttpRequestInterceptor;
+import org.springframework.cloud.sleuth.propagation.Propagator;
+import org.springframework.context.ConfigurableApplicationContext;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.annotation.Order;
+import org.springframework.security.oauth2.client.OAuth2RestTemplate;
+import org.springframework.web.client.RestTemplate;
+import org.springframework.web.reactive.function.client.WebClient;
+
+/**
+ * {@link org.springframework.boot.autoconfigure.EnableAutoConfiguration
+ * Auto-configuration} enables span information propagation when using
+ * {@link RestTemplate}.
+ *
+ * @author Marcin Grzejszczak
+ * @since 1.0.0
+ */
+@Configuration(proxyBeanMethods = false)
+@ConditionalnOnSleuthWebClient
+@ConditionalOnBean(Tracer.class)
+@AutoConfigureBefore(HttpClientConfiguration.class)
+@AutoConfigureAfter({ BraveAutoConfiguration.class, OtelAutoConfiguration.class })
+class TraceWebClientAutoConfiguration {
+
+ @Configuration(proxyBeanMethods = false)
+ @ConditionalOnClass(RestTemplate.class)
+ static class RestTemplateConfig {
+
+ @Bean
+ public TracingClientHttpRequestInterceptor tracingClientHttpRequestInterceptor(
+ CurrentTraceContext currentTraceContext, HttpClientHandler httpClientHandler) {
+ return (TracingClientHttpRequestInterceptor) TracingClientHttpRequestInterceptor.create(currentTraceContext,
+ httpClientHandler);
+ }
+
+ @Configuration(proxyBeanMethods = false)
+ protected static class TraceInterceptorConfiguration {
+
+ @Autowired
+ private BeanFactory beanFactory;
+
+ @Bean
+ static TraceRestTemplateBeanPostProcessor traceRestTemplateBeanPostProcessor(
+ ListableBeanFactory beanFactory) {
+ return new TraceRestTemplateBeanPostProcessor(beanFactory);
+ }
+
+ @Bean
+ @Order
+ RestTemplateCustomizer traceRestTemplateCustomizer() {
+ return new TraceRestTemplateCustomizer(new LazyTraceClientHttpRequestInterceptor(this.beanFactory));
+ }
+
+ }
+
+ }
+
+ @Configuration(proxyBeanMethods = false)
+ @ConditionalOnClass(HttpHeadersFilter.class)
+ static class HttpHeadersFilterConfig {
+
+ @Bean
+ HttpHeadersFilter traceRequestHttpHeadersFilter(Tracer tracer, HttpClientHandler handler,
+ Propagator propagator) {
+ return new TraceRequestHttpHeadersFilter(tracer, handler, propagator);
+ }
+
+ @Bean
+ HttpHeadersFilter traceResponseHttpHeadersFilter(Tracer tracer, HttpClientHandler handler,
+ Propagator propagator) {
+ return new TraceResponseHttpHeadersFilter(tracer, handler, propagator);
+ }
+
+ }
+
+ @Configuration(proxyBeanMethods = false)
+ @ConditionalOnClass(HttpClient.class)
+ static class NettyConfiguration {
+
+ @Bean
+ static HttpClientBeanPostProcessor httpClientBeanPostProcessor(ConfigurableApplicationContext springContext) {
+ return new HttpClientBeanPostProcessor(springContext);
+ }
+
+ }
+
+ @Configuration(proxyBeanMethods = false)
+ @ConditionalOnClass(WebClient.class)
+ @ConditionalOnProperty(value = "spring.sleuth.web.webclient.enabled", matchIfMissing = true)
+ static class WebClientConfig {
+
+ @Bean
+ static TraceWebClientBeanPostProcessor traceWebClientBeanPostProcessor(
+ ConfigurableApplicationContext springContext) {
+ return new TraceWebClientBeanPostProcessor(springContext);
+ }
+
+ }
+
+ @Configuration(proxyBeanMethods = false)
+ @ConditionalOnClass({ UserInfoRestTemplateCustomizer.class, OAuth2RestTemplate.class })
+ protected static class TraceOAuthConfiguration {
+
+ @Bean
+ static UserInfoRestTemplateCustomizerBeanPostProcessor userInfoRestTemplateCustomizerBeanPostProcessor(
+ BeanFactory beanFactory) {
+ return new UserInfoRestTemplateCustomizerBeanPostProcessor(beanFactory);
+ }
+
+ @Bean
+ @ConditionalOnMissingBean
+ static UserInfoRestTemplateCustomizer traceUserInfoRestTemplateCustomizer(BeanFactory beanFactory) {
+ return new TraceUserInfoRestTemplateCustomizer(beanFactory);
+ }
+
+ }
+
+}
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/feign/SleuthFeignProperties.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/web/client/feign/SleuthFeignProperties.java
similarity index 90%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/feign/SleuthFeignProperties.java
rename to spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/web/client/feign/SleuthFeignProperties.java
index 22488c1a6..04eebd04a 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/feign/SleuthFeignProperties.java
+++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/web/client/feign/SleuthFeignProperties.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.instrument.web.client.feign;
+package org.springframework.cloud.sleuth.autoconfig.instrument.web.client.feign;
import org.springframework.boot.context.properties.ConfigurationProperties;
@@ -25,7 +25,7 @@ import org.springframework.boot.context.properties.ConfigurationProperties;
* @since 2.0.2
*/
@ConfigurationProperties("spring.sleuth.feign")
-class SleuthFeignProperties {
+public class SleuthFeignProperties {
/**
* When true enables instrumentation for feign.
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/feign/TraceFeignClientAutoConfiguration.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/web/client/feign/TraceFeignClientAutoConfiguration.java
similarity index 85%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/feign/TraceFeignClientAutoConfiguration.java
rename to spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/web/client/feign/TraceFeignClientAutoConfiguration.java
index 9affcf734..59741e3e3 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/feign/TraceFeignClientAutoConfiguration.java
+++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/instrument/web/client/feign/TraceFeignClientAutoConfiguration.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.instrument.web.client.feign;
+package org.springframework.cloud.sleuth.autoconfig.instrument.web.client.feign;
import feign.Client;
import feign.Feign;
@@ -28,7 +28,11 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.cloud.openfeign.FeignAutoConfiguration;
import org.springframework.cloud.openfeign.FeignContext;
-import org.springframework.cloud.sleuth.api.Tracer;
+import org.springframework.cloud.sleuth.Tracer;
+import org.springframework.cloud.sleuth.instrument.web.client.feign.FeignContextBeanPostProcessor;
+import org.springframework.cloud.sleuth.instrument.web.client.feign.OkHttpFeignClientBeanPostProcessor;
+import org.springframework.cloud.sleuth.instrument.web.client.feign.SleuthFeignBuilder;
+import org.springframework.cloud.sleuth.instrument.web.client.feign.TraceFeignAspect;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;
@@ -54,11 +58,6 @@ public class TraceFeignClientAutoConfiguration {
return SleuthFeignBuilder.builder(beanFactory);
}
- @Bean
- TraceFeignObjectWrapper traceFeignObjectWrapper(BeanFactory beanFactory) {
- return new TraceFeignObjectWrapper(beanFactory);
- }
-
@Bean
TraceFeignAspect traceFeignAspect(BeanFactory beanFactory) {
return new TraceFeignAspect(beanFactory);
diff --git a/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/otel/ConditionalOnOtelEnabled.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/otel/ConditionalOnOtelEnabled.java
new file mode 100644
index 000000000..1e0e3aefb
--- /dev/null
+++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/otel/ConditionalOnOtelEnabled.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2013-2020 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.springframework.cloud.sleuth.autoconfig.otel;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+import org.springframework.boot.autoconfigure.condition.AnyNestedCondition;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.context.annotation.Conditional;
+
+/**
+ * Conditional on OTel tracer.
+ *
+ * @author Marcin Grzejszczak
+ * @since 3.0.0
+ */
+@Target({ ElementType.TYPE, ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER })
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+@Conditional(AnyTracerModePropertySetCondition.class)
+public @interface ConditionalOnOtelEnabled {
+
+}
+
+final class AnyTracerModePropertySetCondition extends AnyNestedCondition {
+
+ private AnyTracerModePropertySetCondition() {
+ super(ConfigurationPhase.REGISTER_BEAN);
+ }
+
+ @ConditionalOnProperty(value = "spring.sleuth.tracer.mode", havingValue = "AUTO", matchIfMissing = true)
+ static class OnAutoTracerMode {
+
+ }
+
+ @ConditionalOnProperty(value = "spring.sleuth.tracer.mode", havingValue = "OTEL")
+ static class OnConcreteTracerMode {
+
+ }
+
+}
diff --git a/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/autoconfig/TraceOtelAutoConfiguration.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/otel/OtelAutoConfiguration.java
similarity index 77%
rename from spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/autoconfig/TraceOtelAutoConfiguration.java
rename to spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/otel/OtelAutoConfiguration.java
index 2f6912c9d..7bfff1364 100644
--- a/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/autoconfig/TraceOtelAutoConfiguration.java
+++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/otel/OtelAutoConfiguration.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.otel.autoconfig;
+package org.springframework.cloud.sleuth.autoconfig.otel;
import java.util.ArrayList;
import java.util.List;
@@ -26,7 +26,6 @@ import io.opentelemetry.api.metrics.spi.MeterProviderFactory;
import io.opentelemetry.api.trace.Tracer;
import io.opentelemetry.api.trace.TracerProvider;
import io.opentelemetry.api.trace.spi.TracerProviderFactory;
-import io.opentelemetry.context.propagation.ContextPropagators;
import io.opentelemetry.sdk.trace.SpanProcessor;
import io.opentelemetry.sdk.trace.TracerSdkProvider;
import io.opentelemetry.sdk.trace.config.TraceConfig;
@@ -36,15 +35,19 @@ import io.opentelemetry.sdk.trace.samplers.Sampler;
import io.opentelemetry.sdk.trace.spi.TracerProviderFactorySdk;
import org.springframework.beans.factory.ObjectProvider;
-import org.springframework.boot.autoconfigure.AutoConfigureBefore;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
-import org.springframework.cloud.sleuth.autoconfig.TraceAutoConfiguration;
-import org.springframework.cloud.sleuth.otel.bridge.OtelOpenTelemetry;
-import org.springframework.cloud.sleuth.otel.exporter.SpanExporterCustomizer;
+import org.springframework.cloud.sleuth.autoconfig.SleuthAnnotationConfiguration;
+import org.springframework.cloud.sleuth.autoconfig.SleuthBaggageProperties;
+import org.springframework.cloud.sleuth.autoconfig.SleuthSpanFilterProperties;
+import org.springframework.cloud.sleuth.autoconfig.SleuthTracerProperties;
+import org.springframework.cloud.sleuth.autoconfig.TraceConfiguration;
+import org.springframework.cloud.sleuth.otel.bridge.SpanExporterCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Import;
/**
* {@link org.springframework.boot.autoconfigure.EnableAutoConfiguration
@@ -54,18 +57,15 @@ import org.springframework.context.annotation.Configuration;
* @since 3.0.0
*/
@Configuration(proxyBeanMethods = false)
-@ConditionalOnProperty(value = "spring.sleuth.enabled", havingValue = "true", matchIfMissing = true)
-@AutoConfigureBefore(TraceAutoConfiguration.class)
-@EnableConfigurationProperties(OtelProperties.class)
-public class TraceOtelAutoConfiguration {
-
- @Bean
- @ConditionalOnMissingBean
- OpenTelemetry otel(TracerProviderFactory tracerProviderFactory, MeterProviderFactory meterProviderFactory,
- TracerProvider tracerProvider, MeterProvider meterProvider, ContextPropagators contextPropagators) {
- return new OtelOpenTelemetry(tracerProviderFactory, meterProviderFactory, tracerProvider, meterProvider,
- contextPropagators);
- }
+@ConditionalOnClass({ io.opentelemetry.api.trace.Tracer.class, OtelProperties.class })
+@ConditionalOnOtelEnabled
+@ConditionalOnProperty(value = "spring.sleuth.enabled", matchIfMissing = true)
+@ConditionalOnMissingBean(org.springframework.cloud.sleuth.Tracer.class)
+@EnableConfigurationProperties({ OtelProperties.class, SleuthSpanFilterProperties.class, SleuthBaggageProperties.class,
+ SleuthTracerProperties.class })
+@Import({ OtelBridgeConfiguation.class, OtelPropagationConfiguration.class, TraceConfiguration.class,
+ SleuthAnnotationConfiguration.class })
+public class OtelAutoConfiguration {
@Bean
@ConditionalOnMissingBean
@@ -124,12 +124,4 @@ public class TraceOtelAutoConfiguration {
return Sampler.traceIdRatioBased(otelProperties.getTraceIdRatioBased());
}
- @Bean
- @ConditionalOnMissingBean
- SpanExporterCustomizer noOpSleuthSpanFilterConverter() {
- return new SpanExporterCustomizer() {
-
- };
- }
-
}
diff --git a/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/otel/OtelBridgeConfiguation.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/otel/OtelBridgeConfiguation.java
new file mode 100644
index 000000000..b02f72e0b
--- /dev/null
+++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/otel/OtelBridgeConfiguation.java
@@ -0,0 +1,154 @@
+/*
+ * Copyright 2013-2020 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.springframework.cloud.sleuth.autoconfig.otel;
+
+import java.util.regex.Pattern;
+
+import io.opentelemetry.api.OpenTelemetry;
+import io.opentelemetry.api.metrics.MeterProvider;
+import io.opentelemetry.api.metrics.spi.MeterProviderFactory;
+import io.opentelemetry.api.trace.TracerProvider;
+import io.opentelemetry.api.trace.spi.TracerProviderFactory;
+import io.opentelemetry.context.propagation.ContextPropagators;
+
+import org.springframework.beans.factory.ObjectProvider;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.cloud.sleuth.CurrentTraceContext;
+import org.springframework.cloud.sleuth.SamplerFunction;
+import org.springframework.cloud.sleuth.SpanCustomizer;
+import org.springframework.cloud.sleuth.Tracer;
+import org.springframework.cloud.sleuth.autoconfig.SleuthBaggageProperties;
+import org.springframework.cloud.sleuth.autoconfig.instrument.web.ConditionalOnSleuthWeb;
+import org.springframework.cloud.sleuth.autoconfig.instrument.web.SleuthWebProperties;
+import org.springframework.cloud.sleuth.http.HttpClientHandler;
+import org.springframework.cloud.sleuth.http.HttpRequest;
+import org.springframework.cloud.sleuth.http.HttpRequestParser;
+import org.springframework.cloud.sleuth.http.HttpResponseParser;
+import org.springframework.cloud.sleuth.http.HttpServerHandler;
+import org.springframework.cloud.sleuth.instrument.web.HttpClientRequestParser;
+import org.springframework.cloud.sleuth.instrument.web.HttpClientResponseParser;
+import org.springframework.cloud.sleuth.instrument.web.HttpClientSampler;
+import org.springframework.cloud.sleuth.instrument.web.HttpServerRequestParser;
+import org.springframework.cloud.sleuth.instrument.web.HttpServerResponseParser;
+import org.springframework.cloud.sleuth.instrument.web.SkipPatternProvider;
+import org.springframework.cloud.sleuth.otel.bridge.OtelBaggageManager;
+import org.springframework.cloud.sleuth.otel.bridge.OtelCurrentTraceContext;
+import org.springframework.cloud.sleuth.otel.bridge.OtelHttpClientHandler;
+import org.springframework.cloud.sleuth.otel.bridge.OtelHttpServerHandler;
+import org.springframework.cloud.sleuth.otel.bridge.OtelOpenTelemetry;
+import org.springframework.cloud.sleuth.otel.bridge.OtelPropagator;
+import org.springframework.cloud.sleuth.otel.bridge.OtelSpanCustomizer;
+import org.springframework.cloud.sleuth.otel.bridge.OtelTracer;
+import org.springframework.cloud.sleuth.otel.bridge.SkipPatternSampler;
+import org.springframework.cloud.sleuth.otel.bridge.SpanExporterCustomizer;
+import org.springframework.cloud.sleuth.propagation.Propagator;
+import org.springframework.context.ApplicationEventPublisher;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Import;
+import org.springframework.lang.Nullable;
+
+/**
+ * {@link org.springframework.boot.autoconfigure.EnableAutoConfiguration
+ * Auto-configuration} to enable the bridge between Sleuth API and OpenTelemetry.
+ *
+ * @author Marcin Grzejszczak
+ * @since 3.0.0
+ */
+@Configuration(proxyBeanMethods = false)
+@ConditionalOnClass(OpenTelemetry.class)
+@Import({ OtelLogConfiguration.class, OtelExporterConfiguration.class })
+class OtelBridgeConfiguation {
+
+ @Bean
+ @ConditionalOnMissingBean
+ OpenTelemetry otel(TracerProviderFactory tracerProviderFactory, MeterProviderFactory meterProviderFactory,
+ TracerProvider tracerProvider, MeterProvider meterProvider, ContextPropagators contextPropagators) {
+ return new OtelOpenTelemetry(tracerProviderFactory, meterProviderFactory, tracerProvider, meterProvider,
+ contextPropagators);
+ }
+
+ @Bean
+ Tracer otelTracerBridge(io.opentelemetry.api.trace.Tracer tracer, ApplicationEventPublisher publisher,
+ CurrentTraceContext currentTraceContext, SleuthBaggageProperties sleuthBaggageProperties) {
+ return new OtelTracer(tracer, publisher, new OtelBaggageManager(currentTraceContext,
+ sleuthBaggageProperties.getRemoteFields(), sleuthBaggageProperties.getTagFields(), publisher));
+ }
+
+ // Both CurrentTraceContext & ContextStorageProvider
+ @Bean
+ @ConditionalOnMissingBean
+ OtelCurrentTraceContext otelCurrentTraceContext(ApplicationEventPublisher publisher) {
+ return new OtelCurrentTraceContext(publisher);
+ }
+
+ @Bean
+ SpanCustomizer otelSpanCustomizer() {
+ return new OtelSpanCustomizer();
+ }
+
+ @Bean
+ Propagator otelPropagator(ContextPropagators contextPropagators, io.opentelemetry.api.trace.Tracer tracer) {
+ return new OtelPropagator(contextPropagators, tracer);
+ }
+
+ @Bean
+ @ConditionalOnMissingBean
+ SpanExporterCustomizer noOpSleuthSpanFilterConverter() {
+ return new SpanExporterCustomizer() {
+
+ };
+ }
+
+ @Configuration(proxyBeanMethods = false)
+ @ConditionalOnSleuthWeb
+ @EnableConfigurationProperties(SleuthWebProperties.class)
+ static class TraceOtelHttpBridgeConfiguration {
+
+ @Bean
+ HttpClientHandler otelHttpClientHandler(io.opentelemetry.api.trace.Tracer tracer,
+ @Nullable @HttpClientRequestParser HttpRequestParser httpClientRequestParser,
+ @Nullable @HttpClientResponseParser HttpResponseParser httpClientResponseParser,
+ SamplerFunction samplerFunction) {
+ return new OtelHttpClientHandler(tracer, httpClientRequestParser, httpClientResponseParser,
+ samplerFunction);
+ }
+
+ @Bean
+ HttpServerHandler otelHttpServerHandler(io.opentelemetry.api.trace.Tracer tracer,
+ @Nullable @HttpServerRequestParser HttpRequestParser httpServerRequestParser,
+ @Nullable @HttpServerResponseParser HttpResponseParser httpServerResponseParser,
+ ObjectProvider skipPatternProvider) {
+ return new OtelHttpServerHandler(tracer, httpServerRequestParser, httpServerResponseParser,
+ skipPatternProvider.getIfAvailable(() -> () -> Pattern.compile("")));
+ }
+
+ @Bean
+ @ConditionalOnMissingBean(name = HttpClientSampler.NAME)
+ SamplerFunction defaultHttpClientSampler(SleuthWebProperties sleuthWebProperties) {
+ String skipPattern = sleuthWebProperties.getClient().getSkipPattern();
+ if (skipPattern == null) {
+ return SamplerFunction.deferDecision();
+ }
+ return new SkipPatternSampler(Pattern.compile(skipPattern));
+ }
+
+ }
+
+}
diff --git a/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/exporter/TraceOtelExporterAutoConfiguration.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/otel/OtelExporterConfiguration.java
similarity index 57%
rename from spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/exporter/TraceOtelExporterAutoConfiguration.java
rename to spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/otel/OtelExporterConfiguration.java
index c75782f4f..bf471948b 100644
--- a/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/exporter/TraceOtelExporterAutoConfiguration.java
+++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/otel/OtelExporterConfiguration.java
@@ -14,17 +14,18 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.otel.exporter;
+package org.springframework.cloud.sleuth.autoconfig.otel;
import java.util.List;
import io.opentelemetry.sdk.trace.export.SpanExporter;
-import org.springframework.boot.autoconfigure.AutoConfigureBefore;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
-import org.springframework.cloud.sleuth.api.exporter.SpanFilter;
-import org.springframework.cloud.sleuth.otel.autoconfig.TraceOtelAutoConfiguration;
+import org.springframework.cloud.sleuth.exporter.SpanFilter;
+import org.springframework.cloud.sleuth.otel.bridge.CompositeSpanExporter;
+import org.springframework.cloud.sleuth.otel.bridge.SpanExporterCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@@ -36,25 +37,19 @@ import org.springframework.context.annotation.Configuration;
* @since 3.0.0
*/
@Configuration(proxyBeanMethods = false)
-@ConditionalOnProperty(value = "spring.sleuth.enabled", matchIfMissing = true)
-@AutoConfigureBefore(TraceOtelAutoConfiguration.class)
+@ConditionalOnClass(SpanExporter.class)
@EnableConfigurationProperties(OtelExporterProperties.class)
-public class TraceOtelExporterAutoConfiguration {
-
- @Configuration(proxyBeanMethods = false)
- static class SleuthExporterConfiguration {
-
- @Bean
- @ConditionalOnProperty(value = "spring.sleuth.otel.exporter.sleuth-span-filter.enabled", matchIfMissing = true)
- SpanExporterCustomizer sleuthSpanFilterConverter(List spanFilters) {
- return new SpanExporterCustomizer() {
- @Override
- public SpanExporter customize(SpanExporter spanExporter) {
- return new CompositeSpanExporter(spanExporter, spanFilters);
- }
- };
- }
+class OtelExporterConfiguration {
+ @Bean
+ @ConditionalOnProperty(value = "spring.sleuth.otel.exporter.sleuth-span-filter.enabled", matchIfMissing = true)
+ SpanExporterCustomizer sleuthSpanFilterConverter(List spanFilters) {
+ return new SpanExporterCustomizer() {
+ @Override
+ public SpanExporter customize(SpanExporter spanExporter) {
+ return new CompositeSpanExporter(spanExporter, spanFilters);
+ }
+ };
}
}
diff --git a/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/exporter/OtelExporterProperties.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/otel/OtelExporterProperties.java
similarity index 96%
rename from spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/exporter/OtelExporterProperties.java
rename to spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/otel/OtelExporterProperties.java
index adf33e9fa..5a0ae1b25 100644
--- a/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/exporter/OtelExporterProperties.java
+++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/otel/OtelExporterProperties.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.otel.exporter;
+package org.springframework.cloud.sleuth.autoconfig.otel;
import org.springframework.boot.context.properties.ConfigurationProperties;
diff --git a/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/log/TraceOtelLogAutoConfiguration.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/otel/OtelLogConfiguration.java
similarity index 70%
rename from spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/log/TraceOtelLogAutoConfiguration.java
rename to spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/otel/OtelLogConfiguration.java
index 96ace9d0e..b741d5074 100644
--- a/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/log/TraceOtelLogAutoConfiguration.java
+++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/otel/OtelLogConfiguration.java
@@ -14,22 +14,19 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.otel.log;
+package org.springframework.cloud.sleuth.autoconfig.otel;
-import io.opentelemetry.api.trace.Tracer;
import io.opentelemetry.exporter.logging.LoggingSpanExporter;
import org.slf4j.MDC;
-import org.springframework.boot.autoconfigure.AutoConfigureAfter;
-import org.springframework.boot.autoconfigure.AutoConfigureBefore;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
+import org.springframework.beans.factory.BeanFactory;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.cloud.sleuth.autoconfig.SleuthBaggageProperties;
-import org.springframework.cloud.sleuth.autoconfig.TraceAutoConfiguration;
-import org.springframework.cloud.sleuth.otel.bridge.OtelBaggageManager;
-import org.springframework.cloud.sleuth.otel.bridge.TraceOtelBridgeAutoConfiguation;
+import org.springframework.cloud.sleuth.otel.bridge.Slf4jBaggageSpanProcessor;
+import org.springframework.cloud.sleuth.otel.bridge.Slf4jSpanProcessor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@@ -42,11 +39,8 @@ import org.springframework.context.annotation.Configuration;
* @since 3.0.0
*/
@Configuration(proxyBeanMethods = false)
-@ConditionalOnBean(Tracer.class)
-@AutoConfigureBefore(TraceAutoConfiguration.class)
-@AutoConfigureAfter(TraceOtelBridgeAutoConfiguation.class)
@EnableConfigurationProperties(OtelLogProperties.class)
-public class TraceOtelLogAutoConfiguration {
+class OtelLogConfiguration {
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(MDC.class)
@@ -54,9 +48,16 @@ public class TraceOtelLogAutoConfiguration {
static class Slf4jConfiguration {
@Bean
- Slf4jSpanProcessor otelSlf4jSpanProcessor(SleuthBaggageProperties sleuthBaggageProperties,
- OtelBaggageManager baggageManager) {
- return new Slf4jSpanProcessor(sleuthBaggageProperties, baggageManager);
+ @ConditionalOnMissingBean
+ Slf4jSpanProcessor otelSlf4jSpanProcessor() {
+ return new Slf4jSpanProcessor();
+ }
+
+ @Bean
+ @ConditionalOnMissingBean
+ Slf4jBaggageSpanProcessor otelSlf4jBaggageSpanProcessor(BeanFactory beanFactory,
+ SleuthBaggageProperties baggageProperties) {
+ return new Slf4jBaggageSpanProcessor(baggageProperties.getCorrelationFields(), beanFactory);
}
}
diff --git a/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/log/OtelLogProperties.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/otel/OtelLogProperties.java
similarity index 94%
rename from spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/log/OtelLogProperties.java
rename to spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/otel/OtelLogProperties.java
index 5be96cb38..74f1359c9 100644
--- a/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/log/OtelLogProperties.java
+++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/otel/OtelLogProperties.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.otel.log;
+package org.springframework.cloud.sleuth.autoconfig.otel;
import org.springframework.boot.context.properties.ConfigurationProperties;
@@ -25,7 +25,7 @@ import org.springframework.boot.context.properties.ConfigurationProperties;
* @since 3.0.0
*/
@ConfigurationProperties("spring.sleuth.otel.log")
-class OtelLogProperties {
+public class OtelLogProperties {
private Exporter exporter = new Exporter();
diff --git a/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/otel/OtelPropagationConfiguration.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/otel/OtelPropagationConfiguration.java
new file mode 100644
index 000000000..7b7536f72
--- /dev/null
+++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/otel/OtelPropagationConfiguration.java
@@ -0,0 +1,87 @@
+/*
+ * Copyright 2013-2020 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.springframework.cloud.sleuth.autoconfig.otel;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import io.opentelemetry.api.OpenTelemetry;
+import io.opentelemetry.context.propagation.ContextPropagators;
+import io.opentelemetry.context.propagation.DefaultContextPropagators;
+import io.opentelemetry.context.propagation.TextMapPropagator;
+
+import org.springframework.beans.factory.BeanFactory;
+import org.springframework.beans.factory.ObjectProvider;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.cloud.sleuth.BaggageManager;
+import org.springframework.cloud.sleuth.autoconfig.SleuthBaggageProperties;
+import org.springframework.cloud.sleuth.otel.propagation.BaggageTextMapPropagator;
+import org.springframework.cloud.sleuth.otel.propagation.CompositeTextMapPropagator;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * {@link org.springframework.boot.autoconfigure.EnableAutoConfiguration
+ * Auto-configuration} to enable propagation configuration via Spring Cloud Sleuth and
+ * OpenTelemetry SDK.
+ *
+ * @author Marcin Grzejszczak
+ * @since 3.0.0
+ */
+@Configuration(proxyBeanMethods = false)
+@EnableConfigurationProperties({ SleuthPropagationProperties.class, OtelPropagationProperties.class })
+class OtelPropagationConfiguration {
+
+ @Bean
+ @ConditionalOnMissingBean
+ ContextPropagators otelContextPropagators(ObjectProvider> propagators) {
+ List mapPropagators = propagators.getIfAvailable(ArrayList::new);
+ if (mapPropagators.isEmpty()) {
+ return OpenTelemetry.getGlobalPropagators();
+ }
+ DefaultContextPropagators.Builder builder = DefaultContextPropagators.builder();
+ mapPropagators.forEach(builder::addTextMapPropagator);
+ OpenTelemetry.setGlobalPropagators(builder.build());
+ return OpenTelemetry.getGlobalPropagators();
+ }
+
+ @Configuration(proxyBeanMethods = false)
+ @ConditionalOnProperty(name = "spring.sleuth.otel.propagation.composite-text-map-propagator.enabled",
+ matchIfMissing = true)
+ static class PropagatorsConfiguration {
+
+ @Bean
+ TextMapPropagator compositeTextMapPropagator(BeanFactory beanFactory, SleuthPropagationProperties properties) {
+ return new CompositeTextMapPropagator(beanFactory, properties.getType());
+ }
+
+ }
+
+ @Configuration(proxyBeanMethods = false)
+ @ConditionalOnProperty(name = "spring.sleuth.otel.propagation.sleuth-baggage.enabled", matchIfMissing = true)
+ static class BaggagePropagatorConfiguration {
+
+ @Bean
+ TextMapPropagator baggageTextMapPropagator(SleuthBaggageProperties properties, BaggageManager baggageManager) {
+ return new BaggageTextMapPropagator(properties.getRemoteFields(), baggageManager);
+ }
+
+ }
+
+}
diff --git a/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/propagation/OtelPropagationProperties.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/otel/OtelPropagationProperties.java
similarity index 89%
rename from spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/propagation/OtelPropagationProperties.java
rename to spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/otel/OtelPropagationProperties.java
index 04911082c..e5a6ed768 100644
--- a/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/propagation/OtelPropagationProperties.java
+++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/otel/OtelPropagationProperties.java
@@ -14,18 +14,18 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.otel.propagation;
+package org.springframework.cloud.sleuth.autoconfig.otel;
import org.springframework.boot.context.properties.ConfigurationProperties;
/**
- * Sleuth settings for OpenTelemetry.
+ * Sleuth settings for OpenTelemetry propagation.
*
* @author Marcin Grzejszczak
* @since 3.0.0
*/
@ConfigurationProperties("spring.sleuth.otel.propagation")
-class OtelPropagationProperties {
+public class OtelPropagationProperties {
private SleuthBaggage sleuthBaggage = new SleuthBaggage();
diff --git a/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/autoconfig/OtelProperties.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/otel/OtelProperties.java
similarity index 97%
rename from spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/autoconfig/OtelProperties.java
rename to spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/otel/OtelProperties.java
index 089922636..d20404d40 100644
--- a/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/autoconfig/OtelProperties.java
+++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/otel/OtelProperties.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.otel.autoconfig;
+package org.springframework.cloud.sleuth.autoconfig.otel;
import io.opentelemetry.api.trace.Span;
import io.opentelemetry.sdk.trace.config.TraceConfig;
@@ -28,7 +28,7 @@ import org.springframework.boot.context.properties.ConfigurationProperties;
* @since 3.0.0
*/
@ConfigurationProperties("spring.sleuth.otel.config")
-class OtelProperties {
+public class OtelProperties {
/**
* Instrumentation name to be used to find a Tracer.
diff --git a/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/propagation/SleuthPropagationProperties.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/otel/SleuthPropagationProperties.java
similarity index 75%
rename from spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/propagation/SleuthPropagationProperties.java
rename to spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/otel/SleuthPropagationProperties.java
index 4ef6ea647..88ac08932 100644
--- a/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/propagation/SleuthPropagationProperties.java
+++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/otel/SleuthPropagationProperties.java
@@ -14,12 +14,13 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.otel.propagation;
+package org.springframework.cloud.sleuth.autoconfig.otel;
import java.util.Collections;
import java.util.List;
import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.cloud.sleuth.otel.propagation.PropagationType;
/**
* Sleuth settings for OpenTelemetry.
@@ -43,38 +44,4 @@ public class SleuthPropagationProperties {
this.type = type;
}
- public enum PropagationType {
-
- /**
- * AWS propagation type.
- */
- AWS,
-
- /**
- * B3 propagation type.
- */
- B3,
-
- /**
- * Jaeger propagation type.
- */
- JAEGER,
-
- /**
- * Lightstep propagation type.
- */
- OT_TRACER,
-
- /**
- * W3C propagation type.
- */
- W3C,
-
- /**
- * Custom propagation type.
- */
- CUSTOM
-
- }
-
}
diff --git a/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/opentracing/OpentracingAutoConfiguration.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/otel/instrument/opentracing/OtelOpentracingAutoConfiguration.java
similarity index 83%
rename from spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/opentracing/OpentracingAutoConfiguration.java
rename to spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/otel/instrument/opentracing/OtelOpentracingAutoConfiguration.java
index 6f0c49678..f54c082b1 100644
--- a/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/opentracing/OpentracingAutoConfiguration.java
+++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/otel/instrument/opentracing/OtelOpentracingAutoConfiguration.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.otel.opentracing;
+package org.springframework.cloud.sleuth.autoconfig.otel.instrument.opentracing;
import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.opentracingshim.OpenTracingShim;
@@ -26,8 +26,8 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
-import org.springframework.cloud.sleuth.opentracing.SleuthOpentracingProperties;
-import org.springframework.cloud.sleuth.otel.autoconfig.TraceOtelAutoConfiguration;
+import org.springframework.cloud.sleuth.autoconfig.SleuthOpentracingProperties;
+import org.springframework.cloud.sleuth.autoconfig.otel.OtelAutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@@ -41,11 +41,11 @@ import org.springframework.context.annotation.Configuration;
*/
@Configuration(proxyBeanMethods = false)
@ConditionalOnProperty(value = "spring.sleuth.opentracing.enabled", matchIfMissing = true)
-@ConditionalOnBean(io.opentelemetry.api.trace.Tracer.class)
+@ConditionalOnBean(OpenTelemetry.class)
@ConditionalOnClass(OpenTracingShim.class)
-@AutoConfigureAfter(TraceOtelAutoConfiguration.class)
+@AutoConfigureAfter(OtelAutoConfiguration.class)
@EnableConfigurationProperties(SleuthOpentracingProperties.class)
-class OpentracingAutoConfiguration {
+public class OtelOpentracingAutoConfiguration {
@Bean
@ConditionalOnMissingBean
diff --git a/spring-cloud-sleuth-zipkin/src/main/java/org/springframework/cloud/sleuth/zipkin2/sender/ZipkinActiveMqSenderConfiguration.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/zipkin2/ZipkinActiveMqSenderConfiguration.java
similarity index 94%
rename from spring-cloud-sleuth-zipkin/src/main/java/org/springframework/cloud/sleuth/zipkin2/sender/ZipkinActiveMqSenderConfiguration.java
rename to spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/zipkin2/ZipkinActiveMqSenderConfiguration.java
index d4732bec3..d1357afa1 100644
--- a/spring-cloud-sleuth-zipkin/src/main/java/org/springframework/cloud/sleuth/zipkin2/sender/ZipkinActiveMqSenderConfiguration.java
+++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/zipkin2/ZipkinActiveMqSenderConfiguration.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.zipkin2.sender;
+package org.springframework.cloud.sleuth.autoconfig.zipkin2;
import org.apache.activemq.ActiveMQConnectionFactory;
import zipkin2.reporter.Sender;
@@ -27,7 +27,6 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.autoconfigure.jms.activemq.ActiveMQAutoConfiguration;
-import org.springframework.cloud.sleuth.zipkin2.ZipkinAutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
diff --git a/spring-cloud-sleuth-zipkin/src/main/java/org/springframework/cloud/sleuth/zipkin2/ZipkinAutoConfiguration.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/zipkin2/ZipkinAutoConfiguration.java
similarity index 90%
rename from spring-cloud-sleuth-zipkin/src/main/java/org/springframework/cloud/sleuth/zipkin2/ZipkinAutoConfiguration.java
rename to spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/zipkin2/ZipkinAutoConfiguration.java
index b056bf1d1..5f14d057b 100644
--- a/spring-cloud-sleuth-zipkin/src/main/java/org/springframework/cloud/sleuth/zipkin2/ZipkinAutoConfiguration.java
+++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/zipkin2/ZipkinAutoConfiguration.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.zipkin2;
+package org.springframework.cloud.sleuth.autoconfig.zipkin2;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
@@ -44,8 +44,13 @@ import org.springframework.boot.autoconfigure.web.ServerProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.cloud.client.serviceregistry.Registration;
import org.springframework.cloud.commons.util.InetUtils;
-import org.springframework.cloud.sleuth.autoconfig.TraceAutoConfiguration;
-import org.springframework.cloud.sleuth.zipkin2.sender.ZipkinSenderConfigurationImportSelector;
+import org.springframework.cloud.sleuth.autoconfig.brave.BraveAutoConfiguration;
+import org.springframework.cloud.sleuth.autoconfig.otel.OtelAutoConfiguration;
+import org.springframework.cloud.sleuth.zipkin2.DefaultEndpointLocator;
+import org.springframework.cloud.sleuth.zipkin2.DefaultZipkinRestTemplateCustomizer;
+import org.springframework.cloud.sleuth.zipkin2.EndpointLocator;
+import org.springframework.cloud.sleuth.zipkin2.ZipkinProperties;
+import org.springframework.cloud.sleuth.zipkin2.ZipkinRestTemplateCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
@@ -68,10 +73,12 @@ import org.springframework.web.client.RestTemplate;
*/
@Configuration(proxyBeanMethods = false)
@EnableConfigurationProperties(ZipkinProperties.class)
+@ConditionalOnClass({ Sender.class, EndpointLocator.class })
@ConditionalOnProperty(value = { "spring.sleuth.enabled", "spring.zipkin.enabled" }, matchIfMissing = true)
-@AutoConfigureBefore(TraceAutoConfiguration.class)
@AutoConfigureAfter(name = "org.springframework.cloud.autoconfigure.RefreshAutoConfiguration")
-@Import(ZipkinSenderConfigurationImportSelector.class)
+@AutoConfigureBefore({ OtelAutoConfiguration.class, BraveAutoConfiguration.class })
+@Import({ ZipkinSenderConfigurationImportSelector.class, ZipkinBraveConfiguration.class,
+ ZipkinOtelConfiguration.class })
public class ZipkinAutoConfiguration {
/**
diff --git a/spring-cloud-sleuth-zipkin/src/main/java/org/springframework/cloud/sleuth/zipkin2/ZipkinBraveAutoConfiguration.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/zipkin2/ZipkinBraveConfiguration.java
similarity index 87%
rename from spring-cloud-sleuth-zipkin/src/main/java/org/springframework/cloud/sleuth/zipkin2/ZipkinBraveAutoConfiguration.java
rename to spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/zipkin2/ZipkinBraveConfiguration.java
index 450d1fe48..1b465ae7f 100644
--- a/spring-cloud-sleuth-zipkin/src/main/java/org/springframework/cloud/sleuth/zipkin2/ZipkinBraveAutoConfiguration.java
+++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/zipkin2/ZipkinBraveConfiguration.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.zipkin2;
+package org.springframework.cloud.sleuth.autoconfig.zipkin2;
import java.util.ArrayList;
import java.util.Arrays;
@@ -32,12 +32,11 @@ import zipkin2.Span;
import zipkin2.reporter.Reporter;
import zipkin2.reporter.brave.ZipkinSpanHandler;
-import org.springframework.boot.autoconfigure.AutoConfigureAfter;
-import org.springframework.boot.autoconfigure.AutoConfigureBefore;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
-import org.springframework.cloud.sleuth.autoconfig.TraceAutoConfiguration;
-import org.springframework.cloud.sleuth.brave.autoconfig.TraceBraveAutoConfiguration;
+import org.springframework.cloud.sleuth.zipkin2.DefaultZipkinRestTemplateCustomizer;
+import org.springframework.cloud.sleuth.zipkin2.EndpointLocator;
+import org.springframework.cloud.sleuth.zipkin2.ZipkinRestTemplateCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.lang.Nullable;
@@ -59,10 +58,8 @@ import org.springframework.web.client.RestTemplate;
*/
@Configuration(proxyBeanMethods = false)
@ConditionalOnProperty(value = { "spring.sleuth.enabled", "spring.zipkin.enabled" }, matchIfMissing = true)
-@AutoConfigureBefore({ TraceAutoConfiguration.class, TraceBraveAutoConfiguration.class })
-@ConditionalOnClass(Tracer.class)
-@AutoConfigureAfter(ZipkinAutoConfiguration.class)
-public class ZipkinBraveAutoConfiguration {
+@ConditionalOnClass({ Tracer.class, EndpointLocator.class })
+class ZipkinBraveConfiguration {
/**
*
@@ -81,7 +78,7 @@ public class ZipkinBraveAutoConfiguration {
return 0;
};
- private static final Log log = LogFactory.getLog(ZipkinBraveAutoConfiguration.class);
+ private static final Log log = LogFactory.getLog(ZipkinBraveConfiguration.class);
/** Returns one handler for as many reporters as exist. */
@Bean
diff --git a/spring-cloud-sleuth-zipkin/src/main/java/org/springframework/cloud/sleuth/zipkin2/sender/ZipkinKafkaSenderConfiguration.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/zipkin2/ZipkinKafkaSenderConfiguration.java
similarity index 95%
rename from spring-cloud-sleuth-zipkin/src/main/java/org/springframework/cloud/sleuth/zipkin2/sender/ZipkinKafkaSenderConfiguration.java
rename to spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/zipkin2/ZipkinKafkaSenderConfiguration.java
index 39cc81445..d4820a631 100644
--- a/spring-cloud-sleuth-zipkin/src/main/java/org/springframework/cloud/sleuth/zipkin2/sender/ZipkinKafkaSenderConfiguration.java
+++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/zipkin2/ZipkinKafkaSenderConfiguration.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.zipkin2.sender;
+package org.springframework.cloud.sleuth.autoconfig.zipkin2;
import java.util.List;
import java.util.Map;
@@ -29,7 +29,6 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.autoconfigure.kafka.KafkaProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
-import org.springframework.cloud.sleuth.zipkin2.ZipkinAutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
diff --git a/spring-cloud-sleuth-zipkin/src/main/java/org/springframework/cloud/sleuth/zipkin2/ZipkinOtelAutoConfiguration.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/zipkin2/ZipkinOtelConfiguration.java
similarity index 83%
rename from spring-cloud-sleuth-zipkin/src/main/java/org/springframework/cloud/sleuth/zipkin2/ZipkinOtelAutoConfiguration.java
rename to spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/zipkin2/ZipkinOtelConfiguration.java
index c0c3f326e..1e45889f1 100644
--- a/spring-cloud-sleuth-zipkin/src/main/java/org/springframework/cloud/sleuth/zipkin2/ZipkinOtelAutoConfiguration.java
+++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/zipkin2/ZipkinOtelConfiguration.java
@@ -14,20 +14,20 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.zipkin2;
+package org.springframework.cloud.sleuth.autoconfig.zipkin2;
import io.opentelemetry.api.trace.Tracer;
import io.opentelemetry.exporter.zipkin.ZipkinSpanExporter;
import zipkin2.reporter.Sender;
import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.boot.autoconfigure.AutoConfigureAfter;
-import org.springframework.boot.autoconfigure.AutoConfigureBefore;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
-import org.springframework.cloud.sleuth.autoconfig.TraceAutoConfiguration;
-import org.springframework.cloud.sleuth.otel.autoconfig.TraceOtelAutoConfiguration;
+import org.springframework.cloud.sleuth.zipkin2.DefaultZipkinRestTemplateCustomizer;
+import org.springframework.cloud.sleuth.zipkin2.EndpointLocator;
+import org.springframework.cloud.sleuth.zipkin2.ZipkinProperties;
+import org.springframework.cloud.sleuth.zipkin2.ZipkinRestTemplateCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
@@ -50,10 +50,8 @@ import org.springframework.web.client.RestTemplate;
*/
@Configuration(proxyBeanMethods = false)
@ConditionalOnProperty(value = { "spring.sleuth.enabled", "spring.zipkin.enabled" }, matchIfMissing = true)
-@AutoConfigureBefore({ TraceAutoConfiguration.class, TraceOtelAutoConfiguration.class })
-@ConditionalOnClass(Tracer.class)
-@AutoConfigureAfter(ZipkinAutoConfiguration.class)
-public class ZipkinOtelAutoConfiguration {
+@ConditionalOnClass({ Tracer.class, EndpointLocator.class })
+class ZipkinOtelConfiguration {
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(ZipkinSpanExporter.class)
diff --git a/spring-cloud-sleuth-zipkin/src/main/java/org/springframework/cloud/sleuth/zipkin2/sender/ZipkinRabbitSenderConfiguration.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/zipkin2/ZipkinRabbitSenderConfiguration.java
similarity index 94%
rename from spring-cloud-sleuth-zipkin/src/main/java/org/springframework/cloud/sleuth/zipkin2/sender/ZipkinRabbitSenderConfiguration.java
rename to spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/zipkin2/ZipkinRabbitSenderConfiguration.java
index 801680692..39d165836 100644
--- a/spring-cloud-sleuth-zipkin/src/main/java/org/springframework/cloud/sleuth/zipkin2/sender/ZipkinRabbitSenderConfiguration.java
+++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/zipkin2/ZipkinRabbitSenderConfiguration.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.zipkin2.sender;
+package org.springframework.cloud.sleuth.autoconfig.zipkin2;
import zipkin2.reporter.Sender;
import zipkin2.reporter.amqp.RabbitMQSender;
@@ -25,7 +25,6 @@ import org.springframework.boot.autoconfigure.amqp.RabbitProperties;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
-import org.springframework.cloud.sleuth.zipkin2.ZipkinAutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
diff --git a/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/zipkin2/ZipkinRestTemplateSenderConfiguration.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/zipkin2/ZipkinRestTemplateSenderConfiguration.java
new file mode 100644
index 000000000..26ccb2a97
--- /dev/null
+++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/zipkin2/ZipkinRestTemplateSenderConfiguration.java
@@ -0,0 +1,114 @@
+/*
+ * Copyright 2013-2020 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.springframework.cloud.sleuth.autoconfig.zipkin2;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import zipkin2.reporter.Sender;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
+import org.springframework.cloud.sleuth.zipkin2.CachingZipkinUrlExtractor;
+import org.springframework.cloud.sleuth.zipkin2.LoadBalancerClientZipkinLoadBalancer;
+import org.springframework.cloud.sleuth.zipkin2.RestTemplateSender;
+import org.springframework.cloud.sleuth.zipkin2.StaticInstanceZipkinLoadBalancer;
+import org.springframework.cloud.sleuth.zipkin2.ZipkinLoadBalancer;
+import org.springframework.cloud.sleuth.zipkin2.ZipkinProperties;
+import org.springframework.cloud.sleuth.zipkin2.ZipkinRestTemplateCustomizer;
+import org.springframework.cloud.sleuth.zipkin2.ZipkinRestTemplateWrapper;
+import org.springframework.cloud.sleuth.zipkin2.ZipkinUrlExtractor;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Conditional;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.client.RestTemplate;
+
+@Configuration(proxyBeanMethods = false)
+@ConditionalOnMissingBean(name = ZipkinAutoConfiguration.SENDER_BEAN_NAME)
+@Conditional(ZipkinSenderCondition.class)
+@EnableConfigurationProperties(ZipkinSenderProperties.class)
+class ZipkinRestTemplateSenderConfiguration {
+
+ private static final Log log = LogFactory.getLog(ZipkinRestTemplateSenderConfiguration.class);
+
+ @Bean(ZipkinAutoConfiguration.SENDER_BEAN_NAME)
+ Sender restTemplateSender(ZipkinProperties zipkin, ZipkinRestTemplateCustomizer zipkinRestTemplateCustomizer,
+ ZipkinUrlExtractor extractor) {
+ RestTemplate restTemplate = new ZipkinRestTemplateWrapper(zipkin, extractor);
+ restTemplate = zipkinRestTemplateCustomizer.customizeTemplate(restTemplate);
+ return new RestTemplateSender(restTemplate, zipkin.getBaseUrl(), zipkin.getEncoder());
+ }
+
+ @Bean
+ ZipkinUrlExtractor defaultZipkinUrlExtractor(final ZipkinLoadBalancer zipkinLoadBalancer) {
+ return new CachingZipkinUrlExtractor(zipkinLoadBalancer);
+ }
+
+ @Configuration(proxyBeanMethods = false)
+ @ConditionalOnMissingClass("org.springframework.cloud.client.loadbalancer.LoadBalancerClient")
+ static class DefaultZipkinUrlExtractorConfiguration {
+
+ @Autowired(required = false)
+ LoadBalancerClient client;
+
+ @Bean
+ @ConditionalOnMissingBean
+ ZipkinLoadBalancer staticInstanceLoadBalancer(final ZipkinProperties zipkinProperties) {
+ return new StaticInstanceZipkinLoadBalancer(zipkinProperties);
+ }
+
+ }
+
+ @Configuration(proxyBeanMethods = false)
+ @ConditionalOnClass(LoadBalancerClient.class)
+ static class DiscoveryClientZipkinUrlExtractorConfiguration {
+
+ @Configuration(proxyBeanMethods = false)
+ @ConditionalOnProperty(value = "spring.zipkin.discovery-client-enabled", havingValue = "true",
+ matchIfMissing = true)
+ static class ZipkinClientLoadBalancedConfiguration {
+
+ @Autowired(required = false)
+ LoadBalancerClient client;
+
+ @Bean
+ @ConditionalOnMissingBean
+ ZipkinLoadBalancer loadBalancerClientZipkinLoadBalancer(ZipkinProperties zipkinProperties) {
+ return new LoadBalancerClientZipkinLoadBalancer(this.client, zipkinProperties);
+ }
+
+ }
+
+ @Configuration(proxyBeanMethods = false)
+ @ConditionalOnProperty(value = "spring.zipkin.discovery-client-enabled", havingValue = "false")
+ static class ZipkinClientNoOpConfiguration {
+
+ @Bean
+ @ConditionalOnMissingBean
+ ZipkinLoadBalancer staticInstanceLoadBalancer(final ZipkinProperties zipkinProperties) {
+ return new StaticInstanceZipkinLoadBalancer(zipkinProperties);
+ }
+
+ }
+
+ }
+
+}
diff --git a/spring-cloud-sleuth-zipkin/src/main/java/org/springframework/cloud/sleuth/zipkin2/sender/ZipkinSenderCondition.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/zipkin2/ZipkinSenderCondition.java
similarity index 90%
rename from spring-cloud-sleuth-zipkin/src/main/java/org/springframework/cloud/sleuth/zipkin2/sender/ZipkinSenderCondition.java
rename to spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/zipkin2/ZipkinSenderCondition.java
index a62f713ff..cd59c2735 100644
--- a/spring-cloud-sleuth-zipkin/src/main/java/org/springframework/cloud/sleuth/zipkin2/sender/ZipkinSenderCondition.java
+++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/zipkin2/ZipkinSenderCondition.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.zipkin2.sender;
+package org.springframework.cloud.sleuth.autoconfig.zipkin2;
import org.springframework.boot.autoconfigure.condition.ConditionMessage;
import org.springframework.boot.autoconfigure.condition.ConditionOutcome;
@@ -25,7 +25,7 @@ import org.springframework.core.type.AnnotationMetadata;
import org.springframework.core.type.ClassMetadata;
import org.springframework.util.StringUtils;
-import static org.springframework.cloud.sleuth.zipkin2.sender.ZipkinSenderConfigurationImportSelector.getType;
+import static org.springframework.cloud.sleuth.autoconfig.zipkin2.ZipkinSenderConfigurationImportSelector.getType;
/** Attach this to any new sender configuration. */
class ZipkinSenderCondition extends SpringBootCondition {
@@ -38,7 +38,7 @@ class ZipkinSenderCondition extends SpringBootCondition {
}
ConditionMessage.Builder message = ConditionMessage.forCondition("ZipkinSender", sourceClass);
String property = context.getEnvironment().getProperty("spring.zipkin.sender.type");
- if (StringUtils.isEmpty(property)) {
+ if (!StringUtils.hasText(property)) {
return ConditionOutcome.match(message.because("automatic sender type"));
}
String senderType = getType(((AnnotationMetadata) md).getClassName());
diff --git a/spring-cloud-sleuth-zipkin/src/main/java/org/springframework/cloud/sleuth/zipkin2/sender/ZipkinSenderConfigurationImportSelector.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/zipkin2/ZipkinSenderConfigurationImportSelector.java
similarity index 93%
rename from spring-cloud-sleuth-zipkin/src/main/java/org/springframework/cloud/sleuth/zipkin2/sender/ZipkinSenderConfigurationImportSelector.java
rename to spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/zipkin2/ZipkinSenderConfigurationImportSelector.java
index 4fb511395..6886f8be6 100644
--- a/spring-cloud-sleuth-zipkin/src/main/java/org/springframework/cloud/sleuth/zipkin2/sender/ZipkinSenderConfigurationImportSelector.java
+++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/zipkin2/ZipkinSenderConfigurationImportSelector.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.zipkin2.sender;
+package org.springframework.cloud.sleuth.autoconfig.zipkin2;
import java.util.Collections;
import java.util.LinkedHashMap;
@@ -28,7 +28,7 @@ import org.springframework.core.type.AnnotationMetadata;
*
* @author Adrian Cole
*/
-public class ZipkinSenderConfigurationImportSelector implements ImportSelector {
+class ZipkinSenderConfigurationImportSelector implements ImportSelector {
static final Map MAPPINGS;
diff --git a/spring-cloud-sleuth-zipkin/src/main/java/org/springframework/cloud/sleuth/zipkin2/sender/ZipkinSenderProperties.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/zipkin2/ZipkinSenderProperties.java
similarity index 92%
rename from spring-cloud-sleuth-zipkin/src/main/java/org/springframework/cloud/sleuth/zipkin2/sender/ZipkinSenderProperties.java
rename to spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/zipkin2/ZipkinSenderProperties.java
index 690592557..546142f4f 100644
--- a/spring-cloud-sleuth-zipkin/src/main/java/org/springframework/cloud/sleuth/zipkin2/sender/ZipkinSenderProperties.java
+++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/zipkin2/ZipkinSenderProperties.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.zipkin2.sender;
+package org.springframework.cloud.sleuth.autoconfig.zipkin2;
import org.springframework.boot.context.properties.ConfigurationProperties;
@@ -25,7 +25,7 @@ import org.springframework.boot.context.properties.ConfigurationProperties;
* @since 1.3.1
*/
@ConfigurationProperties("spring.zipkin.sender")
-class ZipkinSenderProperties {
+public class ZipkinSenderProperties {
/**
* Means of sending spans to Zipkin.
diff --git a/spring-cloud-sleuth-zipkin/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/spring-cloud-sleuth-autoconfigure/src/main/resources/META-INF/additional-spring-configuration-metadata.json
similarity index 55%
rename from spring-cloud-sleuth-zipkin/src/main/resources/META-INF/additional-spring-configuration-metadata.json
rename to spring-cloud-sleuth-autoconfigure/src/main/resources/META-INF/additional-spring-configuration-metadata.json
index 9791af806..4354714eb 100644
--- a/spring-cloud-sleuth-zipkin/src/main/resources/META-INF/additional-spring-configuration-metadata.json
+++ b/spring-cloud-sleuth-autoconfigure/src/main/resources/META-INF/additional-spring-configuration-metadata.json
@@ -28,6 +28,24 @@
"type": "java.lang.String",
"description": "Maximum number of bytes for a given message with spans sent to Zipkin over ActiveMQ.",
"defaultValue": 100000
+ },
+ {
+ "name": "spring.sleuth.function.enabled",
+ "type": "java.lang.Boolean",
+ "description": "Enable instrumenting of Spring Cloud Function and Spring Cloud Function based projects (e.g. Spring Cloud Stream).",
+ "defaultValue": true
+ },
+ {
+ "name": "spring.sleuth.otel.propagation.sleuth-baggage.enabled",
+ "type": "java.lang.Boolean",
+ "description": "Enable propagating baggage in a Sleuth compatible way (baggage key & value pair means e.g. a key & value HTTP pair).",
+ "defaultValue": true
+ },
+ {
+ "name": "spring.sleuth.otel.propagation.composite-text-map-propagator.enabled",
+ "type": "java.lang.Boolean",
+ "description": "Enable a composite text map propagator that can combine multiple propagation types into a single text map propagator.",
+ "defaultValue": true
}
]
}
diff --git a/spring-cloud-sleuth-autoconfigure/src/main/resources/META-INF/spring.factories b/spring-cloud-sleuth-autoconfigure/src/main/resources/META-INF/spring.factories
new file mode 100644
index 000000000..85f8abbf4
--- /dev/null
+++ b/spring-cloud-sleuth-autoconfigure/src/main/resources/META-INF/spring.factories
@@ -0,0 +1,34 @@
+# Auto Configuration
+org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
+org.springframework.cloud.sleuth.autoconfig.instrument.async.TraceAsyncAutoConfiguration,\
+org.springframework.cloud.sleuth.autoconfig.instrument.async.TraceAsyncCustomAutoConfiguration,\
+org.springframework.cloud.sleuth.autoconfig.instrument.async.TraceAsyncDefaultAutoConfiguration,\
+org.springframework.cloud.sleuth.autoconfig.instrument.circuitbreaker.TraceCircuitBreakerAutoConfiguration,\
+org.springframework.cloud.sleuth.autoconfig.instrument.rxjava.TraceRxJavaAutoConfiguration,\
+org.springframework.cloud.sleuth.autoconfig.instrument.quartz.TraceQuartzAutoConfiguration,\
+org.springframework.cloud.sleuth.autoconfig.instrument.web.TraceWebAutoConfiguration,\
+org.springframework.cloud.sleuth.autoconfig.instrument.web.client.TraceWebClientAutoConfiguration,\
+org.springframework.cloud.sleuth.autoconfig.instrument.web.client.feign.TraceFeignClientAutoConfiguration,\
+org.springframework.cloud.sleuth.autoconfig.instrument.web.client.TraceWebAsyncClientAutoConfiguration,\
+org.springframework.cloud.sleuth.autoconfig.instrument.scheduling.TraceSchedulingAutoConfiguration,\
+org.springframework.cloud.sleuth.autoconfig.instrument.reactor.TraceReactorAutoConfiguration,\
+org.springframework.cloud.sleuth.autoconfig.instrument.messaging.TraceFunctionAutoConfiguration,\
+org.springframework.cloud.sleuth.autoconfig.instrument.messaging.TraceSpringIntegrationAutoConfiguration,\
+org.springframework.cloud.sleuth.autoconfig.instrument.messaging.TraceSpringMessagingAutoConfiguration,\
+org.springframework.cloud.sleuth.autoconfig.instrument.messaging.TraceWebSocketAutoConfiguration,\
+org.springframework.cloud.sleuth.autoconfig.brave.BraveAutoConfiguration,\
+org.springframework.cloud.sleuth.autoconfig.brave.instrument.web.client.BraveWebClientAutoConfiguration,\
+org.springframework.cloud.sleuth.autoconfig.brave.instrument.rpc.BraveRpcAutoConfiguration,\
+org.springframework.cloud.sleuth.autoconfig.brave.instrument.grpc.BraveGrpcAutoConfiguration,\
+org.springframework.cloud.sleuth.autoconfig.brave.instrument.messaging.BraveKafkaStreamsAutoConfiguration,\
+org.springframework.cloud.sleuth.autoconfig.brave.instrument.messaging.BraveMessagingAutoConfiguration,\
+org.springframework.cloud.sleuth.autoconfig.brave.instrument.opentracing.BraveOpentracingAutoConfiguration,\
+org.springframework.cloud.sleuth.autoconfig.brave.instrument.redis.BraveRedisAutoConfiguration,\
+org.springframework.cloud.sleuth.autoconfig.brave.instrument.mongodb.BraveMongoDbAutoConfiguration,\
+org.springframework.cloud.sleuth.autoconfig.otel.OtelAutoConfiguration,\
+org.springframework.cloud.sleuth.autoconfig.otel.instrument.opentracing.OtelOpentracingAutoConfiguration,\
+org.springframework.cloud.sleuth.autoconfig.zipkin2.ZipkinAutoConfiguration
+# Environment Post Processor
+org.springframework.boot.env.EnvironmentPostProcessor=\
+org.springframework.cloud.sleuth.autoconfig.TraceEnvironmentPostProcessor,\
+org.springframework.cloud.sleuth.autoconfig.instrument.web.client.TraceGatewayEnvironmentPostProcessor
\ No newline at end of file
diff --git a/spring-cloud-sleuth-brave/src/test/java/org/springframework/cloud/sleuth/DisableSecurity.java b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/DisableSecurity.java
similarity index 100%
rename from spring-cloud-sleuth-brave/src/test/java/org/springframework/cloud/sleuth/DisableSecurity.java
rename to spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/DisableSecurity.java
diff --git a/spring-cloud-sleuth-brave/src/test/java/org/springframework/cloud/sleuth/DisableWebFluxSecurity.java b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/DisableWebFluxSecurity.java
similarity index 100%
rename from spring-cloud-sleuth-brave/src/test/java/org/springframework/cloud/sleuth/DisableWebFluxSecurity.java
rename to spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/DisableWebFluxSecurity.java
diff --git a/spring-cloud-sleuth-brave/src/test/java/org/springframework/cloud/sleuth/PermitAllServletConfiguration.java b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/PermitAllServletConfiguration.java
similarity index 100%
rename from spring-cloud-sleuth-brave/src/test/java/org/springframework/cloud/sleuth/PermitAllServletConfiguration.java
rename to spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/PermitAllServletConfiguration.java
diff --git a/spring-cloud-sleuth-brave/src/test/java/org/springframework/cloud/sleuth/PermitAllWebFluxSecurityConfiguration.java b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/PermitAllWebFluxSecurityConfiguration.java
similarity index 100%
rename from spring-cloud-sleuth-brave/src/test/java/org/springframework/cloud/sleuth/PermitAllWebFluxSecurityConfiguration.java
rename to spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/PermitAllWebFluxSecurityConfiguration.java
diff --git a/spring-cloud-sleuth-brave/src/test/java/org/springframework/cloud/sleuth/SleuthTestAutoConfiguration.java b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/SleuthTestAutoConfiguration.java
similarity index 100%
rename from spring-cloud-sleuth-brave/src/test/java/org/springframework/cloud/sleuth/SleuthTestAutoConfiguration.java
rename to spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/SleuthTestAutoConfiguration.java
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/noop/NoOpBaggageInScope.java b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/NoOpBaggageInScope.java
similarity index 83%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/noop/NoOpBaggageInScope.java
rename to spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/NoOpBaggageInScope.java
index a408fc4c4..bf2c48e53 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/noop/NoOpBaggageInScope.java
+++ b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/NoOpBaggageInScope.java
@@ -14,10 +14,10 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.api.noop;
+package org.springframework.cloud.sleuth.autoconfig;
-import org.springframework.cloud.sleuth.api.BaggageInScope;
-import org.springframework.cloud.sleuth.api.TraceContext;
+import org.springframework.cloud.sleuth.BaggageInScope;
+import org.springframework.cloud.sleuth.TraceContext;
/**
* A noop implementation. Does nothing.
@@ -25,7 +25,7 @@ import org.springframework.cloud.sleuth.api.TraceContext;
* @author Marcin Grzejszczak
* @since 3.0.0
*/
-public class NoOpBaggageInScope implements BaggageInScope {
+class NoOpBaggageInScope implements BaggageInScope {
@Override
public String name() {
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/noop/NoOpCurrentTraceContext.java b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/NoOpCurrentTraceContext.java
similarity index 85%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/noop/NoOpCurrentTraceContext.java
rename to spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/NoOpCurrentTraceContext.java
index ab67c49cf..2435f85a0 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/noop/NoOpCurrentTraceContext.java
+++ b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/NoOpCurrentTraceContext.java
@@ -14,14 +14,14 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.api.noop;
+package org.springframework.cloud.sleuth.autoconfig;
import java.util.concurrent.Callable;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
-import org.springframework.cloud.sleuth.api.CurrentTraceContext;
-import org.springframework.cloud.sleuth.api.TraceContext;
+import org.springframework.cloud.sleuth.CurrentTraceContext;
+import org.springframework.cloud.sleuth.TraceContext;
/**
* A noop implementation. Does nothing.
@@ -29,7 +29,7 @@ import org.springframework.cloud.sleuth.api.TraceContext;
* @author Marcin Grzejszczak
* @since 3.0.0
*/
-public class NoOpCurrentTraceContext implements CurrentTraceContext {
+class NoOpCurrentTraceContext implements CurrentTraceContext {
@Override
public TraceContext context() {
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/noop/NoOpHttpClientHandler.java b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/NoOpHttpClientHandler.java
similarity index 70%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/noop/NoOpHttpClientHandler.java
rename to spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/NoOpHttpClientHandler.java
index f994715d1..e958d7240 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/noop/NoOpHttpClientHandler.java
+++ b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/NoOpHttpClientHandler.java
@@ -14,13 +14,13 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.api.noop;
+package org.springframework.cloud.sleuth.autoconfig;
-import org.springframework.cloud.sleuth.api.Span;
-import org.springframework.cloud.sleuth.api.TraceContext;
-import org.springframework.cloud.sleuth.api.http.HttpClientHandler;
-import org.springframework.cloud.sleuth.api.http.HttpClientRequest;
-import org.springframework.cloud.sleuth.api.http.HttpClientResponse;
+import org.springframework.cloud.sleuth.Span;
+import org.springframework.cloud.sleuth.TraceContext;
+import org.springframework.cloud.sleuth.http.HttpClientHandler;
+import org.springframework.cloud.sleuth.http.HttpClientRequest;
+import org.springframework.cloud.sleuth.http.HttpClientResponse;
/**
* A noop implementation. Does nothing.
@@ -28,7 +28,7 @@ import org.springframework.cloud.sleuth.api.http.HttpClientResponse;
* @author Marcin Grzejszczak
* @since 3.0.0
*/
-public class NoOpHttpClientHandler implements HttpClientHandler {
+class NoOpHttpClientHandler implements HttpClientHandler {
@Override
public Span handleSend(HttpClientRequest request) {
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/noop/NoOpHttpServerHandler.java b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/NoOpHttpServerHandler.java
similarity index 70%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/noop/NoOpHttpServerHandler.java
rename to spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/NoOpHttpServerHandler.java
index ceeb27b79..87357ed29 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/noop/NoOpHttpServerHandler.java
+++ b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/NoOpHttpServerHandler.java
@@ -14,12 +14,12 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.api.noop;
+package org.springframework.cloud.sleuth.autoconfig;
-import org.springframework.cloud.sleuth.api.Span;
-import org.springframework.cloud.sleuth.api.http.HttpServerHandler;
-import org.springframework.cloud.sleuth.api.http.HttpServerRequest;
-import org.springframework.cloud.sleuth.api.http.HttpServerResponse;
+import org.springframework.cloud.sleuth.Span;
+import org.springframework.cloud.sleuth.http.HttpServerHandler;
+import org.springframework.cloud.sleuth.http.HttpServerRequest;
+import org.springframework.cloud.sleuth.http.HttpServerResponse;
/**
* A noop implementation. Does nothing.
@@ -27,7 +27,7 @@ import org.springframework.cloud.sleuth.api.http.HttpServerResponse;
* @author Marcin Grzejszczak
* @since 3.0.0
*/
-public class NoOpHttpServerHandler implements HttpServerHandler {
+class NoOpHttpServerHandler implements HttpServerHandler {
@Override
public Span handleReceive(HttpServerRequest request) {
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/noop/NoOpPropagator.java b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/NoOpPropagator.java
similarity index 79%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/noop/NoOpPropagator.java
rename to spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/NoOpPropagator.java
index 42bd745de..60368f0b4 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/noop/NoOpPropagator.java
+++ b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/NoOpPropagator.java
@@ -14,14 +14,14 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.api.noop;
+package org.springframework.cloud.sleuth.autoconfig;
import java.util.Collections;
import java.util.List;
-import org.springframework.cloud.sleuth.api.Span;
-import org.springframework.cloud.sleuth.api.TraceContext;
-import org.springframework.cloud.sleuth.api.propagation.Propagator;
+import org.springframework.cloud.sleuth.Span;
+import org.springframework.cloud.sleuth.TraceContext;
+import org.springframework.cloud.sleuth.propagation.Propagator;
/**
* A noop implementation. Does nothing.
@@ -29,7 +29,7 @@ import org.springframework.cloud.sleuth.api.propagation.Propagator;
* @author Marcin Grzejszczak
* @since 3.0.0
*/
-public class NoOpPropagator implements Propagator {
+class NoOpPropagator implements Propagator {
@Override
public List fields() {
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/noop/NoOpScopedSpan.java b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/NoOpScopedSpan.java
similarity index 88%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/noop/NoOpScopedSpan.java
rename to spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/NoOpScopedSpan.java
index ed6bb6a77..4a2b1e64a 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/noop/NoOpScopedSpan.java
+++ b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/NoOpScopedSpan.java
@@ -14,10 +14,10 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.api.noop;
+package org.springframework.cloud.sleuth.autoconfig;
-import org.springframework.cloud.sleuth.api.ScopedSpan;
-import org.springframework.cloud.sleuth.api.TraceContext;
+import org.springframework.cloud.sleuth.ScopedSpan;
+import org.springframework.cloud.sleuth.TraceContext;
/**
* A noop implementation. Does nothing.
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/noop/NoOpSpan.java b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/NoOpSpan.java
similarity index 89%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/noop/NoOpSpan.java
rename to spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/NoOpSpan.java
index 33ee8ab9d..266e8b2ff 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/noop/NoOpSpan.java
+++ b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/NoOpSpan.java
@@ -14,10 +14,10 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.api.noop;
+package org.springframework.cloud.sleuth.autoconfig;
-import org.springframework.cloud.sleuth.api.Span;
-import org.springframework.cloud.sleuth.api.TraceContext;
+import org.springframework.cloud.sleuth.Span;
+import org.springframework.cloud.sleuth.TraceContext;
/**
* A noop implementation. Does nothing.
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/noop/NoOpSpanBuilder.java b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/NoOpSpanBuilder.java
similarity index 90%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/noop/NoOpSpanBuilder.java
rename to spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/NoOpSpanBuilder.java
index 1c940d5f7..52e0ac5ce 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/noop/NoOpSpanBuilder.java
+++ b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/NoOpSpanBuilder.java
@@ -14,10 +14,10 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.api.noop;
+package org.springframework.cloud.sleuth.autoconfig;
-import org.springframework.cloud.sleuth.api.Span;
-import org.springframework.cloud.sleuth.api.TraceContext;
+import org.springframework.cloud.sleuth.Span;
+import org.springframework.cloud.sleuth.TraceContext;
/**
* A noop implementation. Does nothing.
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/noop/NoOpSpanCustomizer.java b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/NoOpSpanCustomizer.java
similarity index 84%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/noop/NoOpSpanCustomizer.java
rename to spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/NoOpSpanCustomizer.java
index 3aea4b0f3..75caa6dd4 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/noop/NoOpSpanCustomizer.java
+++ b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/NoOpSpanCustomizer.java
@@ -14,9 +14,9 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.api.noop;
+package org.springframework.cloud.sleuth.autoconfig;
-import org.springframework.cloud.sleuth.api.SpanCustomizer;
+import org.springframework.cloud.sleuth.SpanCustomizer;
/**
* A noop implementation. Does nothing.
@@ -24,7 +24,7 @@ import org.springframework.cloud.sleuth.api.SpanCustomizer;
* @author Marcin Grzejszczak
* @since 3.0.0
*/
-public class NoOpSpanCustomizer implements SpanCustomizer {
+class NoOpSpanCustomizer implements SpanCustomizer {
@Override
public SpanCustomizer name(String name) {
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/noop/NoOpSpanInScope.java b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/NoOpSpanInScope.java
similarity index 88%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/noop/NoOpSpanInScope.java
rename to spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/NoOpSpanInScope.java
index e80c9c260..b34cc321d 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/noop/NoOpSpanInScope.java
+++ b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/NoOpSpanInScope.java
@@ -14,9 +14,9 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.api.noop;
+package org.springframework.cloud.sleuth.autoconfig;
-import org.springframework.cloud.sleuth.api.Tracer;
+import org.springframework.cloud.sleuth.Tracer;
/**
* A noop implementation. Does nothing.
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/noop/NoOpTraceContext.java b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/NoOpTraceContext.java
similarity index 89%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/noop/NoOpTraceContext.java
rename to spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/NoOpTraceContext.java
index 02ba14ba3..5f4ad74df 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/noop/NoOpTraceContext.java
+++ b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/NoOpTraceContext.java
@@ -14,9 +14,9 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.api.noop;
+package org.springframework.cloud.sleuth.autoconfig;
-import org.springframework.cloud.sleuth.api.TraceContext;
+import org.springframework.cloud.sleuth.TraceContext;
/**
* A noop implementation. Does nothing.
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/noop/NoOpTracer.java b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/NoOpTracer.java
similarity index 81%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/noop/NoOpTracer.java
rename to spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/NoOpTracer.java
index 51a138fb2..0b5413a8b 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/noop/NoOpTracer.java
+++ b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/NoOpTracer.java
@@ -14,17 +14,17 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.api.noop;
+package org.springframework.cloud.sleuth.autoconfig;
import java.util.HashMap;
import java.util.Map;
-import org.springframework.cloud.sleuth.api.BaggageInScope;
-import org.springframework.cloud.sleuth.api.ScopedSpan;
-import org.springframework.cloud.sleuth.api.Span;
-import org.springframework.cloud.sleuth.api.SpanCustomizer;
-import org.springframework.cloud.sleuth.api.TraceContext;
-import org.springframework.cloud.sleuth.api.Tracer;
+import org.springframework.cloud.sleuth.BaggageInScope;
+import org.springframework.cloud.sleuth.ScopedSpan;
+import org.springframework.cloud.sleuth.Span;
+import org.springframework.cloud.sleuth.SpanCustomizer;
+import org.springframework.cloud.sleuth.TraceContext;
+import org.springframework.cloud.sleuth.Tracer;
/**
* A noop implementation. Does nothing.
@@ -32,7 +32,7 @@ import org.springframework.cloud.sleuth.api.Tracer;
* @author Marcin Grzejszczak
* @since 3.0.0
*/
-public class NoOpTracer implements Tracer {
+class NoOpTracer implements Tracer {
@Override
public Span nextSpan(Span parent) {
diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/annotation/SleuthNewSpanParserAnnotationDisableTests.java b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/SleuthNewSpanParserAnnotationDisableTests.java
similarity index 81%
rename from spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/annotation/SleuthNewSpanParserAnnotationDisableTests.java
rename to spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/SleuthNewSpanParserAnnotationDisableTests.java
index f213a7936..cc3da1ef1 100644
--- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/annotation/SleuthNewSpanParserAnnotationDisableTests.java
+++ b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/SleuthNewSpanParserAnnotationDisableTests.java
@@ -14,17 +14,17 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.annotation;
+package org.springframework.cloud.sleuth.autoconfig;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.cloud.sleuth.annotation.NewSpanParser;
import static org.assertj.core.api.Assertions.assertThat;
-@SpringBootTest(classes = SleuthAnnotationAutoConfiguration.class,
- properties = "spring.sleuth.annotation.enabled=false")
+@SpringBootTest(classes = SleuthAnnotationConfiguration.class, properties = "spring.sleuth.annotation.enabled=false")
public class SleuthNewSpanParserAnnotationDisableTests {
@Autowired(required = false)
diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/annotation/SleuthNewSpanParserAnnotationNoSleuthTests.java b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/SleuthNewSpanParserAnnotationNoSleuthTests.java
similarity index 81%
rename from spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/annotation/SleuthNewSpanParserAnnotationNoSleuthTests.java
rename to spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/SleuthNewSpanParserAnnotationNoSleuthTests.java
index 221d45ff8..40260f261 100644
--- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/annotation/SleuthNewSpanParserAnnotationNoSleuthTests.java
+++ b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/SleuthNewSpanParserAnnotationNoSleuthTests.java
@@ -14,18 +14,19 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.annotation;
+package org.springframework.cloud.sleuth.autoconfig;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.cloud.sleuth.api.Tracer;
+import org.springframework.cloud.sleuth.Tracer;
+import org.springframework.cloud.sleuth.annotation.NewSpanParser;
import static org.assertj.core.api.Assertions.assertThat;
-@SpringBootTest(classes = SleuthAnnotationAutoConfiguration.class, properties = "spring.sleuth.enabled=false")
+@SpringBootTest(classes = SleuthAnnotationConfiguration.class, properties = "spring.sleuth.enabled=false")
public class SleuthNewSpanParserAnnotationNoSleuthTests {
@Autowired(required = false)
diff --git a/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/SpanIgnoringSpanFilterTests.java b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/SpanIgnoringSpanFilterTests.java
new file mode 100644
index 000000000..84030c105
--- /dev/null
+++ b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/SpanIgnoringSpanFilterTests.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2013-2020 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.springframework.cloud.sleuth.autoconfig;
+
+import org.assertj.core.api.BDDAssertions;
+import org.junit.jupiter.api.Test;
+
+import org.springframework.beans.factory.NoSuchBeanDefinitionException;
+import org.springframework.boot.test.context.runner.ApplicationContextRunner;
+import org.springframework.cloud.sleuth.exporter.SpanIgnoringSpanFilter;
+
+class SpanIgnoringSpanFilterTests {
+
+ private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
+ .withUserConfiguration(TraceConfiguration.class);
+
+ @Test
+ void should_not_register_span_handler_when_property_passed() {
+ this.contextRunner.withPropertyValues("spring.sleuth.span-filter.enabled=false")
+ .run((context) -> BDDAssertions.thenThrownBy(() -> context.getBean(SpanIgnoringSpanFilter.class))
+ .isInstanceOf(NoSuchBeanDefinitionException.class));
+ }
+
+ @Test
+ void should_register_span_handler_by_default() {
+ this.contextRunner.run((context) -> context.getBean(SpanIgnoringSpanFilter.class));
+ }
+
+}
diff --git a/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/TraceNoOpAutoConfiguration.java b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/TraceNoOpAutoConfiguration.java
new file mode 100644
index 000000000..3d0d47ede
--- /dev/null
+++ b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/TraceNoOpAutoConfiguration.java
@@ -0,0 +1,89 @@
+/*
+ * Copyright 2013-2020 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.springframework.cloud.sleuth.autoconfig;
+
+import org.springframework.boot.autoconfigure.AutoConfigureBefore;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.cloud.sleuth.CurrentTraceContext;
+import org.springframework.cloud.sleuth.SpanCustomizer;
+import org.springframework.cloud.sleuth.Tracer;
+import org.springframework.cloud.sleuth.autoconfig.brave.BraveAutoConfiguration;
+import org.springframework.cloud.sleuth.autoconfig.instrument.web.ConditionalOnSleuthWeb;
+import org.springframework.cloud.sleuth.autoconfig.instrument.web.client.ConditionalnOnSleuthWebClient;
+import org.springframework.cloud.sleuth.autoconfig.otel.OtelAutoConfiguration;
+import org.springframework.cloud.sleuth.http.HttpClientHandler;
+import org.springframework.cloud.sleuth.http.HttpServerHandler;
+import org.springframework.cloud.sleuth.propagation.Propagator;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Import;
+
+/**
+ * {@link org.springframework.boot.autoconfigure.EnableAutoConfiguration
+ * Auto-configuration} to enable tracing via Spring Cloud Sleuth.
+ *
+ * @author Spencer Gibb
+ * @author Marcin Grzejszczak
+ * @author Tim Ysewyn
+ * @since 2.0.0
+ */
+@Configuration(proxyBeanMethods = false)
+@ConditionalOnProperty("spring.sleuth.noop.enabled")
+@AutoConfigureBefore({ BraveAutoConfiguration.class, OtelAutoConfiguration.class })
+@Import(TraceConfiguration.class)
+public class TraceNoOpAutoConfiguration {
+
+ @Bean
+ @ConditionalOnMissingBean
+ Tracer defaultTracer() {
+ return new NoOpTracer();
+ }
+
+ @Bean
+ Propagator defaultPropagator() {
+ return new NoOpPropagator();
+ }
+
+ @Bean
+ CurrentTraceContext defaultCurrentTraceContext() {
+ return new NoOpCurrentTraceContext();
+ }
+
+ @Bean
+ SpanCustomizer defaultSpanCustomizer() {
+ return new NoOpSpanCustomizer();
+ }
+
+ @Configuration(proxyBeanMethods = false)
+ static class TraceHttpConfiguration {
+
+ @Bean
+ @ConditionalnOnSleuthWebClient
+ HttpClientHandler defaultHttpClientHandler() {
+ return new NoOpHttpClientHandler();
+ }
+
+ @Bean
+ @ConditionalOnSleuthWeb
+ HttpServerHandler defaultHttpServerHandler() {
+ return new NoOpHttpServerHandler();
+ }
+
+ }
+
+}
diff --git a/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/brave/ArchitectureTests.java b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/brave/ArchitectureTests.java
new file mode 100644
index 000000000..c991704ce
--- /dev/null
+++ b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/brave/ArchitectureTests.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2013-2020 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.springframework.cloud.sleuth.autoconfig.brave;
+
+import com.tngtech.archunit.junit.AnalyzeClasses;
+import com.tngtech.archunit.junit.ArchTest;
+import com.tngtech.archunit.lang.ArchRule;
+
+import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.noClasses;
+
+@AnalyzeClasses(packagesOf = ArchitectureTests.class)
+public class ArchitectureTests {
+
+ @ArchTest
+ public static final ArchRule should_not_contain_any_reference_to_other_tracers = noClasses().should()
+ .dependOnClassesThat().resideInAnyPackage("..org.springframework.cloud.sleuth.otel..",
+ "..org.springframework.cloud.sleuth.autoconfig.otel..", "..io.opentelemetry..");
+
+}
diff --git a/spring-cloud-sleuth-brave/src/test/java/org/springframework/cloud/sleuth/brave/autoconfig/TraceBraveAutoConfigurationCustomizersTests.java b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/brave/BraveAutoConfigurationCustomizersTests.java
similarity index 83%
rename from spring-cloud-sleuth-brave/src/test/java/org/springframework/cloud/sleuth/brave/autoconfig/TraceBraveAutoConfigurationCustomizersTests.java
rename to spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/brave/BraveAutoConfigurationCustomizersTests.java
index 954d527c0..d6c74d5b7 100644
--- a/spring-cloud-sleuth-brave/src/test/java/org/springframework/cloud/sleuth/brave/autoconfig/TraceBraveAutoConfigurationCustomizersTests.java
+++ b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/brave/BraveAutoConfigurationCustomizersTests.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.brave.autoconfig;
+package org.springframework.cloud.sleuth.autoconfig.brave;
import brave.TracingCustomizer;
import brave.baggage.BaggagePropagationCustomizer;
@@ -29,23 +29,20 @@ import org.junit.jupiter.api.Test;
import org.springframework.boot.autoconfigure.AutoConfigurations;
import org.springframework.boot.test.context.assertj.AssertableApplicationContext;
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
-import org.springframework.cloud.sleuth.autoconfig.TraceAutoConfiguration;
-import org.springframework.cloud.sleuth.brave.bridge.TraceBraveBridgeAutoConfiguation;
-import org.springframework.cloud.sleuth.brave.instrument.messaging.TraceMessagingAutoConfiguration;
-import org.springframework.cloud.sleuth.brave.instrument.rpc.TraceRpcAutoConfiguration;
-import org.springframework.cloud.sleuth.brave.instrument.web.TraceHttpAutoConfiguration;
+import org.springframework.cloud.sleuth.autoconfig.brave.instrument.messaging.BraveMessagingAutoConfiguration;
+import org.springframework.cloud.sleuth.autoconfig.brave.instrument.rpc.BraveRpcAutoConfiguration;
+import org.springframework.cloud.sleuth.autoconfig.brave.instrument.web.BraveHttpConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.support.MessageHeaderAccessor;
import static org.assertj.core.api.BDDAssertions.then;
-public class TraceBraveAutoConfigurationCustomizersTests {
+public class BraveAutoConfigurationCustomizersTests {
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
- .withConfiguration(AutoConfigurations.of(TraceAutoConfiguration.class, TraceBraveAutoConfiguration.class,
- TraceBraveBridgeAutoConfiguation.class, TraceHttpAutoConfiguration.class,
- TraceRpcAutoConfiguration.class, TraceMessagingAutoConfiguration.class,
+ .withConfiguration(AutoConfigurations.of(BraveAutoConfiguration.class, BraveHttpConfiguration.class,
+ BraveRpcAutoConfiguration.class, BraveMessagingAutoConfiguration.class,
FakeSpringMessagingAutoConfiguration.class))
.withUserConfiguration(Customizers.class);
diff --git a/spring-cloud-sleuth-brave/src/test/java/org/springframework/cloud/sleuth/brave/autoconfig/TraceBraveAutoConfigurationPropagationCustomizationTests.java b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/brave/BraveAutoConfigurationPropagationCustomizationTests.java
similarity index 86%
rename from spring-cloud-sleuth-brave/src/test/java/org/springframework/cloud/sleuth/brave/autoconfig/TraceBraveAutoConfigurationPropagationCustomizationTests.java
rename to spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/brave/BraveAutoConfigurationPropagationCustomizationTests.java
index 4a262ad7c..b19eeacad 100644
--- a/spring-cloud-sleuth-brave/src/test/java/org/springframework/cloud/sleuth/brave/autoconfig/TraceBraveAutoConfigurationPropagationCustomizationTests.java
+++ b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/brave/BraveAutoConfigurationPropagationCustomizationTests.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.brave.autoconfig;
+package org.springframework.cloud.sleuth.autoconfig.brave;
import brave.baggage.BaggagePropagation;
import brave.propagation.B3Propagation;
@@ -25,36 +25,38 @@ import org.junit.jupiter.api.Test;
import org.springframework.boot.autoconfigure.AutoConfigurations;
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
-import org.springframework.cloud.sleuth.autoconfig.TraceAutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
-public class TraceBraveAutoConfigurationPropagationCustomizationTests {
+public class BraveAutoConfigurationPropagationCustomizationTests {
private static final Propagation.Factory B3_FACTORY = B3Propagation.newFactoryBuilder()
.injectFormat(B3Propagation.Format.SINGLE_NO_PARENT).build();
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
- .withConfiguration(AutoConfigurations.of(TraceAutoConfiguration.class, TraceBraveAutoConfiguration.class));
+ .withConfiguration(AutoConfigurations.of(BraveAutoConfiguration.class));
@Test
public void stillCreatesDefault() {
this.contextRunner.run((context) -> {
- BDDAssertions.then(context.getBean(Propagation.Factory.class)).isEqualTo(B3_FACTORY);
+ BDDAssertions.then(context.getBean(Propagation.Factory.class).get().keys())
+ .isEqualTo(B3_FACTORY.get().keys());
});
}
@Test
public void allowsCustomization() {
this.contextRunner.withPropertyValues("spring.sleuth.baggage.remote-fields=country-code").run((context) -> {
- BDDAssertions.then(context.getBean(Propagation.Factory.class)).extracting("delegate").isEqualTo(B3_FACTORY);
+ BDDAssertions.then(context.getBean(Propagation.Factory.class).get().keys())
+ .isEqualTo(B3_FACTORY.get().keys());
});
}
@Test
public void defaultValueUsedWhenApplicationNameNotSet() {
this.contextRunner.withPropertyValues("spring.application.name=").run((context) -> {
- BDDAssertions.then(context.getBean(Propagation.Factory.class)).isEqualTo(B3_FACTORY);
+ BDDAssertions.then(context.getBean(Propagation.Factory.class).get().keys())
+ .isEqualTo(B3_FACTORY.get().keys());
});
}
diff --git a/spring-cloud-sleuth-brave/src/test/java/org/springframework/cloud/sleuth/brave/autoconfig/TraceBraveAutoConfigurationTests.java b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/brave/BraveAutoConfigurationTests.java
similarity index 90%
rename from spring-cloud-sleuth-brave/src/test/java/org/springframework/cloud/sleuth/brave/autoconfig/TraceBraveAutoConfigurationTests.java
rename to spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/brave/BraveAutoConfigurationTests.java
index 06bf42cff..3667325a9 100644
--- a/spring-cloud-sleuth-brave/src/test/java/org/springframework/cloud/sleuth/brave/autoconfig/TraceBraveAutoConfigurationTests.java
+++ b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/brave/BraveAutoConfigurationTests.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.brave.autoconfig;
+package org.springframework.cloud.sleuth.autoconfig.brave;
import java.util.List;
@@ -39,18 +39,16 @@ import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.AutoConfigurations;
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
-import org.springframework.cloud.sleuth.autoconfig.TraceAutoConfiguration;
-import org.springframework.cloud.sleuth.brave.sampler.SamplerAutoConfigurationTests;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
-public class TraceBraveAutoConfigurationTests {
+public class BraveAutoConfigurationTests {
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
- .withConfiguration(AutoConfigurations.of(TraceAutoConfiguration.class, TraceBraveAutoConfiguration.class));
+ .withConfiguration(AutoConfigurations.of(BraveAutoConfiguration.class));
/**
- * Duplicates {@link SamplerAutoConfigurationTests} intentionally, to ensure
+ * Duplicates {@link BraveSamplerConfigurationTests} intentionally, to ensure
* configuration condition bugs do not exist.
*/
@Test
@@ -62,7 +60,7 @@ public class TraceBraveAutoConfigurationTests {
}
/**
- * Duplicates {@link SamplerAutoConfigurationTests} intentionally, to ensure
+ * Duplicates {@link BraveSamplerConfigurationTests} intentionally, to ensure
* configuration condition bugs do not exist.
*/
@Test
@@ -74,7 +72,7 @@ public class TraceBraveAutoConfigurationTests {
}
/**
- * Duplicates {@link SamplerAutoConfigurationTests} intentionally, to ensure
+ * Duplicates {@link BraveSamplerConfigurationTests} intentionally, to ensure
* configuration condition bugs do not exist.
*/
@Test
diff --git a/spring-cloud-sleuth-brave/src/test/java/org/springframework/cloud/sleuth/brave/autoconfig/TraceBraveAutoConfigurationWithDisabledSleuthTests.java b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/brave/BraveAutoConfigurationWithDisabledSleuthTests.java
similarity index 86%
rename from spring-cloud-sleuth-brave/src/test/java/org/springframework/cloud/sleuth/brave/autoconfig/TraceBraveAutoConfigurationWithDisabledSleuthTests.java
rename to spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/brave/BraveAutoConfigurationWithDisabledSleuthTests.java
index 0bab52c1e..5e99f8efb 100644
--- a/spring-cloud-sleuth-brave/src/test/java/org/springframework/cloud/sleuth/brave/autoconfig/TraceBraveAutoConfigurationWithDisabledSleuthTests.java
+++ b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/brave/BraveAutoConfigurationWithDisabledSleuthTests.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.brave.autoconfig;
+package org.springframework.cloud.sleuth.autoconfig.brave;
import brave.Tracing;
import org.apache.commons.logging.Log;
@@ -38,13 +38,13 @@ import static org.assertj.core.api.Assertions.assertThat;
@SpringBootTest(
// WebEnvironment.NONE will not read a Yaml profile
webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT,
- properties = { "spring.config.use-legacy-processing=true" },
- classes = TraceBraveAutoConfigurationWithDisabledSleuthTests.Config.class)
+ properties = { "spring.config.use-legacy-processing=true", "spring.sleuth.tracer.mode=BRAVE" },
+ classes = BraveAutoConfigurationWithDisabledSleuthTests.Config.class)
@ActiveProfiles("disabled")
@ExtendWith(OutputCaptureExtension.class)
-public class TraceBraveAutoConfigurationWithDisabledSleuthTests {
+public class BraveAutoConfigurationWithDisabledSleuthTests {
- private static final Log log = LogFactory.getLog(TraceBraveAutoConfigurationWithDisabledSleuthTests.class);
+ private static final Log log = LogFactory.getLog(BraveAutoConfigurationWithDisabledSleuthTests.class);
@Autowired(required = false)
Tracing tracing;
diff --git a/spring-cloud-sleuth-brave/src/test/java/org/springframework/cloud/sleuth/brave/propagation/TraceBravePropagationAutoConfigurationTests.java b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/brave/BravePropagationTests.java
similarity index 89%
rename from spring-cloud-sleuth-brave/src/test/java/org/springframework/cloud/sleuth/brave/propagation/TraceBravePropagationAutoConfigurationTests.java
rename to spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/brave/BravePropagationTests.java
index 71852eb8e..c4006c520 100644
--- a/spring-cloud-sleuth-brave/src/test/java/org/springframework/cloud/sleuth/brave/propagation/TraceBravePropagationAutoConfigurationTests.java
+++ b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/brave/BravePropagationTests.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.brave.propagation;
+package org.springframework.cloud.sleuth.autoconfig.brave;
import java.util.Arrays;
import java.util.HashMap;
@@ -30,18 +30,19 @@ import org.junit.jupiter.api.Test;
import org.springframework.boot.autoconfigure.AutoConfigurations;
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
-import org.springframework.cloud.sleuth.brave.autoconfig.TraceBraveAutoConfiguration;
+import org.springframework.cloud.sleuth.brave.bridge.CompositePropagationFactorySupplier;
+import org.springframework.cloud.sleuth.brave.propagation.PropagationFactorySupplier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import static org.assertj.core.api.Assertions.assertThat;
-class TraceBravePropagationAutoConfigurationTests {
+class BravePropagationTests {
@Test
void should_start_a_composite_propagation_factory_supplier_with_b3_as_default() {
- ApplicationContextRunner runner = new ApplicationContextRunner().withConfiguration(
- AutoConfigurations.of(TraceBraveAutoConfiguration.class, TraceBravePropagationAutoConfiguration.class))
+ ApplicationContextRunner runner = new ApplicationContextRunner()
+ .withConfiguration(AutoConfigurations.of(BraveAutoConfiguration.class))
.withUserConfiguration(Config.class);
runner.run(context -> {
@@ -54,8 +55,7 @@ class TraceBravePropagationAutoConfigurationTests {
@Test
void should_start_a_composite_propagation_factory_supplier_with_a_single_propagation_type() {
ApplicationContextRunner runner = new ApplicationContextRunner()
- .withConfiguration(AutoConfigurations.of(TraceBraveAutoConfiguration.class,
- TraceBravePropagationAutoConfiguration.class))
+ .withConfiguration(AutoConfigurations.of(BraveAutoConfiguration.class))
.withUserConfiguration(Config.class).withPropertyValues("spring.sleuth.propagation.type=w3c");
runner.run(context -> {
@@ -68,8 +68,7 @@ class TraceBravePropagationAutoConfigurationTests {
@Test
void should_start_a_composite_propagation_factory_supplier_with_multiple_propagation_types() {
ApplicationContextRunner runner = new ApplicationContextRunner()
- .withConfiguration(AutoConfigurations.of(TraceBraveAutoConfiguration.class,
- TraceBravePropagationAutoConfiguration.class))
+ .withConfiguration(AutoConfigurations.of(BraveAutoConfiguration.class))
.withUserConfiguration(Config.class).withPropertyValues("spring.sleuth.propagation.type=b3,w3c");
runner.run(context -> {
@@ -82,7 +81,7 @@ class TraceBravePropagationAutoConfigurationTests {
@Test
void should_start_a_composite_propagation_factory_supplier_with_custom_propagation_types() {
ApplicationContextRunner runner = new ApplicationContextRunner()
- .withConfiguration(AutoConfigurations.of(TraceBravePropagationAutoConfiguration.class))
+ .withConfiguration(AutoConfigurations.of(BraveAutoConfiguration.class))
.withUserConfiguration(CustomPropagatorConfig.class)
.withPropertyValues("spring.sleuth.propagation.type=custom");
diff --git a/spring-cloud-sleuth-brave/src/test/java/org/springframework/cloud/sleuth/brave/sampler/SamplerAutoConfigurationTests.java b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/brave/BraveSamplerConfigurationTests.java
similarity index 89%
rename from spring-cloud-sleuth-brave/src/test/java/org/springframework/cloud/sleuth/brave/sampler/SamplerAutoConfigurationTests.java
rename to spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/brave/BraveSamplerConfigurationTests.java
index 4fe5157b3..3af0c2d60 100644
--- a/spring-cloud-sleuth-brave/src/test/java/org/springframework/cloud/sleuth/brave/sampler/SamplerAutoConfigurationTests.java
+++ b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/brave/BraveSamplerConfigurationTests.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.brave.sampler;
+package org.springframework.cloud.sleuth.autoconfig.brave;
import brave.Tracing;
import brave.TracingCustomizer;
@@ -37,10 +37,10 @@ import org.springframework.context.annotation.Configuration;
* @since
*/
// TODO: missing spring cloud context tests
-public class SamplerAutoConfigurationTests {
+public class BraveSamplerConfigurationTests {
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
- .withConfiguration(AutoConfigurations.of(SamplerAutoConfiguration.class));
+ .withConfiguration(AutoConfigurations.of(BraveSamplerConfiguration.class));
@Test
void should_use_NEVER_SAMPLER_when_only_logging() {
@@ -92,7 +92,7 @@ public class SamplerAutoConfigurationTests {
SamplerProperties properties = new SamplerProperties();
properties.setProbability(0.01f);
- Sampler sampler = SamplerAutoConfiguration.samplerFromProps(properties);
+ Sampler sampler = BraveSamplerConfiguration.samplerFromProps(properties);
BDDAssertions.then(sampler).isInstanceOf(brave.sampler.CountingSampler.class);
}
@@ -101,7 +101,7 @@ public class SamplerAutoConfigurationTests {
void samplerFromProps_rateLimit() {
SamplerProperties properties = new SamplerProperties();
- Sampler sampler = SamplerAutoConfiguration.samplerFromProps(properties);
+ Sampler sampler = BraveSamplerConfiguration.samplerFromProps(properties);
BDDAssertions.then(sampler).isInstanceOf(brave.sampler.RateLimitingSampler.class);
}
@@ -111,7 +111,7 @@ public class SamplerAutoConfigurationTests {
SamplerProperties properties = new SamplerProperties();
properties.setRate(0);
- Sampler sampler = SamplerAutoConfiguration.samplerFromProps(properties);
+ Sampler sampler = BraveSamplerConfiguration.samplerFromProps(properties);
BDDAssertions.then(sampler).isSameAs(Sampler.NEVER_SAMPLE);
}
@@ -122,7 +122,7 @@ public class SamplerAutoConfigurationTests {
properties.setProbability(0.01f);
properties.setRate(20);
- Sampler sampler = SamplerAutoConfiguration.samplerFromProps(properties);
+ Sampler sampler = BraveSamplerConfiguration.samplerFromProps(properties);
BDDAssertions.then(sampler).isInstanceOf(brave.sampler.CountingSampler.class);
}
@@ -133,7 +133,7 @@ public class SamplerAutoConfigurationTests {
properties.setProbability(0.0f);
properties.setRate(20);
- Sampler sampler = SamplerAutoConfiguration.samplerFromProps(properties);
+ Sampler sampler = BraveSamplerConfiguration.samplerFromProps(properties);
BDDAssertions.then(sampler).isSameAs(Sampler.NEVER_SAMPLE);
}
diff --git a/spring-cloud-sleuth-brave/src/test/java/org/springframework/cloud/sleuth/SpanHandlerTests.java b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/brave/SpanHandlerTests.java
similarity index 88%
rename from spring-cloud-sleuth-brave/src/test/java/org/springframework/cloud/sleuth/SpanHandlerTests.java
rename to spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/brave/SpanHandlerTests.java
index 8e7979da3..fc060c426 100644
--- a/spring-cloud-sleuth-brave/src/test/java/org/springframework/cloud/sleuth/SpanHandlerTests.java
+++ b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/brave/SpanHandlerTests.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth;
+package org.springframework.cloud.sleuth.autoconfig.brave;
import brave.Span;
import brave.Tracer;
@@ -30,8 +30,6 @@ import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.cloud.sleuth.autoconfig.TraceAutoConfiguration;
-import org.springframework.cloud.sleuth.brave.autoconfig.TraceBraveAutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@@ -40,7 +38,8 @@ import static org.springframework.boot.test.context.SpringBootTest.WebEnvironmen
/**
* @author Marcin Grzejszczak
*/
-@SpringBootTest(classes = SpanHandlerTests.SpanHandlerAspectTestsConfig.class, webEnvironment = NONE)
+@SpringBootTest(classes = SpanHandlerTests.SpanHandlerAspectTestsConfig.class, webEnvironment = NONE,
+ properties = "spring.sleuth.tracer.mode=BRAVE")
public class SpanHandlerTests {
@Autowired
@@ -65,7 +64,7 @@ public class SpanHandlerTests {
}
@Configuration(proxyBeanMethods = false)
- @ImportAutoConfiguration({ TraceAutoConfiguration.class, TraceBraveAutoConfiguration.class })
+ @ImportAutoConfiguration({ BraveAutoConfiguration.class })
static class SpanHandlerAspectTestsConfig {
@Bean
diff --git a/spring-cloud-sleuth-brave/src/test/java/org/springframework/cloud/sleuth/brave/autoconfig/TraceBaggageEntryConfigurationTests.java b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/brave/TraceBaggageEntryConfigurationTests.java
similarity index 95%
rename from spring-cloud-sleuth-brave/src/test/java/org/springframework/cloud/sleuth/brave/autoconfig/TraceBaggageEntryConfigurationTests.java
rename to spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/brave/TraceBaggageEntryConfigurationTests.java
index 2224a9e1e..7443e598d 100644
--- a/spring-cloud-sleuth-brave/src/test/java/org/springframework/cloud/sleuth/brave/autoconfig/TraceBaggageEntryConfigurationTests.java
+++ b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/brave/TraceBaggageEntryConfigurationTests.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.brave.autoconfig;
+package org.springframework.cloud.sleuth.autoconfig.brave;
import java.util.Arrays;
import java.util.Collections;
@@ -43,7 +43,6 @@ import org.junit.jupiter.api.Test;
import org.springframework.boot.autoconfigure.AutoConfigurations;
import org.springframework.boot.test.context.assertj.AssertableApplicationContext;
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
-import org.springframework.cloud.sleuth.brave.autoconfig.TraceBaggageConfiguration.BaggageTagSpanHandler;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@@ -56,7 +55,7 @@ public class TraceBaggageEntryConfigurationTests {
static final Set EMPTY_ARRAY = new HashSet();
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
- .withConfiguration(AutoConfigurations.of(TraceBaggageConfiguration.class));
+ .withConfiguration(AutoConfigurations.of(BraveAutoConfiguration.class));
@Test
public void shouldCreateLocalFields() {
@@ -139,14 +138,14 @@ public class TraceBaggageEntryConfigurationTests {
static AbstractListAssert, List extends String>, String, ObjectAssert> assertThatFieldNamesToTag(
AssertableApplicationContext context) {
- return assertThat(context.getBean(SpanHandler.class)).isInstanceOf(BaggageTagSpanHandler.class)
+ return assertThat(context.getBean(BraveBaggageConfiguration.BaggageTagSpanHandler.class))
.extracting("fieldsToTag").asInstanceOf(array(BaggageField[].class)).extracting(BaggageField::name);
}
@Test
public void noopOnNoTagFields() {
this.contextRunner.withPropertyValues("spring.sleuth.baggage.tag-fields=").run((context) -> {
- assertThat(context.getBean(SpanHandler.class)).isSameAs(SpanHandler.NOOP);
+ assertThat(context.getBean("baggageTagSpanHandler", SpanHandler.class)).isSameAs(SpanHandler.NOOP);
});
}
diff --git a/spring-cloud-sleuth-brave/src/test/java/org/springframework/cloud/sleuth/brave/baggage/CorrelationScopeDecoratorTest.java b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/brave/baggage/CorrelationScopeDecoratorTest.java
similarity index 97%
rename from spring-cloud-sleuth-brave/src/test/java/org/springframework/cloud/sleuth/brave/baggage/CorrelationScopeDecoratorTest.java
rename to spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/brave/baggage/CorrelationScopeDecoratorTest.java
index 4029977e7..02720df5e 100644
--- a/spring-cloud-sleuth-brave/src/test/java/org/springframework/cloud/sleuth/brave/baggage/CorrelationScopeDecoratorTest.java
+++ b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/brave/baggage/CorrelationScopeDecoratorTest.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.brave.baggage;
+package org.springframework.cloud.sleuth.autoconfig.brave.baggage;
import brave.Span;
import brave.Tracer;
@@ -41,7 +41,8 @@ import static org.assertj.core.api.Assertions.assertThat;
*/
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE,
properties = { "spring.sleuth.baggage.remote-fields=x-vcap-request-id,country-code",
- "spring.sleuth.baggage.local-fields=bp", "spring.sleuth.baggage.correlation-fields=country-code,bp" })
+ "spring.sleuth.baggage.local-fields=bp", "spring.sleuth.baggage.correlation-fields=country-code,bp",
+ "spring.sleuth.tracer.mode=BRAVE" })
@SpringBootConfiguration
@EnableAutoConfiguration
public class CorrelationScopeDecoratorTest {
diff --git a/spring-cloud-sleuth-brave/src/test/java/org/springframework/cloud/sleuth/brave/instrument/messaging/SleuthKafkaStreamsConfigurationIntegrationTests.java b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/brave/instrument/messaging/BraveKafkaStreamsAutoConfigurationIntegrationTests.java
similarity index 90%
rename from spring-cloud-sleuth-brave/src/test/java/org/springframework/cloud/sleuth/brave/instrument/messaging/SleuthKafkaStreamsConfigurationIntegrationTests.java
rename to spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/brave/instrument/messaging/BraveKafkaStreamsAutoConfigurationIntegrationTests.java
index b9cbacccb..a74554233 100644
--- a/spring-cloud-sleuth-brave/src/test/java/org/springframework/cloud/sleuth/brave/instrument/messaging/SleuthKafkaStreamsConfigurationIntegrationTests.java
+++ b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/brave/instrument/messaging/BraveKafkaStreamsAutoConfigurationIntegrationTests.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.brave.instrument.messaging;
+package org.springframework.cloud.sleuth.autoconfig.brave.instrument.messaging;
import javax.annotation.PostConstruct;
@@ -32,8 +32,7 @@ import org.springframework.boot.test.context.FilteredClassLoader;
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
import org.springframework.boot.test.system.CapturedOutput;
import org.springframework.boot.test.system.OutputCaptureExtension;
-import org.springframework.cloud.sleuth.autoconfig.TraceAutoConfiguration;
-import org.springframework.cloud.sleuth.brave.autoconfig.TraceBraveAutoConfiguration;
+import org.springframework.cloud.sleuth.autoconfig.brave.BraveAutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.kafka.config.StreamsBuilderFactoryBean;
@@ -44,11 +43,11 @@ import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
@ExtendWith(OutputCaptureExtension.class)
-class SleuthKafkaStreamsConfigurationIntegrationTests {
+class BraveKafkaStreamsAutoConfigurationIntegrationTests {
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
- .withConfiguration(AutoConfigurations.of(TraceAutoConfiguration.class, TraceBraveAutoConfiguration.class,
- SleuthKafkaStreamsConfiguration.class))
+ .withConfiguration(
+ AutoConfigurations.of(BraveAutoConfiguration.class, BraveKafkaStreamsAutoConfiguration.class))
.withUserConfiguration(UserConfig.class);
@Test
diff --git a/spring-cloud-sleuth-brave/src/test/java/org/springframework/cloud/sleuth/brave/instrument/messaging/TraceMessagingAutoConfigurationIntegrationTests.java b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/brave/instrument/messaging/BraveMessagingAutoConfigurationIntegrationTests.java
similarity index 84%
rename from spring-cloud-sleuth-brave/src/test/java/org/springframework/cloud/sleuth/brave/instrument/messaging/TraceMessagingAutoConfigurationIntegrationTests.java
rename to spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/brave/instrument/messaging/BraveMessagingAutoConfigurationIntegrationTests.java
index d462abc2c..3fe52218f 100644
--- a/spring-cloud-sleuth-brave/src/test/java/org/springframework/cloud/sleuth/brave/instrument/messaging/TraceMessagingAutoConfigurationIntegrationTests.java
+++ b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/brave/instrument/messaging/BraveMessagingAutoConfigurationIntegrationTests.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.brave.instrument.messaging;
+package org.springframework.cloud.sleuth.autoconfig.brave.instrument.messaging;
import brave.handler.SpanHandler;
import brave.messaging.MessagingRequest;
@@ -29,15 +29,16 @@ import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.cloud.sleuth.brave.instrument.messaging.ConsumerSampler;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import static brave.messaging.MessagingRequestMatchers.channelNameEquals;
import static org.assertj.core.api.BDDAssertions.then;
-@SpringBootTest(classes = TraceMessagingAutoConfigurationIntegrationTests.Config.class,
- webEnvironment = SpringBootTest.WebEnvironment.NONE)
-public class TraceMessagingAutoConfigurationIntegrationTests {
+@SpringBootTest(classes = BraveMessagingAutoConfigurationIntegrationTests.Config.class,
+ webEnvironment = SpringBootTest.WebEnvironment.NONE, properties = "spring.sleuth.tracer.mode=BRAVE")
+public class BraveMessagingAutoConfigurationIntegrationTests {
@Autowired
@ConsumerSampler
diff --git a/spring-cloud-sleuth-brave/src/test/java/org/springframework/cloud/sleuth/brave/instrument/mongodb/TraceMongoDbAutoConfigurationTests.java b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/brave/instrument/mongodb/BraveMongoDbAutoConfigurationTests.java
similarity index 86%
rename from spring-cloud-sleuth-brave/src/test/java/org/springframework/cloud/sleuth/brave/instrument/mongodb/TraceMongoDbAutoConfigurationTests.java
rename to spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/brave/instrument/mongodb/BraveMongoDbAutoConfigurationTests.java
index be9fea222..8570e8a66 100644
--- a/spring-cloud-sleuth-brave/src/test/java/org/springframework/cloud/sleuth/brave/instrument/mongodb/TraceMongoDbAutoConfigurationTests.java
+++ b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/brave/instrument/mongodb/BraveMongoDbAutoConfigurationTests.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.brave.instrument.mongodb;
+package org.springframework.cloud.sleuth.autoconfig.brave.instrument.mongodb;
import brave.Tracing;
import brave.handler.MutableSpan;
@@ -23,6 +23,7 @@ import com.mongodb.MongoClientSettings;
import com.mongodb.event.CommandListener;
import com.mongodb.event.CommandStartedEvent;
import com.mongodb.event.CommandSucceededEvent;
+import org.assertj.core.api.BDDAssertions;
import org.bson.BsonDocument;
import org.junit.jupiter.api.Test;
import org.mockito.BDDMockito;
@@ -31,17 +32,18 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.cloud.sleuth.DisableSecurity;
+import org.springframework.cloud.sleuth.brave.instrument.mongodb.TraceMongoClientSettingsBuilderCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import static org.assertj.core.api.BDDAssertions.then;
-@SpringBootTest(properties = "test.mongo.mock.enabled=false")
-class TraceMongoDbAutoConfigurationTests {
+@SpringBootTest(properties = { "test.mongo.mock.enabled=false", "spring.sleuth.tracer.mode=BRAVE" })
+class BraveMongoDbAutoConfigurationTests {
@Test
void should_record_a_span_when_working_with_mongodb_commands(@Autowired TestSpanHandler handler) {
- then(handler.spans()).isNotEmpty();
+ BDDAssertions.then(handler.spans()).isNotEmpty();
MutableSpan span = handler.get(0);
then(span.traceId()).isNotEmpty();
then(span.tags()).containsKey("mongodb.command");
diff --git a/spring-cloud-sleuth-brave/src/test/java/org/springframework/cloud/sleuth/brave/instrument/opentracing/OpenTracingTest.java b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/brave/instrument/opentracing/OpenTracingTest.java
similarity index 97%
rename from spring-cloud-sleuth-brave/src/test/java/org/springframework/cloud/sleuth/brave/instrument/opentracing/OpenTracingTest.java
rename to spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/brave/instrument/opentracing/OpenTracingTest.java
index c7625e628..0afae9e92 100644
--- a/spring-cloud-sleuth-brave/src/test/java/org/springframework/cloud/sleuth/brave/instrument/opentracing/OpenTracingTest.java
+++ b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/brave/instrument/opentracing/OpenTracingTest.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.brave.instrument.opentracing;
+package org.springframework.cloud.sleuth.autoconfig.brave.instrument.opentracing;
import java.util.LinkedHashMap;
import java.util.Map;
@@ -55,7 +55,8 @@ import static org.springframework.boot.test.context.SpringBootTest.WebEnvironmen
*
* @author Marcin Grzejszczak
*/
-@SpringBootTest(webEnvironment = NONE, properties = "spring.sleuth.baggage.remote-fields=country-code")
+@SpringBootTest(webEnvironment = NONE,
+ properties = { "spring.sleuth.baggage.remote-fields=country-code", "spring.sleuth.tracer.mode=BRAVE" })
public class OpenTracingTest {
@Autowired
diff --git a/spring-cloud-sleuth-brave/src/test/java/org/springframework/cloud/sleuth/brave/instrument/rpc/TraceRpcAutoConfigurationIntegrationTests.java b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/brave/instrument/rpc/BraveRpcAutoConfigurationIntegrationTests.java
similarity index 68%
rename from spring-cloud-sleuth-brave/src/test/java/org/springframework/cloud/sleuth/brave/instrument/rpc/TraceRpcAutoConfigurationIntegrationTests.java
rename to spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/brave/instrument/rpc/BraveRpcAutoConfigurationIntegrationTests.java
index 351323040..84c5d1c6d 100644
--- a/spring-cloud-sleuth-brave/src/test/java/org/springframework/cloud/sleuth/brave/instrument/rpc/TraceRpcAutoConfigurationIntegrationTests.java
+++ b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/brave/instrument/rpc/BraveRpcAutoConfigurationIntegrationTests.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.brave.instrument.rpc;
+package org.springframework.cloud.sleuth.autoconfig.brave.instrument.rpc;
import brave.handler.SpanHandler;
import brave.rpc.RpcRequest;
@@ -27,9 +27,15 @@ import brave.test.TestSpanHandler;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
+import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration;
+import org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.cloud.gateway.config.GatewayAutoConfiguration;
+import org.springframework.cloud.gateway.config.GatewayClassPathWarningAutoConfiguration;
+import org.springframework.cloud.gateway.config.GatewayMetricsAutoConfiguration;
+import org.springframework.cloud.sleuth.brave.instrument.rpc.RpcServerSampler;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@@ -38,9 +44,9 @@ import static brave.rpc.RpcRequestMatchers.serviceEquals;
import static brave.sampler.Matchers.and;
import static org.assertj.core.api.BDDAssertions.then;
-@SpringBootTest(classes = TraceRpcAutoConfigurationIntegrationTests.Config.class,
- webEnvironment = SpringBootTest.WebEnvironment.NONE)
-public class TraceRpcAutoConfigurationIntegrationTests {
+@SpringBootTest(classes = BraveRpcAutoConfigurationIntegrationTests.Config.class,
+ webEnvironment = SpringBootTest.WebEnvironment.NONE, properties = "spring.sleuth.tracer.mode=BRAVE")
+public class BraveRpcAutoConfigurationIntegrationTests {
@Autowired
@RpcServerSampler
@@ -51,7 +57,9 @@ public class TraceRpcAutoConfigurationIntegrationTests {
then(this.sampler).isNotNull();
}
- @EnableAutoConfiguration(exclude = GatewayAutoConfiguration.class)
+ @EnableAutoConfiguration(exclude = { GatewayClassPathWarningAutoConfiguration.class, GatewayAutoConfiguration.class,
+ GatewayMetricsAutoConfiguration.class, ManagementWebSecurityAutoConfiguration.class,
+ MongoAutoConfiguration.class, QuartzAutoConfiguration.class })
@Configuration(proxyBeanMethods = false)
public static class Config {
diff --git a/spring-cloud-sleuth-brave/src/test/java/org/springframework/cloud/sleuth/brave/instrument/web/TraceHttpAutoConfigurationTests.java b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/brave/instrument/web/BraveHttpConfigurationTests.java
similarity index 88%
rename from spring-cloud-sleuth-brave/src/test/java/org/springframework/cloud/sleuth/brave/instrument/web/TraceHttpAutoConfigurationTests.java
rename to spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/brave/instrument/web/BraveHttpConfigurationTests.java
index 0c661de3b..28221975c 100644
--- a/spring-cloud-sleuth-brave/src/test/java/org/springframework/cloud/sleuth/brave/instrument/web/TraceHttpAutoConfigurationTests.java
+++ b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/brave/instrument/web/BraveHttpConfigurationTests.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.brave.instrument.web;
+package org.springframework.cloud.sleuth.autoconfig.brave.instrument.web;
import brave.http.HttpRequest;
import brave.http.HttpRequestParser;
@@ -27,22 +27,21 @@ import org.mockito.BDDMockito;
import org.springframework.boot.autoconfigure.AutoConfigurations;
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
-import org.springframework.cloud.sleuth.autoconfig.TraceAutoConfiguration;
-import org.springframework.cloud.sleuth.brave.autoconfig.TraceBraveAutoConfiguration;
+import org.springframework.cloud.sleuth.autoconfig.brave.BraveAutoConfiguration;
+import org.springframework.cloud.sleuth.autoconfig.instrument.web.TraceWebAutoConfiguration;
import org.springframework.cloud.sleuth.instrument.web.HttpClientRequestParser;
import org.springframework.cloud.sleuth.instrument.web.HttpClientResponseParser;
import org.springframework.cloud.sleuth.instrument.web.HttpClientSampler;
import org.springframework.cloud.sleuth.instrument.web.HttpServerRequestParser;
import org.springframework.cloud.sleuth.instrument.web.HttpServerResponseParser;
import org.springframework.cloud.sleuth.instrument.web.HttpServerSampler;
-import org.springframework.cloud.sleuth.instrument.web.SkipPatternConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.GenericApplicationContext;
import static org.assertj.core.api.BDDAssertions.then;
-public class TraceHttpAutoConfigurationTests {
+public class BraveHttpConfigurationTests {
@Test
public void defaultsClientSamplerToDefer() {
@@ -163,9 +162,7 @@ public class TraceHttpAutoConfigurationTests {
@Test
public void hasNoCycles() {
- contextRunner()
- .withConfiguration(
- AutoConfigurations.of(SkipPatternConfiguration.class, TraceHttpAutoConfiguration.class))
+ contextRunner().withConfiguration(AutoConfigurations.of(BraveHttpConfiguration.class))
.withInitializer(c -> ((GenericApplicationContext) c).setAllowCircularReferences(false))
.run((context) -> {
BDDAssertions.then(context.isRunning()).isEqualTo(true);
@@ -174,8 +171,7 @@ public class TraceHttpAutoConfigurationTests {
private ApplicationContextRunner contextRunner(String... propertyValues) {
return new ApplicationContextRunner().withPropertyValues(propertyValues).withConfiguration(
- AutoConfigurations.of(TraceAutoConfiguration.class, TraceBraveAutoConfiguration.class,
- TraceHttpAutoConfiguration.class, SkipPatternConfiguration.class));
+ AutoConfigurations.of(BraveAutoConfiguration.class, TraceWebAutoConfiguration.class));
}
}
@@ -183,10 +179,10 @@ public class TraceHttpAutoConfigurationTests {
@Configuration(proxyBeanMethods = false)
class HttpClientSamplerConfig {
- static final org.springframework.cloud.sleuth.api.SamplerFunction INSTANCE = request -> null;
+ static final org.springframework.cloud.sleuth.SamplerFunction INSTANCE = request -> null;
@Bean(HttpClientSampler.NAME)
- org.springframework.cloud.sleuth.api.SamplerFunction sleuthHttpClientSampler() {
+ org.springframework.cloud.sleuth.SamplerFunction sleuthHttpClientSampler() {
return INSTANCE;
}
@@ -195,10 +191,10 @@ class HttpClientSamplerConfig {
@Configuration(proxyBeanMethods = false)
class HttpServerSamplerConfig {
- static final org.springframework.cloud.sleuth.api.SamplerFunction INSTANCE = request -> null;
+ static final org.springframework.cloud.sleuth.SamplerFunction INSTANCE = request -> null;
@Bean(HttpServerSampler.NAME)
- org.springframework.cloud.sleuth.api.SamplerFunction sleuthHttpServerSampler() {
+ org.springframework.cloud.sleuth.SamplerFunction sleuthHttpServerSampler() {
return INSTANCE;
}
diff --git a/spring-cloud-sleuth-brave/src/test/java/org/springframework/cloud/sleuth/brave/instrument/web/EndpointWithCyclicDependenciesTests.java b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/brave/instrument/web/EndpointWithCyclicDependenciesTests.java
similarity index 93%
rename from spring-cloud-sleuth-brave/src/test/java/org/springframework/cloud/sleuth/brave/instrument/web/EndpointWithCyclicDependenciesTests.java
rename to spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/brave/instrument/web/EndpointWithCyclicDependenciesTests.java
index 33e3841b3..4f7ebd80c 100644
--- a/spring-cloud-sleuth-brave/src/test/java/org/springframework/cloud/sleuth/brave/instrument/web/EndpointWithCyclicDependenciesTests.java
+++ b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/brave/instrument/web/EndpointWithCyclicDependenciesTests.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.brave.instrument.web;
+package org.springframework.cloud.sleuth.autoconfig.brave.instrument.web;
import brave.http.HttpTracing;
import org.junit.jupiter.api.Test;
@@ -33,7 +33,8 @@ import org.springframework.stereotype.Service;
*
* @author Marcin Grzejszczak
*/
-@SpringBootTest(classes = { EndpointWithCyclicDependenciesTests.ClientConfig.class })
+@SpringBootTest(classes = { EndpointWithCyclicDependenciesTests.ClientConfig.class },
+ properties = "spring.sleuth.tracer.mode=BRAVE")
public class EndpointWithCyclicDependenciesTests {
@Test
diff --git a/spring-cloud-sleuth-brave/src/test/java/org/springframework/cloud/sleuth/brave/instrument/web/client/WebClientTests.java b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/brave/instrument/web/client/WebClientTests.java
similarity index 93%
rename from spring-cloud-sleuth-brave/src/test/java/org/springframework/cloud/sleuth/brave/instrument/web/client/WebClientTests.java
rename to spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/brave/instrument/web/client/WebClientTests.java
index d6815e169..6831e1e95 100644
--- a/spring-cloud-sleuth-brave/src/test/java/org/springframework/cloud/sleuth/brave/instrument/web/client/WebClientTests.java
+++ b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/brave/instrument/web/client/WebClientTests.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.brave.instrument.web.client;
+package org.springframework.cloud.sleuth.autoconfig.brave.instrument.web.client;
import java.util.HashMap;
import java.util.Map;
@@ -45,7 +45,6 @@ import org.springframework.boot.web.server.LocalServerPort;
import org.springframework.cloud.gateway.config.GatewayAutoConfiguration;
import org.springframework.cloud.gateway.config.GatewayClassPathWarningAutoConfiguration;
import org.springframework.cloud.sleuth.DisableSecurity;
-import org.springframework.cloud.sleuth.instrument.web.TraceWebServletAutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpHeaders;
@@ -60,7 +59,8 @@ import static org.assertj.core.api.BDDAssertions.then;
@SpringBootTest(classes = WebClientTests.TestConfiguration.class,
webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT,
- properties = { "spring.application.name=fooservice", "spring.sleuth.web.client.skip-pattern=/skip.*" })
+ properties = { "spring.sleuth.web.servlet.enabled=false", "spring.application.name=fooservice",
+ "spring.sleuth.web.client.skip-pattern=/skip.*" })
@DirtiesContext
public class WebClientTests {
@@ -144,8 +144,8 @@ public class WebClientTests {
}
@Configuration(proxyBeanMethods = false)
- @EnableAutoConfiguration(exclude = { TraceWebServletAutoConfiguration.class,
- GatewayClassPathWarningAutoConfiguration.class, GatewayAutoConfiguration.class })
+ @EnableAutoConfiguration(
+ exclude = { GatewayClassPathWarningAutoConfiguration.class, GatewayAutoConfiguration.class })
@DisableSecurity
public static class TestConfiguration {
diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/async/AsyncCustomAutoConfigurationTest.java b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/instrument/async/TraceAsyncCustomAutoConfigurationTest.java
similarity index 78%
rename from spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/async/AsyncCustomAutoConfigurationTest.java
rename to spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/instrument/async/TraceAsyncCustomAutoConfigurationTest.java
index 89e9c826f..bd4fd4ac3 100644
--- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/async/AsyncCustomAutoConfigurationTest.java
+++ b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/instrument/async/TraceAsyncCustomAutoConfigurationTest.java
@@ -14,22 +14,23 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.instrument.async;
+package org.springframework.cloud.sleuth.autoconfig.instrument.async;
import org.assertj.core.api.BDDAssertions;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
+import org.springframework.cloud.sleuth.instrument.async.LazyTraceAsyncCustomizer;
import org.springframework.scheduling.annotation.AsyncConfigurer;
/**
* @author Marcin Grzejszczak
*/
-public class AsyncCustomAutoConfigurationTest {
+public class TraceAsyncCustomAutoConfigurationTest {
@Test
public void should_return_bean_when_its_not_a_async_configurer() throws Exception {
- AsyncCustomAutoConfiguration configuration = new AsyncCustomAutoConfiguration();
+ TraceAsyncCustomAutoConfiguration configuration = new TraceAsyncCustomAutoConfiguration();
Object bean = configuration.postProcessAfterInitialization(new Object(), "someName");
@@ -38,7 +39,7 @@ public class AsyncCustomAutoConfigurationTest {
@Test
public void should_return_lazy_async_configurer_when_bean_is_async_configurer() throws Exception {
- AsyncCustomAutoConfiguration configuration = new AsyncCustomAutoConfiguration();
+ TraceAsyncCustomAutoConfiguration configuration = new TraceAsyncCustomAutoConfiguration();
Object bean = configuration.postProcessAfterInitialization(Mockito.mock(AsyncConfigurer.class), "someName");
diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/async/AsyncDefaultAutoConfigurationTests.java b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/instrument/async/TraceAsyncDefaultAutoConfigurationTests.java
similarity index 77%
rename from spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/async/AsyncDefaultAutoConfigurationTests.java
rename to spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/instrument/async/TraceAsyncDefaultAutoConfigurationTests.java
index de79a4b5c..94566769b 100644
--- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/async/AsyncDefaultAutoConfigurationTests.java
+++ b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/instrument/async/TraceAsyncDefaultAutoConfigurationTests.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.instrument.async;
+package org.springframework.cloud.sleuth.autoconfig.instrument.async;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
@@ -25,15 +25,19 @@ import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
+import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration;
+import org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.cloud.gateway.config.GatewayAutoConfiguration;
import org.springframework.cloud.gateway.config.GatewayClassPathWarningAutoConfiguration;
import org.springframework.cloud.gateway.config.GatewayMetricsAutoConfiguration;
+import org.springframework.cloud.sleuth.instrument.async.TraceableScheduledExecutorService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
-@SpringBootTest(classes = AsyncDefaultAutoConfigurationTests.Config.class)
-public class AsyncDefaultAutoConfigurationTests {
+@SpringBootTest(classes = TraceAsyncDefaultAutoConfigurationTests.Config.class,
+ properties = "spring.sleuth.noop.enabled=true")
+public class TraceAsyncDefaultAutoConfigurationTests {
@Autowired
ScheduledExecutorService executor;
@@ -45,7 +49,8 @@ public class AsyncDefaultAutoConfigurationTests {
@Configuration(proxyBeanMethods = false)
@EnableAutoConfiguration(exclude = { GatewayClassPathWarningAutoConfiguration.class, GatewayAutoConfiguration.class,
- GatewayMetricsAutoConfiguration.class, ManagementWebSecurityAutoConfiguration.class })
+ GatewayMetricsAutoConfiguration.class, ManagementWebSecurityAutoConfiguration.class,
+ MongoAutoConfiguration.class, QuartzAutoConfiguration.class })
static class Config {
@Bean
diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/messaging/TraceSpringIntegrationAutoConfigurationTests.java b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/instrument/messaging/TraceSpringIntegrationAutoConfigurationTests.java
similarity index 87%
rename from spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/messaging/TraceSpringIntegrationAutoConfigurationTests.java
rename to spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/instrument/messaging/TraceSpringIntegrationAutoConfigurationTests.java
index 0c829b185..33e0f20b7 100644
--- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/messaging/TraceSpringIntegrationAutoConfigurationTests.java
+++ b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/instrument/messaging/TraceSpringIntegrationAutoConfigurationTests.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.instrument.messaging;
+package org.springframework.cloud.sleuth.autoconfig.instrument.messaging;
import org.junit.jupiter.api.Test;
@@ -22,7 +22,8 @@ import org.springframework.boot.autoconfigure.AutoConfigurations;
import org.springframework.boot.test.context.FilteredClassLoader;
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
import org.springframework.cloud.function.context.FunctionCatalog;
-import org.springframework.cloud.sleuth.autoconfig.TraceAutoConfiguration;
+import org.springframework.cloud.sleuth.autoconfig.TraceNoOpAutoConfiguration;
+import org.springframework.cloud.sleuth.instrument.messaging.TracingChannelInterceptor;
import org.springframework.cloud.stream.annotation.EnableBinding;
import org.springframework.context.annotation.Configuration;
@@ -31,7 +32,8 @@ import static org.assertj.core.api.Assertions.assertThat;
class TraceSpringIntegrationAutoConfigurationTests {
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
- .withConfiguration(AutoConfigurations.of(TraceAutoConfiguration.class,
+ .withPropertyValues("spring.sleuth.noop.enabled=true")
+ .withConfiguration(AutoConfigurations.of(TraceNoOpAutoConfiguration.class,
TraceSpringMessagingAutoConfiguration.class, TraceSpringIntegrationAutoConfiguration.class));
@Test
diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/quartz/TraceQuartzAutoConfigurationTest.java b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/instrument/quartz/TraceQuartzAutoConfigurationTest.java
similarity index 82%
rename from spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/quartz/TraceQuartzAutoConfigurationTest.java
rename to spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/instrument/quartz/TraceQuartzAutoConfigurationTest.java
index 9fda4defe..709453023 100644
--- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/quartz/TraceQuartzAutoConfigurationTest.java
+++ b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/instrument/quartz/TraceQuartzAutoConfigurationTest.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.instrument.quartz;
+package org.springframework.cloud.sleuth.autoconfig.instrument.quartz;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;
@@ -22,14 +22,19 @@ import org.mockito.Mockito;
import org.quartz.ListenerManager;
import org.quartz.Scheduler;
+import org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration;
import org.springframework.boot.autoconfigure.AutoConfigurations;
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration;
+import org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration;
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
import org.springframework.cloud.gateway.config.GatewayAutoConfiguration;
import org.springframework.cloud.gateway.config.GatewayClassPathWarningAutoConfiguration;
import org.springframework.cloud.gateway.config.GatewayMetricsAutoConfiguration;
-import org.springframework.cloud.sleuth.api.Tracer;
+import org.springframework.cloud.sleuth.Tracer;
+import org.springframework.cloud.sleuth.instrument.quartz.TracingJobListener;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
@@ -39,8 +44,9 @@ import org.springframework.context.annotation.Primary;
*/
public class TraceQuartzAutoConfigurationTest {
- private final ApplicationContextRunner contextRunner = new ApplicationContextRunner().withConfiguration(
- AutoConfigurations.of(SchedulerConfig.class, TracingConfig.class, EnableAutoConfig.class));
+ private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
+ .withPropertyValues("spring.sleuth.noop.enabled=true").withConfiguration(
+ AutoConfigurations.of(SchedulerConfig.class, TracingConfig.class, EnableAutoConfig.class));
@Test
public void should_create_job_listener_bean_when_all_conditions_are_met() {
@@ -109,7 +115,8 @@ public class TraceQuartzAutoConfigurationTest {
@Configuration(proxyBeanMethods = false)
@EnableAutoConfiguration(exclude = { GatewayClassPathWarningAutoConfiguration.class, GatewayAutoConfiguration.class,
- GatewayMetricsAutoConfiguration.class })
+ GatewayMetricsAutoConfiguration.class, ManagementWebSecurityAutoConfiguration.class,
+ MongoAutoConfiguration.class, QuartzAutoConfiguration.class })
public static class EnableAutoConfig {
}
@@ -130,6 +137,7 @@ public class TraceQuartzAutoConfigurationTest {
@Configuration(proxyBeanMethods = false)
@AutoConfigureBefore(TraceQuartzAutoConfiguration.class)
+ @ConditionalOnProperty("spring.sleuth.noop.enabled")
public static class TracingConfig {
@Bean
diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/scheduling/TraceSchedulingAutoConfigurationTest.java b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/instrument/scheduling/TraceSchedulingAutoConfigurationTest.java
similarity index 77%
rename from spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/scheduling/TraceSchedulingAutoConfigurationTest.java
rename to spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/instrument/scheduling/TraceSchedulingAutoConfigurationTest.java
index 569f4d911..291b07fce 100644
--- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/scheduling/TraceSchedulingAutoConfigurationTest.java
+++ b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/instrument/scheduling/TraceSchedulingAutoConfigurationTest.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.instrument.scheduling;
+package org.springframework.cloud.sleuth.autoconfig.instrument.scheduling;
import org.aspectj.lang.ProceedingJoinPoint;
import org.assertj.core.api.Assertions;
@@ -23,12 +23,14 @@ import org.junit.jupiter.api.Test;
import org.springframework.boot.autoconfigure.AutoConfigurations;
import org.springframework.boot.test.context.FilteredClassLoader;
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
-import org.springframework.cloud.sleuth.autoconfig.TraceAutoConfiguration;
+import org.springframework.cloud.sleuth.autoconfig.TraceNoOpAutoConfiguration;
+import org.springframework.cloud.sleuth.instrument.scheduling.TraceSchedulingAspect;
class TraceSchedulingAutoConfigurationTest {
- private final ApplicationContextRunner contextRunner = new ApplicationContextRunner().withConfiguration(
- AutoConfigurations.of(TraceAutoConfiguration.class, TraceSchedulingAutoConfiguration.class));
+ private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
+ .withPropertyValues("spring.sleuth.noop.enabled=true").withConfiguration(
+ AutoConfigurations.of(TraceNoOpAutoConfiguration.class, TraceSchedulingAutoConfiguration.class));
@Test
void shoud_create_TraceSchedulingAspect() {
diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/SkipPatternProviderConfigTest.java b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/instrument/web/SkipPatternProviderConfigTest.java
similarity index 95%
rename from spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/SkipPatternProviderConfigTest.java
rename to spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/instrument/web/SkipPatternProviderConfigTest.java
index dfbef304e..ba88c5165 100644
--- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/SkipPatternProviderConfigTest.java
+++ b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/instrument/web/SkipPatternProviderConfigTest.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.instrument.web;
+package org.springframework.cloud.sleuth.autoconfig.instrument.web;
import java.util.Arrays;
import java.util.Collection;
@@ -42,7 +42,9 @@ import org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoC
import org.springframework.boot.context.annotation.UserConfigurations;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.boot.test.context.runner.WebApplicationContextRunner;
-import org.springframework.cloud.sleuth.autoconfig.TraceAutoConfiguration;
+import org.springframework.cloud.sleuth.autoconfig.SingleSkipPattern;
+import org.springframework.cloud.sleuth.autoconfig.TraceNoOpAutoConfiguration;
+import org.springframework.cloud.sleuth.instrument.web.SkipPatternProvider;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@@ -54,10 +56,12 @@ import org.springframework.mock.env.MockEnvironment;
*/
public class SkipPatternProviderConfigTest {
- private final WebApplicationContextRunner contextRunner = new WebApplicationContextRunner().withConfiguration(
- AutoConfigurations.of(DispatcherServletAutoConfiguration.class, InfoEndpointAutoConfiguration.class,
- HealthEndpointAutoConfiguration.class, EndpointAutoConfiguration.class,
- WebEndpointAutoConfiguration.class, TraceAutoConfiguration.class, SkipPatternConfiguration.class));
+ private final WebApplicationContextRunner contextRunner = new WebApplicationContextRunner()
+ .withPropertyValues("spring.sleuth.noop.enabled=true")
+ .withConfiguration(AutoConfigurations.of(DispatcherServletAutoConfiguration.class,
+ InfoEndpointAutoConfiguration.class, HealthEndpointAutoConfiguration.class,
+ EndpointAutoConfiguration.class, WebEndpointAutoConfiguration.class,
+ TraceNoOpAutoConfiguration.class, TraceWebAutoConfiguration.class));
@Test
public void should_return_null_when_cleared() throws Exception {
diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/client/TraceWebClientAutoConfigurationTests.java b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/instrument/web/client/BraveWebClientAutoConfigurationTests.java
similarity index 90%
rename from spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/client/TraceWebClientAutoConfigurationTests.java
rename to spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/instrument/web/client/BraveWebClientAutoConfigurationTests.java
index b3692a556..516a4066b 100644
--- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/client/TraceWebClientAutoConfigurationTests.java
+++ b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/instrument/web/client/BraveWebClientAutoConfigurationTests.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.instrument.web.client;
+package org.springframework.cloud.sleuth.autoconfig.instrument.web.client;
import java.io.IOException;
import java.util.Arrays;
@@ -29,12 +29,15 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
+import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration;
+import org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.boot.web.client.RestTemplateCustomizer;
import org.springframework.cloud.gateway.config.GatewayAutoConfiguration;
import org.springframework.cloud.gateway.config.GatewayClassPathWarningAutoConfiguration;
import org.springframework.cloud.gateway.config.GatewayMetricsAutoConfiguration;
+import org.springframework.cloud.sleuth.instrument.web.client.LazyTraceClientHttpRequestInterceptor;
import org.springframework.cloud.sleuth.instrument.web.mvc.TracingClientHttpRequestInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@@ -49,8 +52,9 @@ import static org.assertj.core.api.BDDAssertions.then;
/**
* @author Marcin Grzejszczak
*/
-@SpringBootTest(classes = TraceWebClientAutoConfigurationTests.Config.class)
-public class TraceWebClientAutoConfigurationTests {
+@SpringBootTest(classes = BraveWebClientAutoConfigurationTests.Config.class,
+ properties = "spring.sleuth.noop.enabled=true")
+public class BraveWebClientAutoConfigurationTests {
@Autowired
@Qualifier("firstRestTemplate")
@@ -86,7 +90,7 @@ public class TraceWebClientAutoConfigurationTests {
ClientHttpRequestInterceptor interceptor = interceptors.get(i);
incrementNumberOfInstances(numberOfInstances, interceptor);
if (interceptor instanceof TracingClientHttpRequestInterceptor
- || interceptor instanceof LazyTracingClientHttpRequestInterceptor) {
+ || interceptor instanceof LazyTraceClientHttpRequestInterceptor) {
traceInterceptorIndex = i;
}
else if (interceptor instanceof MyClientHttpRequestInterceptor) {
@@ -115,7 +119,8 @@ public class TraceWebClientAutoConfigurationTests {
@Configuration(proxyBeanMethods = false)
@EnableAutoConfiguration(exclude = { GatewayClassPathWarningAutoConfiguration.class, GatewayAutoConfiguration.class,
- GatewayMetricsAutoConfiguration.class, ManagementWebSecurityAutoConfiguration.class })
+ GatewayMetricsAutoConfiguration.class, ManagementWebSecurityAutoConfiguration.class,
+ MongoAutoConfiguration.class, QuartzAutoConfiguration.class })
static class Config {
// custom builder
diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/client/GH846Tests.java b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/instrument/web/client/GH846Tests.java
similarity index 83%
rename from spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/client/GH846Tests.java
rename to spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/instrument/web/client/GH846Tests.java
index 46fe61cc4..7e0053341 100644
--- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/client/GH846Tests.java
+++ b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/instrument/web/client/GH846Tests.java
@@ -14,14 +14,17 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.instrument.web.client;
+package org.springframework.cloud.sleuth.autoconfig.instrument.web.client;
import javax.annotation.PostConstruct;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
+import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration;
+import org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
import org.springframework.cloud.gateway.config.GatewayAutoConfiguration;
@@ -34,7 +37,8 @@ import org.springframework.web.client.RestTemplate;
import static org.assertj.core.api.Assertions.assertThat;
-@SpringBootTest(classes = GH846Tests.App.class, webEnvironment = WebEnvironment.NONE)
+@SpringBootTest(classes = GH846Tests.App.class, webEnvironment = WebEnvironment.NONE,
+ properties = "spring.sleuth.noop.enabled=true")
public class GH846Tests {
@Autowired
@@ -49,7 +53,8 @@ public class GH846Tests {
@Configuration(proxyBeanMethods = false)
@EnableAutoConfiguration(exclude = { GatewayClassPathWarningAutoConfiguration.class, GatewayAutoConfiguration.class,
- GatewayMetricsAutoConfiguration.class })
+ GatewayMetricsAutoConfiguration.class, ManagementWebSecurityAutoConfiguration.class,
+ MongoAutoConfiguration.class, QuartzAutoConfiguration.class })
static class App {
@Bean
diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/client/TraceWebClientDisabledTests.java b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/instrument/web/client/TraceWebClientDisabledTests.java
similarity index 78%
rename from spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/client/TraceWebClientDisabledTests.java
rename to spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/instrument/web/client/TraceWebClientDisabledTests.java
index cd8aa0b41..513857ebc 100644
--- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/client/TraceWebClientDisabledTests.java
+++ b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/instrument/web/client/TraceWebClientDisabledTests.java
@@ -14,12 +14,14 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.instrument.web.client;
+package org.springframework.cloud.sleuth.autoconfig.instrument.web.client;
import org.junit.jupiter.api.Test;
import org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
+import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration;
+import org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.cloud.gateway.config.GatewayAutoConfiguration;
import org.springframework.cloud.gateway.config.GatewayClassPathWarningAutoConfiguration;
@@ -29,8 +31,8 @@ import org.springframework.context.annotation.Configuration;
/**
* @author Marcin Grzejszczak
*/
-@SpringBootTest(classes = { TraceWebClientDisabledTests.Config.class },
- properties = { "spring.sleuth.web.enabled=true", "spring.sleuth.web.client.enabled=false" })
+@SpringBootTest(classes = { TraceWebClientDisabledTests.Config.class }, properties = { "spring.sleuth.web.enabled=true",
+ "spring.sleuth.web.client.enabled=false", "spring.sleuth.noop.enabled=true" })
public class TraceWebClientDisabledTests {
@Test
@@ -40,7 +42,8 @@ public class TraceWebClientDisabledTests {
@Configuration(proxyBeanMethods = false)
@EnableAutoConfiguration(exclude = { GatewayClassPathWarningAutoConfiguration.class, GatewayAutoConfiguration.class,
- GatewayMetricsAutoConfiguration.class, ManagementWebSecurityAutoConfiguration.class })
+ GatewayMetricsAutoConfiguration.class, ManagementWebSecurityAutoConfiguration.class,
+ MongoAutoConfiguration.class, QuartzAutoConfiguration.class })
public static class Config {
}
diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/client/TraceNoWebEnvironmentTests.java b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/instrument/web/client/feign/TraceNoWebEnvironmentTests.java
similarity index 94%
rename from spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/client/TraceNoWebEnvironmentTests.java
rename to spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/instrument/web/client/feign/TraceNoWebEnvironmentTests.java
index b778be3eb..a9dce11b3 100644
--- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/client/TraceNoWebEnvironmentTests.java
+++ b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/instrument/web/client/feign/TraceNoWebEnvironmentTests.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.instrument.web.client;
+package org.springframework.cloud.sleuth.autoconfig.instrument.web.client.feign;
import org.junit.jupiter.api.Test;
@@ -42,7 +42,7 @@ public class TraceNoWebEnvironmentTests {
SpringApplication springApplication = new SpringApplication(Config.class);
springApplication.setWebApplicationType(WebApplicationType.NONE);
- try (ConfigurableApplicationContext context = springApplication.run()) {
+ try (ConfigurableApplicationContext context = springApplication.run("--spring.sleuth.noop.enabled=true")) {
Config.SomeFeignClient client = context.getBean(Config.SomeFeignClient.class);
client.createSomeTestRequest();
}
diff --git a/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/otel/ArchitectureTests.java b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/otel/ArchitectureTests.java
new file mode 100644
index 000000000..c756feee9
--- /dev/null
+++ b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/otel/ArchitectureTests.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2013-2020 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.springframework.cloud.sleuth.autoconfig.otel;
+
+import com.tngtech.archunit.junit.AnalyzeClasses;
+import com.tngtech.archunit.junit.ArchTest;
+import com.tngtech.archunit.lang.ArchRule;
+
+import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.noClasses;
+
+@AnalyzeClasses(packagesOf = ArchitectureTests.class)
+public class ArchitectureTests {
+
+ @ArchTest
+ public static final ArchRule should_not_contain_any_reference_to_other_tracers = noClasses().should()
+ .dependOnClassesThat().resideInAnyPackage("..org.springframework.cloud.sleuth.brave..",
+ "..org.springframework.cloud.sleuth.autoconfig.brave..", "brave..");
+
+}
diff --git a/spring-cloud-sleuth-otel/src/test/java/org/springframework/cloud/sleuth/otel/propagation/TraceOtelPropagationAutoConfigurationTests.java b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/otel/OtelPropagationConfigurationTests.java
similarity index 80%
rename from spring-cloud-sleuth-otel/src/test/java/org/springframework/cloud/sleuth/otel/propagation/TraceOtelPropagationAutoConfigurationTests.java
rename to spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/otel/OtelPropagationConfigurationTests.java
index 157417473..a975645ae 100644
--- a/spring-cloud-sleuth-otel/src/test/java/org/springframework/cloud/sleuth/otel/propagation/TraceOtelPropagationAutoConfigurationTests.java
+++ b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/otel/OtelPropagationConfigurationTests.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.otel.propagation;
+package org.springframework.cloud.sleuth.autoconfig.otel;
import java.util.Arrays;
import java.util.HashMap;
@@ -31,18 +31,26 @@ import io.opentelemetry.context.Context;
import io.opentelemetry.context.propagation.TextMapPropagator;
import org.junit.jupiter.api.Test;
+import org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
+import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration;
+import org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration;
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
+import org.springframework.cloud.gateway.config.GatewayAutoConfiguration;
+import org.springframework.cloud.gateway.config.GatewayClassPathWarningAutoConfiguration;
+import org.springframework.cloud.gateway.config.GatewayMetricsAutoConfiguration;
+import org.springframework.cloud.sleuth.otel.propagation.CompositeTextMapPropagator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import static org.assertj.core.api.Assertions.assertThat;
-class TraceOtelPropagationAutoConfigurationTests {
+class OtelPropagationConfigurationTests {
@Test
void should_start_a_composite_text_map_propagator_with_b3_as_default() {
- ApplicationContextRunner runner = new ApplicationContextRunner().withUserConfiguration(Config.class);
+ ApplicationContextRunner runner = new ApplicationContextRunner()
+ .withPropertyValues("spring.sleuth.tracer.mode=OTEL").withUserConfiguration(Config.class);
runner.run(context -> {
assertThat(context).hasNotFailed();
@@ -54,6 +62,7 @@ class TraceOtelPropagationAutoConfigurationTests {
@Test
void should_start_a_composite_text_map_propagator_with_a_single_propagation_type() {
ApplicationContextRunner runner = new ApplicationContextRunner().withUserConfiguration(Config.class)
+ .withPropertyValues("spring.sleuth.tracer.mode=OTEL")
.withPropertyValues("spring.sleuth.propagation.type=w3c");
runner.run(context -> {
@@ -66,6 +75,7 @@ class TraceOtelPropagationAutoConfigurationTests {
@Test
void should_start_a_composite_text_map_propagator_with_multiple_propagation_types() {
ApplicationContextRunner runner = new ApplicationContextRunner().withUserConfiguration(Config.class)
+ .withPropertyValues("spring.sleuth.tracer.mode=OTEL")
.withPropertyValues("spring.sleuth.propagation.type=b3,w3c");
runner.run(context -> {
@@ -79,6 +89,7 @@ class TraceOtelPropagationAutoConfigurationTests {
void should_start_a_composite_text_map_propagator_with_custom_propagation_types() {
ApplicationContextRunner runner = new ApplicationContextRunner()
.withUserConfiguration(CustomPropagatorConfig.class)
+ .withPropertyValues("spring.sleuth.tracer.mode=OTEL")
.withPropertyValues("spring.sleuth.propagation.type=custom");
runner.run(context -> {
@@ -128,13 +139,17 @@ class TraceOtelPropagationAutoConfigurationTests {
}
@Configuration(proxyBeanMethods = false)
- @EnableAutoConfiguration
+ @EnableAutoConfiguration(exclude = { GatewayClassPathWarningAutoConfiguration.class, GatewayAutoConfiguration.class,
+ GatewayMetricsAutoConfiguration.class, ManagementWebSecurityAutoConfiguration.class,
+ MongoAutoConfiguration.class, QuartzAutoConfiguration.class })
static class Config {
}
@Configuration(proxyBeanMethods = false)
- @EnableAutoConfiguration
+ @EnableAutoConfiguration(exclude = { GatewayClassPathWarningAutoConfiguration.class, GatewayAutoConfiguration.class,
+ GatewayMetricsAutoConfiguration.class, ManagementWebSecurityAutoConfiguration.class,
+ MongoAutoConfiguration.class, QuartzAutoConfiguration.class })
static class CustomPropagatorConfig {
@Bean
diff --git a/spring-cloud-sleuth-otel/src/test/java/org/springframework/cloud/sleuth/otel/autoconfig/TraceOtelAutoConfigurationTests.java b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/otel/TraceOtelAutoConfigurationTests.java
similarity index 63%
rename from spring-cloud-sleuth-otel/src/test/java/org/springframework/cloud/sleuth/otel/autoconfig/TraceOtelAutoConfigurationTests.java
rename to spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/otel/TraceOtelAutoConfigurationTests.java
index a4037900e..056f67c58 100644
--- a/spring-cloud-sleuth-otel/src/test/java/org/springframework/cloud/sleuth/otel/autoconfig/TraceOtelAutoConfigurationTests.java
+++ b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/otel/TraceOtelAutoConfigurationTests.java
@@ -14,13 +14,19 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.otel.autoconfig;
+package org.springframework.cloud.sleuth.autoconfig.otel;
import io.opentelemetry.api.trace.Tracer;
import org.junit.jupiter.api.Test;
+import org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
+import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration;
+import org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration;
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
+import org.springframework.cloud.gateway.config.GatewayAutoConfiguration;
+import org.springframework.cloud.gateway.config.GatewayClassPathWarningAutoConfiguration;
+import org.springframework.cloud.gateway.config.GatewayMetricsAutoConfiguration;
import org.springframework.context.annotation.Configuration;
import static org.assertj.core.api.Assertions.assertThat;
@@ -29,7 +35,8 @@ class TraceOtelAutoConfigurationTests {
@Test
void should_start_context_with_otel_tracer_when_sleuth_enabled() {
- ApplicationContextRunner runner = new ApplicationContextRunner().withUserConfiguration(Config.class);
+ ApplicationContextRunner runner = new ApplicationContextRunner()
+ .withPropertyValues("spring.sleuth.tracer.mode=OTEL").withUserConfiguration(Config.class);
runner.run(context -> assertThat(context).hasNotFailed().hasSingleBean(Tracer.class));
}
@@ -43,7 +50,9 @@ class TraceOtelAutoConfigurationTests {
}
@Configuration(proxyBeanMethods = false)
- @EnableAutoConfiguration
+ @EnableAutoConfiguration(exclude = { GatewayClassPathWarningAutoConfiguration.class, GatewayAutoConfiguration.class,
+ GatewayMetricsAutoConfiguration.class, ManagementWebSecurityAutoConfiguration.class,
+ MongoAutoConfiguration.class, QuartzAutoConfiguration.class })
static class Config {
}
diff --git a/spring-cloud-sleuth-otel/src/test/java/org/springframework/cloud/sleuth/otel/opentracing/OpentracingAutoConfigurationTests.java b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/otel/instrument/opentracing/OtelBraveOpentracingAutoConfigurationTests.java
similarity index 72%
rename from spring-cloud-sleuth-otel/src/test/java/org/springframework/cloud/sleuth/otel/opentracing/OpentracingAutoConfigurationTests.java
rename to spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/otel/instrument/opentracing/OtelBraveOpentracingAutoConfigurationTests.java
index 745f27b70..568522178 100644
--- a/spring-cloud-sleuth-otel/src/test/java/org/springframework/cloud/sleuth/otel/opentracing/OpentracingAutoConfigurationTests.java
+++ b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/otel/instrument/opentracing/OtelBraveOpentracingAutoConfigurationTests.java
@@ -14,20 +14,18 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.otel.opentracing;
+package org.springframework.cloud.sleuth.autoconfig.otel.instrument.opentracing;
import io.opentelemetry.api.trace.Tracer;
import org.junit.jupiter.api.Test;
import org.springframework.boot.autoconfigure.AutoConfigurations;
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
-import org.springframework.cloud.sleuth.autoconfig.TraceAutoConfiguration;
-import org.springframework.cloud.sleuth.otel.autoconfig.TraceOtelAutoConfiguration;
-import org.springframework.cloud.sleuth.otel.propagation.TraceOtelPropagationAutoConfiguration;
+import org.springframework.cloud.sleuth.autoconfig.otel.OtelAutoConfiguration;
import static org.assertj.core.api.Assertions.assertThat;
-class OpentracingAutoConfigurationTests {
+class OtelBraveOpentracingAutoConfigurationTests {
@Test
void should_start_context_with_otel_tracer_when_sleuth_enabled() {
@@ -38,9 +36,8 @@ class OpentracingAutoConfigurationTests {
}
private ApplicationContextRunner withAutoConfiguration() {
- return new ApplicationContextRunner()
- .withConfiguration(AutoConfigurations.of(TraceAutoConfiguration.class, TraceOtelAutoConfiguration.class,
- TraceOtelPropagationAutoConfiguration.class, OpentracingAutoConfiguration.class));
+ return new ApplicationContextRunner().withPropertyValues("spring.sleuth.tracer.mode=OTEL").withConfiguration(
+ AutoConfigurations.of(OtelAutoConfiguration.class, OtelOpentracingAutoConfiguration.class));
}
@Test
diff --git a/spring-cloud-sleuth-zipkin/src/test/java/org/springframework/cloud/sleuth/zipkin2/ZipkinSamplerTests.java b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/zipkin2/ZipkinSamplerTests.java
similarity index 64%
rename from spring-cloud-sleuth-zipkin/src/test/java/org/springframework/cloud/sleuth/zipkin2/ZipkinSamplerTests.java
rename to spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/zipkin2/ZipkinSamplerTests.java
index 9d137a4cf..11ec8c57a 100644
--- a/spring-cloud-sleuth-zipkin/src/test/java/org/springframework/cloud/sleuth/zipkin2/ZipkinSamplerTests.java
+++ b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/zipkin2/ZipkinSamplerTests.java
@@ -14,17 +14,21 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.zipkin2;
+package org.springframework.cloud.sleuth.autoconfig.zipkin2;
import org.assertj.core.api.BDDAssertions;
import org.junit.jupiter.api.Test;
+import org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration;
import org.springframework.boot.autoconfigure.AutoConfigurations;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
+import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration;
+import org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
-import org.springframework.cloud.sleuth.brave.autoconfig.TraceBraveAutoConfiguration;
-import org.springframework.cloud.sleuth.otel.autoconfig.TraceOtelAutoConfiguration;
+import org.springframework.cloud.gateway.config.GatewayAutoConfiguration;
+import org.springframework.cloud.gateway.config.GatewayClassPathWarningAutoConfiguration;
+import org.springframework.cloud.gateway.config.GatewayMetricsAutoConfiguration;
import org.springframework.context.annotation.Configuration;
/**
@@ -37,7 +41,8 @@ public class ZipkinSamplerTests {
@Test
void should_set_sampler_to_non_never_when_zipkin_handler_on_classpath_for_brave() {
ApplicationContextRunner contextRunner = new ApplicationContextRunner()
- .withConfiguration(AutoConfigurations.of(BraveTestConfig.class));
+ .withPropertyValues("spring.sleuth.tracer.mode=BRAVE")
+ .withConfiguration(AutoConfigurations.of(TestConfig.class));
contextRunner.run(context -> {
brave.sampler.Sampler sampler = context.getBean(brave.sampler.Sampler.class);
@@ -48,7 +53,8 @@ public class ZipkinSamplerTests {
@Test
void should_set_sampler_to_non_off_when_zipkin_handler_on_classpath_for_otel() {
ApplicationContextRunner contextRunner = new ApplicationContextRunner()
- .withConfiguration(AutoConfigurations.of(OtelTestConfig.class));
+ .withPropertyValues("spring.sleuth.tracer.mode=OTEL")
+ .withConfiguration(AutoConfigurations.of(TestConfig.class));
contextRunner.run(context -> {
io.opentelemetry.sdk.trace.samplers.Sampler sampler = context
@@ -58,14 +64,10 @@ public class ZipkinSamplerTests {
}
@Configuration(proxyBeanMethods = false)
- @EnableAutoConfiguration(exclude = TraceBraveAutoConfiguration.class)
- static class OtelTestConfig {
-
- }
-
- @Configuration(proxyBeanMethods = false)
- @EnableAutoConfiguration(exclude = TraceOtelAutoConfiguration.class)
- static class BraveTestConfig {
+ @EnableAutoConfiguration(exclude = { GatewayClassPathWarningAutoConfiguration.class, GatewayAutoConfiguration.class,
+ GatewayMetricsAutoConfiguration.class, ManagementWebSecurityAutoConfiguration.class,
+ MongoAutoConfiguration.class, QuartzAutoConfiguration.class })
+ static class TestConfig {
}
diff --git a/spring-cloud-sleuth-zipkin/src/test/java/org/springframework/cloud/sleuth/zipkin2/ZipkinWithDisabledSleuthTests.java b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/zipkin2/ZipkinWithDisabledSleuthTests.java
similarity index 94%
rename from spring-cloud-sleuth-zipkin/src/test/java/org/springframework/cloud/sleuth/zipkin2/ZipkinWithDisabledSleuthTests.java
rename to spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/zipkin2/ZipkinWithDisabledSleuthTests.java
index f68e5c64d..27e9fd61e 100644
--- a/spring-cloud-sleuth-zipkin/src/test/java/org/springframework/cloud/sleuth/zipkin2/ZipkinWithDisabledSleuthTests.java
+++ b/spring-cloud-sleuth-autoconfigure/src/test/java/org/springframework/cloud/sleuth/autoconfig/zipkin2/ZipkinWithDisabledSleuthTests.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.zipkin2;
+package org.springframework.cloud.sleuth.autoconfig.zipkin2;
import org.junit.jupiter.api.Test;
diff --git a/spring-cloud-sleuth-autoconfigure/src/test/resources/META-INF/spring.factories b/spring-cloud-sleuth-autoconfigure/src/test/resources/META-INF/spring.factories
new file mode 100644
index 000000000..9717291bf
--- /dev/null
+++ b/spring-cloud-sleuth-autoconfigure/src/test/resources/META-INF/spring.factories
@@ -0,0 +1,4 @@
+# Auto Configuration
+org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
+org.springframework.cloud.sleuth.autoconfig.TraceNoOpAutoConfiguration,\
+org.springframework.cloud.sleuth.SleuthTestAutoConfiguration
\ No newline at end of file
diff --git a/tests/common/src/main/resources/application-baggage.yml b/spring-cloud-sleuth-autoconfigure/src/test/resources/application-baggage.yml
similarity index 100%
rename from tests/common/src/main/resources/application-baggage.yml
rename to spring-cloud-sleuth-autoconfigure/src/test/resources/application-baggage.yml
diff --git a/spring-cloud-sleuth-autoconfigure/src/test/resources/application.yml b/spring-cloud-sleuth-autoconfigure/src/test/resources/application.yml
new file mode 100644
index 000000000..7712f8c1c
--- /dev/null
+++ b/spring-cloud-sleuth-autoconfigure/src/test/resources/application.yml
@@ -0,0 +1,3 @@
+logging.level.org.springframework.cloud: DEBUG
+
+spring.autoconfigure.exclude: org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration, org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration, org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration, org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration, org.springframework.cloud.gateway.config.GatewayAutoConfiguration, org.springframework.cloud.gateway.config.GatewayClassPathWarningAutoConfiguration, org.springframework.cloud.gateway.config.GatewayMetricsAutoConfiguration, org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration
diff --git a/spring-cloud-sleuth-autoconfigure/src/test/resources/bootstrap-disabled.yml b/spring-cloud-sleuth-autoconfigure/src/test/resources/bootstrap-disabled.yml
new file mode 100644
index 000000000..c92cb91a0
--- /dev/null
+++ b/spring-cloud-sleuth-autoconfigure/src/test/resources/bootstrap-disabled.yml
@@ -0,0 +1,5 @@
+spring:
+ application:
+ name: disabledapplication
+ sleuth:
+ enabled: false
diff --git a/spring-cloud-sleuth-autoconfigure/src/test/resources/logback.xml b/spring-cloud-sleuth-autoconfigure/src/test/resources/logback.xml
new file mode 100644
index 000000000..17279c080
--- /dev/null
+++ b/spring-cloud-sleuth-autoconfigure/src/test/resources/logback.xml
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/spring-cloud-sleuth-brave/pom.xml b/spring-cloud-sleuth-brave/pom.xml
index 62975299f..c3c869bcb 100644
--- a/spring-cloud-sleuth-brave/pom.xml
+++ b/spring-cloud-sleuth-brave/pom.xml
@@ -35,7 +35,7 @@
org.springframework.cloud
- spring-cloud-sleuth-core
+ spring-cloud-sleuth-instrumentation
org.springframework.boot
@@ -344,6 +344,11 @@
spring-cloud-starter-netflix-eureka-client
test
+
+ com.tngtech.archunit
+ archunit-junit5
+ test
+
diff --git a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/BraveBaggageInScope.java b/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/BraveBaggageInScope.java
index af4899b6b..366cc6fc5 100644
--- a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/BraveBaggageInScope.java
+++ b/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/BraveBaggageInScope.java
@@ -18,8 +18,8 @@ package org.springframework.cloud.sleuth.brave.bridge;
import brave.baggage.BaggageField;
-import org.springframework.cloud.sleuth.api.BaggageInScope;
-import org.springframework.cloud.sleuth.api.TraceContext;
+import org.springframework.cloud.sleuth.BaggageInScope;
+import org.springframework.cloud.sleuth.TraceContext;
/**
* Brave implementation of a {@link BaggageInScope}.
@@ -27,11 +27,11 @@ import org.springframework.cloud.sleuth.api.TraceContext;
* @author Marcin Grzejszczak
* @since 3.0.0
*/
-public class BraveBaggageInScope implements BaggageInScope {
+class BraveBaggageInScope implements BaggageInScope {
private final BaggageField delegate;
- public BraveBaggageInScope(BaggageField delegate) {
+ BraveBaggageInScope(BaggageField delegate) {
this.delegate = delegate;
}
@@ -56,7 +56,7 @@ public class BraveBaggageInScope implements BaggageInScope {
return this;
}
- public BaggageField unwrap() {
+ BaggageField unwrap() {
return this.delegate;
}
diff --git a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/BraveBaggageManager.java b/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/BraveBaggageManager.java
index 25b17c06f..319a8178e 100644
--- a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/BraveBaggageManager.java
+++ b/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/BraveBaggageManager.java
@@ -22,18 +22,17 @@ import java.util.concurrent.ConcurrentHashMap;
import brave.baggage.BaggageField;
-import org.springframework.cloud.sleuth.api.BaggageInScope;
-import org.springframework.cloud.sleuth.api.BaggageManager;
-import org.springframework.cloud.sleuth.api.TraceContext;
+import org.springframework.cloud.sleuth.BaggageInScope;
+import org.springframework.cloud.sleuth.BaggageManager;
+import org.springframework.cloud.sleuth.TraceContext;
/**
- * Brave implementation of a {@link BaggageManager}. Not implementing the interface
- * directly cause {@link BraveTracer} will already implement it.
+ * Brave implementation of a {@link BaggageManager}.
*
* @author Marcin Grzejszczak
* @since 3.0.0
*/
-public class BraveBaggageManager implements Closeable {
+public class BraveBaggageManager implements Closeable, BaggageManager {
private static final Map CACHE = new ConcurrentHashMap<>();
@@ -41,18 +40,26 @@ public class BraveBaggageManager implements Closeable {
return BaggageField.getAllValues();
}
+ @Override
public BaggageInScope getBaggage(String name) {
return createBaggage(name);
}
+ @Override
public BaggageInScope getBaggage(TraceContext traceContext, String name) {
return new BraveBaggageInScope(BaggageField.getByName(BraveTraceContext.toBrave(traceContext), name));
}
+ @Override
public BaggageInScope createBaggage(String name) {
return CACHE.computeIfAbsent(name, s -> new BraveBaggageInScope(BaggageField.create(s)));
}
+ @Override
+ public BaggageInScope createBaggage(String name, String value) {
+ return createBaggage(name).set(value);
+ }
+
@Override
public void close() {
CACHE.clear();
diff --git a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/BraveCurrentTraceContext.java b/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/BraveCurrentTraceContext.java
index 597eb71ff..4ac699153 100644
--- a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/BraveCurrentTraceContext.java
+++ b/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/BraveCurrentTraceContext.java
@@ -20,8 +20,8 @@ import java.util.concurrent.Callable;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
-import org.springframework.cloud.sleuth.api.CurrentTraceContext;
-import org.springframework.cloud.sleuth.api.TraceContext;
+import org.springframework.cloud.sleuth.CurrentTraceContext;
+import org.springframework.cloud.sleuth.TraceContext;
/**
* Brave implementation of a {@link CurrentTraceContext}.
@@ -76,11 +76,11 @@ public class BraveCurrentTraceContext implements CurrentTraceContext {
return this.delegate.executorService(delegate);
}
- public static brave.propagation.CurrentTraceContext toBrave(CurrentTraceContext context) {
+ static brave.propagation.CurrentTraceContext toBrave(CurrentTraceContext context) {
return ((BraveCurrentTraceContext) context).delegate;
}
- public static CurrentTraceContext fromBrave(brave.propagation.CurrentTraceContext context) {
+ static CurrentTraceContext fromBrave(brave.propagation.CurrentTraceContext context) {
return new BraveCurrentTraceContext(context);
}
diff --git a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/BraveFinishedSpan.java b/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/BraveFinishedSpan.java
index d383a4f48..810cd5d57 100644
--- a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/BraveFinishedSpan.java
+++ b/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/BraveFinishedSpan.java
@@ -21,8 +21,8 @@ import java.util.Map;
import brave.handler.MutableSpan;
-import org.springframework.cloud.sleuth.api.Span;
-import org.springframework.cloud.sleuth.api.exporter.FinishedSpan;
+import org.springframework.cloud.sleuth.Span;
+import org.springframework.cloud.sleuth.exporter.FinishedSpan;
/**
* Brave implementation of a {@link FinishedSpan}.
@@ -30,11 +30,11 @@ import org.springframework.cloud.sleuth.api.exporter.FinishedSpan;
* @author Marcin Grzejszczak
* @since 3.0.0
*/
-public class BraveFinishedSpan implements FinishedSpan {
+class BraveFinishedSpan implements FinishedSpan {
private final MutableSpan mutableSpan;
- public BraveFinishedSpan(MutableSpan mutableSpan) {
+ BraveFinishedSpan(MutableSpan mutableSpan) {
this.mutableSpan = mutableSpan;
}
@@ -106,7 +106,7 @@ public class BraveFinishedSpan implements FinishedSpan {
return this.mutableSpan.remoteServiceName();
}
- public static FinishedSpan fromBrave(MutableSpan mutableSpan) {
+ static FinishedSpan fromBrave(MutableSpan mutableSpan) {
return new BraveFinishedSpan(mutableSpan);
}
diff --git a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/http/BraveHttpClientHandler.java b/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/BraveHttpClientHandler.java
similarity index 71%
rename from spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/http/BraveHttpClientHandler.java
rename to spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/BraveHttpClientHandler.java
index 7bb29904f..4a4ec75bf 100644
--- a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/http/BraveHttpClientHandler.java
+++ b/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/BraveHttpClientHandler.java
@@ -14,15 +14,13 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.brave.bridge.http;
+package org.springframework.cloud.sleuth.brave.bridge;
-import org.springframework.cloud.sleuth.api.Span;
-import org.springframework.cloud.sleuth.api.TraceContext;
-import org.springframework.cloud.sleuth.api.http.HttpClientHandler;
-import org.springframework.cloud.sleuth.api.http.HttpClientRequest;
-import org.springframework.cloud.sleuth.api.http.HttpClientResponse;
-import org.springframework.cloud.sleuth.brave.bridge.BraveSpan;
-import org.springframework.cloud.sleuth.brave.bridge.BraveTraceContext;
+import org.springframework.cloud.sleuth.Span;
+import org.springframework.cloud.sleuth.TraceContext;
+import org.springframework.cloud.sleuth.http.HttpClientHandler;
+import org.springframework.cloud.sleuth.http.HttpClientRequest;
+import org.springframework.cloud.sleuth.http.HttpClientResponse;
/**
* Brave implementation of a {@link HttpClientHandler}.
@@ -59,9 +57,4 @@ public class BraveHttpClientHandler implements HttpClientHandler {
this.delegate.handleReceive(BraveHttpClientResponse.toBrave(response), BraveSpan.toBrave(span));
}
- public static HttpClientHandler fromBrave(
- brave.http.HttpClientHandler handler) {
- return new BraveHttpClientHandler(handler);
- }
-
}
diff --git a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/http/BraveHttpClientRequest.java b/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/BraveHttpClientRequest.java
similarity index 85%
rename from spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/http/BraveHttpClientRequest.java
rename to spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/BraveHttpClientRequest.java
index 44508d0df..641b3124c 100644
--- a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/http/BraveHttpClientRequest.java
+++ b/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/BraveHttpClientRequest.java
@@ -14,13 +14,13 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.brave.bridge.http;
+package org.springframework.cloud.sleuth.brave.bridge;
import java.util.Collection;
import java.util.Collections;
-import org.springframework.cloud.sleuth.api.Span;
-import org.springframework.cloud.sleuth.api.http.HttpClientRequest;
+import org.springframework.cloud.sleuth.Span;
+import org.springframework.cloud.sleuth.http.HttpClientRequest;
/**
* Brave implementation of a {@link HttpClientRequest}.
@@ -28,11 +28,11 @@ import org.springframework.cloud.sleuth.api.http.HttpClientRequest;
* @author Marcin Grzejszczak
* @since 3.0.0
*/
-public class BraveHttpClientRequest implements HttpClientRequest {
+class BraveHttpClientRequest implements HttpClientRequest {
final brave.http.HttpClientRequest delegate;
- public BraveHttpClientRequest(brave.http.HttpClientRequest delegate) {
+ BraveHttpClientRequest(brave.http.HttpClientRequest delegate) {
this.delegate = delegate;
}
@@ -82,7 +82,7 @@ public class BraveHttpClientRequest implements HttpClientRequest {
return this.delegate.header(name);
}
- public static brave.http.HttpClientRequest toBrave(HttpClientRequest httpClientRequest) {
+ static brave.http.HttpClientRequest toBrave(HttpClientRequest httpClientRequest) {
if (httpClientRequest instanceof BraveHttpClientRequest) {
return ((BraveHttpClientRequest) httpClientRequest).delegate;
}
diff --git a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/http/BraveHttpClientResponse.java b/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/BraveHttpClientResponse.java
similarity index 83%
rename from spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/http/BraveHttpClientResponse.java
rename to spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/BraveHttpClientResponse.java
index de504beeb..0a0a50030 100644
--- a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/http/BraveHttpClientResponse.java
+++ b/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/BraveHttpClientResponse.java
@@ -14,14 +14,14 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.brave.bridge.http;
+package org.springframework.cloud.sleuth.brave.bridge;
import java.util.Collection;
import java.util.Collections;
-import org.springframework.cloud.sleuth.api.Span;
-import org.springframework.cloud.sleuth.api.http.HttpClientRequest;
-import org.springframework.cloud.sleuth.api.http.HttpClientResponse;
+import org.springframework.cloud.sleuth.Span;
+import org.springframework.cloud.sleuth.http.HttpClientRequest;
+import org.springframework.cloud.sleuth.http.HttpClientResponse;
/**
* Brave implementation of a {@link HttpClientResponse}.
@@ -29,11 +29,11 @@ import org.springframework.cloud.sleuth.api.http.HttpClientResponse;
* @author Marcin Grzejszczak
* @since 3.0.0
*/
-public class BraveHttpClientResponse implements HttpClientResponse {
+class BraveHttpClientResponse implements HttpClientResponse {
final brave.http.HttpClientResponse delegate;
- public BraveHttpClientResponse(brave.http.HttpClientResponse delegate) {
+ BraveHttpClientResponse(brave.http.HttpClientResponse delegate) {
this.delegate = delegate;
}
@@ -82,7 +82,7 @@ public class BraveHttpClientResponse implements HttpClientResponse {
return this.delegate.error();
}
- public static brave.http.HttpClientResponse toBrave(HttpClientResponse httpClientResponse) {
+ static brave.http.HttpClientResponse toBrave(HttpClientResponse httpClientResponse) {
if (httpClientResponse == null) {
return null;
}
diff --git a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/http/BraveHttpRequest.java b/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/BraveHttpRequest.java
similarity index 78%
rename from spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/http/BraveHttpRequest.java
rename to spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/BraveHttpRequest.java
index 3201422e3..ad94603c1 100644
--- a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/http/BraveHttpRequest.java
+++ b/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/BraveHttpRequest.java
@@ -14,13 +14,13 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.brave.bridge.http;
+package org.springframework.cloud.sleuth.brave.bridge;
import java.util.Collection;
import java.util.Collections;
-import org.springframework.cloud.sleuth.api.Span;
-import org.springframework.cloud.sleuth.api.http.HttpRequest;
+import org.springframework.cloud.sleuth.Span;
+import org.springframework.cloud.sleuth.http.HttpRequest;
/**
* Brave implementation of a {@link HttpRequest}.
@@ -28,11 +28,11 @@ import org.springframework.cloud.sleuth.api.http.HttpRequest;
* @author Marcin Grzejszczak
* @since 3.0.0
*/
-public class BraveHttpRequest implements HttpRequest {
+class BraveHttpRequest implements HttpRequest {
final brave.http.HttpRequest delegate;
- public BraveHttpRequest(brave.http.HttpRequest delegate) {
+ BraveHttpRequest(brave.http.HttpRequest delegate) {
this.delegate = delegate;
}
@@ -72,11 +72,11 @@ public class BraveHttpRequest implements HttpRequest {
return this.delegate.unwrap();
}
- public static brave.http.HttpRequest toBrave(HttpRequest httpRequest) {
+ static brave.http.HttpRequest toBrave(HttpRequest httpRequest) {
return ((BraveHttpRequest) httpRequest).delegate;
}
- public static HttpRequest fromBrave(brave.http.HttpRequest httpRequest) {
+ static HttpRequest fromBrave(brave.http.HttpRequest httpRequest) {
return new BraveHttpRequest(httpRequest);
}
diff --git a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/http/BraveHttpRequestParser.java b/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/BraveHttpRequestParser.java
similarity index 77%
rename from spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/http/BraveHttpRequestParser.java
rename to spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/BraveHttpRequestParser.java
index f1c3dd6b6..79d9a616e 100644
--- a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/http/BraveHttpRequestParser.java
+++ b/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/BraveHttpRequestParser.java
@@ -14,14 +14,12 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.brave.bridge.http;
+package org.springframework.cloud.sleuth.brave.bridge;
-import org.springframework.cloud.sleuth.api.SpanCustomizer;
-import org.springframework.cloud.sleuth.api.TraceContext;
-import org.springframework.cloud.sleuth.api.http.HttpRequest;
-import org.springframework.cloud.sleuth.api.http.HttpRequestParser;
-import org.springframework.cloud.sleuth.brave.bridge.BraveSpanCustomizer;
-import org.springframework.cloud.sleuth.brave.bridge.BraveTraceContext;
+import org.springframework.cloud.sleuth.SpanCustomizer;
+import org.springframework.cloud.sleuth.TraceContext;
+import org.springframework.cloud.sleuth.http.HttpRequest;
+import org.springframework.cloud.sleuth.http.HttpRequestParser;
/**
* Brave implementation of a {@link HttpRequestParser}.
@@ -43,6 +41,10 @@ public class BraveHttpRequestParser implements HttpRequestParser {
BraveSpanCustomizer.toBrave(span));
}
+ /**
+ * @param parser Sleuth's API parser
+ * @return Brave version of the parser
+ */
public static brave.http.HttpRequestParser toBrave(HttpRequestParser parser) {
if (parser instanceof BraveHttpRequestParser) {
return ((BraveHttpRequestParser) parser).delegate;
diff --git a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/http/BraveHttpResponse.java b/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/BraveHttpResponse.java
similarity index 77%
rename from spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/http/BraveHttpResponse.java
rename to spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/BraveHttpResponse.java
index d55fe5a27..1157daafc 100644
--- a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/http/BraveHttpResponse.java
+++ b/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/BraveHttpResponse.java
@@ -14,14 +14,14 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.brave.bridge.http;
+package org.springframework.cloud.sleuth.brave.bridge;
import java.util.Collection;
import java.util.Collections;
-import org.springframework.cloud.sleuth.api.Span;
-import org.springframework.cloud.sleuth.api.http.HttpRequest;
-import org.springframework.cloud.sleuth.api.http.HttpResponse;
+import org.springframework.cloud.sleuth.Span;
+import org.springframework.cloud.sleuth.http.HttpRequest;
+import org.springframework.cloud.sleuth.http.HttpResponse;
/**
* Brave implementation of a {@link HttpResponse}.
@@ -29,11 +29,11 @@ import org.springframework.cloud.sleuth.api.http.HttpResponse;
* @author Marcin Grzejszczak
* @since 3.0.0
*/
-public class BraveHttpResponse implements HttpResponse {
+class BraveHttpResponse implements HttpResponse {
final brave.http.HttpResponse delegate;
- public BraveHttpResponse(brave.http.HttpResponse delegate) {
+ BraveHttpResponse(brave.http.HttpResponse delegate) {
this.delegate = delegate;
}
@@ -82,11 +82,11 @@ public class BraveHttpResponse implements HttpResponse {
return this.delegate.error();
}
- public static brave.http.HttpResponse toBrave(HttpResponse httpResponse) {
+ static brave.http.HttpResponse toBrave(HttpResponse httpResponse) {
return ((BraveHttpResponse) httpResponse).delegate;
}
- public static HttpResponse fromBrave(brave.http.HttpResponse httpResponse) {
+ static HttpResponse fromBrave(brave.http.HttpResponse httpResponse) {
return new BraveHttpResponse(httpResponse);
}
diff --git a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/http/BraveHttpResponseParser.java b/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/BraveHttpResponseParser.java
similarity index 77%
rename from spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/http/BraveHttpResponseParser.java
rename to spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/BraveHttpResponseParser.java
index 29083e35b..dcbce9ec0 100644
--- a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/http/BraveHttpResponseParser.java
+++ b/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/BraveHttpResponseParser.java
@@ -14,14 +14,12 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.brave.bridge.http;
+package org.springframework.cloud.sleuth.brave.bridge;
-import org.springframework.cloud.sleuth.api.SpanCustomizer;
-import org.springframework.cloud.sleuth.api.TraceContext;
-import org.springframework.cloud.sleuth.api.http.HttpResponse;
-import org.springframework.cloud.sleuth.api.http.HttpResponseParser;
-import org.springframework.cloud.sleuth.brave.bridge.BraveSpanCustomizer;
-import org.springframework.cloud.sleuth.brave.bridge.BraveTraceContext;
+import org.springframework.cloud.sleuth.SpanCustomizer;
+import org.springframework.cloud.sleuth.TraceContext;
+import org.springframework.cloud.sleuth.http.HttpResponse;
+import org.springframework.cloud.sleuth.http.HttpResponseParser;
/**
* Brave implementation of a {@link HttpResponseParser}.
@@ -43,6 +41,10 @@ public class BraveHttpResponseParser implements HttpResponseParser {
BraveSpanCustomizer.toBrave(span));
}
+ /**
+ * @param parser Sleuth's API parser
+ * @return Brave's parser
+ */
public static brave.http.HttpResponseParser toBrave(HttpResponseParser parser) {
if (parser instanceof BraveHttpResponseParser) {
return ((BraveHttpResponseParser) parser).delegate;
diff --git a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/http/BraveHttpServerHandler.java b/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/BraveHttpServerHandler.java
similarity index 79%
rename from spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/http/BraveHttpServerHandler.java
rename to spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/BraveHttpServerHandler.java
index 31295a3f5..bb62e8b52 100644
--- a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/http/BraveHttpServerHandler.java
+++ b/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/BraveHttpServerHandler.java
@@ -14,13 +14,12 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.brave.bridge.http;
+package org.springframework.cloud.sleuth.brave.bridge;
-import org.springframework.cloud.sleuth.api.Span;
-import org.springframework.cloud.sleuth.api.http.HttpServerHandler;
-import org.springframework.cloud.sleuth.api.http.HttpServerRequest;
-import org.springframework.cloud.sleuth.api.http.HttpServerResponse;
-import org.springframework.cloud.sleuth.brave.bridge.BraveSpan;
+import org.springframework.cloud.sleuth.Span;
+import org.springframework.cloud.sleuth.http.HttpServerHandler;
+import org.springframework.cloud.sleuth.http.HttpServerRequest;
+import org.springframework.cloud.sleuth.http.HttpServerResponse;
/**
* Brave implementation of a {@link HttpServerHandler}.
diff --git a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/http/BraveHttpServerRequest.java b/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/BraveHttpServerRequest.java
similarity index 87%
rename from spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/http/BraveHttpServerRequest.java
rename to spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/BraveHttpServerRequest.java
index b156b6289..8c7ce455d 100644
--- a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/http/BraveHttpServerRequest.java
+++ b/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/BraveHttpServerRequest.java
@@ -14,14 +14,14 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.brave.bridge.http;
+package org.springframework.cloud.sleuth.brave.bridge;
import java.net.InetSocketAddress;
import java.util.Collection;
import java.util.Collections;
-import org.springframework.cloud.sleuth.api.Span;
-import org.springframework.cloud.sleuth.api.http.HttpServerRequest;
+import org.springframework.cloud.sleuth.Span;
+import org.springframework.cloud.sleuth.http.HttpServerRequest;
import org.springframework.http.server.reactive.ServerHttpRequest;
/**
@@ -30,11 +30,11 @@ import org.springframework.http.server.reactive.ServerHttpRequest;
* @author Marcin Grzejszczak
* @since 3.0.0
*/
-public class BraveHttpServerRequest implements HttpServerRequest {
+class BraveHttpServerRequest implements HttpServerRequest {
final brave.http.HttpServerRequest delegate;
- public BraveHttpServerRequest(brave.http.HttpServerRequest delegate) {
+ BraveHttpServerRequest(brave.http.HttpServerRequest delegate) {
this.delegate = delegate;
}
@@ -79,7 +79,7 @@ public class BraveHttpServerRequest implements HttpServerRequest {
return this.delegate.header(name);
}
- public static brave.http.HttpServerRequest toBrave(HttpServerRequest request) {
+ static brave.http.HttpServerRequest toBrave(HttpServerRequest request) {
if (request == null) {
return null;
}
diff --git a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/http/BraveHttpServerResponse.java b/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/BraveHttpServerResponse.java
similarity index 84%
rename from spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/http/BraveHttpServerResponse.java
rename to spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/BraveHttpServerResponse.java
index 181a69aff..f0bf8e539 100644
--- a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/http/BraveHttpServerResponse.java
+++ b/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/BraveHttpServerResponse.java
@@ -14,14 +14,14 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.brave.bridge.http;
+package org.springframework.cloud.sleuth.brave.bridge;
import java.util.Collection;
import java.util.Collections;
-import org.springframework.cloud.sleuth.api.Span;
-import org.springframework.cloud.sleuth.api.http.HttpServerRequest;
-import org.springframework.cloud.sleuth.api.http.HttpServerResponse;
+import org.springframework.cloud.sleuth.Span;
+import org.springframework.cloud.sleuth.http.HttpServerRequest;
+import org.springframework.cloud.sleuth.http.HttpServerResponse;
/**
* Brave implementation of a {@link HttpServerResponse}.
@@ -29,11 +29,11 @@ import org.springframework.cloud.sleuth.api.http.HttpServerResponse;
* @author Marcin Grzejszczak
* @since 3.0.0
*/
-public class BraveHttpServerResponse implements HttpServerResponse {
+class BraveHttpServerResponse implements HttpServerResponse {
final brave.http.HttpServerResponse delegate;
- public BraveHttpServerResponse(brave.http.HttpServerResponse delegate) {
+ BraveHttpServerResponse(brave.http.HttpServerResponse delegate) {
this.delegate = delegate;
}
@@ -82,7 +82,7 @@ public class BraveHttpServerResponse implements HttpServerResponse {
return this.delegate.error();
}
- public static brave.http.HttpServerResponse toBrave(HttpServerResponse response) {
+ static brave.http.HttpServerResponse toBrave(HttpServerResponse response) {
if (response == null) {
return null;
}
diff --git a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/BravePropagator.java b/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/BravePropagator.java
index 3fe419f9b..f27c79862 100644
--- a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/BravePropagator.java
+++ b/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/BravePropagator.java
@@ -22,9 +22,9 @@ import brave.Tracing;
import brave.propagation.SamplingFlags;
import brave.propagation.TraceContextOrSamplingFlags;
-import org.springframework.cloud.sleuth.api.Span;
-import org.springframework.cloud.sleuth.api.TraceContext;
-import org.springframework.cloud.sleuth.api.propagation.Propagator;
+import org.springframework.cloud.sleuth.Span;
+import org.springframework.cloud.sleuth.TraceContext;
+import org.springframework.cloud.sleuth.propagation.Propagator;
/**
* Brave implementation of a {@link Propagator}.
diff --git a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/BraveSamplerFunction.java b/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/BraveSamplerFunction.java
index ea89f7dba..57c42a876 100644
--- a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/BraveSamplerFunction.java
+++ b/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/BraveSamplerFunction.java
@@ -18,9 +18,8 @@ package org.springframework.cloud.sleuth.brave.bridge;
import brave.sampler.SamplerFunctions;
-import org.springframework.cloud.sleuth.api.SamplerFunction;
-import org.springframework.cloud.sleuth.api.http.HttpRequest;
-import org.springframework.cloud.sleuth.brave.bridge.http.BraveHttpRequest;
+import org.springframework.cloud.sleuth.SamplerFunction;
+import org.springframework.cloud.sleuth.http.HttpRequest;
/**
* Brave implementation of a {@link SamplerFunction}.
@@ -29,7 +28,7 @@ import org.springframework.cloud.sleuth.brave.bridge.http.BraveHttpRequest;
* @author Marcin Grzejszczak
* @since 3.0.0
*/
-public class BraveSamplerFunction implements SamplerFunction {
+public final class BraveSamplerFunction implements SamplerFunction {
final brave.sampler.SamplerFunction samplerFunction;
@@ -42,8 +41,8 @@ public class BraveSamplerFunction implements SamplerFunction {
return this.samplerFunction.trySample(arg);
}
- public static brave.sampler.SamplerFunction toBrave(SamplerFunction samplerFunction,
- Class sleuthInput, Class braveInput) {
+ static brave.sampler.SamplerFunction toBrave(SamplerFunction samplerFunction, Class sleuthInput,
+ Class braveInput) {
if (sleuthInput.equals(HttpRequest.class) && braveInput.equals(brave.http.HttpRequest.class)) {
return arg -> samplerFunction.trySample((T) BraveHttpRequest.fromBrave((brave.http.HttpRequest) arg));
}
diff --git a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/BraveScopedSpan.java b/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/BraveScopedSpan.java
index 7e8d376c2..5349e7820 100644
--- a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/BraveScopedSpan.java
+++ b/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/BraveScopedSpan.java
@@ -16,8 +16,10 @@
package org.springframework.cloud.sleuth.brave.bridge;
-import org.springframework.cloud.sleuth.api.ScopedSpan;
-import org.springframework.cloud.sleuth.api.TraceContext;
+import java.util.Objects;
+
+import org.springframework.cloud.sleuth.ScopedSpan;
+import org.springframework.cloud.sleuth.TraceContext;
/**
* Brave implementation of a {@link ScopedSpan}.
@@ -25,11 +27,11 @@ import org.springframework.cloud.sleuth.api.TraceContext;
* @author Marcin Grzejszczak
* @since 3.0.0
*/
-public class BraveScopedSpan implements ScopedSpan {
+class BraveScopedSpan implements ScopedSpan {
final brave.ScopedSpan span;
- public BraveScopedSpan(brave.ScopedSpan span) {
+ BraveScopedSpan(brave.ScopedSpan span) {
this.span = span;
}
@@ -68,4 +70,21 @@ public class BraveScopedSpan implements ScopedSpan {
this.span.finish();
}
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ BraveScopedSpan that = (BraveScopedSpan) o;
+ return Objects.equals(this.span, that.span);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(this.span);
+ }
+
}
diff --git a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/BraveSpan.java b/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/BraveSpan.java
index afbc32fac..0b3662821 100644
--- a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/BraveSpan.java
+++ b/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/BraveSpan.java
@@ -16,8 +16,10 @@
package org.springframework.cloud.sleuth.brave.bridge;
-import org.springframework.cloud.sleuth.api.Span;
-import org.springframework.cloud.sleuth.api.TraceContext;
+import java.util.Objects;
+
+import org.springframework.cloud.sleuth.Span;
+import org.springframework.cloud.sleuth.TraceContext;
/**
* Brave implementation of a {@link Span}.
@@ -25,11 +27,11 @@ import org.springframework.cloud.sleuth.api.TraceContext;
* @author Marcin Grzejszczak
* @since 3.0.0
*/
-public class BraveSpan implements Span {
+class BraveSpan implements Span {
final brave.Span delegate;
- public BraveSpan(brave.Span delegate) {
+ BraveSpan(brave.Span delegate) {
this.delegate = delegate;
}
@@ -89,12 +91,29 @@ public class BraveSpan implements Span {
return this.delegate != null ? this.delegate.toString() : "null";
}
- public static brave.Span toBrave(Span span) {
+ static brave.Span toBrave(Span span) {
return ((BraveSpan) span).delegate;
}
- public static Span fromBrave(brave.Span span) {
+ static Span fromBrave(brave.Span span) {
return new BraveSpan(span);
}
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ BraveSpan braveSpan = (BraveSpan) o;
+ return Objects.equals(this.delegate, braveSpan.delegate);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(this.delegate);
+ }
+
}
diff --git a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/BraveSpanBuilder.java b/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/BraveSpanBuilder.java
index ad00901b4..20057bc7c 100644
--- a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/BraveSpanBuilder.java
+++ b/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/BraveSpanBuilder.java
@@ -19,8 +19,8 @@ package org.springframework.cloud.sleuth.brave.bridge;
import brave.Tracer;
import brave.propagation.TraceContextOrSamplingFlags;
-import org.springframework.cloud.sleuth.api.Span;
-import org.springframework.cloud.sleuth.api.TraceContext;
+import org.springframework.cloud.sleuth.Span;
+import org.springframework.cloud.sleuth.TraceContext;
/**
* Brave implementation of a {@link Span.Builder}.
@@ -28,7 +28,7 @@ import org.springframework.cloud.sleuth.api.TraceContext;
* @author Marcin Grzejszczak
* @since 3.0.0
*/
-public class BraveSpanBuilder implements Span.Builder {
+class BraveSpanBuilder implements Span.Builder {
brave.Span delegate;
@@ -38,11 +38,11 @@ public class BraveSpanBuilder implements Span.Builder {
private long startTimestamp;
- public BraveSpanBuilder(Tracer tracer) {
+ BraveSpanBuilder(Tracer tracer) {
this.tracer = tracer;
}
- public BraveSpanBuilder(Tracer tracer, TraceContextOrSamplingFlags parentContext) {
+ BraveSpanBuilder(Tracer tracer, TraceContextOrSamplingFlags parentContext) {
this.tracer = tracer;
this.parentContext = parentContext;
}
@@ -118,7 +118,7 @@ public class BraveSpanBuilder implements Span.Builder {
return BraveSpan.fromBrave(this.delegate);
}
- public static Span.Builder toBuilder(Tracer tracer, TraceContextOrSamplingFlags context) {
+ static Span.Builder toBuilder(Tracer tracer, TraceContextOrSamplingFlags context) {
return new BraveSpanBuilder(tracer, context);
}
diff --git a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/BraveSpanCustomizer.java b/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/BraveSpanCustomizer.java
index 714aa0a79..7e8cb1b11 100644
--- a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/BraveSpanCustomizer.java
+++ b/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/BraveSpanCustomizer.java
@@ -16,7 +16,7 @@
package org.springframework.cloud.sleuth.brave.bridge;
-import org.springframework.cloud.sleuth.api.SpanCustomizer;
+import org.springframework.cloud.sleuth.SpanCustomizer;
/**
* Brave implementation of a {@link SpanCustomizer}.
@@ -47,11 +47,11 @@ public class BraveSpanCustomizer implements SpanCustomizer {
return new BraveSpanCustomizer(this.spanCustomizer.annotate(value));
}
- public static brave.SpanCustomizer toBrave(SpanCustomizer spanCustomizer) {
+ static brave.SpanCustomizer toBrave(SpanCustomizer spanCustomizer) {
return ((BraveSpanCustomizer) spanCustomizer).spanCustomizer;
}
- public static SpanCustomizer fromBrave(brave.SpanCustomizer spanCustomizer) {
+ static SpanCustomizer fromBrave(brave.SpanCustomizer spanCustomizer) {
return new BraveSpanCustomizer(spanCustomizer);
}
diff --git a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/BraveTraceContext.java b/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/BraveTraceContext.java
index e2b609008..13a3f18f4 100644
--- a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/BraveTraceContext.java
+++ b/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/BraveTraceContext.java
@@ -18,7 +18,7 @@ package org.springframework.cloud.sleuth.brave.bridge;
import java.util.Objects;
-import org.springframework.cloud.sleuth.api.TraceContext;
+import org.springframework.cloud.sleuth.TraceContext;
import org.springframework.lang.Nullable;
/**
@@ -27,11 +27,11 @@ import org.springframework.lang.Nullable;
* @author Marcin Grzejszczak
* @since 3.0.0
*/
-public class BraveTraceContext implements TraceContext {
+class BraveTraceContext implements TraceContext {
final brave.propagation.TraceContext traceContext;
- public BraveTraceContext(brave.propagation.TraceContext traceContext) {
+ BraveTraceContext(brave.propagation.TraceContext traceContext) {
this.traceContext = traceContext;
}
@@ -56,30 +56,37 @@ public class BraveTraceContext implements TraceContext {
return this.traceContext != null ? this.traceContext.toString() : "null";
}
- @Override
- public boolean equals(Object o) {
- return Objects.equals(this.traceContext, o);
- }
-
- @Override
- public int hashCode() {
- return Objects.hashCode(this.traceContext);
- }
-
@Nullable
public Boolean sampled() {
return this.traceContext.sampled();
}
- public static brave.propagation.TraceContext toBrave(TraceContext traceContext) {
+ static brave.propagation.TraceContext toBrave(TraceContext traceContext) {
if (traceContext == null) {
return null;
}
return ((BraveTraceContext) traceContext).traceContext;
}
- public static TraceContext fromBrave(brave.propagation.TraceContext traceContext) {
+ static TraceContext fromBrave(brave.propagation.TraceContext traceContext) {
return new BraveTraceContext(traceContext);
}
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ BraveTraceContext that = (BraveTraceContext) o;
+ return Objects.equals(this.traceContext, that.traceContext);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(this.traceContext);
+ }
+
}
diff --git a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/BraveTracer.java b/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/BraveTracer.java
index e6f25e5e6..b1ca67640 100644
--- a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/BraveTracer.java
+++ b/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/BraveTracer.java
@@ -20,12 +20,12 @@ import java.util.Map;
import brave.propagation.TraceContextOrSamplingFlags;
-import org.springframework.cloud.sleuth.api.BaggageInScope;
-import org.springframework.cloud.sleuth.api.ScopedSpan;
-import org.springframework.cloud.sleuth.api.Span;
-import org.springframework.cloud.sleuth.api.SpanCustomizer;
-import org.springframework.cloud.sleuth.api.TraceContext;
-import org.springframework.cloud.sleuth.api.Tracer;
+import org.springframework.cloud.sleuth.BaggageInScope;
+import org.springframework.cloud.sleuth.ScopedSpan;
+import org.springframework.cloud.sleuth.Span;
+import org.springframework.cloud.sleuth.SpanCustomizer;
+import org.springframework.cloud.sleuth.TraceContext;
+import org.springframework.cloud.sleuth.Tracer;
/**
* Brave implementation of a {@link Tracer}.
@@ -90,10 +90,6 @@ public class BraveTracer implements Tracer {
return new BraveSpanBuilder(this.tracer);
}
- public static Tracer fromBrave(brave.Tracer tracer, BraveBaggageManager braveBaggageManager) {
- return new BraveTracer(tracer, braveBaggageManager);
- }
-
@Override
public Map getAllBaggage() {
return this.braveBaggageManager.getAllBaggage();
diff --git a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/propagation/CompositePropagationFactorySupplier.java b/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/CompositePropagationFactorySupplier.java
similarity index 64%
rename from spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/propagation/CompositePropagationFactorySupplier.java
rename to spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/CompositePropagationFactorySupplier.java
index 3ca8cc458..09821ca99 100644
--- a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/propagation/CompositePropagationFactorySupplier.java
+++ b/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/CompositePropagationFactorySupplier.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.brave.propagation;
+package org.springframework.cloud.sleuth.brave.bridge;
import java.util.Collections;
import java.util.HashMap;
@@ -30,71 +30,74 @@ import brave.propagation.TraceContextOrSamplingFlags;
import brave.propagation.aws.AWSPropagation;
import org.springframework.beans.factory.BeanFactory;
-import org.springframework.cloud.sleuth.autoconfig.SleuthBaggageProperties;
-import org.springframework.cloud.sleuth.brave.bridge.BraveBaggageManager;
+import org.springframework.cloud.sleuth.brave.propagation.PropagationFactorySupplier;
+import org.springframework.cloud.sleuth.brave.propagation.PropagationType;
-class CompositePropagationFactorySupplier implements PropagationFactorySupplier {
+/**
+ * Merges various propagation factories into a composite.
+ *
+ * @author Marcin Grzejszczak
+ * @since 3.0.0
+ */
+public class CompositePropagationFactorySupplier implements PropagationFactorySupplier {
private final BeanFactory beanFactory;
- private final SleuthBaggageProperties baggageProperties;
+ private final List localFields;
- private final SleuthPropagationProperties properties;
+ private final List types;
- CompositePropagationFactorySupplier(BeanFactory beanFactory, SleuthBaggageProperties baggageProperties,
- SleuthPropagationProperties properties) {
+ public CompositePropagationFactorySupplier(BeanFactory beanFactory, List localFields,
+ List types) {
this.beanFactory = beanFactory;
- this.baggageProperties = baggageProperties;
- this.properties = properties;
+ this.localFields = localFields;
+ this.types = types;
}
@Override
public Propagation.Factory get() {
return new CompositePropagationFactory(
this.beanFactory.getBeanProvider(BraveBaggageManager.class).getIfAvailable(BraveBaggageManager::new),
- this.baggageProperties, this.properties);
+ this.localFields, this.types);
}
}
class CompositePropagationFactory extends Propagation.Factory implements Propagation {
- private final Map> mapping = new HashMap<>();
+ private final Map> mapping = new HashMap<>();
- private final SleuthPropagationProperties properties;
+ private final List types;
- CompositePropagationFactory(BraveBaggageManager braveBaggageManager, SleuthBaggageProperties baggageProperties,
- SleuthPropagationProperties properties) {
- this.properties = properties;
- this.mapping.put(SleuthPropagationProperties.PropagationType.AWS, AWSPropagation.FACTORY.get());
+ CompositePropagationFactory(BraveBaggageManager braveBaggageManager, List localFields,
+ List types) {
+ this.types = types;
+ this.mapping.put(PropagationType.AWS, AWSPropagation.FACTORY.get());
// Note: Versions <2.2.3 use injectFormat(MULTI) for non-remote (ex
// spring-messaging)
// See #1643
- this.mapping.put(SleuthPropagationProperties.PropagationType.B3,
+ this.mapping.put(PropagationType.B3,
B3Propagation.newFactoryBuilder().injectFormat(B3Propagation.Format.SINGLE_NO_PARENT).build().get());
- this.mapping.put(SleuthPropagationProperties.PropagationType.W3C,
- new W3CPropagation(braveBaggageManager, baggageProperties));
- this.mapping.put(SleuthPropagationProperties.PropagationType.CUSTOM, NoOpPropagation.INSTANCE);
+ this.mapping.put(PropagationType.W3C, new W3CPropagation(braveBaggageManager, localFields));
+ this.mapping.put(PropagationType.CUSTOM, NoOpPropagation.INSTANCE);
}
@Override
public List keys() {
- return this.properties.getType().stream().map(this.mapping::get).flatMap(p -> p.keys().stream())
- .collect(Collectors.toList());
+ return this.types.stream().map(this.mapping::get).flatMap(p -> p.keys().stream()).collect(Collectors.toList());
}
@Override
public TraceContext.Injector injector(Setter setter) {
return (traceContext, request) -> {
- this.properties.getType().stream().map(this.mapping::get)
- .forEach(p -> p.injector(setter).inject(traceContext, request));
+ this.types.stream().map(this.mapping::get).forEach(p -> p.injector(setter).inject(traceContext, request));
};
}
@Override
public TraceContext.Extractor extractor(Getter getter) {
return request -> {
- for (SleuthPropagationProperties.PropagationType type : this.properties.getType()) {
+ for (PropagationType type : this.types) {
Propagation propagator = this.mapping.get(type);
if (propagator == null || propagator == NoOpPropagation.INSTANCE) {
continue;
diff --git a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/autoconfig/CompositeSpanHandler.java b/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/CompositeSpanHandler.java
similarity index 80%
rename from spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/autoconfig/CompositeSpanHandler.java
rename to spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/CompositeSpanHandler.java
index ad29f7786..16398220f 100644
--- a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/autoconfig/CompositeSpanHandler.java
+++ b/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/CompositeSpanHandler.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.brave.autoconfig;
+package org.springframework.cloud.sleuth.brave.bridge;
import java.util.Collections;
import java.util.List;
@@ -23,14 +23,19 @@ import brave.handler.MutableSpan;
import brave.handler.SpanHandler;
import brave.propagation.TraceContext;
-import org.springframework.cloud.sleuth.api.exporter.SpanFilter;
-import org.springframework.cloud.sleuth.brave.bridge.BraveFinishedSpan;
+import org.springframework.cloud.sleuth.exporter.SpanFilter;
-class CompositeSpanHandler extends SpanHandler {
+/**
+ * Merges {@link SpanFilter}s into a {@link SpanHandler}.
+ *
+ * @author Marcin Grzejszczak
+ * @since 3.0.0
+ */
+public class CompositeSpanHandler extends SpanHandler {
private final List exporters;
- CompositeSpanHandler(List exporters) {
+ public CompositeSpanHandler(List exporters) {
this.exporters = exporters == null ? Collections.emptyList() : exporters;
}
diff --git a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/TraceBraveBridgeAutoConfiguation.java b/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/TraceBraveBridgeAutoConfiguation.java
deleted file mode 100644
index 27e80a2fc..000000000
--- a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/TraceBraveBridgeAutoConfiguation.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright 2013-2020 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.springframework.cloud.sleuth.brave.bridge;
-
-import brave.Tracing;
-
-import org.springframework.boot.autoconfigure.AutoConfigureAfter;
-import org.springframework.boot.autoconfigure.AutoConfigureBefore;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
-import org.springframework.cloud.sleuth.api.CurrentTraceContext;
-import org.springframework.cloud.sleuth.api.SpanCustomizer;
-import org.springframework.cloud.sleuth.api.Tracer;
-import org.springframework.cloud.sleuth.api.propagation.Propagator;
-import org.springframework.cloud.sleuth.autoconfig.TraceAutoConfiguration;
-import org.springframework.cloud.sleuth.brave.autoconfig.TraceBraveAutoConfiguration;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-
-/**
- * {@link org.springframework.boot.autoconfigure.EnableAutoConfiguration
- * Auto-configuration} to enable the bridge between Sleuth API and Brave.
- *
- * @author Spencer Gibb
- * @author Marcin Grzejszczak
- * @author Tim Ysewyn
- * @since 3.0.0
- */
-@Configuration(proxyBeanMethods = false)
-@ConditionalOnProperty(value = "spring.sleuth.enabled", matchIfMissing = true)
-@ConditionalOnBean(brave.Tracer.class)
-@AutoConfigureAfter(TraceBraveAutoConfiguration.class)
-@AutoConfigureBefore(TraceAutoConfiguration.class)
-public class TraceBraveBridgeAutoConfiguation {
-
- @Bean
- Tracer braveTracer(brave.Tracer tracer, BraveBaggageManager braveBaggageManager) {
- return new BraveTracer(tracer, braveBaggageManager);
- }
-
- @Bean
- CurrentTraceContext braveCurrentTraceContext(brave.propagation.CurrentTraceContext currentTraceContext) {
- return new BraveCurrentTraceContext(currentTraceContext);
- }
-
- @Bean
- SpanCustomizer braveSpanCustomizer(brave.SpanCustomizer spanCustomizer) {
- return new BraveSpanCustomizer(spanCustomizer);
- }
-
- @Bean
- Propagator bravePropagator(Tracing tracing) {
- return new BravePropagator(tracing);
- }
-
-}
diff --git a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/propagation/W3CPropagation.java b/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/W3CPropagation.java
similarity index 94%
rename from spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/propagation/W3CPropagation.java
rename to spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/W3CPropagation.java
index 3775ab0bc..0ae05c306 100644
--- a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/propagation/W3CPropagation.java
+++ b/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/W3CPropagation.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.brave.propagation;
+package org.springframework.cloud.sleuth.brave.bridge;
import java.util.AbstractMap;
import java.util.ArrayList;
@@ -36,10 +36,7 @@ import brave.propagation.TraceContextOrSamplingFlags;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-import org.springframework.cloud.sleuth.api.BaggageInScope;
-import org.springframework.cloud.sleuth.autoconfig.SleuthBaggageProperties;
-import org.springframework.cloud.sleuth.brave.bridge.BraveBaggageInScope;
-import org.springframework.cloud.sleuth.brave.bridge.BraveBaggageManager;
+import org.springframework.cloud.sleuth.BaggageInScope;
import static java.util.Collections.singletonList;
@@ -53,11 +50,12 @@ import static java.util.Collections.singletonList;
* @author Marcin Grzejszczak
* @since 3.0.0
*/
-public final class W3CPropagation extends Propagation.Factory implements Propagation {
+class W3CPropagation extends Propagation.Factory implements Propagation {
private static final Log logger = LogFactory.getLog(W3CPropagation.class.getName());
static final String TRACE_PARENT = "traceparent";
+
static final String TRACE_STATE = "tracestate";
private static final List FIELDS = Collections.unmodifiableList(Arrays.asList(TRACE_PARENT, TRACE_STATE));
@@ -98,7 +96,7 @@ public final class W3CPropagation extends Propagation.Factory implements Propaga
private static final String INVALID_SPAN_ID = "0000000000000000";
- private static final char TRACESTATE_ENTRY_DELIMITER = ',';
+ // private static final char TRACESTATE_ENTRY_DELIMITER = ',';
private static final Set VALID_VERSIONS;
@@ -119,8 +117,8 @@ public final class W3CPropagation extends Propagation.Factory implements Propaga
private final W3CBaggagePropagator baggagePropagator;
- public W3CPropagation(BraveBaggageManager braveBaggageManager, SleuthBaggageProperties sleuthBaggageProperties) {
- this.baggagePropagator = new W3CBaggagePropagator(braveBaggageManager, sleuthBaggageProperties);
+ W3CPropagation(BraveBaggageManager braveBaggageManager, List localFields) {
+ this.baggagePropagator = new W3CBaggagePropagator(braveBaggageManager, localFields);
}
@Override
@@ -159,7 +157,7 @@ public final class W3CPropagation extends Propagation.Factory implements Propaga
};
}
- public void copyTraceFlagsHexTo(char[] dest, int destOffset, TraceContext context) {
+ void copyTraceFlagsHexTo(char[] dest, int destOffset, TraceContext context) {
dest[destOffset] = '0';
dest[destOffset + 1] = Boolean.TRUE.equals(context.sampled()) ? '1' : '0';
}
@@ -189,7 +187,7 @@ public final class W3CPropagation extends Propagation.Factory implements Propaga
return this.baggagePropagator.contextWithBaggage(carrier, context, getter);
}
- protected TraceContextOrSamplingFlags context(TraceContext contextFromParentHeader, String traceStateHeader) {
+ TraceContextOrSamplingFlags context(TraceContext contextFromParentHeader, String traceStateHeader) {
if (traceStateHeader == null || traceStateHeader.isEmpty()) {
return TraceContextOrSamplingFlags.create(contextFromParentHeader);
}
@@ -273,11 +271,11 @@ class W3CBaggagePropagator {
private final BraveBaggageManager braveBaggageManager;
- private final SleuthBaggageProperties properties;
+ private final List localFields;
- W3CBaggagePropagator(BraveBaggageManager braveBaggageManager, SleuthBaggageProperties properties) {
+ W3CBaggagePropagator(BraveBaggageManager braveBaggageManager, List localFields) {
this.braveBaggageManager = braveBaggageManager;
- this.properties = properties;
+ this.localFields = localFields;
}
public List keys() {
@@ -292,7 +290,7 @@ class W3CBaggagePropagator {
}
StringBuilder headerContent = new StringBuilder();
// We ignore local keys - they won't get propagated
- String[] strings = this.properties.getLocalFields().toArray(new String[0]);
+ String[] strings = this.localFields.toArray(new String[0]);
Map filtered = extra.toMapFilteringFieldNames(strings);
for (Map.Entry entry : filtered.entrySet()) {
headerContent.append(entry.getKey()).append("=").append(entry.getValue());
diff --git a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/http/TraceBraveHttpBridgeAutoConfiguration.java b/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/http/TraceBraveHttpBridgeAutoConfiguration.java
deleted file mode 100644
index 0df762c60..000000000
--- a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/bridge/http/TraceBraveHttpBridgeAutoConfiguration.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright 2013-2020 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.springframework.cloud.sleuth.brave.bridge.http;
-
-import brave.http.HttpTracing;
-
-import org.springframework.boot.autoconfigure.AutoConfigureAfter;
-import org.springframework.boot.autoconfigure.AutoConfigureBefore;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
-import org.springframework.cloud.sleuth.api.Tracer;
-import org.springframework.cloud.sleuth.api.http.HttpClientHandler;
-import org.springframework.cloud.sleuth.api.http.HttpServerHandler;
-import org.springframework.cloud.sleuth.brave.bridge.TraceBraveBridgeAutoConfiguation;
-import org.springframework.cloud.sleuth.instrument.web.TraceHttpAutoConfiguration;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-
-/**
- * {@link org.springframework.boot.autoconfigure.EnableAutoConfiguration
- * Auto-configuration} to enable HTTP client and server handling.
- *
- * @author Marcin Grzejszczak
- * @since 3.0.0
- */
-@Configuration(proxyBeanMethods = false)
-@ConditionalOnProperty(value = "spring.sleuth.enabled", matchIfMissing = true)
-@ConditionalOnBean({ Tracer.class, HttpTracing.class })
-@AutoConfigureBefore(TraceHttpAutoConfiguration.class)
-@AutoConfigureAfter(TraceBraveBridgeAutoConfiguation.class)
-public class TraceBraveHttpBridgeAutoConfiguration {
-
- @Bean
- HttpClientHandler braveHttpClientHandler(HttpTracing httpTracing) {
- return new BraveHttpClientHandler(brave.http.HttpClientHandler.create(httpTracing));
- }
-
- @Bean
- HttpServerHandler braveHttpServerHandler(HttpTracing httpTracing) {
- return new BraveHttpServerHandler(brave.http.HttpServerHandler.create(httpTracing));
- }
-
-}
diff --git a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/instrument/grpc/GrpcManagedChannelBuilderCustomizer.java b/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/instrument/grpc/GrpcManagedChannelBuilderCustomizer.java
index f25e79a3a..c9cae1265 100644
--- a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/instrument/grpc/GrpcManagedChannelBuilderCustomizer.java
+++ b/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/instrument/grpc/GrpcManagedChannelBuilderCustomizer.java
@@ -23,6 +23,7 @@ import io.grpc.ManagedChannelBuilder;
* {@link io.grpc.ManagedChannelBuilder} via the {@link SpringAwareManagedChannelBuilder}.
*
* @author Tyler Van Gorder
+ * @since 3.0.0
*/
public interface GrpcManagedChannelBuilderCustomizer {
diff --git a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/instrument/grpc/SpringAwareManagedChannelBuilder.java b/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/instrument/grpc/SpringAwareManagedChannelBuilder.java
index 076aa8201..ff568262a 100644
--- a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/instrument/grpc/SpringAwareManagedChannelBuilder.java
+++ b/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/instrument/grpc/SpringAwareManagedChannelBuilder.java
@@ -34,6 +34,7 @@ import io.grpc.inprocess.InProcessChannelBuilder;
* "spring-grpc"/"spring-cloud-grpc"?
*
* @author Tyler Van Gorder
+ * @since 3.0.0
*/
// TODO: research why we need to continue to maintain this given current libraries
public class SpringAwareManagedChannelBuilder {
diff --git a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/instrument/grpc/TracingManagedChannelBuilderCustomizer.java b/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/instrument/grpc/TracingManagedChannelBuilderCustomizer.java
index 9a03d5892..33956d849 100644
--- a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/instrument/grpc/TracingManagedChannelBuilderCustomizer.java
+++ b/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/instrument/grpc/TracingManagedChannelBuilderCustomizer.java
@@ -20,7 +20,10 @@ import brave.grpc.GrpcTracing;
import io.grpc.ManagedChannelBuilder;
/**
+ * Brave interceptor based customizer.
+ *
* @author Tyler Van Gorder
+ * @since 3.0.0
*/
public class TracingManagedChannelBuilderCustomizer implements GrpcManagedChannelBuilderCustomizer {
diff --git a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/instrument/messaging/OnMessagingEnabled.java b/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/instrument/messaging/ConditionalOnMessagingEnabled.java
similarity index 96%
rename from spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/instrument/messaging/OnMessagingEnabled.java
rename to spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/instrument/messaging/ConditionalOnMessagingEnabled.java
index bbd9b9305..acfb3e2d4 100644
--- a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/instrument/messaging/OnMessagingEnabled.java
+++ b/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/instrument/messaging/ConditionalOnMessagingEnabled.java
@@ -34,6 +34,6 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
@Target({ ElementType.TYPE, ElementType.METHOD })
@Documented
@ConditionalOnProperty(value = "spring.sleuth.messaging.enabled", matchIfMissing = true)
-@interface OnMessagingEnabled {
+public @interface ConditionalOnMessagingEnabled {
}
diff --git a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/instrument/messaging/KafkaFactoryBeanPostProcessor.java b/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/instrument/messaging/KafkaFactoryBeanPostProcessor.java
new file mode 100644
index 000000000..12f6cb1e9
--- /dev/null
+++ b/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/instrument/messaging/KafkaFactoryBeanPostProcessor.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2013-2020 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.springframework.cloud.sleuth.brave.instrument.messaging;
+
+import org.springframework.beans.BeansException;
+import org.springframework.beans.factory.BeanFactory;
+import org.springframework.beans.factory.config.BeanPostProcessor;
+import org.springframework.kafka.core.ConsumerFactory;
+import org.springframework.kafka.core.ProducerFactory;
+
+/**
+ * Bean post processor that wraps Kafka factories.
+ *
+ * @author Marcin Grzejszczak
+ * @since 3.0.0
+ */
+public class KafkaFactoryBeanPostProcessor implements BeanPostProcessor {
+
+ private final BeanFactory beanFactory;
+
+ public KafkaFactoryBeanPostProcessor(BeanFactory beanFactory) {
+ this.beanFactory = beanFactory;
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
+ if (bean instanceof ConsumerFactory) {
+ ConsumerFactory factory = (ConsumerFactory) bean;
+ if (factory.getPostProcessors().stream().noneMatch(o -> o instanceof TraceConsumerPostProcessor)) {
+ factory.addPostProcessor(new TraceConsumerPostProcessor(this.beanFactory));
+ }
+ }
+ else if (bean instanceof ProducerFactory) {
+ ProducerFactory factory = (ProducerFactory) bean;
+ if (factory.getPostProcessors().stream().noneMatch(o -> o instanceof TraceProducerPostProcessor)) {
+ factory.addPostProcessor(new TraceProducerPostProcessor(this.beanFactory));
+ }
+ }
+ return bean;
+ }
+
+}
diff --git a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/instrument/messaging/MessageListenerMethodInterceptor.java b/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/instrument/messaging/MessageListenerMethodInterceptor.java
new file mode 100644
index 000000000..cf22aed8f
--- /dev/null
+++ b/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/instrument/messaging/MessageListenerMethodInterceptor.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright 2013-2020 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.springframework.cloud.sleuth.brave.instrument.messaging;
+
+import brave.Span;
+import brave.Tracer;
+import brave.kafka.clients.KafkaTracing;
+import org.aopalliance.intercept.MethodInterceptor;
+import org.aopalliance.intercept.MethodInvocation;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.kafka.clients.consumer.ConsumerRecord;
+
+import org.springframework.kafka.listener.MessageListener;
+
+public class MessageListenerMethodInterceptor implements MethodInterceptor {
+
+ private static final Log log = LogFactory.getLog(MessageListenerMethodInterceptor.class);
+
+ private final KafkaTracing kafkaTracing;
+
+ private final Tracer tracer;
+
+ public MessageListenerMethodInterceptor(KafkaTracing kafkaTracing, Tracer tracer) {
+ this.kafkaTracing = kafkaTracing;
+ this.tracer = tracer;
+ }
+
+ @Override
+ public Object invoke(MethodInvocation invocation) throws Throwable {
+ if (!"onMessage".equals(invocation.getMethod().getName())) {
+ return invocation.proceed();
+ }
+ Object[] arguments = invocation.getArguments();
+ Object record = record(arguments);
+ if (record == null) {
+ return invocation.proceed();
+ }
+ if (log.isDebugEnabled()) {
+ log.debug("Wrapping onMessage call");
+ }
+ Span span = this.kafkaTracing.nextSpan((ConsumerRecord, ?>) record).name("on-message").start();
+ try (Tracer.SpanInScope ws = this.tracer.withSpanInScope(span)) {
+ return invocation.proceed();
+ }
+ catch (RuntimeException | Error e) {
+ String message = e.getMessage();
+ if (message == null) {
+ message = e.getClass().getSimpleName();
+ }
+ span.tag("error", message);
+ throw e;
+ }
+ finally {
+ span.finish();
+ }
+ }
+
+ private Object record(Object[] arguments) {
+ for (Object object : arguments) {
+ if (object instanceof ConsumerRecord) {
+ return object;
+ }
+ }
+ return null;
+ }
+
+}
diff --git a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/instrument/messaging/SleuthKafkaAspect.java b/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/instrument/messaging/SleuthKafkaAspect.java
new file mode 100644
index 000000000..6a7da2c96
--- /dev/null
+++ b/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/instrument/messaging/SleuthKafkaAspect.java
@@ -0,0 +1,128 @@
+/*
+ * Copyright 2013-2020 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.springframework.cloud.sleuth.brave.instrument.messaging;
+
+import java.lang.reflect.Field;
+
+import brave.Tracer;
+import brave.kafka.clients.KafkaTracing;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.kafka.clients.consumer.Consumer;
+import org.apache.kafka.clients.producer.Producer;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Pointcut;
+
+import org.springframework.aop.framework.ProxyFactoryBean;
+import org.springframework.kafka.listener.AbstractMessageListenerContainer;
+import org.springframework.kafka.listener.MessageListener;
+import org.springframework.kafka.listener.MessageListenerContainer;
+import org.springframework.kafka.listener.adapter.MessagingMessageListenerAdapter;
+import org.springframework.util.ReflectionUtils;
+
+/**
+ * Instruments Kafka related components.
+ *
+ * @since 3.0.0
+ * @author Marcin Grzejszczak
+ */
+@Aspect
+public class SleuthKafkaAspect {
+
+ private static final Log log = LogFactory.getLog(SleuthKafkaAspect.class);
+
+ final Field recordMessageConverter;
+
+ private final KafkaTracing kafkaTracing;
+
+ private final Tracer tracer;
+
+ public SleuthKafkaAspect(KafkaTracing kafkaTracing, Tracer tracer) {
+ this.kafkaTracing = kafkaTracing;
+ this.tracer = tracer;
+ this.recordMessageConverter = ReflectionUtils.findField(MessagingMessageListenerAdapter.class,
+ "recordMessageConverter");
+ }
+
+ @Pointcut("execution(public * org.springframework.kafka.core.ProducerFactory.createProducer(..))")
+ private void anyProducerFactory() {
+ } // NOSONAR
+
+ @Pointcut("execution(public * org.springframework.kafka.core.ConsumerFactory.createConsumer(..))")
+ private void anyConsumerFactory() {
+ } // NOSONAR
+
+ @Pointcut("execution(public * org.springframework.kafka.config.KafkaListenerContainerFactory.createListenerContainer(..))")
+ private void anyCreateListenerContainer() {
+ } // NOSONAR
+
+ @Pointcut("execution(public * org.springframework.kafka.config.KafkaListenerContainerFactory.createContainer(..))")
+ private void anyCreateContainer() {
+ } // NOSONAR
+
+ @Around("anyProducerFactory()")
+ public Object wrapProducerFactory(ProceedingJoinPoint pjp) throws Throwable {
+ Producer producer = (Producer) pjp.proceed();
+ return this.kafkaTracing.producer(producer);
+ }
+
+ @Around("anyConsumerFactory()")
+ public Object wrapConsumerFactory(ProceedingJoinPoint pjp) throws Throwable {
+ Consumer consumer = (Consumer) pjp.proceed();
+ return this.kafkaTracing.consumer(consumer);
+ }
+
+ @Around("anyCreateListenerContainer() || anyCreateContainer()")
+ public Object wrapListenerContainerCreation(ProceedingJoinPoint pjp) throws Throwable {
+ MessageListenerContainer listener = (MessageListenerContainer) pjp.proceed();
+ if (listener instanceof AbstractMessageListenerContainer) {
+ AbstractMessageListenerContainer container = (AbstractMessageListenerContainer) listener;
+ Object someMessageListener = container.getContainerProperties().getMessageListener();
+ if (someMessageListener == null) {
+ if (log.isDebugEnabled()) {
+ log.debug("No message listener to wrap. Proceeding");
+ }
+ }
+ else if (someMessageListener instanceof MessageListener) {
+ container.setupMessageListener(createProxy(someMessageListener));
+ }
+ else {
+ if (log.isDebugEnabled()) {
+ log.debug("ATM we don't support Batch message listeners");
+ }
+ }
+ }
+ else {
+ if (log.isDebugEnabled()) {
+ log.debug("Can't wrap this listener. Proceeding");
+ }
+ }
+ return listener;
+ }
+
+ @SuppressWarnings("unchecked")
+ Object createProxy(Object bean) {
+ ProxyFactoryBean factory = new ProxyFactoryBean();
+ factory.setProxyTargetClass(true);
+ factory.addAdvice(new MessageListenerMethodInterceptor(this.kafkaTracing, this.tracer));
+ factory.setTarget(bean);
+ return factory.getObject();
+ }
+
+}
diff --git a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/instrument/messaging/SleuthRabbitBeanPostProcessor.java b/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/instrument/messaging/SleuthRabbitBeanPostProcessor.java
new file mode 100644
index 000000000..88c24141e
--- /dev/null
+++ b/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/instrument/messaging/SleuthRabbitBeanPostProcessor.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2013-2020 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.springframework.cloud.sleuth.brave.instrument.messaging;
+
+import brave.spring.rabbit.SpringRabbitTracing;
+
+import org.springframework.amqp.rabbit.config.SimpleRabbitListenerContainerFactory;
+import org.springframework.amqp.rabbit.core.RabbitTemplate;
+import org.springframework.beans.BeansException;
+import org.springframework.beans.factory.BeanFactory;
+import org.springframework.beans.factory.config.BeanPostProcessor;
+
+/**
+ *
+ */
+public class SleuthRabbitBeanPostProcessor implements BeanPostProcessor {
+
+ private final BeanFactory beanFactory;
+
+ private SpringRabbitTracing tracing;
+
+ public SleuthRabbitBeanPostProcessor(BeanFactory beanFactory) {
+ this.beanFactory = beanFactory;
+ }
+
+ @Override
+ public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
+ if (bean instanceof RabbitTemplate) {
+ return rabbitTracing().decorateRabbitTemplate((RabbitTemplate) bean);
+ }
+ else if (bean instanceof SimpleRabbitListenerContainerFactory) {
+ return rabbitTracing()
+ .decorateSimpleRabbitListenerContainerFactory((SimpleRabbitListenerContainerFactory) bean);
+ }
+ return bean;
+ }
+
+ SpringRabbitTracing rabbitTracing() {
+ if (this.tracing == null) {
+ this.tracing = this.beanFactory.getBean(SpringRabbitTracing.class);
+ }
+ return this.tracing;
+ }
+
+}
diff --git a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/instrument/messaging/TraceConsumerPostProcessor.java b/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/instrument/messaging/TraceConsumerPostProcessor.java
new file mode 100644
index 000000000..27c676823
--- /dev/null
+++ b/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/instrument/messaging/TraceConsumerPostProcessor.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2013-2020 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.springframework.cloud.sleuth.brave.instrument.messaging;
+
+import brave.kafka.clients.KafkaTracing;
+import org.apache.kafka.clients.consumer.Consumer;
+
+import org.springframework.beans.factory.BeanFactory;
+import org.springframework.kafka.core.ConsumerPostProcessor;
+
+class TraceConsumerPostProcessor implements ConsumerPostProcessor {
+
+ private final BeanFactory beanFactory;
+
+ private KafkaTracing kafkaTracing;
+
+ TraceConsumerPostProcessor(BeanFactory beanFactory) {
+ this.beanFactory = beanFactory;
+ }
+
+ private KafkaTracing kafkaTracing() {
+ if (this.kafkaTracing == null) {
+ this.kafkaTracing = this.beanFactory.getBean(KafkaTracing.class);
+ }
+ return this.kafkaTracing;
+ }
+
+ @Override
+ public Consumer apply(Consumer kvConsumer) {
+ return kafkaTracing().consumer(kvConsumer);
+ }
+
+}
diff --git a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/instrument/messaging/TraceMessagingAutoConfiguration.java b/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/instrument/messaging/TraceMessagingAutoConfiguration.java
deleted file mode 100644
index 8d9a7308e..000000000
--- a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/instrument/messaging/TraceMessagingAutoConfiguration.java
+++ /dev/null
@@ -1,474 +0,0 @@
-/*
- * Copyright 2013-2020 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.springframework.cloud.sleuth.brave.instrument.messaging;
-
-import java.lang.reflect.Field;
-import java.util.List;
-
-import brave.Span;
-import brave.Tracer;
-import brave.Tracing;
-import brave.jms.JmsTracing;
-import brave.kafka.clients.KafkaTracing;
-import brave.messaging.MessagingRequest;
-import brave.messaging.MessagingTracing;
-import brave.messaging.MessagingTracingCustomizer;
-import brave.sampler.SamplerFunction;
-import brave.spring.rabbit.SpringRabbitTracing;
-import org.aopalliance.intercept.MethodInterceptor;
-import org.aopalliance.intercept.MethodInvocation;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.kafka.clients.consumer.Consumer;
-import org.apache.kafka.clients.consumer.ConsumerRecord;
-import org.apache.kafka.clients.producer.Producer;
-import org.aspectj.lang.ProceedingJoinPoint;
-import org.aspectj.lang.annotation.Around;
-import org.aspectj.lang.annotation.Aspect;
-import org.aspectj.lang.annotation.Pointcut;
-
-import org.springframework.amqp.rabbit.config.SimpleRabbitListenerContainerFactory;
-import org.springframework.amqp.rabbit.core.RabbitTemplate;
-import org.springframework.aop.framework.ProxyFactoryBean;
-import org.springframework.beans.BeansException;
-import org.springframework.beans.factory.BeanFactory;
-import org.springframework.beans.factory.config.BeanDefinition;
-import org.springframework.beans.factory.config.BeanPostProcessor;
-import org.springframework.boot.autoconfigure.AutoConfigureAfter;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
-import org.springframework.boot.context.properties.EnableConfigurationProperties;
-import org.springframework.cloud.sleuth.autoconfig.TraceAutoConfiguration;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Role;
-import org.springframework.jms.annotation.JmsListenerConfigurer;
-import org.springframework.jms.config.JmsListenerEndpointRegistry;
-import org.springframework.jms.config.TracingJmsListenerEndpointRegistry;
-import org.springframework.kafka.core.ConsumerFactory;
-import org.springframework.kafka.core.ConsumerPostProcessor;
-import org.springframework.kafka.core.ProducerFactory;
-import org.springframework.kafka.core.ProducerPostProcessor;
-import org.springframework.kafka.listener.AbstractMessageListenerContainer;
-import org.springframework.kafka.listener.MessageListener;
-import org.springframework.kafka.listener.MessageListenerContainer;
-import org.springframework.kafka.listener.adapter.MessagingMessageListenerAdapter;
-import org.springframework.lang.Nullable;
-import org.springframework.util.ReflectionUtils;
-
-/**
- * {@link org.springframework.boot.autoconfigure.EnableAutoConfiguration
- * Auto-configuration} that registers a tracing instrumentation of messaging components.
- *
- * @author Marcin Grzejszczak
- * @since 2.0.0
- */
-@Configuration(proxyBeanMethods = false)
-@ConditionalOnBean(Tracing.class)
-@ConditionalOnClass(MessagingTracing.class)
-@AutoConfigureAfter(TraceAutoConfiguration.class)
-@OnMessagingEnabled
-@EnableConfigurationProperties(SleuthMessagingProperties.class)
-// public allows @AutoConfigureAfter(TraceMessagingAutoConfiguration)
-// for components needing MessagingTracing
-public class TraceMessagingAutoConfiguration {
-
- @Bean
- @ConditionalOnMissingBean
- // NOTE: stable bean name as might be used outside sleuth
- MessagingTracing messagingTracing(Tracing tracing,
- @Nullable @ProducerSampler SamplerFunction producerSampler,
- @Nullable @ConsumerSampler SamplerFunction consumerSampler,
- @Nullable List messagingTracingCustomizers) {
-
- MessagingTracing.Builder builder = MessagingTracing.newBuilder(tracing);
- if (producerSampler != null) {
- builder.producerSampler(producerSampler);
- }
- if (consumerSampler != null) {
- builder.consumerSampler(consumerSampler);
- }
- if (messagingTracingCustomizers != null) {
- for (MessagingTracingCustomizer customizer : messagingTracingCustomizers) {
- customizer.customize(builder);
- }
- }
- return builder.build();
- }
-
- @Configuration(proxyBeanMethods = false)
- @ConditionalOnProperty(value = "spring.sleuth.messaging.rabbit.enabled", matchIfMissing = true)
- @ConditionalOnClass(RabbitTemplate.class)
- protected static class SleuthRabbitConfiguration {
-
- @Bean
- // for tests
- @ConditionalOnMissingBean
- static SleuthRabbitBeanPostProcessor sleuthRabbitBeanPostProcessor(BeanFactory beanFactory) {
- return new SleuthRabbitBeanPostProcessor(beanFactory);
- }
-
- @Bean
- @ConditionalOnMissingBean
- SpringRabbitTracing springRabbitTracing(MessagingTracing messagingTracing,
- SleuthMessagingProperties properties) {
- return SpringRabbitTracing.newBuilder(messagingTracing)
- .remoteServiceName(properties.getMessaging().getRabbit().getRemoteServiceName()).build();
- }
-
- }
-
- @Configuration(proxyBeanMethods = false)
- @ConditionalOnProperty(value = "spring.sleuth.messaging.kafka.enabled", matchIfMissing = true)
- @ConditionalOnClass(ProducerFactory.class)
- protected static class SleuthKafkaConfiguration {
-
- @Bean
- @ConditionalOnMissingBean
- KafkaTracing kafkaTracing(MessagingTracing messagingTracing, SleuthMessagingProperties properties) {
- return KafkaTracing.newBuilder(messagingTracing)
- .remoteServiceName(properties.getMessaging().getKafka().getRemoteServiceName()).build();
- }
-
- @Bean
- // for tests
- @ConditionalOnMissingBean
- SleuthKafkaAspect sleuthKafkaAspect(KafkaTracing kafkaTracing, Tracer tracer) {
- return new SleuthKafkaAspect(kafkaTracing, tracer);
- }
-
- @Bean
- KafkaFactoryBeanPostProcessor kafkaFactoryBeanPostProcessor(BeanFactory beanFactory) {
- return new KafkaFactoryBeanPostProcessor(beanFactory);
- }
-
- }
-
- @Configuration(proxyBeanMethods = false)
- @ConditionalOnProperty(value = "spring.sleuth.messaging.jms.enabled", matchIfMissing = true)
- @ConditionalOnClass(JmsListenerConfigurer.class)
- @ConditionalOnBean(JmsListenerEndpointRegistry.class)
- @Role(BeanDefinition.ROLE_INFRASTRUCTURE)
- protected static class SleuthJmsConfiguration {
-
- @Bean
- @ConditionalOnMissingBean
- JmsTracing jmsTracing(MessagingTracing messagingTracing, SleuthMessagingProperties properties) {
- return JmsTracing.newBuilder(messagingTracing)
- .remoteServiceName(properties.getMessaging().getJms().getRemoteServiceName()).build();
- }
-
- @Bean
- // for tests
- @ConditionalOnMissingBean
- TracingConnectionFactoryBeanPostProcessor tracingConnectionFactoryBeanPostProcessor(BeanFactory beanFactory) {
- return new TracingConnectionFactoryBeanPostProcessor(beanFactory);
- }
-
- @Bean
- JmsListenerConfigurer configureTracing(BeanFactory beanFactory, JmsListenerEndpointRegistry defaultRegistry) {
- return registrar -> {
- TracingJmsBeanPostProcessor processor = beanFactory.getBean(TracingJmsBeanPostProcessor.class);
- JmsListenerEndpointRegistry registry = registrar.getEndpointRegistry();
- registrar.setEndpointRegistry(
- (JmsListenerEndpointRegistry) processor.wrap(registry == null ? defaultRegistry : registry));
- };
- }
-
- // Setup the tracing endpoint registry.
- @Bean
- TracingJmsBeanPostProcessor tracingJmsBeanPostProcessor(BeanFactory beanFactory) {
- return new TracingJmsBeanPostProcessor(beanFactory);
- }
-
- }
-
-}
-
-class SleuthRabbitBeanPostProcessor implements BeanPostProcessor {
-
- private final BeanFactory beanFactory;
-
- private SpringRabbitTracing tracing;
-
- SleuthRabbitBeanPostProcessor(BeanFactory beanFactory) {
- this.beanFactory = beanFactory;
- }
-
- @Override
- public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
- if (bean instanceof RabbitTemplate) {
- return rabbitTracing().decorateRabbitTemplate((RabbitTemplate) bean);
- }
- else if (bean instanceof SimpleRabbitListenerContainerFactory) {
- return rabbitTracing()
- .decorateSimpleRabbitListenerContainerFactory((SimpleRabbitListenerContainerFactory) bean);
- }
- return bean;
- }
-
- SpringRabbitTracing rabbitTracing() {
- if (this.tracing == null) {
- this.tracing = this.beanFactory.getBean(SpringRabbitTracing.class);
- }
- return this.tracing;
- }
-
-}
-
-class KafkaFactoryBeanPostProcessor implements BeanPostProcessor {
-
- private final BeanFactory beanFactory;
-
- KafkaFactoryBeanPostProcessor(BeanFactory beanFactory) {
- this.beanFactory = beanFactory;
- }
-
- @SuppressWarnings("unchecked")
- @Override
- public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
- if (bean instanceof ConsumerFactory) {
- ConsumerFactory factory = (ConsumerFactory) bean;
- if (factory.getPostProcessors().stream().noneMatch(o -> o instanceof TraceConsumerPostProcessor)) {
- factory.addPostProcessor(new TraceConsumerPostProcessor(this.beanFactory));
- }
- }
- else if (bean instanceof ProducerFactory) {
- ProducerFactory factory = (ProducerFactory) bean;
- if (factory.getPostProcessors().stream().noneMatch(o -> o instanceof TraceProducerPostProcessor)) {
- factory.addPostProcessor(new TraceProducerPostProcessor(this.beanFactory));
- }
- }
- return bean;
- }
-
-}
-
-class TraceConsumerPostProcessor implements ConsumerPostProcessor {
-
- private final BeanFactory beanFactory;
-
- private KafkaTracing kafkaTracing;
-
- TraceConsumerPostProcessor(BeanFactory beanFactory) {
- this.beanFactory = beanFactory;
- }
-
- private KafkaTracing kafkaTracing() {
- if (this.kafkaTracing == null) {
- this.kafkaTracing = this.beanFactory.getBean(KafkaTracing.class);
- }
- return this.kafkaTracing;
- }
-
- @Override
- public Consumer apply(Consumer kvConsumer) {
- return kafkaTracing().consumer(kvConsumer);
- }
-
-}
-
-class TraceProducerPostProcessor implements ProducerPostProcessor {
-
- private final BeanFactory beanFactory;
-
- private KafkaTracing kafkaTracing;
-
- TraceProducerPostProcessor(BeanFactory beanFactory) {
- this.beanFactory = beanFactory;
- }
-
- private KafkaTracing kafkaTracing() {
- if (this.kafkaTracing == null) {
- this.kafkaTracing = this.beanFactory.getBean(KafkaTracing.class);
- }
- return this.kafkaTracing;
- }
-
- @Override
- public Producer apply(Producer kvProducer) {
- return kafkaTracing().producer(kvProducer);
- }
-
-}
-
-@Aspect
-class SleuthKafkaAspect {
-
- private static final Log log = LogFactory.getLog(SleuthKafkaAspect.class);
-
- final Field recordMessageConverter;
-
- private final KafkaTracing kafkaTracing;
-
- private final Tracer tracer;
-
- SleuthKafkaAspect(KafkaTracing kafkaTracing, Tracer tracer) {
- this.kafkaTracing = kafkaTracing;
- this.tracer = tracer;
- this.recordMessageConverter = ReflectionUtils.findField(MessagingMessageListenerAdapter.class,
- "recordMessageConverter");
- }
-
- @Pointcut("execution(public * org.springframework.kafka.core.ProducerFactory.createProducer(..))")
- private void anyProducerFactory() {
- } // NOSONAR
-
- @Pointcut("execution(public * org.springframework.kafka.core.ConsumerFactory.createConsumer(..))")
- private void anyConsumerFactory() {
- } // NOSONAR
-
- @Pointcut("execution(public * org.springframework.kafka.config.KafkaListenerContainerFactory.createListenerContainer(..))")
- private void anyCreateListenerContainer() {
- } // NOSONAR
-
- @Pointcut("execution(public * org.springframework.kafka.config.KafkaListenerContainerFactory.createContainer(..))")
- private void anyCreateContainer() {
- } // NOSONAR
-
- @Around("anyProducerFactory()")
- public Object wrapProducerFactory(ProceedingJoinPoint pjp) throws Throwable {
- Producer producer = (Producer) pjp.proceed();
- return this.kafkaTracing.producer(producer);
- }
-
- @Around("anyConsumerFactory()")
- public Object wrapConsumerFactory(ProceedingJoinPoint pjp) throws Throwable {
- Consumer consumer = (Consumer) pjp.proceed();
- return this.kafkaTracing.consumer(consumer);
- }
-
- @Around("anyCreateListenerContainer() || anyCreateContainer()")
- public Object wrapListenerContainerCreation(ProceedingJoinPoint pjp) throws Throwable {
- MessageListenerContainer listener = (MessageListenerContainer) pjp.proceed();
- if (listener instanceof AbstractMessageListenerContainer) {
- AbstractMessageListenerContainer container = (AbstractMessageListenerContainer) listener;
- Object someMessageListener = container.getContainerProperties().getMessageListener();
- if (someMessageListener == null) {
- if (log.isDebugEnabled()) {
- log.debug("No message listener to wrap. Proceeding");
- }
- }
- else if (someMessageListener instanceof MessageListener) {
- container.setupMessageListener(createProxy(someMessageListener));
- }
- else {
- if (log.isDebugEnabled()) {
- log.debug("ATM we don't support Batch message listeners");
- }
- }
- }
- else {
- if (log.isDebugEnabled()) {
- log.debug("Can't wrap this listener. Proceeding");
- }
- }
- return listener;
- }
-
- @SuppressWarnings("unchecked")
- Object createProxy(Object bean) {
- ProxyFactoryBean factory = new ProxyFactoryBean();
- factory.setProxyTargetClass(true);
- factory.addAdvice(new MessageListenerMethodInterceptor(this.kafkaTracing, this.tracer));
- factory.setTarget(bean);
- return factory.getObject();
- }
-
-}
-
-class MessageListenerMethodInterceptor implements MethodInterceptor {
-
- private static final Log log = LogFactory.getLog(MessageListenerMethodInterceptor.class);
-
- private final KafkaTracing kafkaTracing;
-
- private final Tracer tracer;
-
- MessageListenerMethodInterceptor(KafkaTracing kafkaTracing, Tracer tracer) {
- this.kafkaTracing = kafkaTracing;
- this.tracer = tracer;
- }
-
- @Override
- public Object invoke(MethodInvocation invocation) throws Throwable {
- if (!"onMessage".equals(invocation.getMethod().getName())) {
- return invocation.proceed();
- }
- Object[] arguments = invocation.getArguments();
- Object record = record(arguments);
- if (record == null) {
- return invocation.proceed();
- }
- if (log.isDebugEnabled()) {
- log.debug("Wrapping onMessage call");
- }
- Span span = this.kafkaTracing.nextSpan((ConsumerRecord, ?>) record).name("on-message").start();
- try (Tracer.SpanInScope ws = this.tracer.withSpanInScope(span)) {
- return invocation.proceed();
- }
- catch (RuntimeException | Error e) {
- String message = e.getMessage();
- if (message == null) {
- message = e.getClass().getSimpleName();
- }
- span.tag("error", message);
- throw e;
- }
- finally {
- span.finish();
- }
- }
-
- private Object record(Object[] arguments) {
- for (Object object : arguments) {
- if (object instanceof ConsumerRecord) {
- return object;
- }
- }
- return null;
- }
-
-}
-
-class TracingJmsBeanPostProcessor implements BeanPostProcessor {
-
- private final BeanFactory beanFactory;
-
- TracingJmsBeanPostProcessor(BeanFactory beanFactory) {
- this.beanFactory = beanFactory;
- }
-
- @Override
- public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
- return wrap(bean);
- }
-
- Object wrap(Object bean) {
- if (typeMatches(bean)) {
- return new TracingJmsListenerEndpointRegistry((JmsListenerEndpointRegistry) bean, this.beanFactory);
- }
- return bean;
- }
-
- private boolean typeMatches(Object bean) {
- return bean instanceof JmsListenerEndpointRegistry && !(bean instanceof TracingJmsListenerEndpointRegistry);
- }
-
-}
diff --git a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/instrument/messaging/TraceProducerPostProcessor.java b/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/instrument/messaging/TraceProducerPostProcessor.java
new file mode 100644
index 000000000..efcc83304
--- /dev/null
+++ b/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/instrument/messaging/TraceProducerPostProcessor.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2013-2020 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.springframework.cloud.sleuth.brave.instrument.messaging;
+
+import brave.kafka.clients.KafkaTracing;
+import org.apache.kafka.clients.producer.Producer;
+
+import org.springframework.beans.factory.BeanFactory;
+import org.springframework.kafka.core.ProducerPostProcessor;
+
+class TraceProducerPostProcessor implements ProducerPostProcessor {
+
+ private final BeanFactory beanFactory;
+
+ private KafkaTracing kafkaTracing;
+
+ TraceProducerPostProcessor(BeanFactory beanFactory) {
+ this.beanFactory = beanFactory;
+ }
+
+ private KafkaTracing kafkaTracing() {
+ if (this.kafkaTracing == null) {
+ this.kafkaTracing = this.beanFactory.getBean(KafkaTracing.class);
+ }
+ return this.kafkaTracing;
+ }
+
+ @Override
+ public Producer apply(Producer kvProducer) {
+ return kafkaTracing().producer(kvProducer);
+ }
+
+}
diff --git a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/instrument/messaging/TracingConnectionFactoryBeanPostProcessor.java b/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/instrument/messaging/TracingConnectionFactoryBeanPostProcessor.java
index f8e61b6e7..545ea7053 100644
--- a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/instrument/messaging/TracingConnectionFactoryBeanPostProcessor.java
+++ b/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/instrument/messaging/TracingConnectionFactoryBeanPostProcessor.java
@@ -42,11 +42,11 @@ import org.springframework.jms.listener.endpoint.JmsMessageEndpointManager;
* @author Adrian Cole
* @since 2.1.0
*/
-class TracingConnectionFactoryBeanPostProcessor implements BeanPostProcessor {
+public class TracingConnectionFactoryBeanPostProcessor implements BeanPostProcessor {
private final BeanFactory beanFactory;
- TracingConnectionFactoryBeanPostProcessor(BeanFactory beanFactory) {
+ public TracingConnectionFactoryBeanPostProcessor(BeanFactory beanFactory) {
this.beanFactory = beanFactory;
}
diff --git a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/instrument/messaging/TracingJmsBeanPostProcessor.java b/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/instrument/messaging/TracingJmsBeanPostProcessor.java
new file mode 100644
index 000000000..a2820f8b1
--- /dev/null
+++ b/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/instrument/messaging/TracingJmsBeanPostProcessor.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2013-2020 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.springframework.cloud.sleuth.brave.instrument.messaging;
+
+import org.springframework.beans.BeansException;
+import org.springframework.beans.factory.BeanFactory;
+import org.springframework.beans.factory.config.BeanPostProcessor;
+import org.springframework.jms.config.JmsListenerEndpointRegistry;
+import org.springframework.jms.config.TracingJmsListenerEndpointRegistry;
+
+/**
+ * A {@link BeanPostProcessor} for JMS endpoint registry.
+ *
+ * @author Marcin Grzejszczak
+ * @since 3.0.0
+ */
+public class TracingJmsBeanPostProcessor implements BeanPostProcessor {
+
+ private final BeanFactory beanFactory;
+
+ public TracingJmsBeanPostProcessor(BeanFactory beanFactory) {
+ this.beanFactory = beanFactory;
+ }
+
+ @Override
+ public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
+ return wrap(bean);
+ }
+
+ private Object wrap(Object bean) {
+ if (typeMatches(bean)) {
+ return new TracingJmsListenerEndpointRegistry((JmsListenerEndpointRegistry) bean, this.beanFactory);
+ }
+ return bean;
+ }
+
+ private boolean typeMatches(Object bean) {
+ return bean instanceof JmsListenerEndpointRegistry && !(bean instanceof TracingJmsListenerEndpointRegistry);
+ }
+
+}
diff --git a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/instrument/mongodb/TraceMongoClientSettingsBuilderCustomizer.java b/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/instrument/mongodb/TraceMongoClientSettingsBuilderCustomizer.java
new file mode 100644
index 000000000..87d275bae
--- /dev/null
+++ b/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/instrument/mongodb/TraceMongoClientSettingsBuilderCustomizer.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2013-2020 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.springframework.cloud.sleuth.brave.instrument.mongodb;
+
+import brave.Tracing;
+import brave.mongodb.MongoDBTracing;
+import com.mongodb.MongoClientSettings;
+
+import org.springframework.boot.autoconfigure.mongo.MongoClientSettingsBuilderCustomizer;
+
+/**
+ * Trace representation of a {@link MongoClientSettingsBuilderCustomizer}.
+ *
+ * @author Marcin Grzejszczak
+ * @since 3.0.0
+ */
+public class TraceMongoClientSettingsBuilderCustomizer implements MongoClientSettingsBuilderCustomizer {
+
+ private final Tracing tracing;
+
+ public TraceMongoClientSettingsBuilderCustomizer(Tracing tracing) {
+ this.tracing = tracing;
+ }
+
+ @Override
+ public void customize(MongoClientSettings.Builder clientSettingsBuilder) {
+ clientSettingsBuilder.addCommandListener(MongoDBTracing.create(this.tracing).commandListener());
+ }
+
+}
diff --git a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/instrument/web/CompositeHttpSampler.java b/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/instrument/web/CompositeHttpSampler.java
new file mode 100644
index 000000000..c93a6095d
--- /dev/null
+++ b/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/instrument/web/CompositeHttpSampler.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2013-2020 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.springframework.cloud.sleuth.brave.instrument.web;
+
+import brave.http.HttpRequest;
+import brave.sampler.SamplerFunction;
+
+/**
+ * Composite Http Sampler.
+ *
+ * @author Adrian Cole
+ * @since 3.0.0
+ */
+public final class CompositeHttpSampler implements SamplerFunction {
+
+ final SamplerFunction left;
+
+ final SamplerFunction right;
+
+ public CompositeHttpSampler(SamplerFunction left, SamplerFunction right) {
+ this.left = left;
+ this.right = right;
+ }
+
+ @Override
+ public Boolean trySample(HttpRequest request) {
+ // If either decision is false, return false
+ Boolean leftDecision = this.left.trySample(request);
+ if (Boolean.FALSE.equals(leftDecision)) {
+ return false;
+ }
+ Boolean rightDecision = this.right.trySample(request);
+ if (Boolean.FALSE.equals(rightDecision)) {
+ return false;
+ }
+ // If either decision is null, return the other
+ if (leftDecision == null) {
+ return rightDecision;
+ }
+ if (rightDecision == null) {
+ return leftDecision;
+ }
+ // Neither are null and at least one is true
+ return rightDecision;
+ }
+
+}
diff --git a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/instrument/web/SkipPatternHttpClientSampler.java b/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/instrument/web/SkipPatternHttpClientSampler.java
new file mode 100644
index 000000000..cd7649615
--- /dev/null
+++ b/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/instrument/web/SkipPatternHttpClientSampler.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2013-2020 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.springframework.cloud.sleuth.brave.instrument.web;
+
+import java.util.regex.Pattern;
+
+public class SkipPatternHttpClientSampler extends SkipPatternSampler {
+
+ private final Pattern skipPattern;
+
+ public SkipPatternHttpClientSampler(Pattern skipPattern) {
+ this.skipPattern = skipPattern;
+ }
+
+ @Override
+ Pattern getPattern() {
+ return skipPattern;
+ }
+
+}
diff --git a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/instrument/web/SkipPatternHttpServerSampler.java b/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/instrument/web/SkipPatternHttpServerSampler.java
new file mode 100644
index 000000000..29fac88c4
--- /dev/null
+++ b/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/instrument/web/SkipPatternHttpServerSampler.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2013-2020 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.springframework.cloud.sleuth.brave.instrument.web;
+
+import java.util.regex.Pattern;
+
+import org.springframework.cloud.sleuth.instrument.web.SkipPatternProvider;
+
+/**
+ * Http Sampler that looks at paths.
+ *
+ * @author Marcin Grzejszczak
+ * @since 3.0.0
+ */
+public class SkipPatternHttpServerSampler extends SkipPatternSampler {
+
+ private final SkipPatternProvider provider;
+
+ public SkipPatternHttpServerSampler(SkipPatternProvider provider) {
+ this.provider = provider;
+ }
+
+ @Override
+ Pattern getPattern() {
+ return this.provider.skipPattern();
+ }
+
+}
diff --git a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/propagation/PropagationType.java b/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/propagation/PropagationType.java
new file mode 100644
index 000000000..33dc21b6a
--- /dev/null
+++ b/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/propagation/PropagationType.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2013-2020 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.springframework.cloud.sleuth.brave.propagation;
+
+/*
+ * Supported propagation types.
+ *
+ * @author Marcin Grzejszczak
+ * @since 3.0.0
+ */
+public enum PropagationType {
+
+ /**
+ * AWS propagation type.
+ */
+ AWS,
+
+ /**
+ * B3 propagation type.
+ */
+ B3,
+
+ /**
+ * W3C propagation type.
+ */
+ W3C,
+
+ /**
+ * Custom propagation type.
+ */
+ CUSTOM
+
+}
diff --git a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/sampler/ProbabilityBasedSampler.java b/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/sampler/ProbabilityBasedSampler.java
index e3efb4542..27a16fd60 100644
--- a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/sampler/ProbabilityBasedSampler.java
+++ b/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/sampler/ProbabilityBasedSampler.java
@@ -19,6 +19,7 @@ package org.springframework.cloud.sleuth.brave.sampler;
import java.util.BitSet;
import java.util.Random;
import java.util.concurrent.atomic.AtomicInteger;
+import java.util.function.Supplier;
import brave.sampler.Sampler;
@@ -43,19 +44,19 @@ import org.springframework.util.Assert;
* @author Adrian Cole
* @since 1.0.0
*/
-class ProbabilityBasedSampler extends Sampler {
+public class ProbabilityBasedSampler extends Sampler {
private final AtomicInteger counter = new AtomicInteger(0);
private final BitSet sampleDecisions;
- private final SamplerProperties configuration;
+ private final Supplier probability;
- ProbabilityBasedSampler(SamplerProperties configuration) {
- Assert.notNull(configuration.getProbability(), "probability property is required for ProbabilityBasedSampler");
- int outOf100 = (int) (configuration.getProbability() * 100.0f);
+ public ProbabilityBasedSampler(Supplier probability) {
+ Assert.notNull(probability, "probability property is required for ProbabilityBasedSampler");
+ this.probability = probability;
+ int outOf100 = (int) (probability.get() * 100.0f);
this.sampleDecisions = randomBitSet(100, outOf100, new Random());
- this.configuration = configuration;
}
/**
@@ -88,10 +89,10 @@ class ProbabilityBasedSampler extends Sampler {
@Override
public boolean isSampled(long traceId) {
- if (this.configuration.getProbability() == 0) {
+ if (this.probability.get() == 0) {
return false;
}
- else if (this.configuration.getProbability() == 1.0f) {
+ else if (this.probability.get() == 1.0f) {
return true;
}
synchronized (this) {
diff --git a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/sampler/RateLimitingSampler.java b/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/sampler/RateLimitingSampler.java
index 2bfb124f8..aa7335ce4 100644
--- a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/sampler/RateLimitingSampler.java
+++ b/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/sampler/RateLimitingSampler.java
@@ -16,6 +16,8 @@
package org.springframework.cloud.sleuth.brave.sampler;
+import java.util.function.Supplier;
+
import brave.sampler.Sampler;
/**
@@ -27,16 +29,16 @@ import brave.sampler.Sampler;
* @author Marcin Grzejszczak
* @since 2.1.0
*/
-class RateLimitingSampler extends Sampler {
+public class RateLimitingSampler extends Sampler {
private final Sampler sampler;
- RateLimitingSampler(SamplerProperties configuration) {
- this.sampler = brave.sampler.RateLimitingSampler.create(rateLimit(configuration));
+ public RateLimitingSampler(Supplier rate) {
+ this.sampler = brave.sampler.RateLimitingSampler.create(rateLimit(rate));
}
- private Integer rateLimit(SamplerProperties configuration) {
- return configuration.getRate() != null ? configuration.getRate() : 0;
+ private Integer rateLimit(Supplier rate) {
+ return rate.get() != null ? rate.get() : 0;
}
@Override
diff --git a/spring-cloud-sleuth-brave/src/main/resources/META-INF/spring.factories b/spring-cloud-sleuth-brave/src/main/resources/META-INF/spring.factories
deleted file mode 100644
index 07c86e7f5..000000000
--- a/spring-cloud-sleuth-brave/src/main/resources/META-INF/spring.factories
+++ /dev/null
@@ -1,15 +0,0 @@
-# Auto Configuration
-org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
-org.springframework.cloud.sleuth.brave.autoconfig.TraceBraveAutoConfiguration,\
-org.springframework.cloud.sleuth.brave.bridge.TraceBraveBridgeAutoConfiguation,\
-org.springframework.cloud.sleuth.brave.bridge.http.TraceBraveHttpBridgeAutoConfiguration,\
-org.springframework.cloud.sleuth.brave.propagation.TraceBravePropagationAutoConfiguration,\
-org.springframework.cloud.sleuth.brave.instrument.web.TraceHttpAutoConfiguration,\
-org.springframework.cloud.sleuth.brave.instrument.web.client.TraceWebClientAutoConfiguration,\
-org.springframework.cloud.sleuth.brave.instrument.rpc.TraceRpcAutoConfiguration,\
-org.springframework.cloud.sleuth.brave.instrument.grpc.TraceGrpcAutoConfiguration,\
-org.springframework.cloud.sleuth.brave.instrument.messaging.SleuthKafkaStreamsConfiguration,\
-org.springframework.cloud.sleuth.brave.instrument.messaging.TraceMessagingAutoConfiguration,\
-org.springframework.cloud.sleuth.brave.instrument.opentracing.OpentracingAutoConfiguration,\
-org.springframework.cloud.sleuth.brave.instrument.redis.TraceRedisAutoConfiguration,\
-org.springframework.cloud.sleuth.brave.instrument.mongodb.TraceMongoDbAutoConfiguration
diff --git a/spring-cloud-sleuth-brave/src/test/java/org/springframework/cloud/sleuth/ArchitectureTests.java b/spring-cloud-sleuth-brave/src/test/java/org/springframework/cloud/sleuth/ArchitectureTests.java
new file mode 100644
index 000000000..434c404af
--- /dev/null
+++ b/spring-cloud-sleuth-brave/src/test/java/org/springframework/cloud/sleuth/ArchitectureTests.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2013-2020 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.springframework.cloud.sleuth;
+
+import com.tngtech.archunit.core.importer.ImportOption;
+import com.tngtech.archunit.core.importer.Location;
+import com.tngtech.archunit.junit.AnalyzeClasses;
+import com.tngtech.archunit.junit.ArchTest;
+import com.tngtech.archunit.lang.ArchRule;
+
+import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.noClasses;
+
+@AnalyzeClasses(packagesOf = ArchitectureTests.class, importOptions = ArchitectureTests.ProductionCode.class)
+public class ArchitectureTests {
+
+ @ArchTest
+ public static final ArchRule should_not_contain_any_spring_configuration_reference_in_module = noClasses().should()
+ .dependOnClassesThat().resideInAnyPackage("..org.springframework.boot.context.properties..",
+ "..org.springframework.context.annotation..");
+
+ static class ProductionCode implements ImportOption {
+
+ @Override
+ public boolean includes(Location location) {
+ return Predefined.DO_NOT_INCLUDE_TESTS.includes(location)
+ && Predefined.DO_NOT_INCLUDE_JARS.includes(location);
+ }
+
+ }
+
+}
diff --git a/spring-cloud-sleuth-brave/src/test/java/org/springframework/cloud/sleuth/documentation/SpringCloudSleuthDocTests.java b/spring-cloud-sleuth-brave/src/test/java/org/springframework/cloud/sleuth/brave/SpringCloudSleuthDocTests.java
similarity index 96%
rename from spring-cloud-sleuth-brave/src/test/java/org/springframework/cloud/sleuth/documentation/SpringCloudSleuthDocTests.java
rename to spring-cloud-sleuth-brave/src/test/java/org/springframework/cloud/sleuth/brave/SpringCloudSleuthDocTests.java
index f92effb4a..8949528cd 100644
--- a/spring-cloud-sleuth-brave/src/test/java/org/springframework/cloud/sleuth/documentation/SpringCloudSleuthDocTests.java
+++ b/spring-cloud-sleuth-brave/src/test/java/org/springframework/cloud/sleuth/brave/SpringCloudSleuthDocTests.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.documentation;
+package org.springframework.cloud.sleuth.brave;
import java.util.Optional;
import java.util.concurrent.Callable;
@@ -35,10 +35,10 @@ import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
+import org.springframework.cloud.sleuth.Span;
import org.springframework.cloud.sleuth.SpanName;
import org.springframework.cloud.sleuth.SpanNamer;
-import org.springframework.cloud.sleuth.api.Span;
-import org.springframework.cloud.sleuth.api.Tracer;
+import org.springframework.cloud.sleuth.Tracer;
import org.springframework.cloud.sleuth.brave.bridge.BraveBaggageManager;
import org.springframework.cloud.sleuth.brave.bridge.BraveTracer;
import org.springframework.cloud.sleuth.instrument.async.TraceCallable;
@@ -67,10 +67,7 @@ public class SpringCloudSleuthDocTests {
brave.Tracer braveTracer = this.tracing.tracer();
- BraveBaggageManager braveBaggageManager = new BraveBaggageManager();
-
- org.springframework.cloud.sleuth.api.Tracer tracer = BraveTracer.fromBrave(this.braveTracer,
- this.braveBaggageManager);
+ org.springframework.cloud.sleuth.Tracer tracer = new BraveTracer(this.braveTracer, new BraveBaggageManager());
@BeforeEach
public void setup() {
diff --git a/spring-cloud-sleuth-brave/src/test/java/org/springframework/cloud/sleuth/brave/propagation/W3CBaggagePropagatorTest.java b/spring-cloud-sleuth-brave/src/test/java/org/springframework/cloud/sleuth/brave/bridge/W3CBaggagePropagatorTest.java
similarity index 90%
rename from spring-cloud-sleuth-brave/src/test/java/org/springframework/cloud/sleuth/brave/propagation/W3CBaggagePropagatorTest.java
rename to spring-cloud-sleuth-brave/src/test/java/org/springframework/cloud/sleuth/brave/bridge/W3CBaggagePropagatorTest.java
index 24473624f..5ae82de49 100644
--- a/spring-cloud-sleuth-brave/src/test/java/org/springframework/cloud/sleuth/brave/propagation/W3CBaggagePropagatorTest.java
+++ b/spring-cloud-sleuth-brave/src/test/java/org/springframework/cloud/sleuth/brave/bridge/W3CBaggagePropagatorTest.java
@@ -14,9 +14,10 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.brave.propagation;
+package org.springframework.cloud.sleuth.brave.bridge;
import java.util.Arrays;
+import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
@@ -28,9 +29,6 @@ import brave.propagation.TraceContextOrSamplingFlags;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
-import org.springframework.cloud.sleuth.autoconfig.SleuthBaggageProperties;
-import org.springframework.cloud.sleuth.brave.bridge.BraveBaggageManager;
-
import static java.util.Collections.singletonMap;
import static org.assertj.core.api.Assertions.assertThat;
@@ -39,13 +37,7 @@ import static org.assertj.core.api.Assertions.assertThat;
*/
class W3CBaggagePropagatorTest {
- W3CBaggagePropagator propagator = new W3CBaggagePropagator(new BraveBaggageManager(), sleuthBaggageProperties());
-
- SleuthBaggageProperties sleuthBaggageProperties() {
- SleuthBaggageProperties properties = new SleuthBaggageProperties();
- properties.setRemoteFields(Arrays.asList("nometa", "meta", "key", "key1", "key2"));
- return properties;
- }
+ W3CBaggagePropagator propagator = new W3CBaggagePropagator(new BraveBaggageManager(), Collections.emptyList());
@Test
void fields() {
@@ -90,10 +82,6 @@ class W3CBaggagePropagatorTest {
.create(TraceContext.newBuilder().traceId(1L).spanId(2L).sampled(true).build());
}
- private TraceContext.Builder contextBuilder() {
- return TraceContext.newBuilder().traceId(1L).spanId(2L).sampled(true);
- }
-
@Test
void extract_multiEntry() {
TraceContextOrSamplingFlags context = context();
diff --git a/spring-cloud-sleuth-brave/src/test/java/org/springframework/cloud/sleuth/brave/propagation/W3CPropagationTest.java b/spring-cloud-sleuth-brave/src/test/java/org/springframework/cloud/sleuth/brave/bridge/W3CPropagationTest.java
similarity index 96%
rename from spring-cloud-sleuth-brave/src/test/java/org/springframework/cloud/sleuth/brave/propagation/W3CPropagationTest.java
rename to spring-cloud-sleuth-brave/src/test/java/org/springframework/cloud/sleuth/brave/bridge/W3CPropagationTest.java
index 69529588e..dd60a6705 100644
--- a/spring-cloud-sleuth-brave/src/test/java/org/springframework/cloud/sleuth/brave/propagation/W3CPropagationTest.java
+++ b/spring-cloud-sleuth-brave/src/test/java/org/springframework/cloud/sleuth/brave/bridge/W3CPropagationTest.java
@@ -14,8 +14,9 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.brave.propagation;
+package org.springframework.cloud.sleuth.brave.bridge;
+import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedHashMap;
@@ -26,12 +27,9 @@ import brave.propagation.TraceContext;
import brave.propagation.TraceContextOrSamplingFlags;
import org.junit.jupiter.api.Test;
-import org.springframework.cloud.sleuth.autoconfig.SleuthBaggageProperties;
-import org.springframework.cloud.sleuth.brave.bridge.BraveBaggageManager;
-
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.entry;
-import static org.springframework.cloud.sleuth.brave.propagation.W3CPropagation.TRACE_PARENT;
+import static org.springframework.cloud.sleuth.brave.bridge.W3CPropagation.TRACE_PARENT;
/**
* Test taken from OpenTelemetry.
@@ -54,8 +52,7 @@ class W3CPropagationTest {
private static final String TRACESTATE_NOT_DEFAULT_ENCODING_WITH_SPACES = "bar=baz , foo=bar";
- private final W3CPropagation w3CPropagation = new W3CPropagation(new BraveBaggageManager(),
- new SleuthBaggageProperties());
+ private final W3CPropagation w3CPropagation = new W3CPropagation(new BraveBaggageManager(), new ArrayList<>());
@Test
void inject_NullCarrierUsage() {
diff --git a/spring-cloud-sleuth-brave/src/test/java/org/springframework/cloud/sleuth/brave/sampler/ProbabilityBasedSamplerTests.java b/spring-cloud-sleuth-brave/src/test/java/org/springframework/cloud/sleuth/brave/sampler/ProbabilityBasedSamplerTests.java
index 402f79994..8732f3bf5 100644
--- a/spring-cloud-sleuth-brave/src/test/java/org/springframework/cloud/sleuth/brave/sampler/ProbabilityBasedSamplerTests.java
+++ b/spring-cloud-sleuth-brave/src/test/java/org/springframework/cloud/sleuth/brave/sampler/ProbabilityBasedSamplerTests.java
@@ -17,6 +17,7 @@
package org.springframework.cloud.sleuth.brave.sampler;
import java.util.Random;
+import java.util.function.Supplier;
import brave.sampler.Sampler;
import org.junit.jupiter.api.Test;
@@ -31,24 +32,18 @@ public class ProbabilityBasedSamplerTests {
private static Random RANDOM = new Random();
- SamplerProperties samplerConfiguration = new SamplerProperties();
-
@Test
public void should_pass_all_samples_when_config_has_1_probability() throws Exception {
- this.samplerConfiguration.setProbability(1f);
-
for (int i = 0; i < 10; i++) {
- then(new ProbabilityBasedSampler(this.samplerConfiguration).isSampled(RANDOM.nextLong())).isTrue();
+ then(new ProbabilityBasedSampler(() -> 1f).isSampled(RANDOM.nextLong())).isTrue();
}
}
@Test
public void should_reject_all_samples_when_config_has_0_probability() throws Exception {
- this.samplerConfiguration.setProbability(0f);
-
for (int i = 0; i < 10; i++) {
- then(new ProbabilityBasedSampler(this.samplerConfiguration).isSampled(RANDOM.nextLong())).isFalse();
+ then(new ProbabilityBasedSampler(() -> 0f).isSampled(RANDOM.nextLong())).isFalse();
}
}
@@ -56,9 +51,8 @@ public class ProbabilityBasedSamplerTests {
public void should_pass_given_percent_of_samples() throws Exception {
int numberOfIterations = 1000;
float probability = 1f;
- this.samplerConfiguration.setProbability(probability);
- int numberOfSampledElements = countNumberOfSampledElements(numberOfIterations);
+ int numberOfSampledElements = countNumberOfSampledElements(numberOfIterations, () -> probability);
then(numberOfSampledElements).isEqualTo((int) (numberOfIterations * probability));
}
@@ -67,9 +61,8 @@ public class ProbabilityBasedSamplerTests {
public void should_pass_given_percent_of_samples_with_fractional_element() throws Exception {
int numberOfIterations = 1000;
float probability = 0.35f;
- this.samplerConfiguration.setProbability(probability);
- int numberOfSampledElements = countNumberOfSampledElements(numberOfIterations);
+ int numberOfSampledElements = countNumberOfSampledElements(numberOfIterations, () -> probability);
int threshold = (int) (numberOfIterations * probability);
then(numberOfSampledElements).isEqualTo(threshold);
@@ -77,13 +70,12 @@ public class ProbabilityBasedSamplerTests {
@Test
public void should_fail_given_no_probability() {
- assertThatThrownBy(() -> new ProbabilityBasedSampler(this.samplerConfiguration))
- .isInstanceOf(IllegalArgumentException.class)
+ assertThatThrownBy(() -> new ProbabilityBasedSampler(null)).isInstanceOf(IllegalArgumentException.class)
.hasMessage("probability property is required for ProbabilityBasedSampler");
}
- private int countNumberOfSampledElements(int numberOfIterations) {
- Sampler sampler = new ProbabilityBasedSampler(this.samplerConfiguration);
+ private int countNumberOfSampledElements(int numberOfIterations, Supplier probability) {
+ Sampler sampler = new ProbabilityBasedSampler(probability);
int passedCounter = 0;
for (int i = 0; i < numberOfIterations; i++) {
boolean passed = sampler.isSampled(RANDOM.nextLong());
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
deleted file mode 100644
index af7c9105e..000000000
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/autoconfig/TraceAutoConfiguration.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Copyright 2013-2020 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.springframework.cloud.sleuth.autoconfig;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
-import org.springframework.boot.context.properties.EnableConfigurationProperties;
-import org.springframework.cloud.sleuth.SpanNamer;
-import org.springframework.cloud.sleuth.api.CurrentTraceContext;
-import org.springframework.cloud.sleuth.api.SpanCustomizer;
-import org.springframework.cloud.sleuth.api.Tracer;
-import org.springframework.cloud.sleuth.api.exporter.SpanFilter;
-import org.springframework.cloud.sleuth.api.noop.NoOpCurrentTraceContext;
-import org.springframework.cloud.sleuth.api.noop.NoOpPropagator;
-import org.springframework.cloud.sleuth.api.noop.NoOpSpanCustomizer;
-import org.springframework.cloud.sleuth.api.noop.NoOpTracer;
-import org.springframework.cloud.sleuth.api.propagation.Propagator;
-import org.springframework.cloud.sleuth.internal.DefaultSpanNamer;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-
-/**
- * {@link org.springframework.boot.autoconfigure.EnableAutoConfiguration
- * Auto-configuration} to enable tracing via Spring Cloud Sleuth.
- *
- * @author Spencer Gibb
- * @author Marcin Grzejszczak
- * @author Tim Ysewyn
- * @since 2.0.0
- */
-@Configuration(proxyBeanMethods = false)
-@ConditionalOnProperty(value = "spring.sleuth.enabled", matchIfMissing = true)
-@EnableConfigurationProperties({ SleuthSpanFilterProperties.class, SleuthBaggageProperties.class })
-public class TraceAutoConfiguration {
-
- private static final Log log = LogFactory.getLog(TraceAutoConfiguration.class);
-
- @Bean
- @ConditionalOnMissingBean
- Tracer defaultTracer() {
- if (log.isWarnEnabled()) {
- log.warn(
- "You have not provided a tracer implementation. A default, noop one will be set up. You will not see any spans get reported to external systems (e.g. Zipkin) nor will any context get propagated.");
- }
- return new NoOpTracer();
- }
-
- @Bean
- @ConditionalOnMissingBean
- SpanNamer defaultSpanNamer() {
- return new DefaultSpanNamer();
- }
-
- @Bean
- @ConditionalOnMissingBean
- Propagator defaultPropagator() {
- return new NoOpPropagator();
- }
-
- @Bean
- @ConditionalOnMissingBean
- CurrentTraceContext defaultCurrentTraceContext() {
- return new NoOpCurrentTraceContext();
- }
-
- @Bean
- @ConditionalOnMissingBean
- SpanCustomizer defaultSpanCustomizer() {
- return new NoOpSpanCustomizer();
- }
-
- @Bean
- @ConditionalOnProperty(value = "spring.sleuth.span-filter.enabled", matchIfMissing = true)
- SpanFilter spanIgnoringSpanExporter(SleuthSpanFilterProperties sleuthSpanFilterProperties) {
- return new SpanIgnoringSpanFilter(sleuthSpanFilterProperties);
- }
-
-}
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/circuitbreaker/SleuthCircuitBreakerAutoConfiguration.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/circuitbreaker/SleuthCircuitBreakerAutoConfiguration.java
deleted file mode 100644
index fa6376482..000000000
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/circuitbreaker/SleuthCircuitBreakerAutoConfiguration.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * Copyright 2013-2020 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.springframework.cloud.sleuth.instrument.circuitbreaker;
-
-import java.util.function.Function;
-import java.util.function.Supplier;
-
-import org.aspectj.lang.ProceedingJoinPoint;
-import org.aspectj.lang.annotation.Around;
-import org.aspectj.lang.annotation.Aspect;
-import org.aspectj.lang.annotation.Pointcut;
-
-import org.springframework.boot.autoconfigure.AutoConfigureAfter;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
-import org.springframework.boot.context.properties.EnableConfigurationProperties;
-import org.springframework.cloud.client.circuitbreaker.CircuitBreaker;
-import org.springframework.cloud.sleuth.api.Tracer;
-import org.springframework.cloud.sleuth.autoconfig.TraceAutoConfiguration;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-
-/**
- * {@link org.springframework.boot.autoconfigure.EnableAutoConfiguration
- * Auto-configuration} that registers instrumentation for circuit breakers.
- *
- * @author Marcin Grzejszczak
- * @since 2.2.1
- */
-@Configuration(proxyBeanMethods = false)
-@AutoConfigureAfter(TraceAutoConfiguration.class)
-@ConditionalOnClass(CircuitBreaker.class)
-@ConditionalOnBean(Tracer.class)
-@ConditionalOnProperty(value = "spring.sleuth.circuitbreaker.enabled", matchIfMissing = true)
-@EnableConfigurationProperties(SleuthCircuitBreakerProperties.class)
-class SleuthCircuitBreakerAutoConfiguration {
-
- @Bean
- TraceCircuitBreakerFactoryAspect traceCircuitBreakerFactoryAspect(Tracer tracer) {
- return new TraceCircuitBreakerFactoryAspect(tracer);
- }
-
-}
-
-@Aspect
-class TraceCircuitBreakerFactoryAspect {
-
- private final Tracer tracer;
-
- TraceCircuitBreakerFactoryAspect(Tracer tracer) {
- this.tracer = tracer;
- }
-
- @Pointcut("execution(public * org.springframework.cloud.client.circuitbreaker.CircuitBreakerFactory.create(..))")
- private void anyCircuitBreakerFactoryCreate() {
- } // NOSONAR
-
- @Around("anyCircuitBreakerFactoryCreate()")
- public Object wrapFactory(ProceedingJoinPoint pjp) throws Throwable {
- CircuitBreaker circuitBreaker = (CircuitBreaker) pjp.proceed();
- return new TraceCircuitBreaker(circuitBreaker, this.tracer);
- }
-
-}
-
-class TraceCircuitBreaker implements CircuitBreaker {
-
- private final CircuitBreaker delegate;
-
- private final Tracer tracer;
-
- TraceCircuitBreaker(CircuitBreaker delegate, Tracer tracer) {
- this.delegate = delegate;
- this.tracer = tracer;
- }
-
- @Override
- public T run(Supplier toRun, Function fallback) {
- return this.delegate.run(new TraceSupplier<>(this.tracer, toRun), new TraceFunction<>(this.tracer, fallback));
- }
-
- @Override
- public T run(Supplier toRun) {
- return this.delegate.run(new TraceSupplier<>(this.tracer, toRun));
- }
-
-}
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/TraceHttpAutoConfiguration.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/TraceHttpAutoConfiguration.java
deleted file mode 100644
index c8be7b5f9..000000000
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/TraceHttpAutoConfiguration.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Copyright 2013-2020 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.springframework.cloud.sleuth.instrument.web;
-
-import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
-import org.springframework.cloud.sleuth.api.http.HttpClientHandler;
-import org.springframework.cloud.sleuth.api.http.HttpServerHandler;
-import org.springframework.cloud.sleuth.api.noop.NoOpHttpClientHandler;
-import org.springframework.cloud.sleuth.api.noop.NoOpHttpServerHandler;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-
-/**
- * {@link org.springframework.boot.autoconfigure.EnableAutoConfiguration
- * Auto-configuration} to enable HTTP tracing via Spring Cloud Sleuth.
- *
- * @author Spencer Gibb
- * @author Marcin Grzejszczak
- * @author Tim Ysewyn
- * @since 2.0.0
- */
-@Configuration(proxyBeanMethods = false)
-@ConditionalOnProperty(value = "spring.sleuth.http.enabled", matchIfMissing = true)
-public class TraceHttpAutoConfiguration {
-
- @Bean
- @ConditionalOnMissingBean
- HttpClientHandler defaultHttpClientHandler() {
- return new NoOpHttpClientHandler();
- }
-
- @Bean
- @ConditionalOnMissingBean
- HttpServerHandler defaultHttpServerHandler() {
- return new NoOpHttpServerHandler();
- }
-
-}
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/TraceRequestHttpHeadersFilter.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/TraceRequestHttpHeadersFilter.java
deleted file mode 100644
index 8033ae8ba..000000000
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/TraceRequestHttpHeadersFilter.java
+++ /dev/null
@@ -1,257 +0,0 @@
-/*
- * Copyright 2013-2020 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.springframework.cloud.sleuth.instrument.web.client;
-
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import org.springframework.cloud.gateway.filter.headers.HttpHeadersFilter;
-import org.springframework.cloud.sleuth.api.Span;
-import org.springframework.cloud.sleuth.api.TraceContext;
-import org.springframework.cloud.sleuth.api.Tracer;
-import org.springframework.cloud.sleuth.api.http.HttpClientHandler;
-import org.springframework.cloud.sleuth.api.http.HttpClientRequest;
-import org.springframework.cloud.sleuth.api.http.HttpClientResponse;
-import org.springframework.cloud.sleuth.api.propagation.Propagator;
-import org.springframework.http.HttpHeaders;
-import org.springframework.http.server.reactive.ServerHttpRequest;
-import org.springframework.http.server.reactive.ServerHttpResponse;
-import org.springframework.web.server.ServerWebExchange;
-
-final class TraceRequestHttpHeadersFilter extends AbstractHttpHeadersFilter {
-
- private static final Log log = LogFactory.getLog(TraceRequestHttpHeadersFilter.class);
-
- static final String TRACE_REQUEST_ATTR = TraceContext.class.getName();
-
- private TraceRequestHttpHeadersFilter(Tracer tracer, HttpClientHandler handler, Propagator propagator) {
- super(tracer, handler, propagator);
- }
-
- static HttpHeadersFilter create(Tracer tracer, HttpClientHandler handler, Propagator propagator) {
- return new TraceRequestHttpHeadersFilter(tracer, handler, propagator);
- }
-
- @Override
- public HttpHeaders filter(HttpHeaders input, ServerWebExchange exchange) {
- if (log.isDebugEnabled()) {
- log.debug("Will instrument the HTTP request headers [" + exchange.getRequest().getHeaders() + "]");
- }
- ServerHttpClientRequest request = new ServerHttpClientRequest(exchange.getRequest(), input);
- Span currentSpan = currentSpan(exchange, request);
- Span span = injectedSpan(request, currentSpan);
- if (log.isDebugEnabled()) {
- log.debug("Client span " + span + " created for the request. New headers are "
- + request.filteredHeaders.toSingleValueMap());
- }
- exchange.getAttributes().put(SPAN_ATTRIBUTE, span);
- HttpHeaders headersWithInput = new HttpHeaders();
- headersWithInput.addAll(input);
- addHeadersWithInput(request.filteredHeaders, headersWithInput);
- if (headersWithInput.containsKey("b3") || headersWithInput.containsKey("B3")) {
- headersWithInput.keySet().remove("b3");
- headersWithInput.keySet().remove("B3");
- }
- return headersWithInput;
- }
-
- private Span currentSpan(ServerWebExchange exchange, ServerHttpClientRequest request) {
- Span currentSpan = currentSpan(exchange);
- if (currentSpan != null) {
- return currentSpan;
- }
- // Usually, an HTTP client would not attempt to resume a trace from headers, as a
- // server would always place its span in scope. However, in commit 848442e,
- // this behavior was added in support of gateway.
- return this.propagator.extract(request, HttpClientRequest::header).start();
- }
-
- private Span currentSpan(ServerWebExchange exchange) {
- Object attribute = exchange.getAttribute(TRACE_REQUEST_ATTR);
- if (attribute instanceof Span) {
- if (log.isDebugEnabled()) {
- log.debug("Found trace request attribute in the server web exchange [" + attribute + "]");
- }
- return (Span) attribute;
- }
- return this.tracer.currentSpan();
- }
-
- private Span injectedSpan(ServerHttpClientRequest request, Span currentSpan) {
- if (currentSpan == null) {
- return this.handler.handleSend(request);
- }
- try (Tracer.SpanInScope ws = this.tracer.withSpan(currentSpan)) {
- Span clientSpan = this.tracer.nextSpan();
- return this.handler.handleSend(request, clientSpan.context());
- }
- }
-
- private void addHeadersWithInput(HttpHeaders filteredHeaders, HttpHeaders headersWithInput) {
- for (Map.Entry> entry : filteredHeaders.entrySet()) {
- String key = entry.getKey();
- List value = entry.getValue();
- headersWithInput.put(key, value);
- }
- }
-
- @Override
- public boolean supports(Type type) {
- return type.equals(Type.REQUEST);
- }
-
-}
-
-final class TraceResponseHttpHeadersFilter extends AbstractHttpHeadersFilter {
-
- private static final Log log = LogFactory.getLog(TraceResponseHttpHeadersFilter.class);
-
- private TraceResponseHttpHeadersFilter(Tracer tracer, HttpClientHandler handler, Propagator propagator) {
- super(tracer, handler, propagator);
- }
-
- static HttpHeadersFilter create(Tracer tracer, HttpClientHandler handler, Propagator propagator) {
- return new TraceResponseHttpHeadersFilter(tracer, handler, propagator);
- }
-
- @Override
- public HttpHeaders filter(HttpHeaders input, ServerWebExchange exchange) {
- Object storedSpan = exchange.getAttribute(SPAN_ATTRIBUTE);
- if (storedSpan == null) {
- return input;
- }
- if (log.isDebugEnabled()) {
- log.debug("Will instrument the response");
- }
- ServerHttpClientResponse response = new ServerHttpClientResponse(exchange.getResponse());
- this.handler.handleReceive(response, (Span) storedSpan);
- if (log.isDebugEnabled()) {
- log.debug("The response was handled for span " + storedSpan);
- }
- return new HttpHeaders(input);
- }
-
- @Override
- public boolean supports(Type type) {
- return type.equals(Type.RESPONSE);
- }
-
-}
-
-abstract class AbstractHttpHeadersFilter implements HttpHeadersFilter {
-
- static final String SPAN_ATTRIBUTE = Span.class.getName();
-
- final Tracer tracer;
-
- final HttpClientHandler handler;
-
- final Propagator propagator;
-
- AbstractHttpHeadersFilter(Tracer tracer, HttpClientHandler handler, Propagator propagator) {
- this.tracer = tracer;
- this.propagator = propagator;
- this.handler = handler;
- }
-
- static final class ServerHttpClientRequest implements HttpClientRequest {
-
- final ServerHttpRequest delegate;
-
- final HttpHeaders filteredHeaders;
-
- ServerHttpClientRequest(ServerHttpRequest delegate, HttpHeaders filteredHeaders) {
- this.delegate = delegate;
- this.filteredHeaders = filteredHeaders;
- }
-
- @Override
- public Collection headerNames() {
- return this.delegate.getHeaders().keySet();
- }
-
- @Override
- public Object unwrap() {
- return delegate;
- }
-
- @Override
- public String method() {
- return delegate.getMethodValue();
- }
-
- @Override
- public String path() {
- return delegate.getURI().getPath();
- }
-
- @Override
- public String url() {
- return delegate.getURI().toString();
- }
-
- @Override
- public String header(String name) {
- return filteredHeaders.getFirst(name);
- }
-
- @Override
- public void header(String name, String value) {
- filteredHeaders.set(name, value);
- }
-
- }
-
- static final class ServerHttpClientResponse implements HttpClientResponse {
-
- final ServerHttpResponse delegate;
-
- ServerHttpClientResponse(ServerHttpResponse delegate) {
- this.delegate = delegate;
- }
-
- @Override
- public Collection headerNames() {
- return this.delegate.getHeaders().keySet();
- }
-
- @Override
- public Object unwrap() {
- return delegate;
- }
-
- @Override
- public int statusCode() {
- return delegate.getStatusCode() != null ? delegate.getStatusCode().value() : 0;
- }
-
- @Override
- public String header(String header) {
- List headers = delegate.getHeaders().get(header);
- if (headers == null || headers.isEmpty()) {
- return null;
- }
- return headers.get(0);
- }
-
- }
-
-}
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/TraceWebClientAutoConfiguration.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/TraceWebClientAutoConfiguration.java
deleted file mode 100644
index 1da11aae2..000000000
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/TraceWebClientAutoConfiguration.java
+++ /dev/null
@@ -1,317 +0,0 @@
-/*
- * Copyright 2013-2020 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.springframework.cloud.sleuth.instrument.web.client;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-import reactor.netty.http.client.HttpClient;
-
-import org.springframework.beans.BeansException;
-import org.springframework.beans.factory.BeanFactory;
-import org.springframework.beans.factory.ListableBeanFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.BeanPostProcessor;
-import org.springframework.boot.autoconfigure.AutoConfigureAfter;
-import org.springframework.boot.autoconfigure.AutoConfigureBefore;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
-import org.springframework.boot.autoconfigure.security.oauth2.resource.UserInfoRestTemplateCustomizer;
-import org.springframework.boot.web.client.RestTemplateCustomizer;
-import org.springframework.cloud.commons.httpclient.HttpClientConfiguration;
-import org.springframework.cloud.gateway.filter.headers.HttpHeadersFilter;
-import org.springframework.cloud.sleuth.api.CurrentTraceContext;
-import org.springframework.cloud.sleuth.api.Tracer;
-import org.springframework.cloud.sleuth.api.http.HttpClientHandler;
-import org.springframework.cloud.sleuth.api.propagation.Propagator;
-import org.springframework.cloud.sleuth.autoconfig.TraceAutoConfiguration;
-import org.springframework.cloud.sleuth.instrument.web.mvc.TracingClientHttpRequestInterceptor;
-import org.springframework.context.ConfigurableApplicationContext;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.core.annotation.Order;
-import org.springframework.http.HttpRequest;
-import org.springframework.http.client.ClientHttpRequestExecution;
-import org.springframework.http.client.ClientHttpRequestInterceptor;
-import org.springframework.http.client.ClientHttpResponse;
-import org.springframework.security.oauth2.client.OAuth2RestTemplate;
-import org.springframework.web.client.RestTemplate;
-import org.springframework.web.reactive.function.client.WebClient;
-
-/**
- * {@link org.springframework.boot.autoconfigure.EnableAutoConfiguration
- * Auto-configuration} enables span information propagation when using
- * {@link RestTemplate}.
- *
- * @author Marcin Grzejszczak
- * @since 1.0.0
- */
-@Configuration(proxyBeanMethods = false)
-@ConditionalOnProperty(value = "spring.sleuth.web.client.enabled", matchIfMissing = true)
-@ConditionalOnBean(Tracer.class)
-@AutoConfigureAfter(TraceAutoConfiguration.class)
-@AutoConfigureBefore(HttpClientConfiguration.class)
-class TraceWebClientAutoConfiguration {
-
- @Configuration(proxyBeanMethods = false)
- @ConditionalOnClass(RestTemplate.class)
- static class RestTemplateConfig {
-
- @Bean
- public TracingClientHttpRequestInterceptor tracingClientHttpRequestInterceptor(
- CurrentTraceContext currentTraceContext, HttpClientHandler httpClientHandler) {
- return (TracingClientHttpRequestInterceptor) TracingClientHttpRequestInterceptor.create(currentTraceContext,
- httpClientHandler);
- }
-
- @Configuration(proxyBeanMethods = false)
- protected static class TraceInterceptorConfiguration {
-
- @Autowired
- private BeanFactory beanFactory;
-
- @Bean
- static TraceRestTemplateBeanPostProcessor traceRestTemplateBeanPostProcessor(
- ListableBeanFactory beanFactory) {
- return new TraceRestTemplateBeanPostProcessor(beanFactory);
- }
-
- @Bean
- @Order
- RestTemplateCustomizer traceRestTemplateCustomizer() {
- return new TraceRestTemplateCustomizer(new LazyTracingClientHttpRequestInterceptor(this.beanFactory));
- }
-
- }
-
- }
-
- @Configuration(proxyBeanMethods = false)
- @ConditionalOnClass(HttpHeadersFilter.class)
- static class HttpHeadersFilterConfig {
-
- @Bean
- HttpHeadersFilter traceRequestHttpHeadersFilter(Tracer tracer, HttpClientHandler handler,
- Propagator propagator) {
- return TraceRequestHttpHeadersFilter.create(tracer, handler, propagator);
- }
-
- @Bean
- HttpHeadersFilter traceResponseHttpHeadersFilter(Tracer tracer, HttpClientHandler handler,
- Propagator propagator) {
- return TraceResponseHttpHeadersFilter.create(tracer, handler, propagator);
- }
-
- }
-
- @Configuration(proxyBeanMethods = false)
- @ConditionalOnClass(HttpClient.class)
- static class NettyConfiguration {
-
- @Bean
- static HttpClientBeanPostProcessor httpClientBeanPostProcessor(ConfigurableApplicationContext springContext) {
- return new HttpClientBeanPostProcessor(springContext);
- }
-
- }
-
- @Configuration(proxyBeanMethods = false)
- @ConditionalOnClass(WebClient.class)
- @ConditionalOnProperty(value = "spring.sleuth.web.webclient.enabled", matchIfMissing = true)
- static class WebClientConfig {
-
- @Bean
- static TraceWebClientBeanPostProcessor traceWebClientBeanPostProcessor(
- ConfigurableApplicationContext springContext) {
- return new TraceWebClientBeanPostProcessor(springContext);
- }
-
- }
-
- @Configuration(proxyBeanMethods = false)
- @ConditionalOnClass({ UserInfoRestTemplateCustomizer.class, OAuth2RestTemplate.class })
- protected static class TraceOAuthConfiguration {
-
- @Bean
- static UserInfoRestTemplateCustomizerBPP userInfoRestTemplateCustomizerBeanPostProcessor(
- BeanFactory beanFactory) {
- return new UserInfoRestTemplateCustomizerBPP(beanFactory);
- }
-
- @Bean
- @ConditionalOnMissingBean
- static UserInfoRestTemplateCustomizer traceUserInfoRestTemplateCustomizer(BeanFactory beanFactory) {
- return new TraceUserInfoRestTemplateCustomizer(beanFactory);
- }
-
- private static class UserInfoRestTemplateCustomizerBPP implements BeanPostProcessor {
-
- private final BeanFactory beanFactory;
-
- UserInfoRestTemplateCustomizerBPP(BeanFactory beanFactory) {
- this.beanFactory = beanFactory;
- }
-
- @Override
- public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
- return bean;
- }
-
- @Override
- public Object postProcessAfterInitialization(final Object bean, String beanName) throws BeansException {
- final BeanFactory beanFactory = this.beanFactory;
- if (bean instanceof UserInfoRestTemplateCustomizer
- && !(bean instanceof TraceUserInfoRestTemplateCustomizer)) {
- return new TraceUserInfoRestTemplateCustomizer(beanFactory, bean);
- }
- return bean;
- }
-
- }
-
- }
-
-}
-
-class TraceRestTemplateBeanPostProcessor implements BeanPostProcessor {
-
- private final BeanFactory beanFactory;
-
- TraceRestTemplateBeanPostProcessor(BeanFactory beanFactory) {
- this.beanFactory = beanFactory;
- }
-
- @Override
- public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
- return bean;
- }
-
- @Override
- public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
- if (bean instanceof RestTemplate) {
- RestTemplate rt = (RestTemplate) bean;
- new RestTemplateInterceptorInjector(interceptor()).inject(rt);
- }
- return bean;
- }
-
- private LazyTracingClientHttpRequestInterceptor interceptor() {
- return new LazyTracingClientHttpRequestInterceptor(this.beanFactory);
- }
-
-}
-
-class RestTemplateInterceptorInjector {
-
- private final ClientHttpRequestInterceptor interceptor;
-
- RestTemplateInterceptorInjector(ClientHttpRequestInterceptor interceptor) {
- this.interceptor = interceptor;
- }
-
- void inject(RestTemplate restTemplate) {
- if (hasTraceInterceptor(restTemplate)) {
- return;
- }
- List interceptors = new ArrayList(
- restTemplate.getInterceptors());
- interceptors.add(0, this.interceptor);
- restTemplate.setInterceptors(interceptors);
- }
-
- private boolean hasTraceInterceptor(RestTemplate restTemplate) {
- for (ClientHttpRequestInterceptor interceptor : restTemplate.getInterceptors()) {
- if (interceptor instanceof TracingClientHttpRequestInterceptor
- || interceptor instanceof LazyTracingClientHttpRequestInterceptor) {
- return true;
- }
- }
- return false;
- }
-
-}
-
-class TraceRestTemplateCustomizer implements RestTemplateCustomizer {
-
- private final ClientHttpRequestInterceptor interceptor;
-
- TraceRestTemplateCustomizer(ClientHttpRequestInterceptor interceptor) {
- this.interceptor = interceptor;
- }
-
- @Override
- public void customize(RestTemplate restTemplate) {
- new RestTemplateInterceptorInjector(this.interceptor).inject(restTemplate);
- }
-
-}
-
-class LazyTracingClientHttpRequestInterceptor implements ClientHttpRequestInterceptor {
-
- private final BeanFactory beanFactory;
-
- private TracingClientHttpRequestInterceptor interceptor;
-
- LazyTracingClientHttpRequestInterceptor(BeanFactory beanFactory) {
- this.beanFactory = beanFactory;
- }
-
- @Override
- public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution)
- throws IOException {
- return interceptor().intercept(request, body, execution);
- }
-
- private TracingClientHttpRequestInterceptor interceptor() {
- if (this.interceptor == null) {
- this.interceptor = this.beanFactory.getBean(TracingClientHttpRequestInterceptor.class);
- }
- return this.interceptor;
- }
-
-}
-
-class TraceUserInfoRestTemplateCustomizer implements UserInfoRestTemplateCustomizer {
-
- private final BeanFactory beanFactory;
-
- private final Object delegate;
-
- TraceUserInfoRestTemplateCustomizer(BeanFactory beanFactory) {
- this.beanFactory = beanFactory;
- this.delegate = null;
- }
-
- TraceUserInfoRestTemplateCustomizer(BeanFactory beanFactory, Object bean) {
- this.beanFactory = beanFactory;
- this.delegate = bean;
- }
-
- @Override
- public void customize(OAuth2RestTemplate template) {
- final TracingClientHttpRequestInterceptor interceptor = this.beanFactory
- .getBean(TracingClientHttpRequestInterceptor.class);
- new RestTemplateInterceptorInjector(interceptor).inject(template);
- if (this.delegate != null) {
- ((UserInfoRestTemplateCustomizer) this.delegate).customize(template);
- }
- }
-
-}
diff --git a/spring-cloud-sleuth-core/src/main/resources/META-INF/spring.factories b/spring-cloud-sleuth-core/src/main/resources/META-INF/spring.factories
deleted file mode 100644
index b41d4c94a..000000000
--- a/spring-cloud-sleuth-core/src/main/resources/META-INF/spring.factories
+++ /dev/null
@@ -1,28 +0,0 @@
-# Auto Configuration
-org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
-org.springframework.cloud.sleuth.annotation.SleuthAnnotationAutoConfiguration,\
-org.springframework.cloud.sleuth.autoconfig.TraceAutoConfiguration,\
-org.springframework.cloud.sleuth.instrument.web.TraceHttpAutoConfiguration,\
-org.springframework.cloud.sleuth.instrument.async.AsyncAutoConfiguration,\
-org.springframework.cloud.sleuth.instrument.async.AsyncCustomAutoConfiguration,\
-org.springframework.cloud.sleuth.instrument.async.AsyncDefaultAutoConfiguration,\
-org.springframework.cloud.sleuth.instrument.circuitbreaker.SleuthCircuitBreakerAutoConfiguration,\
-org.springframework.cloud.sleuth.instrument.rxjava.RxJavaAutoConfiguration,\
-org.springframework.cloud.sleuth.instrument.quartz.TraceQuartzAutoConfiguration,\
-org.springframework.cloud.sleuth.instrument.web.TraceWebServletAutoConfiguration,\
-org.springframework.cloud.sleuth.instrument.web.TraceWebFluxAutoConfiguration,\
-org.springframework.cloud.sleuth.instrument.web.client.TraceWebClientAutoConfiguration,\
-org.springframework.cloud.sleuth.instrument.web.client.TraceWebAsyncClientAutoConfiguration,\
-org.springframework.cloud.sleuth.instrument.web.client.feign.TraceFeignClientAutoConfiguration,\
-org.springframework.cloud.sleuth.instrument.web.SkipPatternConfiguration,\
-org.springframework.cloud.sleuth.instrument.scheduling.TraceSchedulingAutoConfiguration,\
-org.springframework.cloud.sleuth.instrument.reactor.TraceReactorAutoConfiguration,\
-org.springframework.cloud.sleuth.instrument.messaging.TraceFunctionAutoConfiguration,\
-org.springframework.cloud.sleuth.instrument.messaging.TraceSpringIntegrationAutoConfiguration,\
-org.springframework.cloud.sleuth.instrument.messaging.TraceSpringMessagingAutoConfiguration,\
-org.springframework.cloud.sleuth.instrument.messaging.TraceWebSocketAutoConfiguration
-
-# Environment Post Processor
-org.springframework.boot.env.EnvironmentPostProcessor=\
-org.springframework.cloud.sleuth.autoconfig.TraceEnvironmentPostProcessor,\
-org.springframework.cloud.sleuth.instrument.web.client.TraceGatewayEnvironmentPostProcessor
\ No newline at end of file
diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/autoconfig/SpanIgnoringSpanFilterTests.java b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/autoconfig/SpanIgnoringSpanFilterTests.java
deleted file mode 100644
index 304aae0f9..000000000
--- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/autoconfig/SpanIgnoringSpanFilterTests.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Copyright 2013-2020 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.springframework.cloud.sleuth.autoconfig;
-
-import java.util.Collections;
-
-import org.assertj.core.api.BDDAssertions;
-import org.junit.jupiter.api.Test;
-import org.mockito.BDDMockito;
-
-import org.springframework.beans.factory.NoSuchBeanDefinitionException;
-import org.springframework.boot.autoconfigure.AutoConfigurations;
-import org.springframework.boot.test.context.runner.ApplicationContextRunner;
-import org.springframework.cloud.sleuth.api.exporter.FinishedSpan;
-
-import static org.assertj.core.api.BDDAssertions.then;
-
-class SpanIgnoringSpanFilterTests {
-
- private FinishedSpan namedSpan() {
- FinishedSpan span = BDDMockito.mock(FinishedSpan.class);
- BDDMockito.given(span.getName()).willReturn("someName");
- return span;
- }
-
- @Test
- void should_not_handle_span_when_present_in_main_list_of_spans_to_skip() {
- SleuthSpanFilterProperties SleuthSpanFilterProperties = new SleuthSpanFilterProperties();
- SleuthSpanFilterProperties.setSpanNamePatternsToSkip(Collections.singletonList("someName"));
- SpanIgnoringSpanFilter handler = new SpanIgnoringSpanFilter(SleuthSpanFilterProperties);
-
- then(handler.isExportable(namedSpan())).isFalse();
- }
-
- @Test
- void should_not_handle_span_when_present_in_additional_list_of_spans_to_skip() {
- SleuthSpanFilterProperties SleuthSpanFilterProperties = SleuthSpanExporterPropertiesWithAdditionalEntries();
- SpanIgnoringSpanFilter handler = new SpanIgnoringSpanFilter(SleuthSpanFilterProperties);
-
- then(handler.isExportable(namedSpan())).isFalse();
- }
-
- @Test
- void should_use_cached_entry_for_same_patterns() {
- export(handler(SleuthSpanExporterPropertiesWithAdditionalEntries("someOtherName")));
- export(handler(SleuthSpanExporterPropertiesWithAdditionalEntries("someOtherName")));
- export(handler(SleuthSpanExporterPropertiesWithAdditionalEntries("someOtherName")));
-
- then(SpanIgnoringSpanFilter.cache).containsKey("someOtherName");
-
- export(handler(SleuthSpanExporterPropertiesWithAdditionalEntries("a")));
- export(handler(SleuthSpanExporterPropertiesWithAdditionalEntries("b")));
- export(handler(SleuthSpanExporterPropertiesWithAdditionalEntries("c")));
-
- then(SpanIgnoringSpanFilter.cache).containsKey("someOtherName").containsKey("a").containsKey("b")
- .containsKey("c");
- }
-
- private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
- .withConfiguration(AutoConfigurations.of(TraceAutoConfiguration.class));
-
- @Test
- void should_not_register_span_handler_when_property_passed() {
- this.contextRunner.withPropertyValues("spring.sleuth.span-filter.enabled=false")
- .run((context) -> BDDAssertions.thenThrownBy(() -> context.getBean(SpanIgnoringSpanFilter.class))
- .isInstanceOf(NoSuchBeanDefinitionException.class));
- }
-
- @Test
- void should_register_span_handler_by_default() {
- this.contextRunner.run((context) -> context.getBean(SpanIgnoringSpanFilter.class));
- }
-
- private SleuthSpanFilterProperties SleuthSpanExporterPropertiesWithAdditionalEntries() {
- return SleuthSpanExporterPropertiesWithAdditionalEntries("someName");
- }
-
- private SleuthSpanFilterProperties SleuthSpanExporterPropertiesWithAdditionalEntries(String name) {
- SleuthSpanFilterProperties SleuthSpanFilterProperties = new SleuthSpanFilterProperties();
- SleuthSpanFilterProperties.setAdditionalSpanNamePatternsToIgnore(Collections.singletonList(name));
- return SleuthSpanFilterProperties;
- }
-
- private void export(SpanIgnoringSpanFilter handler) {
- handler.isExportable(namedSpan());
- }
-
- private SpanIgnoringSpanFilter handler(SleuthSpanFilterProperties SleuthSpanFilterProperties) {
- return new SpanIgnoringSpanFilter(SleuthSpanFilterProperties);
- }
-
-}
diff --git a/spring-cloud-sleuth-dependencies/pom.xml b/spring-cloud-sleuth-dependencies/pom.xml
index 825c30d28..367ddc4ae 100644
--- a/spring-cloud-sleuth-dependencies/pom.xml
+++ b/spring-cloud-sleuth-dependencies/pom.xml
@@ -40,7 +40,17 @@
org.springframework.cloud
- spring-cloud-sleuth-core
+ spring-cloud-sleuth-autoconfigure
+ ${project.version}
+
+
+ org.springframework.cloud
+ spring-cloud-sleuth-api
+ ${project.version}
+
+
+ org.springframework.cloud
+ spring-cloud-sleuth-instrumentation
${project.version}
@@ -63,11 +73,6 @@
spring-cloud-starter-sleuth
${project.version}
-
- org.springframework.cloud
- spring-cloud-starter-sleuth-otel
- ${project.version}
-
io.zipkin.brave
diff --git a/spring-cloud-sleuth-core/pom.xml b/spring-cloud-sleuth-instrumentation/pom.xml
similarity index 92%
rename from spring-cloud-sleuth-core/pom.xml
rename to spring-cloud-sleuth-instrumentation/pom.xml
index 9249b9fef..5029e4082 100644
--- a/spring-cloud-sleuth-core/pom.xml
+++ b/spring-cloud-sleuth-instrumentation/pom.xml
@@ -20,10 +20,10 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
- spring-cloud-sleuth-core
+ spring-cloud-sleuth-instrumentation
jar
- Spring Cloud Sleuth Core
- Spring Cloud Sleuth Core
+ Spring Cloud Sleuth Instrumentation
+ Spring Cloud Sleuth Instrumentation
org.springframework.cloud
@@ -33,6 +33,10 @@
+
+ org.springframework.cloud
+ spring-cloud-sleuth-api
+
org.springframework.boot
spring-boot-starter-web
@@ -157,6 +161,11 @@
awaitility
test
+
+ com.tngtech.archunit
+ archunit-junit5
+ test
+
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/AbstractSleuthMethodInvocationProcessor.java b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/annotation/AbstractSleuthMethodInvocationProcessor.java
similarity index 89%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/AbstractSleuthMethodInvocationProcessor.java
rename to spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/annotation/AbstractSleuthMethodInvocationProcessor.java
index 71db3718f..d0f8d0f48 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/AbstractSleuthMethodInvocationProcessor.java
+++ b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/annotation/AbstractSleuthMethodInvocationProcessor.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.annotation;
+package org.springframework.cloud.sleuth.instrument.annotation;
import org.aopalliance.intercept.MethodInvocation;
import org.apache.commons.logging.Log;
@@ -23,9 +23,12 @@ import org.apache.commons.logging.LogFactory;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
-import org.springframework.cloud.sleuth.api.CurrentTraceContext;
-import org.springframework.cloud.sleuth.api.Span;
-import org.springframework.cloud.sleuth.api.Tracer;
+import org.springframework.cloud.sleuth.CurrentTraceContext;
+import org.springframework.cloud.sleuth.Span;
+import org.springframework.cloud.sleuth.Tracer;
+import org.springframework.cloud.sleuth.annotation.ContinueSpan;
+import org.springframework.cloud.sleuth.annotation.NewSpanParser;
+import org.springframework.cloud.sleuth.annotation.SleuthMethodInvocationProcessor;
/**
* Sleuth annotation processor.
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/DefaultSpanCreator.java b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/annotation/DefaultSpanCreator.java
similarity index 84%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/DefaultSpanCreator.java
rename to spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/annotation/DefaultSpanCreator.java
index b6995d30b..2fe930486 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/DefaultSpanCreator.java
+++ b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/annotation/DefaultSpanCreator.java
@@ -14,13 +14,15 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.annotation;
+package org.springframework.cloud.sleuth.instrument.annotation;
import org.aopalliance.intercept.MethodInvocation;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-import org.springframework.cloud.sleuth.api.Span;
+import org.springframework.cloud.sleuth.Span;
+import org.springframework.cloud.sleuth.annotation.NewSpan;
+import org.springframework.cloud.sleuth.annotation.NewSpanParser;
import org.springframework.cloud.sleuth.internal.SpanNameUtil;
import org.springframework.util.StringUtils;
@@ -30,7 +32,7 @@ import org.springframework.util.StringUtils;
* @author Christian Schwerdtfeger
* @since 1.2.0
*/
-class DefaultSpanCreator implements NewSpanParser {
+public class DefaultSpanCreator implements NewSpanParser {
private static final Log log = LogFactory.getLog(DefaultSpanCreator.class);
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/NonReactorSleuthMethodInvocationProcessor.java b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/annotation/NonReactorSleuthMethodInvocationProcessor.java
similarity index 82%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/NonReactorSleuthMethodInvocationProcessor.java
rename to spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/annotation/NonReactorSleuthMethodInvocationProcessor.java
index 65caecd05..57efa26a6 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/NonReactorSleuthMethodInvocationProcessor.java
+++ b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/annotation/NonReactorSleuthMethodInvocationProcessor.java
@@ -14,12 +14,14 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.annotation;
+package org.springframework.cloud.sleuth.instrument.annotation;
import org.aopalliance.intercept.MethodInvocation;
-import org.springframework.cloud.sleuth.api.Span;
-import org.springframework.cloud.sleuth.api.Tracer;
+import org.springframework.cloud.sleuth.Span;
+import org.springframework.cloud.sleuth.Tracer;
+import org.springframework.cloud.sleuth.annotation.ContinueSpan;
+import org.springframework.cloud.sleuth.annotation.NewSpan;
import org.springframework.util.StringUtils;
/**
@@ -28,7 +30,7 @@ import org.springframework.util.StringUtils;
* @author Marcin Grzejszczak
* @since 2.1.0
*/
-class NonReactorSleuthMethodInvocationProcessor extends AbstractSleuthMethodInvocationProcessor {
+public class NonReactorSleuthMethodInvocationProcessor extends AbstractSleuthMethodInvocationProcessor {
@Override
public Object process(MethodInvocation invocation, NewSpan newSpan, ContinueSpan continueSpan) throws Throwable {
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/ReactorSleuthMethodInvocationProcessor.java b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/annotation/ReactorSleuthMethodInvocationProcessor.java
similarity index 94%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/ReactorSleuthMethodInvocationProcessor.java
rename to spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/annotation/ReactorSleuthMethodInvocationProcessor.java
index 1bec84718..fcaeee33a 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/ReactorSleuthMethodInvocationProcessor.java
+++ b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/annotation/ReactorSleuthMethodInvocationProcessor.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.annotation;
+package org.springframework.cloud.sleuth.instrument.annotation;
import java.lang.reflect.Method;
@@ -30,10 +30,12 @@ import reactor.core.publisher.MonoOperator;
import reactor.util.annotation.Nullable;
import reactor.util.context.Context;
-import org.springframework.cloud.sleuth.api.CurrentTraceContext;
-import org.springframework.cloud.sleuth.api.Span;
-import org.springframework.cloud.sleuth.api.TraceContext;
-import org.springframework.cloud.sleuth.api.Tracer;
+import org.springframework.cloud.sleuth.CurrentTraceContext;
+import org.springframework.cloud.sleuth.Span;
+import org.springframework.cloud.sleuth.TraceContext;
+import org.springframework.cloud.sleuth.Tracer;
+import org.springframework.cloud.sleuth.annotation.ContinueSpan;
+import org.springframework.cloud.sleuth.annotation.NewSpan;
import org.springframework.util.StringUtils;
/**
@@ -42,7 +44,7 @@ import org.springframework.util.StringUtils;
* @author Marcin Grzejszczak
* @since 2.1.0
*/
-class ReactorSleuthMethodInvocationProcessor extends AbstractSleuthMethodInvocationProcessor {
+public class ReactorSleuthMethodInvocationProcessor extends AbstractSleuthMethodInvocationProcessor {
private NonReactorSleuthMethodInvocationProcessor nonReactorSleuthMethodInvocationProcessor;
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/SleuthAdvisorConfig.java b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/annotation/SleuthAdvisorConfig.java
similarity index 94%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/SleuthAdvisorConfig.java
rename to spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/annotation/SleuthAdvisorConfig.java
index 6efd69075..01c14d8dc 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/SleuthAdvisorConfig.java
+++ b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/annotation/SleuthAdvisorConfig.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.annotation;
+package org.springframework.cloud.sleuth.instrument.annotation;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
@@ -35,6 +35,9 @@ import org.springframework.aop.support.annotation.AnnotationClassFilter;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
+import org.springframework.cloud.sleuth.annotation.ContinueSpan;
+import org.springframework.cloud.sleuth.annotation.NewSpan;
+import org.springframework.cloud.sleuth.annotation.SleuthMethodInvocationProcessor;
import org.springframework.core.annotation.AnnotationUtils;
import org.springframework.util.ReflectionUtils;
@@ -46,7 +49,7 @@ import org.springframework.util.ReflectionUtils;
* @since 1.2.0
*/
@SuppressWarnings("serial")
-class SleuthAdvisorConfig extends AbstractPointcutAdvisor implements BeanFactoryAware {
+public class SleuthAdvisorConfig extends AbstractPointcutAdvisor implements BeanFactoryAware {
private Advice advice;
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/SleuthAnnotatedParameter.java b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/annotation/SleuthAnnotatedParameter.java
similarity index 89%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/SleuthAnnotatedParameter.java
rename to spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/annotation/SleuthAnnotatedParameter.java
index 94e371d12..8c8719985 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/SleuthAnnotatedParameter.java
+++ b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/annotation/SleuthAnnotatedParameter.java
@@ -14,7 +14,9 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.annotation;
+package org.springframework.cloud.sleuth.instrument.annotation;
+
+import org.springframework.cloud.sleuth.annotation.SpanTag;
/**
* A container class that holds information about the parameter of the annotated method
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/SleuthAnnotationUtils.java b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/annotation/SleuthAnnotationUtils.java
similarity index 91%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/SleuthAnnotationUtils.java
rename to spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/annotation/SleuthAnnotationUtils.java
index 5144100ca..f27fa77c0 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/SleuthAnnotationUtils.java
+++ b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/annotation/SleuthAnnotationUtils.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.annotation;
+package org.springframework.cloud.sleuth.instrument.annotation;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
@@ -24,6 +24,9 @@ import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+import org.springframework.cloud.sleuth.annotation.ContinueSpan;
+import org.springframework.cloud.sleuth.annotation.NewSpan;
+import org.springframework.cloud.sleuth.annotation.SpanTag;
import org.springframework.core.annotation.AnnotationUtils;
/**
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/SpanTagAnnotationHandler.java b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/annotation/SpanTagAnnotationHandler.java
similarity index 93%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/SpanTagAnnotationHandler.java
rename to spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/annotation/SpanTagAnnotationHandler.java
index a6a5d275d..79a938fb2 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/SpanTagAnnotationHandler.java
+++ b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/annotation/SpanTagAnnotationHandler.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.annotation;
+package org.springframework.cloud.sleuth.instrument.annotation;
import java.lang.reflect.Method;
import java.util.Arrays;
@@ -26,7 +26,11 @@ import org.apache.commons.logging.LogFactory;
import org.springframework.aop.support.AopUtils;
import org.springframework.beans.factory.BeanFactory;
-import org.springframework.cloud.sleuth.api.SpanCustomizer;
+import org.springframework.cloud.sleuth.SpanCustomizer;
+import org.springframework.cloud.sleuth.annotation.NoOpTagValueResolver;
+import org.springframework.cloud.sleuth.annotation.SpanTag;
+import org.springframework.cloud.sleuth.annotation.TagValueExpressionResolver;
+import org.springframework.cloud.sleuth.annotation.TagValueResolver;
import org.springframework.util.StringUtils;
/**
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/SpelTagValueExpressionResolver.java b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/annotation/SpelTagValueExpressionResolver.java
similarity index 88%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/SpelTagValueExpressionResolver.java
rename to spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/annotation/SpelTagValueExpressionResolver.java
index e01021dcd..60e04c3f1 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/SpelTagValueExpressionResolver.java
+++ b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/annotation/SpelTagValueExpressionResolver.java
@@ -14,11 +14,12 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.annotation;
+package org.springframework.cloud.sleuth.instrument.annotation;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+import org.springframework.cloud.sleuth.annotation.TagValueExpressionResolver;
import org.springframework.expression.Expression;
import org.springframework.expression.ExpressionParser;
import org.springframework.expression.spel.standard.SpelExpressionParser;
@@ -31,7 +32,7 @@ import org.springframework.expression.spel.support.SimpleEvaluationContext;
* @author Marcin Grzejszczak
* @since 1.2.0
*/
-class SpelTagValueExpressionResolver implements TagValueExpressionResolver {
+public class SpelTagValueExpressionResolver implements TagValueExpressionResolver {
private static final Log log = LogFactory.getLog(SpelTagValueExpressionResolver.class);
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/ContextUtil.java b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/async/ContextUtil.java
similarity index 100%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/ContextUtil.java
rename to spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/async/ContextUtil.java
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/ExecutorBeanPostProcessor.java b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/async/ExecutorInstrumentor.java
similarity index 87%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/ExecutorBeanPostProcessor.java
rename to spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/async/ExecutorInstrumentor.java
index 6998211b9..08479cf2c 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/ExecutorBeanPostProcessor.java
+++ b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/async/ExecutorInstrumentor.java
@@ -19,6 +19,7 @@ package org.springframework.cloud.sleuth.instrument.async;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
+import java.util.List;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.ScheduledExecutorService;
@@ -33,47 +34,50 @@ import org.apache.commons.logging.LogFactory;
import org.springframework.aop.framework.AopConfigException;
import org.springframework.aop.framework.ProxyFactoryBean;
-import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
-import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.core.task.AsyncTaskExecutor;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.util.ReflectionUtils;
/**
- * Bean post processor that wraps a call to an {@link Executor} either in a JDK or CGLIB
- * proxy. Depending on whether the implementation has a final method or is final.
+ * Wraps {@link Executor}s in tracing representations.
*
* @author Marcin Grzejszczak
- * @author Jesus Alonso
- * @author Denys Ivano
- * @author Vladislav Fefelov
- * @since 1.1.4
+ * @since 3.0.0
*/
-class ExecutorBeanPostProcessor implements BeanPostProcessor {
+public class ExecutorInstrumentor {
- private static final Log log = LogFactory.getLog(ExecutorBeanPostProcessor.class);
+ private static final Log log = LogFactory.getLog(ExecutorInstrumentor.class);
+
+ private final Supplier> ignoredBeans;
private final BeanFactory beanFactory;
- private SleuthAsyncProperties sleuthAsyncProperties;
-
- ExecutorBeanPostProcessor(BeanFactory beanFactory) {
+ public ExecutorInstrumentor(Supplier> ignoredBeans, BeanFactory beanFactory) {
+ this.ignoredBeans = ignoredBeans;
this.beanFactory = beanFactory;
}
- @Override
- public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
- return bean;
+ /**
+ * @param bean bean to instrument
+ * @return {@code true} if bean is applicable for instrumentation
+ */
+ public static boolean isApplicableForInstrumentation(Object bean) {
+ return bean instanceof Executor && !(bean instanceof LazyTraceThreadPoolTaskExecutor
+ || bean instanceof TraceableScheduledExecutorService || bean instanceof TraceableExecutorService
+ || bean instanceof LazyTraceAsyncTaskExecutor || bean instanceof LazyTraceExecutor);
}
- @Override
- public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
- if (bean instanceof LazyTraceThreadPoolTaskExecutor || bean instanceof TraceableScheduledExecutorService
- || bean instanceof TraceableExecutorService || bean instanceof LazyTraceAsyncTaskExecutor
- || bean instanceof LazyTraceExecutor) {
- log.info("Bean is already instrumented " + beanName);
+ /**
+ * Wraps an {@link Executor} bean in its trace representation.
+ * @param bean a bean (might be of {@link Executor} type
+ * @param beanName name of the bean
+ * @return wrapped bean or just bean if not {@link Executor} or already instrumented
+ */
+ public Object instrument(Object bean, String beanName) {
+ if (!isApplicableForInstrumentation(bean)) {
+ log.info("Bean is already instrumented or is not applicable for instrumentation " + beanName);
return bean;
}
if (bean instanceof ThreadPoolTaskExecutor) {
@@ -166,8 +170,7 @@ class ExecutorBeanPostProcessor implements BeanPostProcessor {
}
boolean isProxyNeeded(String beanName) {
- SleuthAsyncProperties sleuthAsyncProperties = asyncConfigurationProperties();
- return !sleuthAsyncProperties.getIgnoredBeans().contains(beanName);
+ return !this.ignoredBeans.get().contains(beanName);
}
Object createThreadPoolTaskExecutorProxy(Object bean, boolean cglibProxy, ThreadPoolTaskExecutor executor,
@@ -276,13 +279,6 @@ class ExecutorBeanPostProcessor implements BeanPostProcessor {
return getObject(factory);
}
- private SleuthAsyncProperties asyncConfigurationProperties() {
- if (this.sleuthAsyncProperties == null) {
- this.sleuthAsyncProperties = this.beanFactory.getBean(SleuthAsyncProperties.class);
- }
- return this.sleuthAsyncProperties;
- }
-
private static boolean anyFinalMethods(T object) {
try {
for (Method method : ReflectionUtils.getAllDeclaredMethods(object.getClass())) {
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/LazyTraceAsyncCustomizer.java b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/async/LazyTraceAsyncCustomizer.java
similarity index 100%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/LazyTraceAsyncCustomizer.java
rename to spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/async/LazyTraceAsyncCustomizer.java
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/LazyTraceAsyncTaskExecutor.java b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/async/LazyTraceAsyncTaskExecutor.java
similarity index 98%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/LazyTraceAsyncTaskExecutor.java
rename to spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/async/LazyTraceAsyncTaskExecutor.java
index e1fa5a734..849ed7a60 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/LazyTraceAsyncTaskExecutor.java
+++ b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/async/LazyTraceAsyncTaskExecutor.java
@@ -25,7 +25,7 @@ import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.cloud.sleuth.SpanNamer;
-import org.springframework.cloud.sleuth.api.Tracer;
+import org.springframework.cloud.sleuth.Tracer;
import org.springframework.cloud.sleuth.internal.DefaultSpanNamer;
import org.springframework.core.task.AsyncTaskExecutor;
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/LazyTraceExecutor.java b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/async/LazyTraceExecutor.java
similarity index 98%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/LazyTraceExecutor.java
rename to spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/async/LazyTraceExecutor.java
index c233ff40f..08483e1a6 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/LazyTraceExecutor.java
+++ b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/async/LazyTraceExecutor.java
@@ -24,7 +24,7 @@ import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.cloud.sleuth.SpanNamer;
-import org.springframework.cloud.sleuth.api.Tracer;
+import org.springframework.cloud.sleuth.Tracer;
import org.springframework.cloud.sleuth.internal.DefaultSpanNamer;
/**
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/LazyTraceScheduledThreadPoolExecutor.java b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/async/LazyTraceScheduledThreadPoolExecutor.java
similarity index 99%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/LazyTraceScheduledThreadPoolExecutor.java
rename to spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/async/LazyTraceScheduledThreadPoolExecutor.java
index 2cf81b2ad..5523a4ef1 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/LazyTraceScheduledThreadPoolExecutor.java
+++ b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/async/LazyTraceScheduledThreadPoolExecutor.java
@@ -39,7 +39,7 @@ import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.cloud.sleuth.SpanNamer;
-import org.springframework.cloud.sleuth.api.Tracer;
+import org.springframework.cloud.sleuth.Tracer;
import org.springframework.cloud.sleuth.internal.DefaultSpanNamer;
import org.springframework.util.ReflectionUtils;
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/LazyTraceThreadPoolTaskExecutor.java b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/async/LazyTraceThreadPoolTaskExecutor.java
similarity index 99%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/LazyTraceThreadPoolTaskExecutor.java
rename to spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/async/LazyTraceThreadPoolTaskExecutor.java
index dee2c4333..8aed835f0 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/LazyTraceThreadPoolTaskExecutor.java
+++ b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/async/LazyTraceThreadPoolTaskExecutor.java
@@ -28,7 +28,7 @@ import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.cloud.sleuth.SpanNamer;
-import org.springframework.cloud.sleuth.api.Tracer;
+import org.springframework.cloud.sleuth.Tracer;
import org.springframework.cloud.sleuth.internal.DefaultSpanNamer;
import org.springframework.core.task.TaskDecorator;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/LazyTraceThreadPoolTaskScheduler.java b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/async/LazyTraceThreadPoolTaskScheduler.java
similarity index 99%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/LazyTraceThreadPoolTaskScheduler.java
rename to spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/async/LazyTraceThreadPoolTaskScheduler.java
index 6c6494f25..883ff9b98 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/LazyTraceThreadPoolTaskScheduler.java
+++ b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/async/LazyTraceThreadPoolTaskScheduler.java
@@ -35,7 +35,7 @@ import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.cloud.sleuth.SpanNamer;
-import org.springframework.cloud.sleuth.api.Tracer;
+import org.springframework.cloud.sleuth.Tracer;
import org.springframework.cloud.sleuth.internal.DefaultSpanNamer;
import org.springframework.lang.Nullable;
import org.springframework.scheduling.Trigger;
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/SleuthContextListener.java b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/async/SleuthContextListener.java
similarity index 93%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/SleuthContextListener.java
rename to spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/async/SleuthContextListener.java
index c1f912dc9..ffc119f03 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/SleuthContextListener.java
+++ b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/async/SleuthContextListener.java
@@ -32,7 +32,13 @@ import org.springframework.context.event.ContextClosedEvent;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.context.event.SmartApplicationListener;
-class SleuthContextListener implements SmartApplicationListener {
+/**
+ * Checks whether Spring Context is up and running.
+ *
+ * @author Marcin Grzejszczak
+ * @since 3.0.0
+ */
+public class SleuthContextListener implements SmartApplicationListener {
static final Map CACHE = new ConcurrentHashMap<>();
@@ -42,7 +48,7 @@ class SleuthContextListener implements SmartApplicationListener {
final AtomicBoolean closed;
- SleuthContextListener() {
+ public SleuthContextListener() {
this.refreshed = new AtomicBoolean();
this.closed = new AtomicBoolean();
}
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/TraceAsyncAspect.java b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/async/TraceAsyncAspect.java
similarity index 93%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/TraceAsyncAspect.java
rename to spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/async/TraceAsyncAspect.java
index c63f0b4d6..78bffe0c4 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/TraceAsyncAspect.java
+++ b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/async/TraceAsyncAspect.java
@@ -23,9 +23,9 @@ import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
+import org.springframework.cloud.sleuth.Span;
import org.springframework.cloud.sleuth.SpanNamer;
-import org.springframework.cloud.sleuth.api.Span;
-import org.springframework.cloud.sleuth.api.Tracer;
+import org.springframework.cloud.sleuth.Tracer;
import org.springframework.cloud.sleuth.internal.SpanNameUtil;
import org.springframework.util.ReflectionUtils;
@@ -38,7 +38,7 @@ import org.springframework.util.ReflectionUtils;
* @see Tracer
*/
@Aspect
-class TraceAsyncAspect {
+public class TraceAsyncAspect {
private static final String CLASS_KEY = "class";
@@ -48,7 +48,7 @@ class TraceAsyncAspect {
private final SpanNamer spanNamer;
- TraceAsyncAspect(Tracer tracer, SpanNamer spanNamer) {
+ public TraceAsyncAspect(Tracer tracer, SpanNamer spanNamer) {
this.tracer = tracer;
this.spanNamer = spanNamer;
}
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/TraceAsyncListenableTaskExecutor.java b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/async/TraceAsyncListenableTaskExecutor.java
similarity index 97%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/TraceAsyncListenableTaskExecutor.java
rename to spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/async/TraceAsyncListenableTaskExecutor.java
index ff24a9861..e807f83ff 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/TraceAsyncListenableTaskExecutor.java
+++ b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/async/TraceAsyncListenableTaskExecutor.java
@@ -20,7 +20,7 @@ import java.util.concurrent.Callable;
import java.util.concurrent.Future;
import org.springframework.cloud.sleuth.SpanNamer;
-import org.springframework.cloud.sleuth.api.Tracer;
+import org.springframework.cloud.sleuth.Tracer;
import org.springframework.core.task.AsyncListenableTaskExecutor;
import org.springframework.util.concurrent.ListenableFuture;
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/TraceCallable.java b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/async/TraceCallable.java
similarity index 95%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/TraceCallable.java
rename to spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/async/TraceCallable.java
index 0e9f334d7..22d722b37 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/TraceCallable.java
+++ b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/async/TraceCallable.java
@@ -18,9 +18,9 @@ package org.springframework.cloud.sleuth.instrument.async;
import java.util.concurrent.Callable;
+import org.springframework.cloud.sleuth.Span;
import org.springframework.cloud.sleuth.SpanNamer;
-import org.springframework.cloud.sleuth.api.Span;
-import org.springframework.cloud.sleuth.api.Tracer;
+import org.springframework.cloud.sleuth.Tracer;
/**
* Callable that passes Span between threads. The Span name is taken either from the
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/TraceRunnable.java b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/async/TraceRunnable.java
similarity index 95%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/TraceRunnable.java
rename to spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/async/TraceRunnable.java
index b5cc62a69..0d5cebb2a 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/TraceRunnable.java
+++ b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/async/TraceRunnable.java
@@ -16,9 +16,9 @@
package org.springframework.cloud.sleuth.instrument.async;
+import org.springframework.cloud.sleuth.Span;
import org.springframework.cloud.sleuth.SpanNamer;
-import org.springframework.cloud.sleuth.api.Span;
-import org.springframework.cloud.sleuth.api.Tracer;
+import org.springframework.cloud.sleuth.Tracer;
/**
* Runnable that passes Span between threads. The Span name is taken either from the
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/TraceableExecutorService.java b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/async/TraceableExecutorService.java
similarity index 98%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/TraceableExecutorService.java
rename to spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/async/TraceableExecutorService.java
index 28defc50a..97f505a74 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/TraceableExecutorService.java
+++ b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/async/TraceableExecutorService.java
@@ -28,7 +28,7 @@ import java.util.concurrent.TimeoutException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.cloud.sleuth.SpanNamer;
-import org.springframework.cloud.sleuth.api.Tracer;
+import org.springframework.cloud.sleuth.Tracer;
/**
* A decorator class for {@link ExecutorService} to support tracing in Executors.
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/TraceableScheduledExecutorService.java b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/async/TraceableScheduledExecutorService.java
similarity index 100%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/TraceableScheduledExecutorService.java
rename to spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/async/TraceableScheduledExecutorService.java
diff --git a/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/circuitbreaker/TraceCircuitBreaker.java b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/circuitbreaker/TraceCircuitBreaker.java
new file mode 100644
index 000000000..f4a430356
--- /dev/null
+++ b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/circuitbreaker/TraceCircuitBreaker.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2018-2019 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.springframework.cloud.sleuth.instrument.circuitbreaker;
+
+import java.util.function.Function;
+import java.util.function.Supplier;
+
+import org.springframework.cloud.client.circuitbreaker.CircuitBreaker;
+import org.springframework.cloud.sleuth.Tracer;
+
+class TraceCircuitBreaker implements CircuitBreaker {
+
+ private final CircuitBreaker delegate;
+
+ private final Tracer tracer;
+
+ TraceCircuitBreaker(CircuitBreaker delegate, Tracer tracer) {
+ this.delegate = delegate;
+ this.tracer = tracer;
+ }
+
+ @Override
+ public T run(Supplier toRun, Function fallback) {
+ return this.delegate.run(new TraceSupplier<>(this.tracer, toRun), new TraceFunction<>(this.tracer, fallback));
+ }
+
+ @Override
+ public T run(Supplier toRun) {
+ return this.delegate.run(new TraceSupplier<>(this.tracer, toRun));
+ }
+
+}
diff --git a/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/circuitbreaker/TraceCircuitBreakerFactoryAspect.java b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/circuitbreaker/TraceCircuitBreakerFactoryAspect.java
new file mode 100644
index 000000000..422571e93
--- /dev/null
+++ b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/circuitbreaker/TraceCircuitBreakerFactoryAspect.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2018-2019 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.springframework.cloud.sleuth.instrument.circuitbreaker;
+
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Pointcut;
+
+import org.springframework.cloud.client.circuitbreaker.CircuitBreaker;
+import org.springframework.cloud.sleuth.Tracer;
+
+/**
+ * Aspec around {@link CircuitBreaker} creation.
+ *
+ * @author Marcin Grzejszczak
+ * @since 3.0.0
+ */
+@Aspect
+public class TraceCircuitBreakerFactoryAspect {
+
+ private final Tracer tracer;
+
+ public TraceCircuitBreakerFactoryAspect(Tracer tracer) {
+ this.tracer = tracer;
+ }
+
+ @Pointcut("execution(public * org.springframework.cloud.client.circuitbreaker.CircuitBreakerFactory.create(..))")
+ private void anyCircuitBreakerFactoryCreate() {
+ } // NOSONAR
+
+ @Around("anyCircuitBreakerFactoryCreate()")
+ public Object wrapFactory(ProceedingJoinPoint pjp) throws Throwable {
+ CircuitBreaker circuitBreaker = (CircuitBreaker) pjp.proceed();
+ return new TraceCircuitBreaker(circuitBreaker, this.tracer);
+ }
+
+}
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/circuitbreaker/TraceFunction.java b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/circuitbreaker/TraceFunction.java
similarity index 94%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/circuitbreaker/TraceFunction.java
rename to spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/circuitbreaker/TraceFunction.java
index 6d547791b..89c8d1b61 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/circuitbreaker/TraceFunction.java
+++ b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/circuitbreaker/TraceFunction.java
@@ -19,8 +19,8 @@ package org.springframework.cloud.sleuth.instrument.circuitbreaker;
import java.util.concurrent.atomic.AtomicReference;
import java.util.function.Function;
-import org.springframework.cloud.sleuth.api.Span;
-import org.springframework.cloud.sleuth.api.Tracer;
+import org.springframework.cloud.sleuth.Span;
+import org.springframework.cloud.sleuth.Tracer;
/**
* Trace representation of a {@link Function}.
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/circuitbreaker/TraceSupplier.java b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/circuitbreaker/TraceSupplier.java
similarity index 94%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/circuitbreaker/TraceSupplier.java
rename to spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/circuitbreaker/TraceSupplier.java
index 33e00d3d6..cb453ce50 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/circuitbreaker/TraceSupplier.java
+++ b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/circuitbreaker/TraceSupplier.java
@@ -19,8 +19,8 @@ package org.springframework.cloud.sleuth.instrument.circuitbreaker;
import java.util.concurrent.atomic.AtomicReference;
import java.util.function.Supplier;
-import org.springframework.cloud.sleuth.api.Span;
-import org.springframework.cloud.sleuth.api.Tracer;
+import org.springframework.cloud.sleuth.Span;
+import org.springframework.cloud.sleuth.Tracer;
/**
* Trace representation of a {@link Supplier}.
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/MessageHeaderPropagation.java b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/MessageHeaderPropagation.java
similarity index 96%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/MessageHeaderPropagation.java
rename to spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/MessageHeaderPropagation.java
index 8a23d3ca7..228ffa39d 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/MessageHeaderPropagation.java
+++ b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/MessageHeaderPropagation.java
@@ -25,21 +25,27 @@ import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-import org.springframework.cloud.sleuth.api.propagation.Propagator;
+import org.springframework.cloud.sleuth.propagation.Propagator;
import org.springframework.messaging.support.MessageHeaderAccessor;
import org.springframework.messaging.support.NativeMessageHeaderAccessor;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.StringUtils;
/**
+ * Setter and getter for Spring Integration based communication.
+ *
* This always sets native headers in defence of STOMP issues discussed here .
*
* @author Marcin Grzejszczak
+ * @since 3.0.0
*/
-enum MessageHeaderPropagation
+public enum MessageHeaderPropagation
implements Propagator.Setter, Propagator.Getter {
+ /**
+ * Singleton instance for message header propagation.
+ */
INSTANCE;
private static final Log log = LogFactory.getLog(MessageHeaderPropagation.class);
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/MessagingSleuthOperators.java b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/MessagingSleuthOperators.java
similarity index 98%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/MessagingSleuthOperators.java
rename to spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/MessagingSleuthOperators.java
index 3c4981e1d..05578a596 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/MessagingSleuthOperators.java
+++ b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/MessagingSleuthOperators.java
@@ -23,8 +23,8 @@ import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.BeanFactory;
-import org.springframework.cloud.sleuth.api.Span;
-import org.springframework.cloud.sleuth.api.Tracer;
+import org.springframework.cloud.sleuth.Span;
+import org.springframework.cloud.sleuth.Tracer;
import org.springframework.messaging.Message;
/**
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/TraceFunctionAutoConfiguration.java b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/TraceFunctionAroundWrapper.java
similarity index 74%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/TraceFunctionAutoConfiguration.java
rename to spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/TraceFunctionAroundWrapper.java
index 014c42158..6ce93702c 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/TraceFunctionAutoConfiguration.java
+++ b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/TraceFunctionAroundWrapper.java
@@ -22,48 +22,24 @@ import java.util.concurrent.ConcurrentHashMap;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-import org.springframework.boot.autoconfigure.AutoConfigureAfter;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.cloud.context.scope.refresh.RefreshScopeRefreshedEvent;
import org.springframework.cloud.function.context.catalog.FunctionAroundWrapper;
import org.springframework.cloud.function.context.catalog.SimpleFunctionRegistry;
-import org.springframework.cloud.sleuth.api.Tracer;
-import org.springframework.cloud.sleuth.api.propagation.Propagator;
-import org.springframework.cloud.sleuth.autoconfig.TraceAutoConfiguration;
+import org.springframework.cloud.sleuth.Tracer;
+import org.springframework.cloud.sleuth.propagation.Propagator;
import org.springframework.context.ApplicationListener;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.messaging.Message;
import org.springframework.messaging.support.MessageBuilder;
import org.springframework.messaging.support.MessageHeaderAccessor;
/**
- * {@link org.springframework.boot.autoconfigure.EnableAutoConfiguration
- * Auto-configuration} to enable tracing via Spring Cloud Function.
+ * Trace representation of a {@link FunctionAroundWrapper}.
*
- * @author Oleg Zhurakousky
* @author Marcin Grzejszczak
* @since 3.0.0
*/
-@Configuration(proxyBeanMethods = false)
-@ConditionalOnProperty(value = "spring.sleuth.function.enabled", matchIfMissing = true)
-@ConditionalOnBean(Tracer.class)
-@ConditionalOnClass({ FunctionAroundWrapper.class, RefreshScopeRefreshedEvent.class })
-@AutoConfigureAfter(TraceAutoConfiguration.class)
-class TraceFunctionAutoConfiguration {
-
- @Bean
- TraceFunctionAroundWrapper traceFunctionAroundWrapper(Environment environment, Tracer tracer, Propagator propagator,
- Propagator.Setter injector, Propagator.Getter extractor) {
- return new TraceFunctionAroundWrapper(environment, tracer, propagator, injector, extractor);
- }
-
-}
-
-class TraceFunctionAroundWrapper extends FunctionAroundWrapper
+public class TraceFunctionAroundWrapper extends FunctionAroundWrapper
implements ApplicationListener {
private static final Log log = LogFactory.getLog(TraceFunctionAroundWrapper.class);
@@ -80,7 +56,7 @@ class TraceFunctionAroundWrapper extends FunctionAroundWrapper
final Map functionToDestinationCache = new ConcurrentHashMap<>();
- TraceFunctionAroundWrapper(Environment environment, Tracer tracer, Propagator propagator,
+ public TraceFunctionAroundWrapper(Environment environment, Tracer tracer, Propagator propagator,
Propagator.Setter injector, Propagator.Getter extractor) {
this.environment = environment;
this.tracer = tracer;
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/TraceMessageHandler.java b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/TraceMessageHandler.java
similarity index 98%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/TraceMessageHandler.java
rename to spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/TraceMessageHandler.java
index c373a087f..d7afc387d 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/TraceMessageHandler.java
+++ b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/TraceMessageHandler.java
@@ -27,10 +27,10 @@ import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.beans.factory.ObjectProvider;
-import org.springframework.cloud.sleuth.api.Span;
-import org.springframework.cloud.sleuth.api.Tracer;
-import org.springframework.cloud.sleuth.api.propagation.Propagator;
+import org.springframework.cloud.sleuth.Span;
+import org.springframework.cloud.sleuth.Tracer;
import org.springframework.cloud.sleuth.internal.SpanNameUtil;
+import org.springframework.cloud.sleuth.propagation.Propagator;
import org.springframework.core.ResolvableType;
import org.springframework.messaging.Message;
import org.springframework.messaging.MessageHeaders;
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/TraceMessageHeaders.java b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/TraceMessageHeaders.java
similarity index 100%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/TraceMessageHeaders.java
rename to spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/TraceMessageHeaders.java
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/TracingChannelInterceptor.java b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/TracingChannelInterceptor.java
similarity index 92%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/TracingChannelInterceptor.java
rename to spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/TracingChannelInterceptor.java
index 462067dbb..98aa57cf7 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/TracingChannelInterceptor.java
+++ b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/TracingChannelInterceptor.java
@@ -22,11 +22,10 @@ import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.aop.support.AopUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.cloud.sleuth.api.Span;
-import org.springframework.cloud.sleuth.api.Tracer;
-import org.springframework.cloud.sleuth.api.propagation.Propagator;
+import org.springframework.cloud.sleuth.Span;
+import org.springframework.cloud.sleuth.Tracer;
import org.springframework.cloud.sleuth.internal.SpanNameUtil;
+import org.springframework.cloud.sleuth.propagation.Propagator;
import org.springframework.integration.channel.AbstractMessageChannel;
import org.springframework.integration.channel.DirectChannel;
import org.springframework.integration.context.IntegrationObjectSupport;
@@ -46,12 +45,12 @@ import org.springframework.util.ClassUtils;
* This starts and propagates {@link Span.Kind#PRODUCER} span for each message sent (via
* native headers. It also extracts or creates a {@link Span.Kind#CONSUMER} span for each
* message received. This span is injected onto each message so it becomes the parent when
- * a handler later calls {@link MessageHandler#handleMessage(Message)}, or a another
- * processing library calls {@link #nextSpan(Message)}.
+ * a handler later calls {@link MessageHandler#handleMessage(Message)}.
*
* @author Marcin Grzejszczak
+ * @since 3.0.0
*/
-final class TracingChannelInterceptor extends ChannelInterceptorAdapter implements ExecutorChannelInterceptor {
+public final class TracingChannelInterceptor extends ChannelInterceptorAdapter implements ExecutorChannelInterceptor {
/**
* Name of the class in Spring Cloud Stream that is a direct channel.
@@ -87,8 +86,6 @@ final class TracingChannelInterceptor extends ChannelInterceptorAdapter implemen
final Propagator.Getter extractor;
- final SleuthIntegrationMessagingProperties properties;
-
final boolean integrationObjectSupportPresent;
private final boolean hasDirectChannelClass;
@@ -100,14 +97,12 @@ final class TracingChannelInterceptor extends ChannelInterceptorAdapter implemen
private final ThreadLocalSpan threadLocalSpan = new ThreadLocalSpan();
- @Autowired
- TracingChannelInterceptor(Tracer tracer, Propagator propagator, SleuthIntegrationMessagingProperties properties) {
- this(tracer, propagator, properties, MessageHeaderPropagation.INSTANCE, MessageHeaderPropagation.INSTANCE);
+ TracingChannelInterceptor(Tracer tracer, Propagator propagator) {
+ this(tracer, propagator, MessageHeaderPropagation.INSTANCE, MessageHeaderPropagation.INSTANCE);
}
- TracingChannelInterceptor(Tracer tracer, Propagator propagator, SleuthIntegrationMessagingProperties properties,
+ public TracingChannelInterceptor(Tracer tracer, Propagator propagator,
Propagator.Setter setter, Propagator.Getter getter) {
- this.properties = properties;
this.tracer = tracer;
this.propagator = propagator;
this.injector = setter;
@@ -120,9 +115,8 @@ final class TracingChannelInterceptor extends ChannelInterceptorAdapter implemen
? ClassUtils.resolveClassName(STREAM_DIRECT_CHANNEL, null) : null;
}
- public static TracingChannelInterceptor create(Tracer tracer, Propagator propagator,
- SleuthIntegrationMessagingProperties properties) {
- return new TracingChannelInterceptor(tracer, propagator, properties);
+ public static TracingChannelInterceptor create(Tracer tracer, Propagator propagator) {
+ return new TracingChannelInterceptor(tracer, propagator);
}
/**
@@ -137,7 +131,7 @@ final class TracingChannelInterceptor extends ChannelInterceptorAdapter implemen
Span result = this.propagator.extract(headers, this.extractor).start();
headers.setImmutable();
if (!result.isNoop()) {
- addTags(message, result, null);
+ addTags(result, null);
}
if (log.isDebugEnabled()) {
log.debug("Created a new span " + result);
@@ -161,7 +155,7 @@ final class TracingChannelInterceptor extends ChannelInterceptorAdapter implemen
Span.Builder spanBuilder = this.propagator.extract(headers, this.extractor);
MessageHeaderPropagation.removeAnyTraceHeaders(headers, this.propagator.fields());
spanBuilder.kind(Span.Kind.PRODUCER).name("send").remoteServiceName(toRemoteServiceName(headers));
- addTags(message, spanBuilder, channel);
+ addTags(spanBuilder, channel);
Span span = spanBuilder.start();
if (log.isDebugEnabled()) {
log.debug("Extracted result from headers " + span);
@@ -288,7 +282,7 @@ final class TracingChannelInterceptor extends ChannelInterceptorAdapter implemen
Span.Builder builder = this.tracer.spanBuilder().setParent(result.context());
MessageHeaderPropagation.removeAnyTraceHeaders(headers, this.propagator.fields());
builder.kind(Span.Kind.CONSUMER).name("receive").remoteServiceName(toRemoteServiceName(headers));
- addTags(message, builder, channel);
+ addTags(builder, channel);
return builder.start();
}
@@ -345,7 +339,7 @@ final class TracingChannelInterceptor extends ChannelInterceptorAdapter implemen
// Start and finish a consumer span as we will immediately process it.
consumerSpanBuilder.kind(Span.Kind.CONSUMER).start();
consumerSpanBuilder.remoteServiceName(REMOTE_SERVICE_NAME);
- addTags(message, consumerSpanBuilder, channel);
+ addTags(consumerSpanBuilder, channel);
Span consumerSpan = consumerSpanBuilder.start();
consumerSpan.end();
return consumerSpan;
@@ -364,18 +358,17 @@ final class TracingChannelInterceptor extends ChannelInterceptorAdapter implemen
/**
* When an upstream context was not present, lookup keys are unlikely added.
- * @param message a message to append tags to
* @param result span to customize
* @param channel channel to which a message was sent
*/
- void addTags(Message> message, Span.Builder result, MessageChannel channel) {
+ void addTags(Span.Builder result, MessageChannel channel) {
// TODO topic etc
if (channel != null) {
result.tag("channel", messageChannelName(channel));
}
}
- void addTags(Message> message, Span result, MessageChannel channel) {
+ void addTags(Span result, MessageChannel channel) {
// TODO topic etc
if (channel != null) {
result.tag("channel", messageChannelName(channel));
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/quartz/TracingJobListener.java b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/quartz/TracingJobListener.java
similarity index 91%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/quartz/TracingJobListener.java
rename to spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/quartz/TracingJobListener.java
index ab9ae825e..dad33a648 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/quartz/TracingJobListener.java
+++ b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/quartz/TracingJobListener.java
@@ -24,9 +24,9 @@ import org.quartz.Trigger;
import org.quartz.Trigger.CompletedExecutionInstruction;
import org.quartz.TriggerListener;
-import org.springframework.cloud.sleuth.api.Span;
-import org.springframework.cloud.sleuth.api.Tracer;
-import org.springframework.cloud.sleuth.api.propagation.Propagator;
+import org.springframework.cloud.sleuth.Span;
+import org.springframework.cloud.sleuth.Tracer;
+import org.springframework.cloud.sleuth.propagation.Propagator;
/**
* {@link org.quartz.JobListener JobListener} that will wrap a span around quartz jobs
@@ -35,7 +35,7 @@ import org.springframework.cloud.sleuth.api.propagation.Propagator;
* @author Branden Cash
* @since 2.2.0
*/
-class TracingJobListener implements JobListener, TriggerListener {
+public class TracingJobListener implements JobListener, TriggerListener {
static final String TRIGGER_TAG_KEY = "quartz.trigger";
@@ -55,7 +55,7 @@ class TracingJobListener implements JobListener, TriggerListener {
private final Propagator propagator;
- TracingJobListener(Tracer tracer, Propagator propagator) {
+ public TracingJobListener(Tracer tracer, Propagator propagator) {
this.tracer = tracer;
this.propagator = propagator;
}
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/reactor/ReactorSleuth.java b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/reactor/ReactorSleuth.java
similarity index 93%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/reactor/ReactorSleuth.java
rename to spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/reactor/ReactorSleuth.java
index 4af0d7fa9..6a656adc0 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/reactor/ReactorSleuth.java
+++ b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/reactor/ReactorSleuth.java
@@ -29,9 +29,9 @@ import reactor.core.Scannable;
import reactor.core.publisher.Operators;
import reactor.util.context.Context;
-import org.springframework.cloud.sleuth.api.CurrentTraceContext;
-import org.springframework.cloud.sleuth.api.TraceContext;
-import org.springframework.cloud.sleuth.api.Tracer;
+import org.springframework.cloud.sleuth.CurrentTraceContext;
+import org.springframework.cloud.sleuth.TraceContext;
+import org.springframework.cloud.sleuth.Tracer;
import org.springframework.cloud.sleuth.internal.LazyBean;
import org.springframework.context.ConfigurableApplicationContext;
@@ -147,7 +147,13 @@ public abstract class ReactorSleuth {
return context;
}
- static Function super Publisher, ? extends Publisher> springContextSpanOperator(
+ /**
+ * Creates a context with beans in it.
+ * @param springContext spring context
+ * @param an arbitrary type that is left unchanged by the span operator
+ * @return a new operator pointcut that has beans in the context
+ */
+ public static Function super Publisher, ? extends Publisher> springContextSpanOperator(
ConfigurableApplicationContext springContext) {
if (log.isTraceEnabled()) {
log.trace("Spring Context passing operator [" + springContext + "]");
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/reactor/ScopePassingSpanSubscriber.java b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/reactor/ScopePassingSpanSubscriber.java
similarity index 96%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/reactor/ScopePassingSpanSubscriber.java
rename to spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/reactor/ScopePassingSpanSubscriber.java
index 1310f9e0c..a0d8bcf61 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/reactor/ScopePassingSpanSubscriber.java
+++ b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/reactor/ScopePassingSpanSubscriber.java
@@ -23,8 +23,8 @@ import org.reactivestreams.Subscription;
import reactor.core.Scannable;
import reactor.util.context.Context;
-import org.springframework.cloud.sleuth.api.CurrentTraceContext;
-import org.springframework.cloud.sleuth.api.TraceContext;
+import org.springframework.cloud.sleuth.CurrentTraceContext;
+import org.springframework.cloud.sleuth.TraceContext;
import org.springframework.lang.Nullable;
/**
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/reactor/SpanSubscription.java b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/reactor/SpanSubscription.java
similarity index 100%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/reactor/SpanSubscription.java
rename to spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/reactor/SpanSubscription.java
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/rxjava/SleuthRxJavaSchedulersHook.java b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/rxjava/SleuthRxJavaSchedulersHook.java
similarity index 95%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/rxjava/SleuthRxJavaSchedulersHook.java
rename to spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/rxjava/SleuthRxJavaSchedulersHook.java
index 66eb82fb6..4473ffce7 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/rxjava/SleuthRxJavaSchedulersHook.java
+++ b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/rxjava/SleuthRxJavaSchedulersHook.java
@@ -29,8 +29,8 @@ import rx.plugins.RxJavaObservableExecutionHook;
import rx.plugins.RxJavaPlugins;
import rx.plugins.RxJavaSchedulersHook;
-import org.springframework.cloud.sleuth.api.Span;
-import org.springframework.cloud.sleuth.api.Tracer;
+import org.springframework.cloud.sleuth.Span;
+import org.springframework.cloud.sleuth.Tracer;
/**
* {@link RxJavaSchedulersHook} that wraps an {@link Action0} into its tracing
@@ -39,7 +39,7 @@ import org.springframework.cloud.sleuth.api.Tracer;
* @author Shivang Shah
* @since 1.0.0
*/
-class SleuthRxJavaSchedulersHook extends RxJavaSchedulersHook {
+public class SleuthRxJavaSchedulersHook extends RxJavaSchedulersHook {
private static final Log log = LogFactory.getLog(SleuthRxJavaSchedulersHook.class);
@@ -51,7 +51,7 @@ class SleuthRxJavaSchedulersHook extends RxJavaSchedulersHook {
private RxJavaSchedulersHook delegate;
- SleuthRxJavaSchedulersHook(Tracer tracer, List threadsToIgnore) {
+ public SleuthRxJavaSchedulersHook(Tracer tracer, List threadsToIgnore) {
this.tracer = tracer;
this.threadsToIgnore = toPatternList(threadsToIgnore);
try {
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/scheduling/TraceSchedulingAspect.java b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/scheduling/TraceSchedulingAspect.java
similarity index 93%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/scheduling/TraceSchedulingAspect.java
rename to spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/scheduling/TraceSchedulingAspect.java
index 7b9ade67f..a73af359f 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/scheduling/TraceSchedulingAspect.java
+++ b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/scheduling/TraceSchedulingAspect.java
@@ -22,8 +22,8 @@ import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
-import org.springframework.cloud.sleuth.api.Span;
-import org.springframework.cloud.sleuth.api.Tracer;
+import org.springframework.cloud.sleuth.Span;
+import org.springframework.cloud.sleuth.Tracer;
import org.springframework.cloud.sleuth.internal.SpanNameUtil;
import org.springframework.lang.Nullable;
@@ -41,7 +41,7 @@ import org.springframework.lang.Nullable;
* @since 1.0.0
*/
@Aspect
-class TraceSchedulingAspect {
+public class TraceSchedulingAspect {
private static final String CLASS_KEY = "class";
@@ -52,7 +52,7 @@ class TraceSchedulingAspect {
@Nullable
private final Pattern skipPattern;
- TraceSchedulingAspect(Tracer tracer, Pattern skipPattern) {
+ public TraceSchedulingAspect(Tracer tracer, Pattern skipPattern) {
this.tracer = tracer;
this.skipPattern = skipPattern;
}
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/HttpClientRequestParser.java b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/HttpClientRequestParser.java
similarity index 94%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/HttpClientRequestParser.java
rename to spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/HttpClientRequestParser.java
index 5efdadaa5..e5fb681f9 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/HttpClientRequestParser.java
+++ b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/HttpClientRequestParser.java
@@ -26,7 +26,7 @@ import java.lang.annotation.Target;
import org.springframework.beans.factory.annotation.Qualifier;
/**
- * Annotate a client {@link org.springframework.cloud.sleuth.api.http.HttpRequestParser}.
+ * Annotate a client {@link org.springframework.cloud.sleuth.http.HttpRequestParser}.
*
* @see Qualifier
* @since 2.2.2
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/HttpClientResponseParser.java b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/HttpClientResponseParser.java
similarity index 100%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/HttpClientResponseParser.java
rename to spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/HttpClientResponseParser.java
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/HttpClientSampler.java b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/HttpClientSampler.java
similarity index 96%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/HttpClientSampler.java
rename to spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/HttpClientSampler.java
index e9a307e59..b2d425872 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/HttpClientSampler.java
+++ b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/HttpClientSampler.java
@@ -24,7 +24,7 @@ import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.cloud.sleuth.api.SamplerFunction;
+import org.springframework.cloud.sleuth.SamplerFunction;
/**
* Annotate a client {@link SamplerFunction} that should be injected to a client sampler.
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/HttpServerRequestParser.java b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/HttpServerRequestParser.java
similarity index 100%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/HttpServerRequestParser.java
rename to spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/HttpServerRequestParser.java
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/HttpServerResponseParser.java b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/HttpServerResponseParser.java
similarity index 100%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/HttpServerResponseParser.java
rename to spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/HttpServerResponseParser.java
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/HttpServerSampler.java b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/HttpServerSampler.java
similarity index 95%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/HttpServerSampler.java
rename to spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/HttpServerSampler.java
index 11cd1dd19..8248f5574 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/HttpServerSampler.java
+++ b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/HttpServerSampler.java
@@ -24,7 +24,7 @@ import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.cloud.sleuth.api.SamplerFunction;
+import org.springframework.cloud.sleuth.SamplerFunction;
/**
* Annotate a server {@link SamplerFunction}.
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/SkipPatternProvider.java b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/SkipPatternProvider.java
similarity index 100%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/SkipPatternProvider.java
rename to spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/SkipPatternProvider.java
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/TraceWebAspect.java b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/TraceWebAspect.java
similarity index 94%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/TraceWebAspect.java
rename to spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/TraceWebAspect.java
index f881c53a6..46f7d5e6e 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/TraceWebAspect.java
+++ b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/TraceWebAspect.java
@@ -25,10 +25,10 @@ import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
+import org.springframework.cloud.sleuth.CurrentTraceContext;
import org.springframework.cloud.sleuth.SpanNamer;
-import org.springframework.cloud.sleuth.api.CurrentTraceContext;
-import org.springframework.cloud.sleuth.api.TraceContext;
-import org.springframework.cloud.sleuth.api.Tracer;
+import org.springframework.cloud.sleuth.TraceContext;
+import org.springframework.cloud.sleuth.Tracer;
import org.springframework.cloud.sleuth.instrument.async.TraceCallable;
import org.springframework.web.context.request.async.WebAsyncTask;
@@ -55,7 +55,7 @@ import org.springframework.web.context.request.async.WebAsyncTask;
*/
@SuppressWarnings("ArgNamesWarningsInspection")
@Aspect
-class TraceWebAspect {
+public class TraceWebAspect {
private static final Log log = org.apache.commons.logging.LogFactory.getLog(TraceWebAspect.class);
@@ -65,7 +65,7 @@ class TraceWebAspect {
private final SpanNamer spanNamer;
- TraceWebAspect(Tracer tracer, CurrentTraceContext currentTraceContext, SpanNamer spanNamer) {
+ public TraceWebAspect(Tracer tracer, CurrentTraceContext currentTraceContext, SpanNamer spanNamer) {
this.tracer = tracer;
this.currentTraceContext = currentTraceContext;
this.spanNamer = spanNamer;
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/TraceWebFilter.java b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/TraceWebFilter.java
similarity index 80%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/TraceWebFilter.java
rename to spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/TraceWebFilter.java
index 7134b035e..434f4aa54 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/TraceWebFilter.java
+++ b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/TraceWebFilter.java
@@ -28,14 +28,12 @@ import reactor.core.publisher.MonoOperator;
import reactor.util.annotation.Nullable;
import reactor.util.context.Context;
-import org.springframework.beans.factory.BeanFactory;
-import org.springframework.cloud.sleuth.api.Span;
-import org.springframework.cloud.sleuth.api.TraceContext;
-import org.springframework.cloud.sleuth.api.Tracer;
-import org.springframework.cloud.sleuth.api.http.HttpServerHandler;
-import org.springframework.cloud.sleuth.api.http.HttpServerRequest;
-import org.springframework.cloud.sleuth.api.http.HttpServerResponse;
-import org.springframework.cloud.sleuth.instrument.reactor.SleuthReactorProperties;
+import org.springframework.cloud.sleuth.Span;
+import org.springframework.cloud.sleuth.TraceContext;
+import org.springframework.cloud.sleuth.Tracer;
+import org.springframework.cloud.sleuth.http.HttpServerHandler;
+import org.springframework.cloud.sleuth.http.HttpServerRequest;
+import org.springframework.cloud.sleuth.http.HttpServerResponse;
import org.springframework.core.Ordered;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpRequest;
@@ -53,14 +51,7 @@ import org.springframework.web.server.WebFilterChain;
* @author Marcin Grzejszczak
* @since 2.0.0
*/
-final class TraceWebFilter implements WebFilter, Ordered {
-
- /**
- * If you register your filter before the {@link TraceWebFilter} then you will not
- * have the tracing context passed for you out of the box. That means that e.g. your
- * logs will not get correlated.
- */
- public static final int ORDER = SleuthWebProperties.TRACING_FILTER_ORDER;
+public class TraceWebFilter implements WebFilter, Ordered {
// Remember that this can be used in other packages
protected static final String TRACE_REQUEST_ATTR = Span.class.getName();
@@ -74,51 +65,15 @@ final class TraceWebFilter implements WebFilter, Ordered {
private static final String TRACE_SPAN_WITHOUT_PARENT = TraceWebFilter.class.getName() + ".SPAN_WITH_NO_PARENT";
- private final BeanFactory beanFactory;
+ private final Tracer tracer;
- Tracer tracer;
+ private final HttpServerHandler handler;
- HttpServerHandler handler;
+ private int order;
- SleuthWebProperties webProperties;
-
- SleuthReactorProperties sleuthReactorProperties;
-
- TraceWebFilter(BeanFactory beanFactory) {
- this.beanFactory = beanFactory;
- }
-
- public static WebFilter create(BeanFactory beanFactory) {
- return new TraceWebFilter(beanFactory);
- }
-
- @SuppressWarnings("unchecked")
- HttpServerHandler handler() {
- if (this.handler == null) {
- this.handler = this.beanFactory.getBean(HttpServerHandler.class);
- }
- return this.handler;
- }
-
- Tracer tracer() {
- if (this.tracer == null) {
- this.tracer = this.beanFactory.getBean(Tracer.class);
- }
- return this.tracer;
- }
-
- SleuthWebProperties sleuthWebProperties() {
- if (this.webProperties == null) {
- this.webProperties = this.beanFactory.getBean(SleuthWebProperties.class);
- }
- return this.webProperties;
- }
-
- SleuthReactorProperties sleuthReactorProperties() {
- if (this.sleuthReactorProperties == null) {
- this.sleuthReactorProperties = this.beanFactory.getBean(SleuthReactorProperties.class);
- }
- return this.sleuthReactorProperties;
+ public TraceWebFilter(Tracer tracer, HttpServerHandler handler) {
+ this.tracer = tracer;
+ this.handler = handler;
}
@Override
@@ -133,20 +88,21 @@ final class TraceWebFilter implements WebFilter, Ordered {
}
private boolean isTracePresent() {
- if (sleuthReactorProperties().getInstrumentationType() == SleuthReactorProperties.InstrumentationType.MANUAL) {
- return false;
- }
- boolean tracePresent = tracer().currentSpan() != null;
+ boolean tracePresent = this.tracer.currentSpan() != null;
if (tracePresent) {
// clear any previous trace
- tracer().withSpan(null); // TODO: dangerous and also allocates stuff
+ this.tracer.withSpan(null); // TODO: dangerous and also allocates stuff
}
return tracePresent;
}
@Override
public int getOrder() {
- return sleuthWebProperties().getFilterOrder();
+ return this.order;
+ }
+
+ public void setOrder(int order) {
+ this.order = order;
}
private static class MonoWebFilterTrace extends MonoOperator {
@@ -166,8 +122,8 @@ final class TraceWebFilter implements WebFilter, Ordered {
MonoWebFilterTrace(Mono extends Void> source, ServerWebExchange exchange, boolean initialTracePresent,
TraceWebFilter parent) {
super(source);
- this.tracer = parent.tracer();
- this.handler = parent.handler();
+ this.tracer = parent.tracer;
+ this.handler = parent.handler;
this.exchange = exchange;
this.span = exchange.getAttribute(TRACE_REQUEST_ATTR);
this.initialTracePresent = initialTracePresent;
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/WebFluxSleuthOperators.java b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/WebFluxSleuthOperators.java
similarity index 96%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/WebFluxSleuthOperators.java
rename to spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/WebFluxSleuthOperators.java
index f27da8072..c6f7487c9 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/WebFluxSleuthOperators.java
+++ b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/WebFluxSleuthOperators.java
@@ -25,10 +25,10 @@ import reactor.core.publisher.Signal;
import reactor.core.publisher.SignalType;
import reactor.util.context.Context;
-import org.springframework.cloud.sleuth.api.CurrentTraceContext;
-import org.springframework.cloud.sleuth.api.Span;
-import org.springframework.cloud.sleuth.api.TraceContext;
-import org.springframework.cloud.sleuth.api.Tracer;
+import org.springframework.cloud.sleuth.CurrentTraceContext;
+import org.springframework.cloud.sleuth.Span;
+import org.springframework.cloud.sleuth.TraceContext;
+import org.springframework.cloud.sleuth.Tracer;
import org.springframework.web.server.ServerWebExchange;
/**
diff --git a/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/AbstractHttpHeadersFilter.java b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/AbstractHttpHeadersFilter.java
new file mode 100644
index 000000000..6df38d2da
--- /dev/null
+++ b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/AbstractHttpHeadersFilter.java
@@ -0,0 +1,131 @@
+/*
+ * Copyright 2013-2020 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.springframework.cloud.sleuth.instrument.web.client;
+
+import java.util.Collection;
+import java.util.List;
+
+import org.springframework.cloud.gateway.filter.headers.HttpHeadersFilter;
+import org.springframework.cloud.sleuth.Span;
+import org.springframework.cloud.sleuth.Tracer;
+import org.springframework.cloud.sleuth.http.HttpClientHandler;
+import org.springframework.cloud.sleuth.http.HttpClientRequest;
+import org.springframework.cloud.sleuth.http.HttpClientResponse;
+import org.springframework.cloud.sleuth.propagation.Propagator;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.server.reactive.ServerHttpRequest;
+import org.springframework.http.server.reactive.ServerHttpResponse;
+
+abstract class AbstractHttpHeadersFilter implements HttpHeadersFilter {
+
+ static final String SPAN_ATTRIBUTE = Span.class.getName();
+
+ final Tracer tracer;
+
+ final HttpClientHandler handler;
+
+ final Propagator propagator;
+
+ AbstractHttpHeadersFilter(Tracer tracer, HttpClientHandler handler, Propagator propagator) {
+ this.tracer = tracer;
+ this.propagator = propagator;
+ this.handler = handler;
+ }
+
+ static final class ServerHttpClientRequest implements HttpClientRequest {
+
+ final ServerHttpRequest delegate;
+
+ final HttpHeaders filteredHeaders;
+
+ ServerHttpClientRequest(ServerHttpRequest delegate, HttpHeaders filteredHeaders) {
+ this.delegate = delegate;
+ this.filteredHeaders = filteredHeaders;
+ }
+
+ @Override
+ public Collection headerNames() {
+ return this.delegate.getHeaders().keySet();
+ }
+
+ @Override
+ public Object unwrap() {
+ return delegate;
+ }
+
+ @Override
+ public String method() {
+ return delegate.getMethodValue();
+ }
+
+ @Override
+ public String path() {
+ return delegate.getURI().getPath();
+ }
+
+ @Override
+ public String url() {
+ return delegate.getURI().toString();
+ }
+
+ @Override
+ public String header(String name) {
+ return filteredHeaders.getFirst(name);
+ }
+
+ @Override
+ public void header(String name, String value) {
+ filteredHeaders.set(name, value);
+ }
+
+ }
+
+ static final class ServerHttpClientResponse implements HttpClientResponse {
+
+ final ServerHttpResponse delegate;
+
+ ServerHttpClientResponse(ServerHttpResponse delegate) {
+ this.delegate = delegate;
+ }
+
+ @Override
+ public Collection headerNames() {
+ return this.delegate.getHeaders().keySet();
+ }
+
+ @Override
+ public Object unwrap() {
+ return delegate;
+ }
+
+ @Override
+ public int statusCode() {
+ return delegate.getStatusCode() != null ? delegate.getStatusCode().value() : 0;
+ }
+
+ @Override
+ public String header(String header) {
+ List headers = delegate.getHeaders().get(header);
+ if (headers == null || headers.isEmpty()) {
+ return null;
+ }
+ return headers.get(0);
+ }
+
+ }
+
+}
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/HttpClientBeanPostProcessor.java b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/HttpClientBeanPostProcessor.java
similarity index 93%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/HttpClientBeanPostProcessor.java
rename to spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/HttpClientBeanPostProcessor.java
index 704fcc62f..e669308f7 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/HttpClientBeanPostProcessor.java
+++ b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/HttpClientBeanPostProcessor.java
@@ -34,19 +34,25 @@ import reactor.util.context.Context;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
-import org.springframework.cloud.sleuth.api.CurrentTraceContext;
-import org.springframework.cloud.sleuth.api.Span;
-import org.springframework.cloud.sleuth.api.TraceContext;
-import org.springframework.cloud.sleuth.api.http.HttpClientHandler;
+import org.springframework.cloud.sleuth.CurrentTraceContext;
+import org.springframework.cloud.sleuth.Span;
+import org.springframework.cloud.sleuth.TraceContext;
+import org.springframework.cloud.sleuth.http.HttpClientHandler;
import org.springframework.cloud.sleuth.internal.LazyBean;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.lang.Nullable;
-class HttpClientBeanPostProcessor implements BeanPostProcessor {
+/**
+ * A {@link BeanPostProcessor} that wraps a {@link HttpClient} in a trace representation.
+ *
+ * @author Marcin Grzejszczak
+ * @since 3.0.0
+ */
+public class HttpClientBeanPostProcessor implements BeanPostProcessor {
final ConfigurableApplicationContext springContext;
- HttpClientBeanPostProcessor(ConfigurableApplicationContext springContext) {
+ public HttpClientBeanPostProcessor(ConfigurableApplicationContext springContext) {
this.springContext = springContext;
}
@@ -236,7 +242,7 @@ class HttpClientBeanPostProcessor implements BeanPostProcessor {
}
- static final class HttpClientRequestWrapper implements org.springframework.cloud.sleuth.api.http.HttpClientRequest {
+ static final class HttpClientRequestWrapper implements org.springframework.cloud.sleuth.http.HttpClientRequest {
final HttpClientRequest delegate;
@@ -314,8 +320,7 @@ class HttpClientBeanPostProcessor implements BeanPostProcessor {
}
- static final class HttpClientResponseWrapper
- implements org.springframework.cloud.sleuth.api.http.HttpClientResponse {
+ static final class HttpClientResponseWrapper implements org.springframework.cloud.sleuth.http.HttpClientResponse {
@Nullable
final HttpClientResponse delegate;
diff --git a/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/LazyTraceClientHttpRequestInterceptor.java b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/LazyTraceClientHttpRequestInterceptor.java
new file mode 100644
index 000000000..e5f5e07c7
--- /dev/null
+++ b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/LazyTraceClientHttpRequestInterceptor.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2013-2020 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.springframework.cloud.sleuth.instrument.web.client;
+
+import java.io.IOException;
+
+import org.springframework.beans.factory.BeanFactory;
+import org.springframework.cloud.sleuth.instrument.web.mvc.TracingClientHttpRequestInterceptor;
+import org.springframework.http.HttpRequest;
+import org.springframework.http.client.ClientHttpRequestExecution;
+import org.springframework.http.client.ClientHttpRequestInterceptor;
+import org.springframework.http.client.ClientHttpResponse;
+
+/**
+ * Lazy trace representation of {@link ClientHttpRequestInterceptor}.
+ *
+ * @author Marcin Grzejszczak
+ * @since 3.0.0
+ */
+public class LazyTraceClientHttpRequestInterceptor implements ClientHttpRequestInterceptor {
+
+ private final BeanFactory beanFactory;
+
+ private TracingClientHttpRequestInterceptor interceptor;
+
+ public LazyTraceClientHttpRequestInterceptor(BeanFactory beanFactory) {
+ this.beanFactory = beanFactory;
+ }
+
+ @Override
+ public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution)
+ throws IOException {
+ return interceptor().intercept(request, body, execution);
+ }
+
+ private TracingClientHttpRequestInterceptor interceptor() {
+ if (this.interceptor == null) {
+ this.interceptor = this.beanFactory.getBean(TracingClientHttpRequestInterceptor.class);
+ }
+ return this.interceptor;
+ }
+
+}
diff --git a/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/RestTemplateInterceptorInjector.java b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/RestTemplateInterceptorInjector.java
new file mode 100644
index 000000000..fbdda43d8
--- /dev/null
+++ b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/RestTemplateInterceptorInjector.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2013-2020 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.springframework.cloud.sleuth.instrument.web.client;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.springframework.cloud.sleuth.instrument.web.mvc.TracingClientHttpRequestInterceptor;
+import org.springframework.http.client.ClientHttpRequestInterceptor;
+import org.springframework.web.client.RestTemplate;
+
+class RestTemplateInterceptorInjector {
+
+ private final ClientHttpRequestInterceptor interceptor;
+
+ RestTemplateInterceptorInjector(ClientHttpRequestInterceptor interceptor) {
+ this.interceptor = interceptor;
+ }
+
+ void inject(RestTemplate restTemplate) {
+ if (hasTraceInterceptor(restTemplate)) {
+ return;
+ }
+ List interceptors = new ArrayList(
+ restTemplate.getInterceptors());
+ interceptors.add(0, this.interceptor);
+ restTemplate.setInterceptors(interceptors);
+ }
+
+ private boolean hasTraceInterceptor(RestTemplate restTemplate) {
+ for (ClientHttpRequestInterceptor interceptor : restTemplate.getInterceptors()) {
+ if (interceptor instanceof TracingClientHttpRequestInterceptor
+ || interceptor instanceof LazyTraceClientHttpRequestInterceptor) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+}
diff --git a/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/TraceRequestHttpHeadersFilter.java b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/TraceRequestHttpHeadersFilter.java
new file mode 100644
index 000000000..c8c0c1c74
--- /dev/null
+++ b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/TraceRequestHttpHeadersFilter.java
@@ -0,0 +1,119 @@
+/*
+ * Copyright 2013-2020 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.springframework.cloud.sleuth.instrument.web.client;
+
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import org.springframework.cloud.gateway.filter.headers.HttpHeadersFilter;
+import org.springframework.cloud.sleuth.Span;
+import org.springframework.cloud.sleuth.TraceContext;
+import org.springframework.cloud.sleuth.Tracer;
+import org.springframework.cloud.sleuth.http.HttpClientHandler;
+import org.springframework.cloud.sleuth.http.HttpClientRequest;
+import org.springframework.cloud.sleuth.propagation.Propagator;
+import org.springframework.http.HttpHeaders;
+import org.springframework.web.server.ServerWebExchange;
+
+/**
+ * Trace representation of {@link HttpHeadersFilter} for a request.
+ *
+ * @author Marcin Grzejszczak
+ * @since 3.0.0
+ */
+public class TraceRequestHttpHeadersFilter extends AbstractHttpHeadersFilter {
+
+ private static final Log log = LogFactory.getLog(TraceRequestHttpHeadersFilter.class);
+
+ static final String TRACE_REQUEST_ATTR = TraceContext.class.getName();
+
+ public TraceRequestHttpHeadersFilter(Tracer tracer, HttpClientHandler handler, Propagator propagator) {
+ super(tracer, handler, propagator);
+ }
+
+ @Override
+ public HttpHeaders filter(HttpHeaders input, ServerWebExchange exchange) {
+ if (log.isDebugEnabled()) {
+ log.debug("Will instrument the HTTP request headers [" + exchange.getRequest().getHeaders() + "]");
+ }
+ ServerHttpClientRequest request = new ServerHttpClientRequest(exchange.getRequest(), input);
+ Span currentSpan = currentSpan(exchange, request);
+ Span span = injectedSpan(request, currentSpan);
+ if (log.isDebugEnabled()) {
+ log.debug("Client span " + span + " created for the request. New headers are "
+ + request.filteredHeaders.toSingleValueMap());
+ }
+ exchange.getAttributes().put(SPAN_ATTRIBUTE, span);
+ HttpHeaders headersWithInput = new HttpHeaders();
+ headersWithInput.addAll(input);
+ addHeadersWithInput(request.filteredHeaders, headersWithInput);
+ if (headersWithInput.containsKey("b3") || headersWithInput.containsKey("B3")) {
+ headersWithInput.keySet().remove("b3");
+ headersWithInput.keySet().remove("B3");
+ }
+ return headersWithInput;
+ }
+
+ private Span currentSpan(ServerWebExchange exchange, ServerHttpClientRequest request) {
+ Span currentSpan = currentSpan(exchange);
+ if (currentSpan != null) {
+ return currentSpan;
+ }
+ // Usually, an HTTP client would not attempt to resume a trace from headers, as a
+ // server would always place its span in scope. However, in commit 848442e,
+ // this behavior was added in support of gateway.
+ return this.propagator.extract(request, HttpClientRequest::header).start();
+ }
+
+ private Span currentSpan(ServerWebExchange exchange) {
+ Object attribute = exchange.getAttribute(TRACE_REQUEST_ATTR);
+ if (attribute instanceof Span) {
+ if (log.isDebugEnabled()) {
+ log.debug("Found trace request attribute in the server web exchange [" + attribute + "]");
+ }
+ return (Span) attribute;
+ }
+ return this.tracer.currentSpan();
+ }
+
+ private Span injectedSpan(ServerHttpClientRequest request, Span currentSpan) {
+ if (currentSpan == null) {
+ return this.handler.handleSend(request);
+ }
+ try (Tracer.SpanInScope ws = this.tracer.withSpan(currentSpan)) {
+ Span clientSpan = this.tracer.nextSpan();
+ return this.handler.handleSend(request, clientSpan.context());
+ }
+ }
+
+ private void addHeadersWithInput(HttpHeaders filteredHeaders, HttpHeaders headersWithInput) {
+ for (Map.Entry> entry : filteredHeaders.entrySet()) {
+ String key = entry.getKey();
+ List value = entry.getValue();
+ headersWithInput.put(key, value);
+ }
+ }
+
+ @Override
+ public boolean supports(Type type) {
+ return type.equals(Type.REQUEST);
+ }
+
+}
diff --git a/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/TraceResponseHttpHeadersFilter.java b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/TraceResponseHttpHeadersFilter.java
new file mode 100644
index 000000000..4403b77cc
--- /dev/null
+++ b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/TraceResponseHttpHeadersFilter.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2013-2020 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.springframework.cloud.sleuth.instrument.web.client;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import org.springframework.cloud.gateway.filter.headers.HttpHeadersFilter;
+import org.springframework.cloud.sleuth.Span;
+import org.springframework.cloud.sleuth.Tracer;
+import org.springframework.cloud.sleuth.http.HttpClientHandler;
+import org.springframework.cloud.sleuth.propagation.Propagator;
+import org.springframework.http.HttpHeaders;
+import org.springframework.web.server.ServerWebExchange;
+
+/**
+ * Trace representation of {@link HttpHeadersFilter} for a response.
+ *
+ * @author Marcin Grzejszczak
+ * @since 3.0.0
+ */
+public class TraceResponseHttpHeadersFilter extends AbstractHttpHeadersFilter {
+
+ private static final Log log = LogFactory.getLog(TraceResponseHttpHeadersFilter.class);
+
+ public TraceResponseHttpHeadersFilter(Tracer tracer, HttpClientHandler handler, Propagator propagator) {
+ super(tracer, handler, propagator);
+ }
+
+ @Override
+ public HttpHeaders filter(HttpHeaders input, ServerWebExchange exchange) {
+ Object storedSpan = exchange.getAttribute(SPAN_ATTRIBUTE);
+ if (storedSpan == null) {
+ return input;
+ }
+ if (log.isDebugEnabled()) {
+ log.debug("Will instrument the response");
+ }
+ ServerHttpClientResponse response = new ServerHttpClientResponse(exchange.getResponse());
+ this.handler.handleReceive(response, (Span) storedSpan);
+ if (log.isDebugEnabled()) {
+ log.debug("The response was handled for span " + storedSpan);
+ }
+ return new HttpHeaders(input);
+ }
+
+ @Override
+ public boolean supports(Type type) {
+ return type.equals(Type.RESPONSE);
+ }
+
+}
diff --git a/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/TraceRestTemplateBeanPostProcessor.java b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/TraceRestTemplateBeanPostProcessor.java
new file mode 100644
index 000000000..882287153
--- /dev/null
+++ b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/TraceRestTemplateBeanPostProcessor.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2013-2020 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.springframework.cloud.sleuth.instrument.web.client;
+
+import org.springframework.beans.BeansException;
+import org.springframework.beans.factory.BeanFactory;
+import org.springframework.beans.factory.config.BeanPostProcessor;
+import org.springframework.web.client.RestTemplate;
+
+/**
+ * Wraps {@link RestTemplate} with trace interceptors.
+ *
+ * @author Marcin Grzejszczak
+ * @since 3.0.0
+ */
+public class TraceRestTemplateBeanPostProcessor implements BeanPostProcessor {
+
+ private final BeanFactory beanFactory;
+
+ public TraceRestTemplateBeanPostProcessor(BeanFactory beanFactory) {
+ this.beanFactory = beanFactory;
+ }
+
+ @Override
+ public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
+ return bean;
+ }
+
+ @Override
+ public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
+ if (bean instanceof RestTemplate) {
+ RestTemplate rt = (RestTemplate) bean;
+ new RestTemplateInterceptorInjector(interceptor()).inject(rt);
+ }
+ return bean;
+ }
+
+ private LazyTraceClientHttpRequestInterceptor interceptor() {
+ return new LazyTraceClientHttpRequestInterceptor(this.beanFactory);
+ }
+
+}
diff --git a/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/TraceRestTemplateCustomizer.java b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/TraceRestTemplateCustomizer.java
new file mode 100644
index 000000000..2c8bb8686
--- /dev/null
+++ b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/TraceRestTemplateCustomizer.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2013-2020 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.springframework.cloud.sleuth.instrument.web.client;
+
+import org.springframework.boot.web.client.RestTemplateCustomizer;
+import org.springframework.http.client.ClientHttpRequestInterceptor;
+import org.springframework.web.client.RestTemplate;
+
+/**
+ * Wraps a {@link RestTemplate} in a trace representation.
+ *
+ * @author Marcin Grzejszczak
+ * @since 3.0.0
+ */
+public class TraceRestTemplateCustomizer implements RestTemplateCustomizer {
+
+ private final ClientHttpRequestInterceptor interceptor;
+
+ public TraceRestTemplateCustomizer(ClientHttpRequestInterceptor interceptor) {
+ this.interceptor = interceptor;
+ }
+
+ @Override
+ public void customize(RestTemplate restTemplate) {
+ new RestTemplateInterceptorInjector(this.interceptor).inject(restTemplate);
+ }
+
+}
diff --git a/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/TraceUserInfoRestTemplateCustomizer.java b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/TraceUserInfoRestTemplateCustomizer.java
new file mode 100644
index 000000000..e8fbdaa65
--- /dev/null
+++ b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/TraceUserInfoRestTemplateCustomizer.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2013-2020 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.springframework.cloud.sleuth.instrument.web.client;
+
+import org.springframework.beans.factory.BeanFactory;
+import org.springframework.boot.autoconfigure.security.oauth2.resource.UserInfoRestTemplateCustomizer;
+import org.springframework.cloud.sleuth.instrument.web.mvc.TracingClientHttpRequestInterceptor;
+import org.springframework.security.oauth2.client.OAuth2RestTemplate;
+
+/**
+ * Wraps a {@link OAuth2RestTemplate} into a trace representation.
+ *
+ * @author Marcin Grzejszczak
+ * @since 3.0.0
+ */
+public class TraceUserInfoRestTemplateCustomizer implements UserInfoRestTemplateCustomizer {
+
+ private final BeanFactory beanFactory;
+
+ private final Object delegate;
+
+ public TraceUserInfoRestTemplateCustomizer(BeanFactory beanFactory) {
+ this.beanFactory = beanFactory;
+ this.delegate = null;
+ }
+
+ TraceUserInfoRestTemplateCustomizer(BeanFactory beanFactory, Object bean) {
+ this.beanFactory = beanFactory;
+ this.delegate = bean;
+ }
+
+ @Override
+ public void customize(OAuth2RestTemplate template) {
+ final TracingClientHttpRequestInterceptor interceptor = this.beanFactory
+ .getBean(TracingClientHttpRequestInterceptor.class);
+ new RestTemplateInterceptorInjector(interceptor).inject(template);
+ if (this.delegate != null) {
+ ((UserInfoRestTemplateCustomizer) this.delegate).customize(template);
+ }
+ }
+
+}
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/TraceWebClientBeanPostProcessor.java b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/TraceWebClientBeanPostProcessor.java
similarity index 95%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/TraceWebClientBeanPostProcessor.java
rename to spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/TraceWebClientBeanPostProcessor.java
index e93978a69..f12eafc2a 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/TraceWebClientBeanPostProcessor.java
+++ b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/TraceWebClientBeanPostProcessor.java
@@ -31,12 +31,12 @@ import reactor.util.annotation.Nullable;
import reactor.util.context.Context;
import org.springframework.beans.factory.config.BeanPostProcessor;
-import org.springframework.cloud.sleuth.api.CurrentTraceContext;
-import org.springframework.cloud.sleuth.api.Span;
-import org.springframework.cloud.sleuth.api.TraceContext;
-import org.springframework.cloud.sleuth.api.http.HttpClientHandler;
-import org.springframework.cloud.sleuth.api.http.HttpClientRequest;
-import org.springframework.cloud.sleuth.api.http.HttpClientResponse;
+import org.springframework.cloud.sleuth.CurrentTraceContext;
+import org.springframework.cloud.sleuth.Span;
+import org.springframework.cloud.sleuth.TraceContext;
+import org.springframework.cloud.sleuth.http.HttpClientHandler;
+import org.springframework.cloud.sleuth.http.HttpClientRequest;
+import org.springframework.cloud.sleuth.http.HttpClientResponse;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.web.reactive.function.client.ClientRequest;
import org.springframework.web.reactive.function.client.ClientResponse;
@@ -51,11 +51,11 @@ import org.springframework.web.reactive.function.client.WebClient;
* @author Marcin Grzejszczak
* @since 2.0.0
*/
-final class TraceWebClientBeanPostProcessor implements BeanPostProcessor {
+public class TraceWebClientBeanPostProcessor implements BeanPostProcessor {
final ConfigurableApplicationContext springContext;
- TraceWebClientBeanPostProcessor(ConfigurableApplicationContext springContext) {
+ public TraceWebClientBeanPostProcessor(ConfigurableApplicationContext springContext) {
this.springContext = springContext;
}
diff --git a/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/UserInfoRestTemplateCustomizerBeanPostProcessor.java b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/UserInfoRestTemplateCustomizerBeanPostProcessor.java
new file mode 100644
index 000000000..c539a18b6
--- /dev/null
+++ b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/UserInfoRestTemplateCustomizerBeanPostProcessor.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2013-2020 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.springframework.cloud.sleuth.instrument.web.client;
+
+import org.springframework.beans.BeansException;
+import org.springframework.beans.factory.BeanFactory;
+import org.springframework.beans.factory.config.BeanPostProcessor;
+import org.springframework.boot.autoconfigure.security.oauth2.resource.UserInfoRestTemplateCustomizer;
+
+public class UserInfoRestTemplateCustomizerBeanPostProcessor implements BeanPostProcessor {
+
+ private final BeanFactory beanFactory;
+
+ public UserInfoRestTemplateCustomizerBeanPostProcessor(BeanFactory beanFactory) {
+ this.beanFactory = beanFactory;
+ }
+
+ @Override
+ public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
+ return bean;
+ }
+
+ @Override
+ public Object postProcessAfterInitialization(final Object bean, String beanName) throws BeansException {
+ final BeanFactory beanFactory = this.beanFactory;
+ if (bean instanceof UserInfoRestTemplateCustomizer && !(bean instanceof TraceUserInfoRestTemplateCustomizer)) {
+ return new TraceUserInfoRestTemplateCustomizer(beanFactory, bean);
+ }
+ return bean;
+ }
+
+}
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/feign/FeignContextBeanPostProcessor.java b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/feign/FeignContextBeanPostProcessor.java
similarity index 92%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/feign/FeignContextBeanPostProcessor.java
rename to spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/feign/FeignContextBeanPostProcessor.java
index 7155818a1..adc049177 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/feign/FeignContextBeanPostProcessor.java
+++ b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/feign/FeignContextBeanPostProcessor.java
@@ -27,11 +27,11 @@ import org.springframework.cloud.openfeign.FeignContext;
* @author Marcin Grzejszczak
* @since 1.0.2
*/
-final class FeignContextBeanPostProcessor implements BeanPostProcessor {
+public class FeignContextBeanPostProcessor implements BeanPostProcessor {
private final BeanFactory beanFactory;
- FeignContextBeanPostProcessor(BeanFactory beanFactory) {
+ public FeignContextBeanPostProcessor(BeanFactory beanFactory) {
this.beanFactory = beanFactory;
}
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/feign/LazyClient.java b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/feign/LazyClient.java
similarity index 93%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/feign/LazyClient.java
rename to spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/feign/LazyClient.java
index 4d1c1c0b3..8b99f90fe 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/feign/LazyClient.java
+++ b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/feign/LazyClient.java
@@ -24,8 +24,8 @@ import feign.Response;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
-import org.springframework.cloud.sleuth.api.CurrentTraceContext;
-import org.springframework.cloud.sleuth.api.http.HttpClientHandler;
+import org.springframework.cloud.sleuth.CurrentTraceContext;
+import org.springframework.cloud.sleuth.http.HttpClientHandler;
/**
* Lazy implementation of the Feign Client.
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/feign/LazyTracingFeignClient.java b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/feign/LazyTracingFeignClient.java
similarity index 94%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/feign/LazyTracingFeignClient.java
rename to spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/feign/LazyTracingFeignClient.java
index dd8ee9851..6e563bb0c 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/feign/LazyTracingFeignClient.java
+++ b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/feign/LazyTracingFeignClient.java
@@ -25,8 +25,8 @@ import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.BeanFactory;
-import org.springframework.cloud.sleuth.api.CurrentTraceContext;
-import org.springframework.cloud.sleuth.api.http.HttpClientHandler;
+import org.springframework.cloud.sleuth.CurrentTraceContext;
+import org.springframework.cloud.sleuth.http.HttpClientHandler;
/**
* Lazilly resolves the Trace Feign Client.
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/feign/OkHttpFeignClientBeanPostProcessor.java b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/feign/OkHttpFeignClientBeanPostProcessor.java
similarity index 91%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/feign/OkHttpFeignClientBeanPostProcessor.java
rename to spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/feign/OkHttpFeignClientBeanPostProcessor.java
index c4193066d..e79cc6e23 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/feign/OkHttpFeignClientBeanPostProcessor.java
+++ b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/feign/OkHttpFeignClientBeanPostProcessor.java
@@ -29,11 +29,11 @@ import org.springframework.beans.factory.config.BeanPostProcessor;
* @author Marcin Grzejszczak
* @since 1.1.3
*/
-final class OkHttpFeignClientBeanPostProcessor implements BeanPostProcessor {
+public class OkHttpFeignClientBeanPostProcessor implements BeanPostProcessor {
private final BeanFactory beanFactory;
- OkHttpFeignClientBeanPostProcessor(BeanFactory beanFactory) {
+ public OkHttpFeignClientBeanPostProcessor(BeanFactory beanFactory) {
this.beanFactory = beanFactory;
}
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/feign/SleuthFeignBuilder.java b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/feign/SleuthFeignBuilder.java
similarity index 93%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/feign/SleuthFeignBuilder.java
rename to spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/feign/SleuthFeignBuilder.java
index a0d89ec29..70d3f25ad 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/feign/SleuthFeignBuilder.java
+++ b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/feign/SleuthFeignBuilder.java
@@ -30,12 +30,12 @@ import org.springframework.beans.factory.BeanFactory;
* @author Marcin Grzejszczak
* @since 1.0.0
*/
-final class SleuthFeignBuilder {
+public final class SleuthFeignBuilder {
private SleuthFeignBuilder() {
}
- static Feign.Builder builder(BeanFactory beanFactory) {
+ public static Feign.Builder builder(BeanFactory beanFactory) {
return Feign.builder().retryer(Retryer.NEVER_RETRY).client(client(beanFactory));
}
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/feign/TraceFeignAspect.java b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/feign/TraceFeignAspect.java
similarity index 96%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/feign/TraceFeignAspect.java
rename to spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/feign/TraceFeignAspect.java
index 038b5af1e..d2cabe30e 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/feign/TraceFeignAspect.java
+++ b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/feign/TraceFeignAspect.java
@@ -35,13 +35,13 @@ import org.springframework.beans.factory.BeanFactory;
* @since 1.1.2
*/
@Aspect
-class TraceFeignAspect {
+public class TraceFeignAspect {
private static final Log log = LogFactory.getLog(TraceFeignAspect.class);
private final BeanFactory beanFactory;
- TraceFeignAspect(BeanFactory beanFactory) {
+ public TraceFeignAspect(BeanFactory beanFactory) {
this.beanFactory = beanFactory;
}
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/feign/TraceFeignBlockingLoadBalancerClient.java b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/feign/TraceFeignBlockingLoadBalancerClient.java
similarity index 94%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/feign/TraceFeignBlockingLoadBalancerClient.java
rename to spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/feign/TraceFeignBlockingLoadBalancerClient.java
index fc4faffe8..7909938bc 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/feign/TraceFeignBlockingLoadBalancerClient.java
+++ b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/feign/TraceFeignBlockingLoadBalancerClient.java
@@ -29,10 +29,10 @@ import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.cloud.client.loadbalancer.reactive.LoadBalancerProperties;
import org.springframework.cloud.loadbalancer.support.LoadBalancerClientFactory;
import org.springframework.cloud.openfeign.loadbalancer.FeignBlockingLoadBalancerClient;
-import org.springframework.cloud.sleuth.api.CurrentTraceContext;
-import org.springframework.cloud.sleuth.api.Span;
-import org.springframework.cloud.sleuth.api.Tracer;
-import org.springframework.cloud.sleuth.api.http.HttpClientHandler;
+import org.springframework.cloud.sleuth.CurrentTraceContext;
+import org.springframework.cloud.sleuth.Span;
+import org.springframework.cloud.sleuth.Tracer;
+import org.springframework.cloud.sleuth.http.HttpClientHandler;
/**
* A trace representation of {@link FeignBlockingLoadBalancerClient}.
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/feign/TraceFeignContext.java b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/feign/TraceFeignContext.java
similarity index 100%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/feign/TraceFeignContext.java
rename to spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/feign/TraceFeignContext.java
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/feign/TraceFeignObjectWrapper.java b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/feign/TraceFeignObjectWrapper.java
similarity index 100%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/feign/TraceFeignObjectWrapper.java
rename to spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/feign/TraceFeignObjectWrapper.java
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/feign/TraceRetryableFeignBlockingLoadBalancerClient.java b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/feign/TraceRetryableFeignBlockingLoadBalancerClient.java
similarity index 94%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/feign/TraceRetryableFeignBlockingLoadBalancerClient.java
rename to spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/feign/TraceRetryableFeignBlockingLoadBalancerClient.java
index f667f6c22..147dadc86 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/feign/TraceRetryableFeignBlockingLoadBalancerClient.java
+++ b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/feign/TraceRetryableFeignBlockingLoadBalancerClient.java
@@ -30,10 +30,10 @@ import org.springframework.cloud.client.loadbalancer.reactive.LoadBalancerProper
import org.springframework.cloud.loadbalancer.blocking.client.BlockingLoadBalancerClient;
import org.springframework.cloud.loadbalancer.support.LoadBalancerClientFactory;
import org.springframework.cloud.openfeign.loadbalancer.RetryableFeignBlockingLoadBalancerClient;
-import org.springframework.cloud.sleuth.api.CurrentTraceContext;
-import org.springframework.cloud.sleuth.api.Span;
-import org.springframework.cloud.sleuth.api.Tracer;
-import org.springframework.cloud.sleuth.api.http.HttpClientHandler;
+import org.springframework.cloud.sleuth.CurrentTraceContext;
+import org.springframework.cloud.sleuth.Span;
+import org.springframework.cloud.sleuth.Tracer;
+import org.springframework.cloud.sleuth.http.HttpClientHandler;
/**
* A trace representation of {@link RetryableFeignBlockingLoadBalancerClient}. Needed due
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/feign/TracingFeignClient.java b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/feign/TracingFeignClient.java
similarity index 95%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/feign/TracingFeignClient.java
rename to spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/feign/TracingFeignClient.java
index 4622887a9..6493dddcc 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/feign/TracingFeignClient.java
+++ b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/feign/TracingFeignClient.java
@@ -30,11 +30,11 @@ import feign.Response;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-import org.springframework.cloud.sleuth.api.CurrentTraceContext;
-import org.springframework.cloud.sleuth.api.Span;
-import org.springframework.cloud.sleuth.api.http.HttpClientHandler;
-import org.springframework.cloud.sleuth.api.http.HttpClientRequest;
-import org.springframework.cloud.sleuth.api.http.HttpClientResponse;
+import org.springframework.cloud.sleuth.CurrentTraceContext;
+import org.springframework.cloud.sleuth.Span;
+import org.springframework.cloud.sleuth.http.HttpClientHandler;
+import org.springframework.cloud.sleuth.http.HttpClientRequest;
+import org.springframework.cloud.sleuth.http.HttpClientResponse;
import org.springframework.cloud.util.ProxyUtils;
import org.springframework.lang.Nullable;
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/mvc/HandlerParser.java b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/mvc/HandlerParser.java
similarity index 97%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/mvc/HandlerParser.java
rename to spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/mvc/HandlerParser.java
index b1587f2bf..571fc1585 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/mvc/HandlerParser.java
+++ b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/mvc/HandlerParser.java
@@ -19,7 +19,7 @@ package org.springframework.cloud.sleuth.instrument.web.mvc;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
-import org.springframework.cloud.sleuth.api.SpanCustomizer;
+import org.springframework.cloud.sleuth.SpanCustomizer;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/mvc/SpanCustomizingAsyncHandlerInterceptor.java b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/mvc/SpanCustomizingAsyncHandlerInterceptor.java
similarity index 97%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/mvc/SpanCustomizingAsyncHandlerInterceptor.java
rename to spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/mvc/SpanCustomizingAsyncHandlerInterceptor.java
index 355dcc5d5..7d3fa7b1b 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/mvc/SpanCustomizingAsyncHandlerInterceptor.java
+++ b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/mvc/SpanCustomizingAsyncHandlerInterceptor.java
@@ -20,7 +20,7 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.cloud.sleuth.api.SpanCustomizer;
+import org.springframework.cloud.sleuth.SpanCustomizer;
import org.springframework.cloud.sleuth.instrument.web.servlet.TracingFilter;
import org.springframework.web.servlet.AsyncHandlerInterceptor;
import org.springframework.web.servlet.HandlerInterceptor;
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/mvc/SpanCustomizingHandlerInterceptor.java b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/mvc/SpanCustomizingHandlerInterceptor.java
similarity index 98%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/mvc/SpanCustomizingHandlerInterceptor.java
rename to spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/mvc/SpanCustomizingHandlerInterceptor.java
index 2ae085a86..6063b1035 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/mvc/SpanCustomizingHandlerInterceptor.java
+++ b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/mvc/SpanCustomizingHandlerInterceptor.java
@@ -20,7 +20,7 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.cloud.sleuth.api.SpanCustomizer;
+import org.springframework.cloud.sleuth.SpanCustomizer;
import org.springframework.cloud.sleuth.instrument.web.servlet.TracingFilter;
import org.springframework.lang.Nullable;
import org.springframework.web.servlet.HandlerInterceptor;
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/mvc/TraceContextListenableFuture.java b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/mvc/TraceContextListenableFuture.java
similarity index 97%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/mvc/TraceContextListenableFuture.java
rename to spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/mvc/TraceContextListenableFuture.java
index 93f50196c..88ac53a02 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/mvc/TraceContextListenableFuture.java
+++ b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/mvc/TraceContextListenableFuture.java
@@ -20,8 +20,8 @@ import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
-import org.springframework.cloud.sleuth.api.CurrentTraceContext;
-import org.springframework.cloud.sleuth.api.TraceContext;
+import org.springframework.cloud.sleuth.CurrentTraceContext;
+import org.springframework.cloud.sleuth.TraceContext;
import org.springframework.util.concurrent.FailureCallback;
import org.springframework.util.concurrent.ListenableFuture;
import org.springframework.util.concurrent.ListenableFutureCallback;
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/mvc/TracingAsyncClientHttpRequestInterceptor.java b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/mvc/TracingAsyncClientHttpRequestInterceptor.java
similarity index 93%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/mvc/TracingAsyncClientHttpRequestInterceptor.java
rename to spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/mvc/TracingAsyncClientHttpRequestInterceptor.java
index 2981ee127..24c314df2 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/mvc/TracingAsyncClientHttpRequestInterceptor.java
+++ b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/mvc/TracingAsyncClientHttpRequestInterceptor.java
@@ -19,10 +19,10 @@ package org.springframework.cloud.sleuth.instrument.web.mvc;
import java.io.IOException;
import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.cloud.sleuth.api.CurrentTraceContext;
-import org.springframework.cloud.sleuth.api.Span;
-import org.springframework.cloud.sleuth.api.TraceContext;
-import org.springframework.cloud.sleuth.api.http.HttpClientHandler;
+import org.springframework.cloud.sleuth.CurrentTraceContext;
+import org.springframework.cloud.sleuth.Span;
+import org.springframework.cloud.sleuth.TraceContext;
+import org.springframework.cloud.sleuth.http.HttpClientHandler;
import org.springframework.cloud.sleuth.instrument.web.mvc.TracingClientHttpRequestInterceptor.ClientHttpResponseWrapper;
import org.springframework.cloud.sleuth.instrument.web.mvc.TracingClientHttpRequestInterceptor.HttpRequestWrapper;
import org.springframework.http.HttpRequest;
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/mvc/TracingClientHttpRequestInterceptor.java b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/mvc/TracingClientHttpRequestInterceptor.java
similarity index 93%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/mvc/TracingClientHttpRequestInterceptor.java
rename to spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/mvc/TracingClientHttpRequestInterceptor.java
index 3eb7dfe9e..1b9909ab0 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/mvc/TracingClientHttpRequestInterceptor.java
+++ b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/mvc/TracingClientHttpRequestInterceptor.java
@@ -24,11 +24,11 @@ import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.cloud.sleuth.api.CurrentTraceContext;
-import org.springframework.cloud.sleuth.api.Span;
-import org.springframework.cloud.sleuth.api.http.HttpClientHandler;
-import org.springframework.cloud.sleuth.api.http.HttpClientRequest;
-import org.springframework.cloud.sleuth.api.http.HttpClientResponse;
+import org.springframework.cloud.sleuth.CurrentTraceContext;
+import org.springframework.cloud.sleuth.Span;
+import org.springframework.cloud.sleuth.http.HttpClientHandler;
+import org.springframework.cloud.sleuth.http.HttpClientRequest;
+import org.springframework.cloud.sleuth.http.HttpClientResponse;
import org.springframework.http.HttpRequest;
import org.springframework.http.client.ClientHttpRequestExecution;
import org.springframework.http.client.ClientHttpRequestInterceptor;
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/mvc/WebMvcRuntime.java b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/mvc/WebMvcRuntime.java
similarity index 94%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/mvc/WebMvcRuntime.java
rename to spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/mvc/WebMvcRuntime.java
index 68eb5d0e0..f228016aa 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/mvc/WebMvcRuntime.java
+++ b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/mvc/WebMvcRuntime.java
@@ -16,8 +16,8 @@
package org.springframework.cloud.sleuth.instrument.web.mvc;
-import org.springframework.cloud.sleuth.api.CurrentTraceContext;
-import org.springframework.cloud.sleuth.api.http.HttpServerHandler;
+import org.springframework.cloud.sleuth.CurrentTraceContext;
+import org.springframework.cloud.sleuth.http.HttpServerHandler;
import org.springframework.context.ApplicationContext;
import org.springframework.web.method.HandlerMethod;
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/mvc/package-info.java b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/mvc/package-info.java
similarity index 100%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/mvc/package-info.java
rename to spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/mvc/package-info.java
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/servlet/HttpServletRequestWrapper.java b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/servlet/HttpServletRequestWrapper.java
similarity index 97%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/servlet/HttpServletRequestWrapper.java
rename to spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/servlet/HttpServletRequestWrapper.java
index 667c9ddb3..f3f028b66 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/servlet/HttpServletRequestWrapper.java
+++ b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/servlet/HttpServletRequestWrapper.java
@@ -22,7 +22,7 @@ import java.util.Collections;
import javax.servlet.RequestDispatcher;
import javax.servlet.http.HttpServletRequest;
-import org.springframework.cloud.sleuth.api.http.HttpServerRequest;
+import org.springframework.cloud.sleuth.http.HttpServerRequest;
import org.springframework.lang.Nullable;
/**
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/servlet/HttpServletResponseWrapper.java b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/servlet/HttpServletResponseWrapper.java
similarity index 97%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/servlet/HttpServletResponseWrapper.java
rename to spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/servlet/HttpServletResponseWrapper.java
index 9c511fba5..6e6f9d7d4 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/servlet/HttpServletResponseWrapper.java
+++ b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/servlet/HttpServletResponseWrapper.java
@@ -22,7 +22,7 @@ import javax.servlet.UnavailableException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
-import org.springframework.cloud.sleuth.api.http.HttpServerResponse;
+import org.springframework.cloud.sleuth.http.HttpServerResponse;
import org.springframework.lang.Nullable;
/**
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/servlet/ServletRuntime.java b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/servlet/ServletRuntime.java
similarity index 97%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/servlet/ServletRuntime.java
rename to spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/servlet/ServletRuntime.java
index e157aa6af..8a5abd26a 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/servlet/ServletRuntime.java
+++ b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/servlet/ServletRuntime.java
@@ -27,9 +27,9 @@ import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
-import org.springframework.cloud.sleuth.api.Span;
-import org.springframework.cloud.sleuth.api.http.HttpServerHandler;
-import org.springframework.cloud.sleuth.api.http.HttpServerResponse;
+import org.springframework.cloud.sleuth.Span;
+import org.springframework.cloud.sleuth.http.HttpServerHandler;
+import org.springframework.cloud.sleuth.http.HttpServerResponse;
/**
* Access to servlet version-specific features.
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/servlet/TracingFilter.java b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/servlet/TracingFilter.java
similarity index 91%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/servlet/TracingFilter.java
rename to spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/servlet/TracingFilter.java
index 25002f775..3f589c893 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/servlet/TracingFilter.java
+++ b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/servlet/TracingFilter.java
@@ -28,12 +28,12 @@ import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
-import org.springframework.cloud.sleuth.api.CurrentTraceContext;
-import org.springframework.cloud.sleuth.api.Span;
-import org.springframework.cloud.sleuth.api.SpanCustomizer;
-import org.springframework.cloud.sleuth.api.TraceContext;
-import org.springframework.cloud.sleuth.api.http.HttpServerHandler;
-import org.springframework.cloud.sleuth.api.http.HttpServerResponse;
+import org.springframework.cloud.sleuth.CurrentTraceContext;
+import org.springframework.cloud.sleuth.Span;
+import org.springframework.cloud.sleuth.SpanCustomizer;
+import org.springframework.cloud.sleuth.TraceContext;
+import org.springframework.cloud.sleuth.http.HttpServerHandler;
+import org.springframework.cloud.sleuth.http.HttpServerResponse;
public final class TracingFilter implements Filter {
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/servlet/package-info.java b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/servlet/package-info.java
similarity index 100%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/servlet/package-info.java
rename to spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/instrument/web/servlet/package-info.java
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/internal/DefaultSpanNamer.java b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/internal/DefaultSpanNamer.java
similarity index 100%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/internal/DefaultSpanNamer.java
rename to spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/internal/DefaultSpanNamer.java
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/internal/LazyBean.java b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/internal/LazyBean.java
similarity index 100%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/internal/LazyBean.java
rename to spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/internal/LazyBean.java
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/internal/SpanNameUtil.java b/spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/internal/SpanNameUtil.java
similarity index 100%
rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/internal/SpanNameUtil.java
rename to spring-cloud-sleuth-instrumentation/src/main/java/org/springframework/cloud/sleuth/internal/SpanNameUtil.java
diff --git a/spring-cloud-sleuth-instrumentation/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/spring-cloud-sleuth-instrumentation/src/main/resources/META-INF/additional-spring-configuration-metadata.json
new file mode 100644
index 000000000..828f8064d
--- /dev/null
+++ b/spring-cloud-sleuth-instrumentation/src/main/resources/META-INF/additional-spring-configuration-metadata.json
@@ -0,0 +1,100 @@
+{
+ "properties": [
+ {
+ "name": "spring.sleuth.integration.enabled",
+ "type": "java.lang.Boolean",
+ "description": "Enable Spring Integration sleuth instrumentation.",
+ "defaultValue": true
+ },
+ {
+ "name": "spring.sleuth.integration.websockets.enabled",
+ "type": "java.lang.Boolean",
+ "description": "Enable tracing for WebSockets.",
+ "defaultValue": true
+ },
+ {
+ "name": "spring.sleuth.async.enabled",
+ "type": "java.lang.Boolean",
+ "description": "Enable instrumenting async related components so that the tracing information is passed between threads.",
+ "defaultValue": true
+ },
+ {
+ "name": "spring.sleuth.async.configurer.enabled",
+ "type": "java.lang.Boolean",
+ "description": "Enable default AsyncConfigurer.",
+ "defaultValue": true
+ },
+ {
+ "name": "spring.sleuth.feign.enabled",
+ "type": "java.lang.Boolean",
+ "description": "Enable span information propagation when using Feign.",
+ "defaultValue": true
+ },
+ {
+ "name": "spring.sleuth.feign.processor.enabled",
+ "type": "java.lang.Boolean",
+ "description": "Enable post processor that wraps Feign Context in its tracing representations.",
+ "defaultValue": true
+ },
+ {
+ "name": "spring.sleuth.grpc.enabled",
+ "type": "java.lang.Boolean",
+ "description": "Enable span information propagation when using GRPC.",
+ "defaultValue": true
+ },
+ {
+ "name": "spring.sleuth.messaging.jms.enabled",
+ "type": "java.lang.Boolean",
+ "description": "Enable tracing of JMS.",
+ "defaultValue": true
+ },
+ {
+ "name": "spring.sleuth.messaging.rabbit.enabled",
+ "type": "java.lang.Boolean",
+ "description": "Enable tracing of RabbitMQ.",
+ "defaultValue": true
+ },
+ {
+ "name": "spring.sleuth.messaging.kafka.enabled",
+ "type": "java.lang.Boolean",
+ "description": "Enable tracing of Kafka.",
+ "defaultValue": true
+ },
+ {
+ "name": "spring.sleuth.messaging.kafka.mapper.enabled",
+ "type": "java.lang.Boolean",
+ "description": "Enable DefaultKafkaHeaderMapper tracing for Kafka.",
+ "defaultValue": true
+ },
+ {
+ "name": "spring.sleuth.quartz.enabled",
+ "type": "java.lang.Boolean",
+ "description": "Enable tracing for Quartz.",
+ "defaultValue": true
+ },
+ {
+ "name": "spring.sleuth.mongodb.enabled",
+ "type": "java.lang.Boolean",
+ "description": "Enable tracing for MongoDb.",
+ "defaultValue": true
+ },
+ {
+ "name": "spring.sleuth.rpc.enabled",
+ "type": "java.lang.Boolean",
+ "description": "Enable tracing of RPC.",
+ "defaultValue": true
+ },
+ {
+ "name": "spring.sleuth.sampler.refresh.enabled",
+ "type": "java.lang.Boolean",
+ "description": "Enable refresh scope for sampler.",
+ "defaultValue": true
+ },
+ {
+ "name": "spring.sleuth.web.webclient.enabled",
+ "type": "java.lang.Boolean",
+ "description": "Enable tracing instrumentation for WebClient.",
+ "defaultValue": true
+ }
+ ]
+}
diff --git a/spring-cloud-sleuth-instrumentation/src/test/java/org/springframework/cloud/sleuth/ArchitectureTests.java b/spring-cloud-sleuth-instrumentation/src/test/java/org/springframework/cloud/sleuth/ArchitectureTests.java
new file mode 100644
index 000000000..434c404af
--- /dev/null
+++ b/spring-cloud-sleuth-instrumentation/src/test/java/org/springframework/cloud/sleuth/ArchitectureTests.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2013-2020 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.springframework.cloud.sleuth;
+
+import com.tngtech.archunit.core.importer.ImportOption;
+import com.tngtech.archunit.core.importer.Location;
+import com.tngtech.archunit.junit.AnalyzeClasses;
+import com.tngtech.archunit.junit.ArchTest;
+import com.tngtech.archunit.lang.ArchRule;
+
+import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.noClasses;
+
+@AnalyzeClasses(packagesOf = ArchitectureTests.class, importOptions = ArchitectureTests.ProductionCode.class)
+public class ArchitectureTests {
+
+ @ArchTest
+ public static final ArchRule should_not_contain_any_spring_configuration_reference_in_module = noClasses().should()
+ .dependOnClassesThat().resideInAnyPackage("..org.springframework.boot.context.properties..",
+ "..org.springframework.context.annotation..");
+
+ static class ProductionCode implements ImportOption {
+
+ @Override
+ public boolean includes(Location location) {
+ return Predefined.DO_NOT_INCLUDE_TESTS.includes(location)
+ && Predefined.DO_NOT_INCLUDE_JARS.includes(location);
+ }
+
+ }
+
+}
diff --git a/spring-cloud-sleuth-instrumentation/src/test/java/org/springframework/cloud/sleuth/annotation/NoOpTagValueResolverTests.java b/spring-cloud-sleuth-instrumentation/src/test/java/org/springframework/cloud/sleuth/annotation/NoOpTagValueResolverTests.java
new file mode 100644
index 000000000..75ce679cd
--- /dev/null
+++ b/spring-cloud-sleuth-instrumentation/src/test/java/org/springframework/cloud/sleuth/annotation/NoOpTagValueResolverTests.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2013-2020 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.springframework.cloud.sleuth.annotation;
+
+import org.junit.jupiter.api.Test;
+
+import static org.assertj.core.api.BDDAssertions.then;
+
+/**
+ * @author Marcin Grzejszczak
+ */
+public class NoOpTagValueResolverTests {
+
+ @Test
+ public void should_return_null() throws Exception {
+ then(new NoOpTagValueResolver().resolve("")).isNull();
+ }
+
+}
diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/annotation/SpelTagValueExpressionResolverTests.java b/spring-cloud-sleuth-instrumentation/src/test/java/org/springframework/cloud/sleuth/annotation/SpelTagValueExpressionResolverTests.java
similarity index 94%
rename from spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/annotation/SpelTagValueExpressionResolverTests.java
rename to spring-cloud-sleuth-instrumentation/src/test/java/org/springframework/cloud/sleuth/annotation/SpelTagValueExpressionResolverTests.java
index 1b47e90b9..f77bee18c 100644
--- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/annotation/SpelTagValueExpressionResolverTests.java
+++ b/spring-cloud-sleuth-instrumentation/src/test/java/org/springframework/cloud/sleuth/annotation/SpelTagValueExpressionResolverTests.java
@@ -18,6 +18,8 @@ package org.springframework.cloud.sleuth.annotation;
import org.junit.jupiter.api.Test;
+import org.springframework.cloud.sleuth.instrument.annotation.SpelTagValueExpressionResolver;
+
import static org.assertj.core.api.BDDAssertions.then;
/**
diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/async/ExecutorBeanPostProcessorTests.java b/spring-cloud-sleuth-instrumentation/src/test/java/org/springframework/cloud/sleuth/instrument/async/ExecutorInstrumentorTests.java
similarity index 74%
rename from spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/async/ExecutorBeanPostProcessorTests.java
rename to spring-cloud-sleuth-instrumentation/src/test/java/org/springframework/cloud/sleuth/instrument/async/ExecutorInstrumentorTests.java
index 73b3ac8fc..c935a31be 100644
--- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/async/ExecutorBeanPostProcessorTests.java
+++ b/spring-cloud-sleuth-instrumentation/src/test/java/org/springframework/cloud/sleuth/instrument/async/ExecutorInstrumentorTests.java
@@ -35,12 +35,10 @@ import java.util.concurrent.atomic.AtomicBoolean;
import org.aopalliance.aop.Advice;
import org.assertj.core.api.BDDAssertions;
import org.awaitility.Awaitility;
-import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.BDDMockito;
import org.mockito.Mock;
-import org.mockito.Mockito;
import org.mockito.junit.jupiter.MockitoExtension;
import org.springframework.aop.framework.AopConfigException;
@@ -58,22 +56,14 @@ import org.springframework.security.concurrent.DelegatingSecurityContextExecutor
* @author Vladislav Fefelov
*/
@ExtendWith(MockitoExtension.class)
-public class ExecutorBeanPostProcessorTests {
+public class ExecutorInstrumentorTests {
@Mock(lenient = true)
BeanFactory beanFactory;
- private SleuthAsyncProperties sleuthAsyncProperties;
-
- @BeforeEach
- public void setup() {
- this.sleuthAsyncProperties = new SleuthAsyncProperties();
- Mockito.when(this.beanFactory.getBean(SleuthAsyncProperties.class)).thenReturn(this.sleuthAsyncProperties);
- }
-
@Test
public void should_create_a_cglib_proxy_by_default() throws Exception {
- Object o = new ExecutorBeanPostProcessor(this.beanFactory).postProcessAfterInitialization(new Foo(), "foo");
+ Object o = new ExecutorInstrumentor(Collections::emptyList, beanFactory).instrument(new Foo(), "foo");
BDDAssertions.then(o).isInstanceOf(Foo.class);
BDDAssertions.then(AopUtils.isCglibProxy(o)).isTrue();
@@ -83,7 +73,7 @@ public class ExecutorBeanPostProcessorTests {
public void should_fallback_to_sleuth_implementation_when_cglib_cannot_be_created_for_executor() throws Exception {
ExecutorService service = Executors.newSingleThreadExecutor();
- Object o = new ExecutorBeanPostProcessor(this.beanFactory).postProcessAfterInitialization(service, "foo");
+ Object o = new ExecutorInstrumentor(Collections::emptyList, beanFactory).instrument(service, "foo");
BDDAssertions.then(o).isInstanceOf(TraceableExecutorService.class);
service.shutdown();
@@ -94,7 +84,7 @@ public class ExecutorBeanPostProcessorTests {
throws Exception {
ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
- Object o = new ExecutorBeanPostProcessor(this.beanFactory).postProcessAfterInitialization(service, "foo");
+ Object o = new ExecutorInstrumentor(Collections::emptyList, beanFactory).instrument(service, "foo");
BDDAssertions.then(o).isInstanceOf(TraceableScheduledExecutorService.class);
service.shutdown();
@@ -104,7 +94,7 @@ public class ExecutorBeanPostProcessorTests {
public void should_do_nothing_when_bean_is_already_lazy_trace_async_task_executor() throws Exception {
LazyTraceAsyncTaskExecutor service = BDDMockito.mock(LazyTraceAsyncTaskExecutor.class);
- Object o = new ExecutorBeanPostProcessor(this.beanFactory).postProcessAfterInitialization(service, "foo");
+ Object o = new ExecutorInstrumentor(Collections::emptyList, beanFactory).instrument(service, "foo");
BDDAssertions.then(o).isSameAs(service);
}
@@ -113,7 +103,7 @@ public class ExecutorBeanPostProcessorTests {
public void should_do_nothing_when_bean_is_already_lazy_trace_executor() throws Exception {
LazyTraceExecutor service = BDDMockito.mock(LazyTraceExecutor.class);
- Object o = new ExecutorBeanPostProcessor(this.beanFactory).postProcessAfterInitialization(service, "foo");
+ Object o = new ExecutorInstrumentor(Collections::emptyList, beanFactory).instrument(service, "foo");
BDDAssertions.then(o).isSameAs(service);
}
@@ -122,7 +112,7 @@ public class ExecutorBeanPostProcessorTests {
public void should_do_nothing_when_bean_is_already_lazy_thread_pool_task_executor() throws Exception {
LazyTraceThreadPoolTaskExecutor service = BDDMockito.mock(LazyTraceThreadPoolTaskExecutor.class);
- Object o = new ExecutorBeanPostProcessor(this.beanFactory).postProcessAfterInitialization(service, "foo");
+ Object o = new ExecutorInstrumentor(Collections::emptyList, beanFactory).instrument(service, "foo");
BDDAssertions.then(o).isSameAs(service);
}
@@ -131,7 +121,7 @@ public class ExecutorBeanPostProcessorTests {
public void should_do_nothing_when_bean_is_already_traceable_executor() throws Exception {
TraceableExecutorService service = BDDMockito.mock(TraceableExecutorService.class);
- Object o = new ExecutorBeanPostProcessor(this.beanFactory).postProcessAfterInitialization(service, "foo");
+ Object o = new ExecutorInstrumentor(Collections::emptyList, beanFactory).instrument(service, "foo");
BDDAssertions.then(o).isSameAs(service);
}
@@ -140,7 +130,7 @@ public class ExecutorBeanPostProcessorTests {
public void should_do_nothing_when_bean_is_already_traceable_scheduled_executor() throws Exception {
TraceableScheduledExecutorService service = BDDMockito.mock(TraceableScheduledExecutorService.class);
- Object o = new ExecutorBeanPostProcessor(this.beanFactory).postProcessAfterInitialization(service, "foo");
+ Object o = new ExecutorInstrumentor(Collections::emptyList, beanFactory).instrument(service, "foo");
BDDAssertions.then(o).isSameAs(service);
}
@@ -148,7 +138,7 @@ public class ExecutorBeanPostProcessorTests {
@Test
public void should_fallback_to_default_implementation_when_exception_thrown() throws Exception {
ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
- ExecutorBeanPostProcessor bpp = new ExecutorBeanPostProcessor(this.beanFactory) {
+ ExecutorInstrumentor bpp = new ExecutorInstrumentor(Collections::emptyList, beanFactory) {
@Override
Object createProxy(Object bean, boolean cglibProxy, Advice advice) {
@@ -157,7 +147,7 @@ public class ExecutorBeanPostProcessorTests {
};
- Object wrappedService = bpp.postProcessAfterInitialization(service, "foo");
+ Object wrappedService = bpp.instrument(service, "foo");
BDDAssertions.then(wrappedService).isInstanceOf(TraceableScheduledExecutorService.class);
service.shutdown();
@@ -165,8 +155,8 @@ public class ExecutorBeanPostProcessorTests {
@Test
public void should_create_a_cglib_proxy_by_default_for_ThreadPoolTaskExecutor() throws Exception {
- Object o = new ExecutorBeanPostProcessor(this.beanFactory)
- .postProcessAfterInitialization(new FooThreadPoolTaskExecutor(), "foo");
+ Object o = new ExecutorInstrumentor(Collections::emptyList, beanFactory)
+ .instrument(new FooThreadPoolTaskExecutor(), "foo");
BDDAssertions.then(o).isInstanceOf(FooThreadPoolTaskExecutor.class);
BDDAssertions.then(AopUtils.isCglibProxy(o)).isTrue();
@@ -176,7 +166,7 @@ public class ExecutorBeanPostProcessorTests {
public void should_throw_exception_when_it_is_not_possible_to_create_any_proxy_for_ThreadPoolTaskExecutor()
throws Exception {
ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
- ExecutorBeanPostProcessor bpp = new ExecutorBeanPostProcessor(this.beanFactory) {
+ ExecutorInstrumentor bpp = new ExecutorInstrumentor(Collections::emptyList, beanFactory) {
@Override
Object createThreadPoolTaskExecutorProxy(Object bean, boolean cglibProxy, ThreadPoolTaskExecutor executor,
String beanName) {
@@ -184,22 +174,22 @@ public class ExecutorBeanPostProcessorTests {
}
};
- BDDAssertions.thenThrownBy(() -> bpp.postProcessAfterInitialization(taskExecutor, "foo"))
- .isInstanceOf(AopConfigException.class).hasMessage("foo");
+ BDDAssertions.thenThrownBy(() -> bpp.instrument(taskExecutor, "foo")).isInstanceOf(AopConfigException.class)
+ .hasMessage("foo");
}
@Test
public void should_fallback_to_sleuth_impl_when_it_is_not_possible_to_create_any_proxy_for_ExecutorService()
throws Exception {
ExecutorService service = BDDMockito.mock(ExecutorService.class);
- ExecutorBeanPostProcessor bpp = new ExecutorBeanPostProcessor(this.beanFactory) {
+ ExecutorInstrumentor bpp = new ExecutorInstrumentor(Collections::emptyList, beanFactory) {
@Override
Object getObject(ProxyFactoryBean factory) {
throw new AopConfigException("foo");
}
};
- Object o = bpp.postProcessAfterInitialization(service, "foo");
+ Object o = bpp.instrument(service, "foo");
BDDAssertions.then(o).isInstanceOf(TraceableExecutorService.class);
}
@@ -207,9 +197,9 @@ public class ExecutorBeanPostProcessorTests {
@Test
public void should_throw_exception_from_the_wrapped_object() throws Exception {
ExecutorService service = exceptionThrowingExecutorService();
- ExecutorBeanPostProcessor bpp = new ExecutorBeanPostProcessor(this.beanFactory);
+ ExecutorInstrumentor bpp = new ExecutorInstrumentor(Collections::emptyList, beanFactory);
- ExecutorService o = (ExecutorService) bpp.postProcessAfterInitialization(service, "foo");
+ ExecutorService o = (ExecutorService) bpp.instrument(service, "foo");
BDDAssertions.thenThrownBy(() -> o.submit((Callable) () -> "hello")).hasMessage("foo")
.isInstanceOf(IllegalStateException.class);
@@ -289,9 +279,9 @@ public class ExecutorBeanPostProcessorTests {
@Test
public void should_use_jdk_proxy_when_executor_has_final_methods() {
- ExecutorBeanPostProcessor beanPostProcessor = new ExecutorBeanPostProcessor(this.beanFactory);
+ ExecutorInstrumentor beanPostProcessor = new ExecutorInstrumentor(Collections::emptyList, beanFactory);
Executor executor = Runnable::run;
- Executor wrappedExecutor = (Executor) beanPostProcessor.postProcessAfterInitialization(executor, "executor");
+ Executor wrappedExecutor = (Executor) beanPostProcessor.instrument(executor, "executor");
BDDAssertions.then(AopUtils.isJdkDynamicProxy(wrappedExecutor)).isTrue();
BDDAssertions.then(AopUtils.isCglibProxy(wrappedExecutor)).isFalse();
@@ -305,10 +295,10 @@ public class ExecutorBeanPostProcessorTests {
@Test
public void should_use_cglib_proxy_when_an_executor_has_a_final_package_protected_method() {
- ExecutorBeanPostProcessor beanPostProcessor = new ExecutorBeanPostProcessor(this.beanFactory);
+ ExecutorInstrumentor beanPostProcessor = new ExecutorInstrumentor(Collections::emptyList, beanFactory);
ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(10);
ScheduledThreadPoolExecutor wrappedExecutor = (ScheduledThreadPoolExecutor) beanPostProcessor
- .postProcessAfterInitialization(executor, "executor");
+ .instrument(executor, "executor");
BDDAssertions.then(AopUtils.isCglibProxy(wrappedExecutor)).isTrue();
@@ -319,11 +309,11 @@ public class ExecutorBeanPostProcessorTests {
@Test
public void should_use_jdk_proxy_when_executor_service_has_final_methods() throws Exception {
- ExecutorBeanPostProcessor beanPostProcessor = new ExecutorBeanPostProcessor(this.beanFactory);
+ ExecutorInstrumentor beanPostProcessor = new ExecutorInstrumentor(Collections::emptyList, beanFactory);
ExecutorService executorService = new DelegatingSecurityContextExecutorService(
Executors.newSingleThreadExecutor());
- ExecutorService wrappedExecutor = (ExecutorService) beanPostProcessor
- .postProcessAfterInitialization(executorService, "executorService");
+ ExecutorService wrappedExecutor = (ExecutorService) beanPostProcessor.instrument(executorService,
+ "executorService");
BDDAssertions.then(AopUtils.isJdkDynamicProxy(wrappedExecutor)).isTrue();
BDDAssertions.then(AopUtils.isCglibProxy(wrappedExecutor)).isFalse();
@@ -333,10 +323,10 @@ public class ExecutorBeanPostProcessorTests {
@Test
public void should_use_jdk_proxy_when_async_task_executor_has_final_methods() throws Exception {
- ExecutorBeanPostProcessor beanPostProcessor = new ExecutorBeanPostProcessor(this.beanFactory);
+ ExecutorInstrumentor beanPostProcessor = new ExecutorInstrumentor(Collections::emptyList, beanFactory);
- AsyncTaskExecutor wrappedExecutor = (AsyncTaskExecutor) beanPostProcessor
- .postProcessAfterInitialization(new DirectTaskExecutor(), "taskExecutor");
+ AsyncTaskExecutor wrappedExecutor = (AsyncTaskExecutor) beanPostProcessor.instrument(new DirectTaskExecutor(),
+ "taskExecutor");
BDDAssertions.then(AopUtils.isJdkDynamicProxy(wrappedExecutor)).isTrue();
BDDAssertions.then(AopUtils.isCglibProxy(wrappedExecutor)).isFalse();
@@ -345,11 +335,11 @@ public class ExecutorBeanPostProcessorTests {
@Test
public void should_fallback_to_sleuth_impl_when_thread_pool_task_executor_has_final_methods() {
- ExecutorBeanPostProcessor postProcessor = new ExecutorBeanPostProcessor(this.beanFactory);
+ ExecutorInstrumentor postProcessor = new ExecutorInstrumentor(Collections::emptyList, beanFactory);
ThreadPoolTaskExecutor threadPoolTaskExecutor = new PoolTaskExecutor();
ThreadPoolTaskExecutor wrappedTaskExecutor = (ThreadPoolTaskExecutor) postProcessor
- .postProcessAfterInitialization(threadPoolTaskExecutor, "threadPoolTaskExecutor");
+ .instrument(threadPoolTaskExecutor, "threadPoolTaskExecutor");
BDDAssertions.then(wrappedTaskExecutor).isInstanceOf(LazyTraceThreadPoolTaskExecutor.class);
BDDAssertions.then(AopUtils.isCglibProxy(wrappedTaskExecutor)).isFalse();
@@ -359,26 +349,24 @@ public class ExecutorBeanPostProcessorTests {
@Test
public void proxy_is_not_needed() throws Exception {
- this.sleuthAsyncProperties.setIgnoredBeans(Collections.singletonList("fooExecutor"));
-
- boolean isProxyNeeded = new ExecutorBeanPostProcessor(this.beanFactory).isProxyNeeded("fooExecutor");
+ boolean isProxyNeeded = new ExecutorInstrumentor(() -> Collections.singletonList("fooExecutor"), beanFactory)
+ .isProxyNeeded("fooExecutor");
BDDAssertions.then(isProxyNeeded).isFalse();
}
@Test
public void proxy_is_needed() throws Exception {
- boolean isProxyNeeded = new ExecutorBeanPostProcessor(this.beanFactory).isProxyNeeded("fooExecutor");
+ boolean isProxyNeeded = new ExecutorInstrumentor(Collections::emptyList, beanFactory)
+ .isProxyNeeded("fooExecutor");
BDDAssertions.then(isProxyNeeded).isTrue();
}
@Test
public void should_not_create_proxy() throws Exception {
- this.sleuthAsyncProperties.setIgnoredBeans(Collections.singletonList("fooExecutor"));
-
- Object o = new ExecutorBeanPostProcessor(this.beanFactory)
- .postProcessAfterInitialization(new ThreadPoolTaskExecutor(), "fooExecutor");
+ Object o = new ExecutorInstrumentor(() -> Collections.singletonList("fooExecutor"), beanFactory)
+ .instrument(new ThreadPoolTaskExecutor(), "fooExecutor");
BDDAssertions.then(o).isInstanceOf(ThreadPoolTaskExecutor.class);
BDDAssertions.then(AopUtils.isCglibProxy(o)).isFalse();
@@ -386,8 +374,8 @@ public class ExecutorBeanPostProcessorTests {
@Test
public void should_throw_real_exception_when_using_proxy() throws Exception {
- Object o = new ExecutorBeanPostProcessor(this.beanFactory)
- .postProcessAfterInitialization(new RejectedExecutionExecutor(), "fooExecutor");
+ Object o = new ExecutorInstrumentor(Collections::emptyList, beanFactory)
+ .instrument(new RejectedExecutionExecutor(), "fooExecutor");
BDDAssertions.then(o).isInstanceOf(RejectedExecutionExecutor.class);
BDDAssertions.then(AopUtils.isCglibProxy(o)).isTrue();
@@ -400,23 +388,22 @@ public class ExecutorBeanPostProcessorTests {
public void should_not_double_instrument_traced_executors() throws Exception {
LazyTraceThreadPoolTaskExecutor lazyTraceThreadPoolTaskExecutor = BDDMockito
.mock(LazyTraceThreadPoolTaskExecutor.class);
- Object o = new ExecutorBeanPostProcessor(this.beanFactory)
- .postProcessAfterInitialization(lazyTraceThreadPoolTaskExecutor, "executor");
+ Object o = new ExecutorInstrumentor(Collections::emptyList, beanFactory)
+ .instrument(lazyTraceThreadPoolTaskExecutor, "executor");
BDDAssertions.then(o).isSameAs(lazyTraceThreadPoolTaskExecutor);
TraceableExecutorService traceableExecutorService = BDDMockito.mock(TraceableExecutorService.class);
- o = new ExecutorBeanPostProcessor(this.beanFactory).postProcessAfterInitialization(traceableExecutorService,
+ o = new ExecutorInstrumentor(Collections::emptyList, beanFactory).instrument(traceableExecutorService,
"executor");
BDDAssertions.then(o).isSameAs(traceableExecutorService);
LazyTraceAsyncTaskExecutor lazyTraceAsyncTaskExecutor = BDDMockito.mock(LazyTraceAsyncTaskExecutor.class);
- o = new ExecutorBeanPostProcessor(this.beanFactory).postProcessAfterInitialization(lazyTraceAsyncTaskExecutor,
+ o = new ExecutorInstrumentor(Collections::emptyList, beanFactory).instrument(lazyTraceAsyncTaskExecutor,
"executor");
BDDAssertions.then(o).isSameAs(lazyTraceAsyncTaskExecutor);
LazyTraceExecutor lazyTraceExecutor = BDDMockito.mock(LazyTraceExecutor.class);
- o = new ExecutorBeanPostProcessor(this.beanFactory).postProcessAfterInitialization(lazyTraceExecutor,
- "executor");
+ o = new ExecutorInstrumentor(Collections::emptyList, beanFactory).instrument(lazyTraceExecutor, "executor");
BDDAssertions.then(o).isSameAs(lazyTraceExecutor);
}
@@ -424,10 +411,10 @@ public class ExecutorBeanPostProcessorTests {
// #1569
@Test
public void should_use_jdk_proxy_when_executor_has_any_final_methods() {
- ExecutorBeanPostProcessor beanPostProcessor = new ExecutorBeanPostProcessor(this.beanFactory);
+ ExecutorInstrumentor beanPostProcessor = new ExecutorInstrumentor(Collections::emptyList, beanFactory);
- Executor wrappedExecutor = (Executor) beanPostProcessor
- .postProcessAfterInitialization(new ExecutorWithFinalMethod(), "executorWithFinalMethod");
+ Executor wrappedExecutor = (Executor) beanPostProcessor.instrument(new ExecutorWithFinalMethod(),
+ "executorWithFinalMethod");
BDDAssertions.then(AopUtils.isJdkDynamicProxy(wrappedExecutor)).isTrue();
BDDAssertions.then(AopUtils.isCglibProxy(wrappedExecutor)).isFalse();
@@ -441,10 +428,10 @@ public class ExecutorBeanPostProcessorTests {
// #1569
@Test
public void should_use_jdk_proxy_when_executor_has_an_inherited_final_methods() {
- ExecutorBeanPostProcessor beanPostProcessor = new ExecutorBeanPostProcessor(this.beanFactory);
+ ExecutorInstrumentor beanPostProcessor = new ExecutorInstrumentor(Collections::emptyList, beanFactory);
- Executor wrappedExecutor = (Executor) beanPostProcessor
- .postProcessAfterInitialization(new ExecutorWithInheritedFinalMethod(), "executorWithFinalMethod");
+ Executor wrappedExecutor = (Executor) beanPostProcessor.instrument(new ExecutorWithInheritedFinalMethod(),
+ "executorWithFinalMethod");
BDDAssertions.then(AopUtils.isJdkDynamicProxy(wrappedExecutor)).isTrue();
BDDAssertions.then(AopUtils.isCglibProxy(wrappedExecutor)).isFalse();
diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/async/LazyTraceAsyncCustomizerTest.java b/spring-cloud-sleuth-instrumentation/src/test/java/org/springframework/cloud/sleuth/instrument/async/LazyTraceAsyncCustomizerTest.java
similarity index 100%
rename from spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/async/LazyTraceAsyncCustomizerTest.java
rename to spring-cloud-sleuth-instrumentation/src/test/java/org/springframework/cloud/sleuth/instrument/async/LazyTraceAsyncCustomizerTest.java
diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/async/LazyTraceScheduledThreadPoolExecutorTests.java b/spring-cloud-sleuth-instrumentation/src/test/java/org/springframework/cloud/sleuth/instrument/async/LazyTraceScheduledThreadPoolExecutorTests.java
similarity index 100%
rename from spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/async/LazyTraceScheduledThreadPoolExecutorTests.java
rename to spring-cloud-sleuth-instrumentation/src/test/java/org/springframework/cloud/sleuth/instrument/async/LazyTraceScheduledThreadPoolExecutorTests.java
diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/async/SleuthContextListenerTest.java b/spring-cloud-sleuth-instrumentation/src/test/java/org/springframework/cloud/sleuth/instrument/async/SleuthContextListenerTest.java
similarity index 56%
rename from spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/async/SleuthContextListenerTest.java
rename to spring-cloud-sleuth-instrumentation/src/test/java/org/springframework/cloud/sleuth/instrument/async/SleuthContextListenerTest.java
index a95ce32c0..92ed01d4a 100644
--- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/async/SleuthContextListenerTest.java
+++ b/spring-cloud-sleuth-instrumentation/src/test/java/org/springframework/cloud/sleuth/instrument/async/SleuthContextListenerTest.java
@@ -19,30 +19,28 @@ package org.springframework.cloud.sleuth.instrument.async;
import org.assertj.core.api.BDDAssertions;
import org.junit.jupiter.api.Test;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.context.ConfigurableApplicationContext;
+import org.springframework.boot.test.context.runner.ApplicationContextRunner;
-@SpringBootTest(classes = SleuthContextListener.class)
class SleuthContextListenerTest {
- @Autowired
- private ConfigurableApplicationContext applicationContext;
-
@Test
void should_be_usable_using_context() {
- SleuthContextListener listener = SleuthContextListener.getBean(applicationContext);
+ new ApplicationContextRunner().withUserConfiguration(SleuthContextListener.class).run(context -> {
+ SleuthContextListener listener = SleuthContextListener.getBean(context);
- BDDAssertions.then(listener).isNotNull();
- BDDAssertions.then(listener.isUnusable()).isFalse();
+ BDDAssertions.then(listener).isNotNull();
+ BDDAssertions.then(listener.isUnusable()).isFalse();
+ });
}
@Test
void should_be_usable_using_beanfactory() {
- SleuthContextListener listener = SleuthContextListener.getBean(applicationContext.getBeanFactory());
+ new ApplicationContextRunner().withUserConfiguration(SleuthContextListener.class).run(context -> {
+ SleuthContextListener listener = SleuthContextListener.getBean(context.getBeanFactory());
- BDDAssertions.then(listener).isNotNull();
- BDDAssertions.then(listener.isUnusable()).isFalse();
+ BDDAssertions.then(listener).isNotNull();
+ BDDAssertions.then(listener.isUnusable()).isFalse();
+ });
}
}
diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/messaging/TraceFunctionAroundWrapperTests.java b/spring-cloud-sleuth-instrumentation/src/test/java/org/springframework/cloud/sleuth/instrument/messaging/TraceFunctionAroundWrapperTests.java
similarity index 100%
rename from spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/messaging/TraceFunctionAroundWrapperTests.java
rename to spring-cloud-sleuth-instrumentation/src/test/java/org/springframework/cloud/sleuth/instrument/messaging/TraceFunctionAroundWrapperTests.java
diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/client/TraceExchangeFilterFunctionHttpClientResponseTests.java b/spring-cloud-sleuth-instrumentation/src/test/java/org/springframework/cloud/sleuth/instrument/web/client/TraceExchangeFilterFunctionHttpClientResponseTests.java
similarity index 100%
rename from spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/client/TraceExchangeFilterFunctionHttpClientResponseTests.java
rename to spring-cloud-sleuth-instrumentation/src/test/java/org/springframework/cloud/sleuth/instrument/web/client/TraceExchangeFilterFunctionHttpClientResponseTests.java
diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/client/TraceWebClientBeanPostProcessorTest.java b/spring-cloud-sleuth-instrumentation/src/test/java/org/springframework/cloud/sleuth/instrument/web/client/TraceWebClientBeanPostProcessorTest.java
similarity index 98%
rename from spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/client/TraceWebClientBeanPostProcessorTest.java
rename to spring-cloud-sleuth-instrumentation/src/test/java/org/springframework/cloud/sleuth/instrument/web/client/TraceWebClientBeanPostProcessorTest.java
index c8986fa9d..e7e2ef04d 100644
--- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/client/TraceWebClientBeanPostProcessorTest.java
+++ b/spring-cloud-sleuth-instrumentation/src/test/java/org/springframework/cloud/sleuth/instrument/web/client/TraceWebClientBeanPostProcessorTest.java
@@ -27,7 +27,7 @@ import org.mockito.Mockito;
import org.mockito.junit.jupiter.MockitoExtension;
import org.reactivestreams.Subscription;
-import org.springframework.cloud.sleuth.api.Span;
+import org.springframework.cloud.sleuth.Span;
import org.springframework.cloud.sleuth.instrument.web.client.TraceExchangeFilterFunction.TraceWebClientSubscription;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.web.reactive.function.client.WebClient;
diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/client/feign/TracingFeignObjectWrapperTests.java b/spring-cloud-sleuth-instrumentation/src/test/java/org/springframework/cloud/sleuth/instrument/web/client/feign/TracingFeignObjectWrapperTests.java
similarity index 100%
rename from spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/client/feign/TracingFeignObjectWrapperTests.java
rename to spring-cloud-sleuth-instrumentation/src/test/java/org/springframework/cloud/sleuth/instrument/web/client/feign/TracingFeignObjectWrapperTests.java
diff --git a/spring-cloud-sleuth-instrumentation/src/test/resources/META-INF/spring.factories b/spring-cloud-sleuth-instrumentation/src/test/resources/META-INF/spring.factories
new file mode 100644
index 000000000..93ad5a8d7
--- /dev/null
+++ b/spring-cloud-sleuth-instrumentation/src/test/resources/META-INF/spring.factories
@@ -0,0 +1,3 @@
+# Auto Configuration
+org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
+org.springframework.cloud.sleuth.autoconfig.TraceNoOpAutoConfiguration
\ No newline at end of file
diff --git a/spring-cloud-sleuth-instrumentation/src/test/resources/application.yml b/spring-cloud-sleuth-instrumentation/src/test/resources/application.yml
new file mode 100644
index 000000000..2a3ed553c
--- /dev/null
+++ b/spring-cloud-sleuth-instrumentation/src/test/resources/application.yml
@@ -0,0 +1,5 @@
+logging.level.org.springframework.cloud: DEBUG
+logging.level.com.netflix.discovery.InstanceInfoReplicator: ERROR
+logging.level.org.springframework.cloud.sleuth.brave.instrument.web.client.feign: TRACE
+
+spring.autoconfigure.exclude: org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration, org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration, org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration, org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration, org.springframework.cloud.gateway.config.GatewayAutoConfiguration, org.springframework.cloud.gateway.config.GatewayClassPathWarningAutoConfiguration, org.springframework.cloud.gateway.config.GatewayMetricsAutoConfiguration, org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration
diff --git a/spring-cloud-sleuth-instrumentation/src/test/resources/logback.xml b/spring-cloud-sleuth-instrumentation/src/test/resources/logback.xml
new file mode 100644
index 000000000..17279c080
--- /dev/null
+++ b/spring-cloud-sleuth-instrumentation/src/test/resources/logback.xml
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/spring-cloud-sleuth-otel/pom.xml b/spring-cloud-sleuth-otel/pom.xml
index a457d51b1..2d26d9724 100644
--- a/spring-cloud-sleuth-otel/pom.xml
+++ b/spring-cloud-sleuth-otel/pom.xml
@@ -35,13 +35,17 @@
org.springframework.cloud
- spring-cloud-sleuth-core
+ spring-cloud-sleuth-instrumentation
org.springframework.boot
spring-boot-starter
-
+
+ org.springframework.boot
+ spring-boot-configuration-processor
+ true
+
org.springframework
spring-jcl
@@ -109,7 +113,6 @@
io.opentelemetry
opentelemetry-extension-trace-propagators
- true
io.opentelemetry
@@ -139,6 +142,11 @@
assertj-core
test
+
+ com.tngtech.archunit
+ archunit-junit5
+ test
+
diff --git a/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/exporter/ArrayListSpanProcessor.java b/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/ArrayListSpanProcessor.java
similarity index 87%
rename from spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/exporter/ArrayListSpanProcessor.java
rename to spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/ArrayListSpanProcessor.java
index c3dc6625e..90a95bfbb 100644
--- a/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/exporter/ArrayListSpanProcessor.java
+++ b/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/ArrayListSpanProcessor.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.otel.exporter;
+package org.springframework.cloud.sleuth.otel.bridge;
import java.util.Collection;
import java.util.Queue;
@@ -28,9 +28,15 @@ import io.opentelemetry.sdk.trace.SpanProcessor;
import io.opentelemetry.sdk.trace.data.SpanData;
import io.opentelemetry.sdk.trace.export.SpanExporter;
+/**
+ * Stores spans in a queue.
+ *
+ * @author Marcin Grzejszczak
+ * @since 3.0.0
+ */
public class ArrayListSpanProcessor implements SpanProcessor, SpanExporter {
- Queue spans = new LinkedBlockingQueue<>();
+ Queue spans = new LinkedBlockingQueue<>(50);
@Override
public void onStart(Context parent, ReadWriteSpan span) {
@@ -84,4 +90,9 @@ public class ArrayListSpanProcessor implements SpanProcessor, SpanExporter {
this.spans.clear();
}
+ @Override
+ public String toString() {
+ return "ArrayListSpanProcessor{" + "spans=" + spans + '}';
+ }
+
}
diff --git a/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/exporter/CompositeSpanExporter.java b/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/CompositeSpanExporter.java
similarity index 75%
rename from spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/exporter/CompositeSpanExporter.java
rename to spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/CompositeSpanExporter.java
index 8747ae0c1..74aaeb22d 100644
--- a/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/exporter/CompositeSpanExporter.java
+++ b/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/CompositeSpanExporter.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.otel.exporter;
+package org.springframework.cloud.sleuth.otel.bridge;
import java.util.Collection;
import java.util.List;
@@ -22,17 +22,23 @@ import java.util.stream.Collectors;
import io.opentelemetry.sdk.common.CompletableResultCode;
import io.opentelemetry.sdk.trace.data.SpanData;
+import io.opentelemetry.sdk.trace.export.SpanExporter;
-import org.springframework.cloud.sleuth.api.exporter.SpanFilter;
-import org.springframework.cloud.sleuth.otel.bridge.OtelFinishedSpan;
+import org.springframework.cloud.sleuth.exporter.SpanFilter;
-class CompositeSpanExporter implements io.opentelemetry.sdk.trace.export.SpanExporter {
+/**
+ * Composes multiple {@link SpanFilter} into a single {@link SpanExporter}.
+ *
+ * @author Marcin Grzejszczak
+ * @since 3.0.0
+ */
+public class CompositeSpanExporter implements io.opentelemetry.sdk.trace.export.SpanExporter {
private final io.opentelemetry.sdk.trace.export.SpanExporter delegate;
private final List filters;
- CompositeSpanExporter(io.opentelemetry.sdk.trace.export.SpanExporter delegate, List filters) {
+ public CompositeSpanExporter(io.opentelemetry.sdk.trace.export.SpanExporter delegate, List filters) {
this.delegate = delegate;
this.filters = filters;
}
diff --git a/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/OtelBaggageInScope.java b/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/OtelBaggageInScope.java
index 19475c99b..41b665051 100644
--- a/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/OtelBaggageInScope.java
+++ b/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/OtelBaggageInScope.java
@@ -16,6 +16,7 @@
package org.springframework.cloud.sleuth.otel.bridge;
+import java.util.List;
import java.util.concurrent.atomic.AtomicReference;
import io.opentelemetry.api.baggage.Baggage;
@@ -23,10 +24,9 @@ import io.opentelemetry.api.trace.Span;
import io.opentelemetry.context.Context;
import io.opentelemetry.context.Scope;
-import org.springframework.cloud.sleuth.api.BaggageInScope;
-import org.springframework.cloud.sleuth.api.CurrentTraceContext;
-import org.springframework.cloud.sleuth.api.TraceContext;
-import org.springframework.cloud.sleuth.autoconfig.SleuthBaggageProperties;
+import org.springframework.cloud.sleuth.BaggageInScope;
+import org.springframework.cloud.sleuth.CurrentTraceContext;
+import org.springframework.cloud.sleuth.TraceContext;
import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationEventPublisher;
@@ -36,7 +36,7 @@ import org.springframework.context.ApplicationEventPublisher;
* @author Marcin Grzejszczak
* @since 3.0.0
*/
-public class OtelBaggageInScope implements BaggageInScope {
+class OtelBaggageInScope implements BaggageInScope {
private final OtelBaggageManager otelBaggageManager;
@@ -44,18 +44,18 @@ public class OtelBaggageInScope implements BaggageInScope {
private final ApplicationEventPublisher publisher;
- private final SleuthBaggageProperties sleuthBaggageProperties;
+ private final List tagFields;
private final AtomicReference entry = new AtomicReference<>();
private final AtomicReference scope = new AtomicReference<>();
- public OtelBaggageInScope(OtelBaggageManager otelBaggageManager, CurrentTraceContext currentTraceContext,
- ApplicationEventPublisher publisher, SleuthBaggageProperties sleuthBaggageProperties, Entry entry) {
+ OtelBaggageInScope(OtelBaggageManager otelBaggageManager, CurrentTraceContext currentTraceContext,
+ ApplicationEventPublisher publisher, List tagFields, Entry entry) {
this.otelBaggageManager = otelBaggageManager;
this.currentTraceContext = currentTraceContext;
this.publisher = publisher;
- this.sleuthBaggageProperties = sleuthBaggageProperties;
+ this.tagFields = tagFields;
this.entry.set(entry);
}
@@ -101,8 +101,7 @@ public class OtelBaggageInScope implements BaggageInScope {
}
Context withBaggage = current.with(baggage);
this.scope.set(withBaggage.makeCurrent());
- if (this.sleuthBaggageProperties.getTagFields().stream().map(String::toLowerCase)
- .anyMatch(s -> s.equals(entry().getKey()))) {
+ if (this.tagFields.stream().map(String::toLowerCase).anyMatch(s -> s.equals(entry().getKey()))) {
currentSpan.setAttribute(entry().getKey(), value);
}
this.publisher.publishEvent(new BaggageChanged(this, baggage, entry().getKey(), value));
@@ -129,24 +128,24 @@ public class OtelBaggageInScope implements BaggageInScope {
}
}
- public static class BaggageChanged extends ApplicationEvent {
+ static class BaggageChanged extends ApplicationEvent {
/**
* Baggage with the new entry.
*/
- public Baggage baggage;
+ Baggage baggage;
/**
* Baggage entry name.
*/
- public String name;
+ String name;
/**
* Baggage entry value.
*/
- public String value;
+ String value;
- public BaggageChanged(OtelBaggageInScope source, Baggage baggage, String name, String value) {
+ BaggageChanged(OtelBaggageInScope source, Baggage baggage, String name, String value) {
super(source);
this.baggage = baggage;
this.name = name;
diff --git a/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/OtelBaggageManager.java b/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/OtelBaggageManager.java
index a5e55863f..9bedfa046 100644
--- a/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/OtelBaggageManager.java
+++ b/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/OtelBaggageManager.java
@@ -31,34 +31,39 @@ import io.opentelemetry.api.baggage.BaggageConsumer;
import io.opentelemetry.api.baggage.EntryMetadata;
import io.opentelemetry.context.Context;
-import org.springframework.cloud.sleuth.api.BaggageInScope;
-import org.springframework.cloud.sleuth.api.BaggageManager;
-import org.springframework.cloud.sleuth.api.CurrentTraceContext;
-import org.springframework.cloud.sleuth.api.TraceContext;
-import org.springframework.cloud.sleuth.autoconfig.SleuthBaggageProperties;
+import org.springframework.cloud.sleuth.BaggageInScope;
+import org.springframework.cloud.sleuth.BaggageManager;
+import org.springframework.cloud.sleuth.CurrentTraceContext;
+import org.springframework.cloud.sleuth.TraceContext;
+import org.springframework.cloud.sleuth.Tracer;
import org.springframework.context.ApplicationEventPublisher;
/**
- * OpenTelemetry implementation of a {@link BaggageManager}.
+ * OpenTelemetry implementation of a {@link BaggageManager}. Doesn't implement an
+ * interface cause {@link Tracer} already implements it.
*
* @author Marcin Grzejszczak
* @since 3.0.0
*/
-public class OtelBaggageManager {
+public class OtelBaggageManager implements BaggageManager {
private final CurrentTraceContext currentTraceContext;
- private final SleuthBaggageProperties sleuthBaggageProperties;
+ private final List remoteFields;
+
+ private final List tagFields;
private final ApplicationEventPublisher publisher;
- public OtelBaggageManager(CurrentTraceContext currentTraceContext, SleuthBaggageProperties sleuthBaggageProperties,
- ApplicationEventPublisher publisher) {
+ public OtelBaggageManager(CurrentTraceContext currentTraceContext, List remoteFields,
+ List tagFields, ApplicationEventPublisher publisher) {
this.currentTraceContext = currentTraceContext;
- this.sleuthBaggageProperties = sleuthBaggageProperties;
+ this.remoteFields = remoteFields;
+ this.tagFields = tagFields;
this.publisher = publisher;
}
+ @Override
public Map getAllBaggage() {
Map baggage = new HashMap<>();
currentBaggage().getEntries().forEach(entry -> baggage.put(entry.getKey(), entry.getValue()));
@@ -76,12 +81,13 @@ public class OtelBaggageManager {
return new CompositeBaggage(stack);
}
+ @Override
public BaggageInScope getBaggage(String name) {
Entry entry = getBaggage(name, currentBaggage());
return createNewEntryIfMissing(name, entry);
}
- protected BaggageInScope createNewEntryIfMissing(String name, Entry entry) {
+ BaggageInScope createNewEntryIfMissing(String name, Entry entry) {
if (entry == null) {
return createBaggage(name);
}
@@ -92,6 +98,7 @@ public class OtelBaggageManager {
return entryForName(name, baggage);
}
+ @Override
public BaggageInScope getBaggage(TraceContext traceContext, String name) {
OtelTraceContext context = (OtelTraceContext) traceContext;
// TODO: Refactor
@@ -107,13 +114,13 @@ public class OtelBaggageManager {
return createNewEntryIfMissing(name, entry);
}
- protected Entry getEntry(OtelTraceContext traceContext, String name) {
+ Entry getEntry(OtelTraceContext traceContext, String name) {
OtelTraceContext context = traceContext;
Context ctx = context.context();
return getBaggage(name, Baggage.fromContext(ctx));
}
- protected Context removeFirst(Deque stack) {
+ Context removeFirst(Deque stack) {
return stack.isEmpty() ? null : stack.removeFirst();
}
@@ -123,27 +130,27 @@ public class OtelBaggageManager {
}
private BaggageInScope otelBaggage(Entry entry) {
- return new OtelBaggageInScope(this, this.currentTraceContext, this.publisher, this.sleuthBaggageProperties,
- entry);
+ return new OtelBaggageInScope(this, this.currentTraceContext, this.publisher, this.tagFields, entry);
}
+ @Override
public BaggageInScope createBaggage(String name) {
return createBaggage(name, "");
}
+ @Override
public BaggageInScope createBaggage(String name, String value) {
BaggageInScope baggageInScope = baggageWithValue(name, "");
return baggageInScope.set(value);
}
private BaggageInScope baggageWithValue(String name, String value) {
- List remoteFieldsFields = this.sleuthBaggageProperties.getRemoteFields();
+ List remoteFieldsFields = this.remoteFields;
boolean remoteField = remoteFieldsFields.stream().map(String::toLowerCase)
.anyMatch(s -> s.equals(name.toLowerCase()));
EntryMetadata entryMetadata = EntryMetadata.create(propagationString(remoteField));
Entry entry = new Entry(name, value, entryMetadata);
- return new OtelBaggageInScope(this, this.currentTraceContext, this.publisher, this.sleuthBaggageProperties,
- entry);
+ return new OtelBaggageInScope(this, this.currentTraceContext, this.publisher, this.tagFields, entry);
}
private String propagationString(boolean remoteField) {
diff --git a/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/OtelCurrentTraceContext.java b/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/OtelCurrentTraceContext.java
index ed70438c7..571bbd2b9 100644
--- a/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/OtelCurrentTraceContext.java
+++ b/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/OtelCurrentTraceContext.java
@@ -31,8 +31,8 @@ import io.opentelemetry.context.ContextStorageProvider;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-import org.springframework.cloud.sleuth.api.CurrentTraceContext;
-import org.springframework.cloud.sleuth.api.TraceContext;
+import org.springframework.cloud.sleuth.CurrentTraceContext;
+import org.springframework.cloud.sleuth.TraceContext;
import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.lang.Nullable;
@@ -124,13 +124,6 @@ public class OtelCurrentTraceContext implements CurrentTraceContext, ContextStor
return get().current().wrap(delegate);
}
- private boolean traceAndSpanIdsAreEqual(Span fromContext, Span currentSpan) {
- return fromContext.getSpanContext().getTraceIdAsHexString()
- .equals(currentSpan.getSpanContext().getTraceIdAsHexString())
- && fromContext.getSpanContext().getSpanIdAsHexString()
- .equals(currentSpan.getSpanContext().getSpanIdAsHexString());
- }
-
@Override
public ContextStorage get() {
ContextStorage threadLocalStorage = this.delegate.get();
@@ -157,12 +150,12 @@ public class OtelCurrentTraceContext implements CurrentTraceContext, ContextStor
};
}
- public static class ScopeChanged extends ApplicationEvent {
+ static class ScopeChanged extends ApplicationEvent {
/**
* Span corresponding to the changed scope. Might be {@code null}.
*/
- public final Span span;
+ final Span span;
/**
* Create a new {@code ApplicationEvent}.
@@ -170,21 +163,21 @@ public class OtelCurrentTraceContext implements CurrentTraceContext, ContextStor
* the event is associated (never {@code null})
* @param span corresponding trace context
*/
- public ScopeChanged(Object source, @Nullable Span span) {
+ ScopeChanged(Object source, @Nullable Span span) {
super(source);
this.span = span;
}
}
- public static class ScopeClosed extends ApplicationEvent {
+ static class ScopeClosed extends ApplicationEvent {
/**
* Create a new {@code ApplicationEvent}.
* @param source the object on which the event initially occurred or with which
* the event is associated (never {@code null})
*/
- public ScopeClosed(Object source) {
+ ScopeClosed(Object source) {
super(source);
}
diff --git a/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/OtelFinishedSpan.java b/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/OtelFinishedSpan.java
index 7c5c348a5..f7d5f3d4d 100644
--- a/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/OtelFinishedSpan.java
+++ b/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/OtelFinishedSpan.java
@@ -27,8 +27,8 @@ import io.opentelemetry.api.common.AttributeKey;
import io.opentelemetry.api.common.Attributes;
import io.opentelemetry.sdk.trace.data.SpanData;
-import org.springframework.cloud.sleuth.api.Span;
-import org.springframework.cloud.sleuth.api.exporter.FinishedSpan;
+import org.springframework.cloud.sleuth.Span;
+import org.springframework.cloud.sleuth.exporter.FinishedSpan;
/**
* OpenTelemetry implementation of a {@link FinishedSpan}.
@@ -36,17 +36,17 @@ import org.springframework.cloud.sleuth.api.exporter.FinishedSpan;
* @author Marcin Grzejszczak
* @since 3.0.0
*/
-public class OtelFinishedSpan implements FinishedSpan {
+class OtelFinishedSpan implements FinishedSpan {
private final SpanData spanData;
private final Map tags = new HashMap<>();
- public OtelFinishedSpan(SpanData spanData) {
+ OtelFinishedSpan(SpanData spanData) {
this.spanData = spanData;
}
- public static FinishedSpan fromOtel(SpanData span) {
+ static FinishedSpan fromOtel(SpanData span) {
return new OtelFinishedSpan(span);
}
@@ -137,7 +137,7 @@ public class OtelFinishedSpan implements FinishedSpan {
return "SpanDataToReportedSpan{" + "spanData=" + spanData + ", tags=" + tags + '}';
}
- public static class AssertingThrowable extends Throwable {
+ static class AssertingThrowable extends Throwable {
/**
* Attritbues set on the span.
diff --git a/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/http/OtelHttpClientHandler.java b/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/OtelHttpClientHandler.java
similarity index 88%
rename from spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/http/OtelHttpClientHandler.java
rename to spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/OtelHttpClientHandler.java
index 49d626ab4..cdf3f2f35 100644
--- a/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/http/OtelHttpClientHandler.java
+++ b/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/OtelHttpClientHandler.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.otel.bridge.http;
+package org.springframework.cloud.sleuth.otel.bridge;
import java.net.URI;
import java.net.URISyntaxException;
@@ -26,17 +26,15 @@ import io.opentelemetry.instrumentation.api.tracer.HttpClientTracer;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-import org.springframework.cloud.sleuth.api.SamplerFunction;
-import org.springframework.cloud.sleuth.api.Span;
-import org.springframework.cloud.sleuth.api.TraceContext;
-import org.springframework.cloud.sleuth.api.http.HttpClientHandler;
-import org.springframework.cloud.sleuth.api.http.HttpClientRequest;
-import org.springframework.cloud.sleuth.api.http.HttpClientResponse;
-import org.springframework.cloud.sleuth.api.http.HttpRequest;
-import org.springframework.cloud.sleuth.api.http.HttpRequestParser;
-import org.springframework.cloud.sleuth.api.http.HttpResponseParser;
-import org.springframework.cloud.sleuth.otel.bridge.OtelSpan;
-import org.springframework.cloud.sleuth.otel.bridge.OtelTraceContext;
+import org.springframework.cloud.sleuth.SamplerFunction;
+import org.springframework.cloud.sleuth.Span;
+import org.springframework.cloud.sleuth.TraceContext;
+import org.springframework.cloud.sleuth.http.HttpClientHandler;
+import org.springframework.cloud.sleuth.http.HttpClientRequest;
+import org.springframework.cloud.sleuth.http.HttpClientResponse;
+import org.springframework.cloud.sleuth.http.HttpRequest;
+import org.springframework.cloud.sleuth.http.HttpRequestParser;
+import org.springframework.cloud.sleuth.http.HttpResponseParser;
import org.springframework.lang.Nullable;
import org.springframework.util.StringUtils;
diff --git a/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/http/OtelHttpServerHandler.java b/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/OtelHttpServerHandler.java
similarity index 90%
rename from spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/http/OtelHttpServerHandler.java
rename to spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/OtelHttpServerHandler.java
index bb439ad54..b29674431 100644
--- a/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/http/OtelHttpServerHandler.java
+++ b/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/OtelHttpServerHandler.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.otel.bridge.http;
+package org.springframework.cloud.sleuth.otel.bridge;
import java.net.URI;
import java.util.regex.Pattern;
@@ -24,14 +24,13 @@ import io.opentelemetry.context.Context;
import io.opentelemetry.context.propagation.TextMapPropagator;
import io.opentelemetry.instrumentation.api.tracer.HttpServerTracer;
-import org.springframework.cloud.sleuth.api.Span;
-import org.springframework.cloud.sleuth.api.http.HttpRequestParser;
-import org.springframework.cloud.sleuth.api.http.HttpResponseParser;
-import org.springframework.cloud.sleuth.api.http.HttpServerHandler;
-import org.springframework.cloud.sleuth.api.http.HttpServerRequest;
-import org.springframework.cloud.sleuth.api.http.HttpServerResponse;
+import org.springframework.cloud.sleuth.Span;
+import org.springframework.cloud.sleuth.http.HttpRequestParser;
+import org.springframework.cloud.sleuth.http.HttpResponseParser;
+import org.springframework.cloud.sleuth.http.HttpServerHandler;
+import org.springframework.cloud.sleuth.http.HttpServerRequest;
+import org.springframework.cloud.sleuth.http.HttpServerResponse;
import org.springframework.cloud.sleuth.instrument.web.SkipPatternProvider;
-import org.springframework.cloud.sleuth.otel.bridge.OtelSpan;
import org.springframework.util.StringUtils;
/**
diff --git a/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/OtelPropagator.java b/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/OtelPropagator.java
index 9642e6eb0..3d0be4b0a 100644
--- a/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/OtelPropagator.java
+++ b/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/OtelPropagator.java
@@ -23,9 +23,9 @@ import io.opentelemetry.context.Context;
import io.opentelemetry.context.propagation.ContextPropagators;
import io.opentelemetry.context.propagation.TextMapPropagator;
-import org.springframework.cloud.sleuth.api.Span;
-import org.springframework.cloud.sleuth.api.TraceContext;
-import org.springframework.cloud.sleuth.api.propagation.Propagator;
+import org.springframework.cloud.sleuth.Span;
+import org.springframework.cloud.sleuth.TraceContext;
+import org.springframework.cloud.sleuth.propagation.Propagator;
/**
* OpenTelemetry implementation of a {@link Propagator}.
diff --git a/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/OtelScopedSpan.java b/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/OtelScopedSpan.java
index 2d2030a5c..9d8022e2e 100644
--- a/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/OtelScopedSpan.java
+++ b/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/OtelScopedSpan.java
@@ -19,8 +19,8 @@ package org.springframework.cloud.sleuth.otel.bridge;
import io.opentelemetry.api.trace.Span;
import io.opentelemetry.context.Scope;
-import org.springframework.cloud.sleuth.api.ScopedSpan;
-import org.springframework.cloud.sleuth.api.TraceContext;
+import org.springframework.cloud.sleuth.ScopedSpan;
+import org.springframework.cloud.sleuth.TraceContext;
/**
* OpenTelemetry implementation of a {@link ScopedSpan}.
@@ -28,13 +28,13 @@ import org.springframework.cloud.sleuth.api.TraceContext;
* @author Marcin Grzejszczak
* @since 3.0.0
*/
-public class OtelScopedSpan implements ScopedSpan {
+class OtelScopedSpan implements ScopedSpan {
final Span span;
final Scope scope;
- public OtelScopedSpan(Span span, Scope scope) {
+ OtelScopedSpan(Span span, Scope scope) {
this.span = span;
this.scope = scope;
}
diff --git a/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/OtelSpan.java b/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/OtelSpan.java
index faadb9f00..772b82c46 100644
--- a/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/OtelSpan.java
+++ b/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/OtelSpan.java
@@ -25,8 +25,8 @@ import io.opentelemetry.api.trace.SpanContext;
import io.opentelemetry.api.trace.StatusCode;
import io.opentelemetry.context.Context;
-import org.springframework.cloud.sleuth.api.Span;
-import org.springframework.cloud.sleuth.api.TraceContext;
+import org.springframework.cloud.sleuth.Span;
+import org.springframework.cloud.sleuth.TraceContext;
import org.springframework.lang.Nullable;
/**
@@ -35,13 +35,13 @@ import org.springframework.lang.Nullable;
* @author Marcin Grzejszczak
* @since 3.0.0
*/
-public class OtelSpan implements Span {
+class OtelSpan implements Span {
final io.opentelemetry.api.trace.Span delegate;
private final AtomicReference context;
- public OtelSpan(io.opentelemetry.api.trace.Span delegate) {
+ OtelSpan(io.opentelemetry.api.trace.Span delegate) {
this.delegate = delegate;
if (delegate instanceof SpanFromSpanContext) {
SpanFromSpanContext fromSpanContext = (SpanFromSpanContext) delegate;
@@ -52,20 +52,20 @@ public class OtelSpan implements Span {
}
}
- public OtelSpan(io.opentelemetry.api.trace.Span delegate, Context context) {
+ OtelSpan(io.opentelemetry.api.trace.Span delegate, Context context) {
this.delegate = delegate;
this.context = new AtomicReference<>(context);
}
- public static io.opentelemetry.api.trace.Span toOtel(Span span) {
+ static io.opentelemetry.api.trace.Span toOtel(Span span) {
return ((OtelSpan) span).delegate;
}
- public static Span fromOtel(io.opentelemetry.api.trace.Span span) {
+ static Span fromOtel(io.opentelemetry.api.trace.Span span) {
return new OtelSpan(span);
}
- public static Span fromOtel(io.opentelemetry.api.trace.Span span, Context context) {
+ static Span fromOtel(io.opentelemetry.api.trace.Span span, Context context) {
return new OtelSpan(span, context);
}
@@ -127,6 +127,23 @@ public class OtelSpan implements Span {
return this.delegate != null ? this.delegate.toString() : "null";
}
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ OtelSpan otelSpan = (OtelSpan) o;
+ return Objects.equals(this.delegate, otelSpan.delegate);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(this.delegate);
+ }
+
}
class SpanFromSpanContext implements io.opentelemetry.api.trace.Span {
diff --git a/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/OtelSpanBuilder.java b/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/OtelSpanBuilder.java
index d23dffb47..277673cd4 100644
--- a/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/OtelSpanBuilder.java
+++ b/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/OtelSpanBuilder.java
@@ -19,8 +19,8 @@ package org.springframework.cloud.sleuth.otel.bridge;
import java.util.LinkedList;
import java.util.List;
-import org.springframework.cloud.sleuth.api.Span;
-import org.springframework.cloud.sleuth.api.TraceContext;
+import org.springframework.cloud.sleuth.Span;
+import org.springframework.cloud.sleuth.TraceContext;
import org.springframework.util.StringUtils;
/**
@@ -29,7 +29,7 @@ import org.springframework.util.StringUtils;
* @author Marcin Grzejszczak
* @since 3.0.0
*/
-public class OtelSpanBuilder implements Span.Builder {
+class OtelSpanBuilder implements Span.Builder {
private final io.opentelemetry.api.trace.Span.Builder delegate;
@@ -39,11 +39,11 @@ public class OtelSpanBuilder implements Span.Builder {
private Throwable error;
- public OtelSpanBuilder(io.opentelemetry.api.trace.Span.Builder delegate) {
+ OtelSpanBuilder(io.opentelemetry.api.trace.Span.Builder delegate) {
this.delegate = delegate;
}
- public static Span.Builder fromOtel(io.opentelemetry.api.trace.Span.Builder builder) {
+ static Span.Builder fromOtel(io.opentelemetry.api.trace.Span.Builder builder) {
return new OtelSpanBuilder(builder);
}
diff --git a/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/OtelSpanCustomizer.java b/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/OtelSpanCustomizer.java
index 89fa4d81b..4a6a12d24 100644
--- a/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/OtelSpanCustomizer.java
+++ b/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/OtelSpanCustomizer.java
@@ -17,10 +17,8 @@
package org.springframework.cloud.sleuth.otel.bridge;
import io.opentelemetry.api.trace.Span;
-import io.opentelemetry.api.trace.Tracer;
-import org.springframework.cloud.sleuth.api.SpanCustomizer;
-import org.springframework.lang.NonNull;
+import org.springframework.cloud.sleuth.SpanCustomizer;
/**
* OpenTelemetry implementation of a {@link SpanCustomizer}.
@@ -30,20 +28,6 @@ import org.springframework.lang.NonNull;
*/
public class OtelSpanCustomizer implements SpanCustomizer {
- private final Tracer tracer;
-
- private final Span span;
-
- public OtelSpanCustomizer(@NonNull Tracer tracer) {
- this.tracer = tracer;
- this.span = null;
- }
-
- public OtelSpanCustomizer(@NonNull Span span) {
- this.tracer = null;
- this.span = span;
- }
-
@Override
public SpanCustomizer name(String name) {
currentSpan().updateName(name);
@@ -51,7 +35,7 @@ public class OtelSpanCustomizer implements SpanCustomizer {
}
private Span currentSpan() {
- return this.span != null ? this.span : Span.current();
+ return Span.current();
}
@Override
diff --git a/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/OtelTraceContext.java b/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/OtelTraceContext.java
index 21143afe4..db18060db 100644
--- a/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/OtelTraceContext.java
+++ b/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/OtelTraceContext.java
@@ -24,7 +24,7 @@ import io.opentelemetry.api.trace.SpanContext;
import io.opentelemetry.context.Context;
import io.opentelemetry.sdk.trace.ReadableSpan;
-import org.springframework.cloud.sleuth.api.TraceContext;
+import org.springframework.cloud.sleuth.TraceContext;
import org.springframework.lang.Nullable;
/**
@@ -33,7 +33,7 @@ import org.springframework.lang.Nullable;
* @author Marcin Grzejszczak
* @since 3.0.0
*/
-public class OtelTraceContext implements TraceContext {
+class OtelTraceContext implements TraceContext {
final AtomicReference context;
@@ -41,7 +41,7 @@ public class OtelTraceContext implements TraceContext {
final Span span;
- public OtelTraceContext(Context context, SpanContext delegate, @Nullable Span span) {
+ OtelTraceContext(Context context, SpanContext delegate, @Nullable Span span) {
this(new AtomicReference<>(context), delegate, span);
}
@@ -51,25 +51,25 @@ public class OtelTraceContext implements TraceContext {
this.span = span;
}
- public OtelTraceContext(SpanContext delegate, @Nullable Span span) {
+ OtelTraceContext(SpanContext delegate, @Nullable Span span) {
this.context = new AtomicReference<>(Context.current());
this.delegate = delegate;
this.span = span;
}
- public OtelTraceContext(Span span) {
+ OtelTraceContext(Span span) {
this(Context.current(), span.getSpanContext(), span);
}
- public OtelTraceContext(SpanFromSpanContext span) {
+ OtelTraceContext(SpanFromSpanContext span) {
this(span.otelTraceContext.context.get(), span.getSpanContext(), span);
}
- public static TraceContext fromOtel(SpanContext traceContext) {
+ static TraceContext fromOtel(SpanContext traceContext) {
return new OtelTraceContext(traceContext, null);
}
- public static Context toOtelContext(TraceContext context) {
+ static Context toOtelContext(TraceContext context) {
if (context instanceof OtelTraceContext) {
Span span = ((OtelTraceContext) context).span;
if (span != null) {
@@ -104,31 +104,38 @@ public class OtelTraceContext implements TraceContext {
return this.delegate != null ? this.delegate.toString() : "null";
}
- @Override
- public boolean equals(Object o) {
- return Objects.equals(this.delegate, o);
- }
-
- @Override
- public int hashCode() {
- return Objects.hashCode(this.delegate);
- }
-
@Nullable
public Boolean sampled() {
return this.delegate.isSampled();
}
- public Span span() {
+ Span span() {
return this.span;
}
- public Context context() {
+ Context context() {
return this.context.get();
}
- public void updateContext(Context context) {
+ void updateContext(Context context) {
this.context.set(context);
}
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ OtelTraceContext context = (OtelTraceContext) o;
+ return Objects.equals(this.delegate, context.delegate);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(this.delegate);
+ }
+
}
diff --git a/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/OtelTracer.java b/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/OtelTracer.java
index 1a3303804..168247d58 100644
--- a/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/OtelTracer.java
+++ b/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/OtelTracer.java
@@ -23,12 +23,14 @@ import io.opentelemetry.context.Scope;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-import org.springframework.cloud.sleuth.api.BaggageInScope;
-import org.springframework.cloud.sleuth.api.ScopedSpan;
-import org.springframework.cloud.sleuth.api.Span;
-import org.springframework.cloud.sleuth.api.SpanCustomizer;
-import org.springframework.cloud.sleuth.api.TraceContext;
-import org.springframework.cloud.sleuth.api.Tracer;
+import org.springframework.cloud.sleuth.BaggageInScope;
+import org.springframework.cloud.sleuth.BaggageManager;
+import org.springframework.cloud.sleuth.ScopedSpan;
+import org.springframework.cloud.sleuth.Span;
+import org.springframework.cloud.sleuth.SpanCustomizer;
+import org.springframework.cloud.sleuth.TraceContext;
+import org.springframework.cloud.sleuth.Tracer;
+import org.springframework.context.ApplicationEventPublisher;
/**
* OpenTelemetry implementation of a {@link Tracer}.
@@ -40,17 +42,17 @@ public class OtelTracer implements Tracer {
private final io.opentelemetry.api.trace.Tracer tracer;
- private final OtelBaggageManager otelBaggageManager;
+ private final BaggageManager otelBaggageManager;
- public OtelTracer(io.opentelemetry.api.trace.Tracer tracer, OtelBaggageManager otelBaggageManager) {
+ private final ApplicationEventPublisher publisher;
+
+ public OtelTracer(io.opentelemetry.api.trace.Tracer tracer, ApplicationEventPublisher publisher,
+ BaggageManager otelBaggageManager) {
this.tracer = tracer;
+ this.publisher = publisher;
this.otelBaggageManager = otelBaggageManager;
}
- public static Tracer fromOtel(io.opentelemetry.api.trace.Tracer tracer, OtelBaggageManager otelBaggageManager) {
- return new OtelTracer(tracer, otelBaggageManager);
- }
-
@Override
public Span nextSpan(Span parent) {
if (parent == null) {
@@ -62,14 +64,21 @@ public class OtelTracer implements Tracer {
@Override
public SpanInScope withSpan(Span span) {
- io.opentelemetry.api.trace.Span delegate = span == null ? io.opentelemetry.api.trace.Span.getInvalid()
- : ((OtelSpan) span).delegate;
+ io.opentelemetry.api.trace.Span delegate = delegate(span);
return new OtelSpanInScope((OtelSpan) span, delegate);
}
+ protected io.opentelemetry.api.trace.Span delegate(Span span) {
+ if (span == null) {
+ this.publisher.publishEvent(new OtelCurrentTraceContext.ScopeClosed(this));
+ return io.opentelemetry.api.trace.Span.getInvalid();
+ }
+ return ((OtelSpan) span).delegate;
+ }
+
@Override
public SpanCustomizer currentSpanCustomizer() {
- return new OtelSpanCustomizer(this.tracer);
+ return new OtelSpanCustomizer();
}
@Override
diff --git a/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/SkipPatternSampler.java b/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/SkipPatternSampler.java
new file mode 100644
index 000000000..0dd11d0d4
--- /dev/null
+++ b/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/SkipPatternSampler.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2013-2020 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.springframework.cloud.sleuth.otel.bridge;
+
+import java.util.regex.Pattern;
+
+import org.springframework.cloud.sleuth.SamplerFunction;
+import org.springframework.cloud.sleuth.http.HttpRequest;
+
+/**
+ * Decides if sampling should take place for the given request.
+ *
+ * @author Marcin Grzejszczak
+ * @since 3.0.0
+ */
+public class SkipPatternSampler implements SamplerFunction {
+
+ private final Pattern pattern;
+
+ public SkipPatternSampler(Pattern pattern) {
+ this.pattern = pattern;
+ }
+
+ @Override
+ public final Boolean trySample(HttpRequest request) {
+ String url = request.path();
+ boolean shouldSkip = this.pattern.matcher(url).matches();
+ if (shouldSkip) {
+ return false;
+ }
+ return null;
+ }
+
+}
diff --git a/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/log/Slf4jSpanProcessor.java b/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/Slf4jBaggageSpanProcessor.java
similarity index 66%
rename from spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/log/Slf4jSpanProcessor.java
rename to spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/Slf4jBaggageSpanProcessor.java
index fbfdfabfe..f939bda03 100644
--- a/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/log/Slf4jSpanProcessor.java
+++ b/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/Slf4jBaggageSpanProcessor.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.otel.log;
+package org.springframework.cloud.sleuth.otel.bridge;
import java.util.List;
import java.util.Map;
@@ -30,34 +30,39 @@ import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.slf4j.MDC;
-import org.springframework.cloud.sleuth.autoconfig.SleuthBaggageProperties;
-import org.springframework.cloud.sleuth.otel.bridge.OtelBaggageInScope;
-import org.springframework.cloud.sleuth.otel.bridge.OtelBaggageManager;
-import org.springframework.cloud.sleuth.otel.bridge.OtelCurrentTraceContext;
+import org.springframework.beans.factory.BeanFactory;
+import org.springframework.cloud.sleuth.BaggageManager;
import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener;
-class Slf4jSpanProcessor implements SpanProcessor, ApplicationListener {
+public class Slf4jBaggageSpanProcessor implements SpanProcessor, ApplicationListener {
- private static final Log log = LogFactory.getLog(Slf4jSpanProcessor.class);
+ private static final Log log = LogFactory.getLog(Slf4jBaggageSpanProcessor.class);
- private final SleuthBaggageProperties sleuthBaggageProperties;
+ private final List correlationFields;
- private final OtelBaggageManager baggageManager;
+ private final BeanFactory beanFactory;
- Slf4jSpanProcessor(SleuthBaggageProperties sleuthBaggageProperties, OtelBaggageManager baggageManager) {
- this.sleuthBaggageProperties = sleuthBaggageProperties;
- this.baggageManager = baggageManager;
+ private BaggageManager baggageManager;
+
+ public Slf4jBaggageSpanProcessor(List correlationFields, BeanFactory beanFactory) {
+ this.correlationFields = correlationFields;
+ this.beanFactory = beanFactory;
+ }
+
+ private BaggageManager baggageManager() {
+ if (this.baggageManager == null) {
+ this.baggageManager = this.beanFactory.getBean(BaggageManager.class);
+ }
+ return this.baggageManager;
}
@Override
public void onStart(Context parent, ReadWriteSpan span) {
- onStart(span.getSpanContext().getTraceIdAsHexString(), span.getSpanContext().getSpanIdAsHexString());
+ onStart();
}
- private void onStart(String traceId, String spanId) {
- MDC.put("traceId", traceId);
- MDC.put("spanId", spanId);
+ private void onStart() {
flushAllBaggageEntries();
}
@@ -68,8 +73,6 @@ class Slf4jSpanProcessor implements SpanProcessor, ApplicationListener {
@Override
public void onEnd(ReadableSpan span) {
- MDC.remove("traceId");
- MDC.remove("spanId");
removeAllBaggageEntries();
}
@@ -95,11 +98,9 @@ class Slf4jSpanProcessor implements SpanProcessor, ApplicationListener {
}
private void onEachCorrelatedBaggageEntry(Consumer> consumer) {
- if (this.sleuthBaggageProperties.isCorrelationEnabled()) {
- List correlationFields = lowerCaseCorrelationFields();
- this.baggageManager.getAllBaggage().entrySet().stream()
- .filter(e -> correlationFields.contains(e.getKey().toLowerCase())).forEach(consumer);
- }
+ List correlationFields = lowerCaseCorrelationFields();
+ baggageManager().getAllBaggage().entrySet().stream()
+ .filter(e -> correlationFields.contains(e.getKey().toLowerCase())).forEach(consumer);
}
private void removeAllBaggageEntries() {
@@ -107,16 +108,14 @@ class Slf4jSpanProcessor implements SpanProcessor, ApplicationListener {
}
private List lowerCaseCorrelationFields() {
- return this.sleuthBaggageProperties.getCorrelationFields().stream().map(String::toLowerCase)
- .collect(Collectors.toList());
+ return this.correlationFields.stream().map(String::toLowerCase).collect(Collectors.toList());
}
private void onBaggageChanged(OtelBaggageInScope.BaggageChanged event) {
if (log.isTraceEnabled()) {
log.trace("Got baggage changed event [" + event + "]");
}
- if (this.sleuthBaggageProperties.isCorrelationEnabled()
- && lowerCaseCorrelationFields().contains(event.name.toLowerCase())) {
+ if (lowerCaseCorrelationFields().contains(event.name.toLowerCase())) {
if (log.isTraceEnabled()) {
log.trace("Correlation enabled and baggage with name [" + event.name
+ "] is present on the list of correlated fields");
@@ -130,8 +129,7 @@ class Slf4jSpanProcessor implements SpanProcessor, ApplicationListener {
log.trace("Got scope changed event [" + event + "]");
}
if (event.span != null) {
- onStart(event.span.getSpanContext().getTraceIdAsHexString(),
- event.span.getSpanContext().getSpanIdAsHexString());
+ onStart();
}
}
diff --git a/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/Slf4jSpanProcessor.java b/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/Slf4jSpanProcessor.java
new file mode 100644
index 000000000..6804f2f8b
--- /dev/null
+++ b/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/Slf4jSpanProcessor.java
@@ -0,0 +1,99 @@
+/*
+ * Copyright 2013-2020 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.springframework.cloud.sleuth.otel.bridge;
+
+import io.opentelemetry.context.Context;
+import io.opentelemetry.sdk.common.CompletableResultCode;
+import io.opentelemetry.sdk.trace.ReadWriteSpan;
+import io.opentelemetry.sdk.trace.ReadableSpan;
+import io.opentelemetry.sdk.trace.SpanProcessor;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.slf4j.MDC;
+
+import org.springframework.context.ApplicationEvent;
+import org.springframework.context.ApplicationListener;
+
+public class Slf4jSpanProcessor implements SpanProcessor, ApplicationListener {
+
+ private static final Log log = LogFactory.getLog(Slf4jSpanProcessor.class);
+
+ @Override
+ public void onStart(Context parent, ReadWriteSpan span) {
+ onStart(span.getSpanContext().getTraceIdAsHexString(), span.getSpanContext().getSpanIdAsHexString());
+ }
+
+ private void onStart(String traceId, String spanId) {
+ MDC.put("traceId", traceId);
+ MDC.put("spanId", spanId);
+ }
+
+ @Override
+ public boolean isStartRequired() {
+ return true;
+ }
+
+ @Override
+ public void onEnd(ReadableSpan span) {
+ MDC.remove("traceId");
+ MDC.remove("spanId");
+ }
+
+ @Override
+ public boolean isEndRequired() {
+ return true;
+ }
+
+ @Override
+ public CompletableResultCode shutdown() {
+ onEnd(null);
+ return CompletableResultCode.ofSuccess();
+ }
+
+ @Override
+ public CompletableResultCode forceFlush() {
+ return CompletableResultCode.ofSuccess();
+ }
+
+ private void onScopeChanged(OtelCurrentTraceContext.ScopeChanged event) {
+ if (log.isTraceEnabled()) {
+ log.trace("Got scope changed event [" + event + "]");
+ }
+ if (event.span != null) {
+ onStart(event.span.getSpanContext().getTraceIdAsHexString(),
+ event.span.getSpanContext().getSpanIdAsHexString());
+ }
+ }
+
+ private void onScopeClosed(OtelCurrentTraceContext.ScopeClosed event) {
+ if (log.isTraceEnabled()) {
+ log.trace("Got scope closed event [" + event + "]");
+ }
+ onEnd(null);
+ }
+
+ @Override
+ public void onApplicationEvent(ApplicationEvent event) {
+ if (event instanceof OtelCurrentTraceContext.ScopeChanged) {
+ onScopeChanged((OtelCurrentTraceContext.ScopeChanged) event);
+ }
+ else if (event instanceof OtelCurrentTraceContext.ScopeClosed) {
+ onScopeClosed((OtelCurrentTraceContext.ScopeClosed) event);
+ }
+ }
+
+}
diff --git a/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/exporter/SpanExporterCustomizer.java b/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/SpanExporterCustomizer.java
similarity index 94%
rename from spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/exporter/SpanExporterCustomizer.java
rename to spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/SpanExporterCustomizer.java
index 2b35fc3ef..4fe89a103 100644
--- a/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/exporter/SpanExporterCustomizer.java
+++ b/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/SpanExporterCustomizer.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.cloud.sleuth.otel.exporter;
+package org.springframework.cloud.sleuth.otel.bridge;
import io.opentelemetry.sdk.trace.export.SpanExporter;
diff --git a/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/TraceOtelBridgeAutoConfiguation.java b/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/TraceOtelBridgeAutoConfiguation.java
deleted file mode 100644
index f78fa7a5e..000000000
--- a/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/TraceOtelBridgeAutoConfiguation.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright 2013-2020 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.springframework.cloud.sleuth.otel.bridge;
-
-import io.opentelemetry.context.propagation.ContextPropagators;
-
-import org.springframework.boot.autoconfigure.AutoConfigureAfter;
-import org.springframework.boot.autoconfigure.AutoConfigureBefore;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
-import org.springframework.cloud.sleuth.api.CurrentTraceContext;
-import org.springframework.cloud.sleuth.api.SpanCustomizer;
-import org.springframework.cloud.sleuth.api.Tracer;
-import org.springframework.cloud.sleuth.api.propagation.Propagator;
-import org.springframework.cloud.sleuth.autoconfig.SleuthBaggageProperties;
-import org.springframework.cloud.sleuth.autoconfig.TraceAutoConfiguration;
-import org.springframework.cloud.sleuth.otel.autoconfig.TraceOtelAutoConfiguration;
-import org.springframework.context.ApplicationEventPublisher;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-
-/**
- * {@link org.springframework.boot.autoconfigure.EnableAutoConfiguration
- * Auto-configuration} to enable the bridge between Sleuth API and OpenTelemetry.
- *
- * @author Marcin Grzejszczak
- * @since 3.0.0
- */
-@Configuration(proxyBeanMethods = false)
-@ConditionalOnProperty(value = "spring.sleuth.enabled", matchIfMissing = true)
-@ConditionalOnBean(io.opentelemetry.api.trace.Tracer.class)
-@AutoConfigureAfter(TraceOtelAutoConfiguration.class)
-@AutoConfigureBefore(TraceAutoConfiguration.class)
-public class TraceOtelBridgeAutoConfiguation {
-
- @Bean
- Tracer otelTracerBridge(io.opentelemetry.api.trace.Tracer tracer, OtelBaggageManager otelBaggageManager) {
- return new OtelTracer(tracer, otelBaggageManager);
- }
-
- // Both CurrentTraceContext & ContextStorageProvider
- @Bean
- @ConditionalOnMissingBean
- OtelCurrentTraceContext otelCurrentTraceContext(ApplicationEventPublisher publisher) {
- return new OtelCurrentTraceContext(publisher);
- }
-
- @Bean
- SpanCustomizer otelSpanCustomizer(io.opentelemetry.api.trace.Tracer tracer) {
- return new OtelSpanCustomizer(tracer);
- }
-
- @Bean
- Propagator otelPropagator(ContextPropagators contextPropagators, io.opentelemetry.api.trace.Tracer tracer) {
- return new OtelPropagator(contextPropagators, tracer);
- }
-
- @Bean
- OtelBaggageManager otelBaggageManager(CurrentTraceContext currentTraceContext,
- SleuthBaggageProperties sleuthBaggageProperties, ApplicationEventPublisher publisher) {
- return new OtelBaggageManager(currentTraceContext, sleuthBaggageProperties, publisher);
- }
-
-}
diff --git a/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/http/TraceOtelHttpBridgeAutoConfiguration.java b/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/http/TraceOtelHttpBridgeAutoConfiguration.java
deleted file mode 100644
index 1e358cbd2..000000000
--- a/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/bridge/http/TraceOtelHttpBridgeAutoConfiguration.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Copyright 2013-2020 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.springframework.cloud.sleuth.otel.bridge.http;
-
-import java.util.regex.Pattern;
-
-import org.springframework.boot.autoconfigure.AutoConfigureAfter;
-import org.springframework.boot.autoconfigure.AutoConfigureBefore;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
-import org.springframework.cloud.sleuth.api.SamplerFunction;
-import org.springframework.cloud.sleuth.api.Tracer;
-import org.springframework.cloud.sleuth.api.http.HttpClientHandler;
-import org.springframework.cloud.sleuth.api.http.HttpRequest;
-import org.springframework.cloud.sleuth.api.http.HttpRequestParser;
-import org.springframework.cloud.sleuth.api.http.HttpResponseParser;
-import org.springframework.cloud.sleuth.api.http.HttpServerHandler;
-import org.springframework.cloud.sleuth.instrument.web.HttpClientRequestParser;
-import org.springframework.cloud.sleuth.instrument.web.HttpClientResponseParser;
-import org.springframework.cloud.sleuth.instrument.web.HttpClientSampler;
-import org.springframework.cloud.sleuth.instrument.web.HttpServerRequestParser;
-import org.springframework.cloud.sleuth.instrument.web.HttpServerResponseParser;
-import org.springframework.cloud.sleuth.instrument.web.SkipPatternConfiguration;
-import org.springframework.cloud.sleuth.instrument.web.SkipPatternProvider;
-import org.springframework.cloud.sleuth.instrument.web.SleuthWebProperties;
-import org.springframework.cloud.sleuth.instrument.web.TraceHttpAutoConfiguration;
-import org.springframework.cloud.sleuth.otel.bridge.TraceOtelBridgeAutoConfiguation;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.lang.Nullable;
-
-@Configuration(proxyBeanMethods = false)
-@ConditionalOnProperty(value = "spring.sleuth.enabled", matchIfMissing = true)
-@ConditionalOnBean({ Tracer.class, io.opentelemetry.api.trace.Tracer.class })
-@AutoConfigureBefore(TraceHttpAutoConfiguration.class)
-@AutoConfigureAfter({ TraceOtelBridgeAutoConfiguation.class, SkipPatternConfiguration.class })
-public class TraceOtelHttpBridgeAutoConfiguration {
-
- @Bean
- HttpClientHandler otelHttpClientHandler(io.opentelemetry.api.trace.Tracer tracer,
- @Nullable @HttpClientRequestParser HttpRequestParser httpClientRequestParser,
- @Nullable @HttpClientResponseParser HttpResponseParser httpClientResponseParser,
- SamplerFunction samplerFunction) {
- return new OtelHttpClientHandler(tracer, httpClientRequestParser, httpClientResponseParser, samplerFunction);
- }
-
- @Bean
- HttpServerHandler otelHttpServerHandler(io.opentelemetry.api.trace.Tracer tracer,
- @Nullable @HttpServerRequestParser HttpRequestParser httpServerRequestParser,
- @Nullable @HttpServerResponseParser HttpResponseParser httpServerResponseParser,
- SkipPatternProvider skipPatternProvider) {
- return new OtelHttpServerHandler(tracer, httpServerRequestParser, httpServerResponseParser,
- skipPatternProvider);
- }
-
- @Bean
- @ConditionalOnMissingBean(name = HttpClientSampler.NAME)
- SamplerFunction defaultHttpClientSampler(SleuthWebProperties sleuthWebProperties) {
- String skipPattern = sleuthWebProperties.getClient().getSkipPattern();
- if (skipPattern == null) {
- return SamplerFunction.deferDecision();
- }
- return new SkipPatternSampler(Pattern.compile(skipPattern));
- }
-
-}
-
-class SkipPatternSampler implements SamplerFunction {
-
- private final Pattern pattern;
-
- SkipPatternSampler(Pattern pattern) {
- this.pattern = pattern;
- }
-
- @Override
- public final Boolean trySample(HttpRequest request) {
- String url = request.path();
- boolean shouldSkip = this.pattern.matcher(url).matches();
- if (shouldSkip) {
- return false;
- }
- return null;
- }
-
-}
diff --git a/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/propagation/BaggageTextMapPropagator.java b/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/propagation/BaggageTextMapPropagator.java
index c4687c6be..96af07add 100644
--- a/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/propagation/BaggageTextMapPropagator.java
+++ b/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/propagation/BaggageTextMapPropagator.java
@@ -28,30 +28,31 @@ import io.opentelemetry.context.propagation.TextMapPropagator;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-import org.springframework.cloud.sleuth.api.BaggageManager;
-import org.springframework.cloud.sleuth.autoconfig.SleuthBaggageProperties;
-import org.springframework.context.ApplicationEventPublisher;
+import org.springframework.cloud.sleuth.BaggageManager;
-class BaggageTextMapPropagator implements TextMapPropagator {
+/**
+ * {@link TextMapPropagator} that adds Sleuth compatible baggage entries (name of the
+ * field means an HTTP header entry).
+ *
+ * @author Marcin Grzejszczak
+ * @since 3.0.0
+ */
+public class BaggageTextMapPropagator implements TextMapPropagator {
private static final Log log = LogFactory.getLog(BaggageTextMapPropagator.class);
- private final SleuthBaggageProperties properties;
+ private final List remoteFields;
private final BaggageManager baggageManager;
- private final ApplicationEventPublisher publisher;
-
- BaggageTextMapPropagator(SleuthBaggageProperties properties, BaggageManager baggageManager,
- ApplicationEventPublisher publisher) {
- this.properties = properties;
+ public BaggageTextMapPropagator(List remoteFields, BaggageManager baggageManager) {
+ this.remoteFields = remoteFields;
this.baggageManager = baggageManager;
- this.publisher = publisher;
}
@Override
public List fields() {
- return this.properties.getRemoteFields();
+ return this.remoteFields;
}
@Override
@@ -62,15 +63,14 @@ class BaggageTextMapPropagator implements TextMapPropagator {
private List> applicableBaggageEntries(C c) {
Map allBaggage = this.baggageManager.getAllBaggage();
- List lowerCaseKeys = this.properties.getRemoteFields().stream().map(String::toLowerCase)
- .collect(Collectors.toList());
+ List lowerCaseKeys = this.remoteFields.stream().map(String::toLowerCase).collect(Collectors.toList());
return allBaggage.entrySet().stream().filter(e -> lowerCaseKeys.contains(e.getKey().toLowerCase()))
.collect(Collectors.toList());
}
@Override
public Context extract(Context context, C c, Getter getter) {
- Map baggageEntries = this.properties.getRemoteFields().stream()
+ Map baggageEntries = this.remoteFields.stream()
.map(s -> new AbstractMap.SimpleEntry<>(s, getter.get(c, s))).filter(e -> e.getValue() != null)
.collect(Collectors.toMap((e) -> e.getKey(), (e) -> e.getValue()));
Baggage.Builder builder = Baggage.builder().setParent(context);
diff --git a/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/propagation/TraceOtelPropagationAutoConfiguration.java b/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/propagation/CompositeTextMapPropagator.java
similarity index 54%
rename from spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/propagation/TraceOtelPropagationAutoConfiguration.java
rename to spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/propagation/CompositeTextMapPropagator.java
index 4df1a295d..8cef65b00 100644
--- a/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/propagation/TraceOtelPropagationAutoConfiguration.java
+++ b/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/propagation/CompositeTextMapPropagator.java
@@ -26,14 +26,10 @@ import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
-import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.api.baggage.propagation.W3CBaggagePropagator;
import io.opentelemetry.api.trace.Span;
-import io.opentelemetry.api.trace.Tracer;
import io.opentelemetry.api.trace.propagation.HttpTraceContext;
import io.opentelemetry.context.Context;
-import io.opentelemetry.context.propagation.ContextPropagators;
-import io.opentelemetry.context.propagation.DefaultContextPropagators;
import io.opentelemetry.context.propagation.TextMapPropagator;
import io.opentelemetry.extension.trace.propagation.AwsXRayPropagator;
import io.opentelemetry.extension.trace.propagation.B3Propagator;
@@ -43,103 +39,45 @@ import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.BeanFactory;
-import org.springframework.beans.factory.ObjectProvider;
-import org.springframework.boot.autoconfigure.AutoConfigureBefore;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
-import org.springframework.boot.context.properties.EnableConfigurationProperties;
-import org.springframework.cloud.sleuth.api.BaggageManager;
-import org.springframework.cloud.sleuth.autoconfig.SleuthBaggageProperties;
-import org.springframework.cloud.sleuth.autoconfig.TraceAutoConfiguration;
-import org.springframework.cloud.sleuth.otel.bridge.TraceOtelBridgeAutoConfiguation;
-import org.springframework.context.ApplicationEventPublisher;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
import org.springframework.lang.Nullable;
import org.springframework.util.ClassUtils;
/**
- * {@link org.springframework.boot.autoconfigure.EnableAutoConfiguration
- * Auto-configuration} to enable propagation configuration via Spring Cloud Sleuth and
- * OpenTelemetry SDK.
+ * {@link TextMapPropagator} implementation that can read / write from multiple
+ * {@link TextMapPropagator} implementations.
*
* @author Marcin Grzejszczak
* @since 3.0.0
*/
-@Configuration(proxyBeanMethods = false)
-@ConditionalOnBean(Tracer.class)
-@AutoConfigureBefore({ TraceAutoConfiguration.class, TraceOtelBridgeAutoConfiguation.class })
-@EnableConfigurationProperties({ SleuthPropagationProperties.class, OtelPropagationProperties.class })
-public class TraceOtelPropagationAutoConfiguration {
-
- @Bean
- @ConditionalOnMissingBean
- ContextPropagators otelContextPropagators(ObjectProvider> propagators) {
- List mapPropagators = propagators.getIfAvailable(ArrayList::new);
- if (mapPropagators.isEmpty()) {
- return OpenTelemetry.getGlobalPropagators();
- }
- DefaultContextPropagators.Builder builder = DefaultContextPropagators.builder();
- mapPropagators.forEach(builder::addTextMapPropagator);
- OpenTelemetry.setGlobalPropagators(builder.build());
- return OpenTelemetry.getGlobalPropagators();
- }
-
- @Configuration(proxyBeanMethods = false)
- static class PropagatorsConfiguration {
-
- @Bean
- CompositeTextMapPropagator compositeTextMapPropagator(BeanFactory beanFactory,
- SleuthPropagationProperties properties) {
- return new CompositeTextMapPropagator(beanFactory, properties);
- }
-
- }
-
- @Configuration(proxyBeanMethods = false)
- @ConditionalOnProperty(name = "spring.sleuth.otel.propagation.sleuth-baggage.enabled", matchIfMissing = true)
- static class BaggagePropagatorConfiguration {
-
- @Bean
- TextMapPropagator baggageTextMapPropagator(SleuthBaggageProperties properties, BaggageManager baggageManager,
- ApplicationEventPublisher publisher) {
- return new BaggageTextMapPropagator(properties, baggageManager, publisher);
- }
-
- }
-
-}
-
-class CompositeTextMapPropagator implements TextMapPropagator {
+public class CompositeTextMapPropagator implements TextMapPropagator {
private static final Log log = LogFactory.getLog(CompositeTextMapPropagator.class);
- private final Map mapping = new HashMap<>();
+ private final Map mapping = new HashMap<>();
- private final SleuthPropagationProperties properties;
+ private final List types;
- CompositeTextMapPropagator(BeanFactory beanFactory, SleuthPropagationProperties properties) {
- this.properties = properties;
+ public CompositeTextMapPropagator(BeanFactory beanFactory, List