diff --git a/README.adoc b/README.adoc index d186fda16..e92cb4163 100644 --- a/README.adoc +++ b/README.adoc @@ -54,7 +54,17 @@ Example of Sleuth with Brave tracer: @@ -81,7 +91,7 @@ being traced in the logs (notice the `0b6aaf642574edd3` ids). [indent=0] ---- -2020-10-21 12:01:16.285 INFO [,0b6aaf642574edd3,0b6aaf642574edd3,true] 289589 --- [nio-9000-exec-1] DemoController : Handling home! +2020-10-21 12:01:16.285 INFO [,0b6aaf642574edd3,0b6aaf642574edd3,true] 289589 --- [nio-9000-exec-1] DemoController : Handling home! ---- NOTE: Instead of logging the request in the handler explicitly, you could set `logging.level.org.springframework.web.servlet.DispatcherServlet=DEBUG`. diff --git a/benchmarks/README.adoc b/benchmarks/README.adoc index 95a7c9c02..a7fc7036e 100644 --- a/benchmarks/README.adoc +++ b/benchmarks/README.adoc @@ -24,9 +24,9 @@ Just execute them from the root folder like this: For JMH we're building a shaded JAR file that is next executed. -For JMeter we're running two applications, one with Sleuth, one without with Spring Boot -Maven Plugin. Next a Maven JMeter plugin is executed that loads the `*.jmx` files, starts -JMeter and prints out the results. At the end Spring Boot Maven Plugin stops the applications. +For JMeter we're running two applications, one with Sleuth, one without with Spring Boot Maven Plugin. +Next a Maven JMeter plugin is executed that loads the `*.jmx` files, starts JMeter and prints out the results. +At the end Spring Boot Maven Plugin stops the applications. === What are we testing? diff --git a/benchmarks/pom.xml b/benchmarks/pom.xml index 468c4a30b..17a834e9d 100644 --- a/benchmarks/pom.xml +++ b/benchmarks/pom.xml @@ -70,7 +70,7 @@ ${project.groupId} - spring-cloud-starter-sleuth-otel + spring-cloud-sleuth-otel org.springframework.boot diff --git a/benchmarks/src/main/java/org/springframework/cloud/sleuth/benchmarks/app/mvc/SleuthBenchmarkingSpringApp.java b/benchmarks/src/main/java/org/springframework/cloud/sleuth/benchmarks/app/mvc/SleuthBenchmarkingSpringApp.java index 41494a6c9..95a53c16d 100644 --- a/benchmarks/src/main/java/org/springframework/cloud/sleuth/benchmarks/app/mvc/SleuthBenchmarkingSpringApp.java +++ b/benchmarks/src/main/java/org/springframework/cloud/sleuth/benchmarks/app/mvc/SleuthBenchmarkingSpringApp.java @@ -35,11 +35,11 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory; import org.springframework.boot.web.servlet.context.ServletWebServerInitializedEvent; import org.springframework.boot.web.servlet.server.ServletWebServerFactory; +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.cloud.sleuth.annotation.SpanTag; -import org.springframework.cloud.sleuth.api.Span; -import org.springframework.cloud.sleuth.api.Tracer; import org.springframework.cloud.sleuth.instrument.web.SkipPatternProvider; import org.springframework.context.ApplicationListener; import org.springframework.context.annotation.Bean; diff --git a/benchmarks/src/main/java/org/springframework/cloud/sleuth/benchmarks/app/stream/SleuthBenchmarkingStreamApplication.java b/benchmarks/src/main/java/org/springframework/cloud/sleuth/benchmarks/app/stream/SleuthBenchmarkingStreamApplication.java index 5ffa81acb..bde195d0d 100644 --- a/benchmarks/src/main/java/org/springframework/cloud/sleuth/benchmarks/app/stream/SleuthBenchmarkingStreamApplication.java +++ b/benchmarks/src/main/java/org/springframework/cloud/sleuth/benchmarks/app/stream/SleuthBenchmarkingStreamApplication.java @@ -148,7 +148,8 @@ class SimpleFunction implements Function { @Override public String apply(String input) { - // tracing works cause headers from the input message get propagated to the output message + // tracing works cause headers from the input message get propagated to the output + // message log.info("Hello from simple [{}]", input); return input.toUpperCase(); } @@ -185,7 +186,8 @@ class SimpleManualFunction implements Function, Message> })).andThen(msg -> MessagingSleuthOperators.afterMessageHandled(this.beanFactory, msg, null)) .andThen(msg -> MessagingSleuthOperators.handleOutputMessage(this.beanFactory, msg)) .andThen(msg -> MessageBuilder.createMessage(msg.getPayload().toUpperCase(), msg.getHeaders())) - .andThen(msg -> MessagingSleuthOperators.afterMessageHandled(this.beanFactory, msg, null)).apply(input)); + .andThen(msg -> MessagingSleuthOperators.afterMessageHandled(this.beanFactory, msg, null)) + .apply(input)); } } diff --git a/benchmarks/src/main/java/org/springframework/cloud/sleuth/benchmarks/app/webflux/SleuthBenchmarkingSpringWebFluxApp.java b/benchmarks/src/main/java/org/springframework/cloud/sleuth/benchmarks/app/webflux/SleuthBenchmarkingSpringWebFluxApp.java index 758c993ff..1cbf460a1 100644 --- a/benchmarks/src/main/java/org/springframework/cloud/sleuth/benchmarks/app/webflux/SleuthBenchmarkingSpringWebFluxApp.java +++ b/benchmarks/src/main/java/org/springframework/cloud/sleuth/benchmarks/app/webflux/SleuthBenchmarkingSpringWebFluxApp.java @@ -34,7 +34,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.web.embedded.netty.NettyReactiveWebServerFactory; import org.springframework.boot.web.reactive.context.ReactiveWebServerInitializedEvent; -import org.springframework.cloud.sleuth.api.TraceContext; +import org.springframework.cloud.sleuth.TraceContext; import org.springframework.cloud.sleuth.instrument.web.SkipPatternProvider; import org.springframework.cloud.sleuth.instrument.web.WebFluxSleuthOperators; import org.springframework.context.ApplicationListener; diff --git a/benchmarks/src/test/java/org/springframework/cloud/sleuth/benchmarks/jmh/SampleTests.java b/benchmarks/src/test/java/org/springframework/cloud/sleuth/benchmarks/jmh/SampleTests.java index 1dcb57e7d..c71fa92f7 100644 --- a/benchmarks/src/test/java/org/springframework/cloud/sleuth/benchmarks/jmh/SampleTests.java +++ b/benchmarks/src/test/java/org/springframework/cloud/sleuth/benchmarks/jmh/SampleTests.java @@ -75,8 +75,11 @@ public class SampleTests { public static class BenchmarkContext { volatile ConfigurableApplicationContext applicationContext; + volatile InputDestination input; + volatile OutputDestination output; + @Param private Instrumentation instrumentation; diff --git a/benchmarks/src/test/java/org/springframework/cloud/sleuth/benchmarks/jmh/TracerImplementation.java b/benchmarks/src/test/java/org/springframework/cloud/sleuth/benchmarks/jmh/TracerImplementation.java index 07915b422..500277a11 100644 --- a/benchmarks/src/test/java/org/springframework/cloud/sleuth/benchmarks/jmh/TracerImplementation.java +++ b/benchmarks/src/test/java/org/springframework/cloud/sleuth/benchmarks/jmh/TracerImplementation.java @@ -16,13 +16,12 @@ package org.springframework.cloud.sleuth.benchmarks.jmh; -import org.springframework.cloud.sleuth.brave.autoconfig.TraceBraveAutoConfiguration; -import org.springframework.cloud.sleuth.otel.autoconfig.TraceOtelAutoConfiguration; +import org.springframework.cloud.sleuth.autoconfig.brave.BraveAutoConfiguration; +import org.springframework.cloud.sleuth.autoconfig.otel.OtelAutoConfiguration; public enum TracerImplementation { - otel(TraceBraveAutoConfiguration.class.getCanonicalName()), brave( - TraceOtelAutoConfiguration.class.getCanonicalName()); + otel(BraveAutoConfiguration.class.getCanonicalName()), brave(OtelAutoConfiguration.class.getCanonicalName()); private String key = "spring.autoconfigure.exclude"; diff --git a/benchmarks/src/test/java/org/springframework/cloud/sleuth/benchmarks/jmh/bridge/BridgeTests.java b/benchmarks/src/test/java/org/springframework/cloud/sleuth/benchmarks/jmh/bridge/BridgeTests.java index 1b4735012..780f07ad1 100644 --- a/benchmarks/src/test/java/org/springframework/cloud/sleuth/benchmarks/jmh/bridge/BridgeTests.java +++ b/benchmarks/src/test/java/org/springframework/cloud/sleuth/benchmarks/jmh/bridge/BridgeTests.java @@ -32,17 +32,11 @@ import org.openjdk.jmh.annotations.Warmup; import org.springframework.boot.SpringApplication; import org.springframework.boot.WebApplicationType; import org.springframework.boot.autoconfigure.ImportAutoConfiguration; -import org.springframework.cloud.sleuth.api.Span; -import org.springframework.cloud.sleuth.api.Tracer; -import org.springframework.cloud.sleuth.autoconfig.TraceAutoConfiguration; +import org.springframework.cloud.sleuth.Span; +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.benchmarks.jmh.TracerImplementation; -import org.springframework.cloud.sleuth.brave.autoconfig.TraceBraveAutoConfiguration; -import org.springframework.cloud.sleuth.brave.bridge.TraceBraveBridgeAutoConfiguation; -import org.springframework.cloud.sleuth.brave.propagation.TraceBravePropagationAutoConfiguration; -import org.springframework.cloud.sleuth.otel.autoconfig.TraceOtelAutoConfiguration; -import org.springframework.cloud.sleuth.otel.bridge.TraceOtelBridgeAutoConfiguation; -import org.springframework.cloud.sleuth.otel.log.TraceOtelLogAutoConfiguration; -import org.springframework.cloud.sleuth.otel.propagation.TraceOtelPropagationAutoConfiguration; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.annotation.Configuration; @@ -121,11 +115,7 @@ public class BridgeTests { } @Configuration(proxyBeanMethods = false) - @ImportAutoConfiguration({ TraceAutoConfiguration.class, TraceBraveAutoConfiguration.class, - TraceBraveBridgeAutoConfiguation.class, TraceBravePropagationAutoConfiguration.class, - TraceOtelAutoConfiguration.class, TraceOtelBridgeAutoConfiguation.class, - TraceOtelPropagationAutoConfiguration.class, TraceOtelLogAutoConfiguration.class, - TraceOtelLogAutoConfiguration.class }) + @ImportAutoConfiguration({ BraveAutoConfiguration.class, OtelAutoConfiguration.class }) static class TestConfiguration { } diff --git a/benchmarks/src/test/java/org/springframework/cloud/sleuth/benchmarks/jmh/mvc/StartupBenchmarkTests.java b/benchmarks/src/test/java/org/springframework/cloud/sleuth/benchmarks/jmh/mvc/StartupBenchmarkTests.java index b55be9638..dfe8c4faa 100644 --- a/benchmarks/src/test/java/org/springframework/cloud/sleuth/benchmarks/jmh/mvc/StartupBenchmarkTests.java +++ b/benchmarks/src/test/java/org/springframework/cloud/sleuth/benchmarks/jmh/mvc/StartupBenchmarkTests.java @@ -54,7 +54,8 @@ public class StartupBenchmarkTests { @Benchmark public void withoutAsync(ApplicationState state) throws Exception { - state.setExtraArgs("--spring.sleuth.async.enabled=false", "--spring.sleuth.annotation.enabled=false", state.tracerImplementation.property()); + state.setExtraArgs("--spring.sleuth.async.enabled=false", "--spring.sleuth.annotation.enabled=false", + state.tracerImplementation.property()); state.run(); } @@ -68,7 +69,8 @@ public class StartupBenchmarkTests { @Benchmark public void withoutWeb(ApplicationState state) throws Exception { state.setExtraArgs("--spring.sleuth.web.enabled=false", "--spring.sleuth.scheduled.enabled=false", - "--spring.sleuth.async.enabled=false", "--spring.sleuth.annotation.enabled=false", state.tracerImplementation.property()); + "--spring.sleuth.async.enabled=false", "--spring.sleuth.annotation.enabled=false", + state.tracerImplementation.property()); state.run(); } diff --git a/benchmarks/src/test/java/org/springframework/cloud/sleuth/benchmarks/jmh/stream/MicroBenchmarkStreamTests.java b/benchmarks/src/test/java/org/springframework/cloud/sleuth/benchmarks/jmh/stream/MicroBenchmarkStreamTests.java index c81f7a1bc..7b715850a 100644 --- a/benchmarks/src/test/java/org/springframework/cloud/sleuth/benchmarks/jmh/stream/MicroBenchmarkStreamTests.java +++ b/benchmarks/src/test/java/org/springframework/cloud/sleuth/benchmarks/jmh/stream/MicroBenchmarkStreamTests.java @@ -107,9 +107,9 @@ public class MicroBenchmarkStreamTests { protected String[] runArgs() { List strings = new ArrayList<>(); - strings.addAll(Arrays.asList("--spring.jmx.enabled=false", - this.tracerImplementation.property(), - "--spring.application.name=defaultTraceContextForStream" + instrumentation.name() + "_" + tracerImplementation.name())); + strings.addAll(Arrays.asList("--spring.jmx.enabled=false", this.tracerImplementation.property(), + "--spring.application.name=defaultTraceContextForStream" + instrumentation.name() + "_" + + tracerImplementation.name())); strings.addAll(instrumentation.entires.stream().map(s -> "--" + s).collect(Collectors.toList())); return strings.toArray(new String[0]); } diff --git a/benchmarks/src/test/java/org/springframework/cloud/sleuth/benchmarks/jmh/webflux/MicroBenchmarkHttpTests.java b/benchmarks/src/test/java/org/springframework/cloud/sleuth/benchmarks/jmh/webflux/MicroBenchmarkHttpTests.java index 296eb335f..3fcf02146 100644 --- a/benchmarks/src/test/java/org/springframework/cloud/sleuth/benchmarks/jmh/webflux/MicroBenchmarkHttpTests.java +++ b/benchmarks/src/test/java/org/springframework/cloud/sleuth/benchmarks/jmh/webflux/MicroBenchmarkHttpTests.java @@ -82,9 +82,9 @@ public class MicroBenchmarkHttpTests { } protected String[] runArgs() { - return new String[] { "--spring.jmx.enabled=false", - tracerImplementation.property(), - "--spring.application.name=defaultTraceContext" + instrumentation.name() + "_" + tracerImplementation.name(), + return new String[] { "--spring.jmx.enabled=false", tracerImplementation.property(), + "--spring.application.name=defaultTraceContext" + instrumentation.name() + "_" + + tracerImplementation.name(), "--" + instrumentation.key + "=" + instrumentation.value }; } diff --git a/benchmarks/src/test/java/org/springframework/cloud/sleuth/benchmarks/jmh/webflux/SpringWebFluxBenchmarksTests.java b/benchmarks/src/test/java/org/springframework/cloud/sleuth/benchmarks/jmh/webflux/SpringWebFluxBenchmarksTests.java index 6e3a1d2b1..f70ce2546 100644 --- a/benchmarks/src/test/java/org/springframework/cloud/sleuth/benchmarks/jmh/webflux/SpringWebFluxBenchmarksTests.java +++ b/benchmarks/src/test/java/org/springframework/cloud/sleuth/benchmarks/jmh/webflux/SpringWebFluxBenchmarksTests.java @@ -68,6 +68,7 @@ public class SpringWebFluxBenchmarksTests { static final SpanHandler FAKE_SPAN_HANDLER = new SpanHandler() { // intentionally anonymous to prevent logging fallback on NOOP }; + protected static TraceContext defaultTraceContext = TraceContext.newBuilder().traceIdHigh(333L).traceId(444L) .spanId(3).sampled(true).build(); @@ -138,8 +139,8 @@ public class SpringWebFluxBenchmarksTests { } protected String[] runArgs() { - return new String[] { "--spring.jmx.enabled=false", "--spring.application.name=defaultTraceContext", TracerImplementation.brave.toString(), - "--spring.sleuth.enabled=true" }; + return new String[] { "--spring.jmx.enabled=false", "--spring.application.name=defaultTraceContext", + TracerImplementation.brave.toString(), "--spring.sleuth.enabled=true" }; } @TearDown diff --git a/benchmarks/src/test/java/org/springframework/cloud/sleuth/benchmarks/jmh/webflux/WithOutReactorSleuthSpringWebFluxBenchmarksTests.java b/benchmarks/src/test/java/org/springframework/cloud/sleuth/benchmarks/jmh/webflux/WithOutReactorSleuthSpringWebFluxBenchmarksTests.java index a2ae976c0..3629040a1 100644 --- a/benchmarks/src/test/java/org/springframework/cloud/sleuth/benchmarks/jmh/webflux/WithOutReactorSleuthSpringWebFluxBenchmarksTests.java +++ b/benchmarks/src/test/java/org/springframework/cloud/sleuth/benchmarks/jmh/webflux/WithOutReactorSleuthSpringWebFluxBenchmarksTests.java @@ -40,8 +40,8 @@ public class WithOutReactorSleuthSpringWebFluxBenchmarksTests extends SpringWebF @Override protected String[] runArgs() { return new String[] { "--spring.jmx.enabled=false", "--spring.application.name=defaultTraceContext", - TracerImplementation.brave.toString(), - "--spring.sleuth.enabled=true", "--spring.sleuth.reactor.enabled=false" + TracerImplementation.brave.toString(), "--spring.sleuth.enabled=true", + "--spring.sleuth.reactor.enabled=false" }; } diff --git a/benchmarks/src/test/java/org/springframework/cloud/sleuth/benchmarks/jmh/webflux/WithOutSleuthSpringWebFluxBenchmarksTests.java b/benchmarks/src/test/java/org/springframework/cloud/sleuth/benchmarks/jmh/webflux/WithOutSleuthSpringWebFluxBenchmarksTests.java index 7ea130c2e..8185d0c20 100644 --- a/benchmarks/src/test/java/org/springframework/cloud/sleuth/benchmarks/jmh/webflux/WithOutSleuthSpringWebFluxBenchmarksTests.java +++ b/benchmarks/src/test/java/org/springframework/cloud/sleuth/benchmarks/jmh/webflux/WithOutSleuthSpringWebFluxBenchmarksTests.java @@ -39,8 +39,8 @@ public class WithOutSleuthSpringWebFluxBenchmarksTests extends SpringWebFluxBenc @Override protected String[] runArgs() { - return new String[] { "--spring.jmx.enabled=false", "--spring.application.name=defaultTraceContext", TracerImplementation.brave.toString(), - "--spring.sleuth.enabled=false" }; + return new String[] { "--spring.jmx.enabled=false", "--spring.application.name=defaultTraceContext", + TracerImplementation.brave.toString(), "--spring.sleuth.enabled=false" }; } @Override diff --git a/docs/pom.xml b/docs/pom.xml index 1297a2f20..9b9c12e89 100644 --- a/docs/pom.xml +++ b/docs/pom.xml @@ -14,7 +14,6 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License. --> - @@ -41,7 +40,7 @@ ${project.groupId} - spring-cloud-starter-sleuth-otel + spring-cloud-sleuth-otel ${project.groupId} diff --git a/docs/src/main/asciidoc/README.adoc b/docs/src/main/asciidoc/README.adoc index 63c63d560..70c0a9d3d 100644 --- a/docs/src/main/asciidoc/README.adoc +++ b/docs/src/main/asciidoc/README.adoc @@ -47,7 +47,17 @@ Example of Sleuth with Brave tracer: @@ -74,7 +84,7 @@ being traced in the logs (notice the `0b6aaf642574edd3` ids). [indent=0] ---- -2020-10-21 12:01:16.285 INFO [,0b6aaf642574edd3,0b6aaf642574edd3,true] 289589 --- [nio-9000-exec-1] DemoController : Handling home! +2020-10-21 12:01:16.285 INFO [,0b6aaf642574edd3,0b6aaf642574edd3,true] 289589 --- [nio-9000-exec-1] DemoController : Handling home! ---- NOTE: Instead of logging the request in the handler explicitly, you could set `logging.level.org.springframework.web.servlet.DispatcherServlet=DEBUG`. diff --git a/docs/src/main/asciidoc/_attributes.adoc b/docs/src/main/asciidoc/_attributes.adoc index ed836ba7d..e7046300c 100644 --- a/docs/src/main/asciidoc/_attributes.adoc +++ b/docs/src/main/asciidoc/_attributes.adoc @@ -17,6 +17,8 @@ // project-specific attributes :core_path: {project-root} :docs_path: {project-root}/docs +:autoconfig_path: {project-root}/spring-cloud-sleuth-autoconfigure +:api_path: {project-root}/spring-cloud-sleuth-api :brave_path: {project-root}/spring-cloud-sleuth-brave :otel_path: {project-root}/spring-cloud-sleuth-otel :tests_path: {core_path}/tests diff --git a/docs/src/main/asciidoc/_configprops.adoc b/docs/src/main/asciidoc/_configprops.adoc index c4a803307..6d388aa9a 100644 --- a/docs/src/main/asciidoc/_configprops.adoc +++ b/docs/src/main/asciidoc/_configprops.adoc @@ -1,8 +1,7 @@ |=== |Name | Default | Description -|spring.sleuth.async.configurer.enabled | `true` | Enable default AsyncConfigurer. -|spring.sleuth.async.enabled | `true` | Enable instrumenting async related components so that the tracing information is passed between threads. +|spring.sleuth.async.enabled | `false` | |spring.sleuth.async.ignored-beans | | List of {@link java.util.concurrent.Executor} bean names that should be ignored and not wrapped in a trace representation. |spring.sleuth.baggage.correlation-enabled | `true` | context. |spring.sleuth.baggage.correlation-fields | | @@ -11,16 +10,11 @@ |spring.sleuth.baggage.tag-fields | | |spring.sleuth.circuitbreaker.enabled | `true` | Enable Spring Cloud CircuitBreaker instrumentation. |spring.sleuth.enabled | `true` | -|spring.sleuth.feign.enabled | `true` | Enable span information propagation when using Feign. -|spring.sleuth.feign.processor.enabled | `true` | Enable post processor that wraps Feign Context in its tracing representations. -|spring.sleuth.grpc.enabled | `true` | Enable span information propagation when using GRPC. +|spring.sleuth.feign.enabled | `true` | When true enables instrumentation for feign. +|spring.sleuth.function.enabled | `true` | Enable instrumenting of Spring Cloud Function and Spring Cloud Function based projects (e.g. Spring Cloud Stream). |spring.sleuth.http.enabled | `true` | -|spring.sleuth.integration.enabled | `true` | Enable Spring Integration sleuth instrumentation. +|spring.sleuth.integration.enabled | `false` | Enable Spring Integration sleuth instrumentation. |spring.sleuth.integration.patterns | `[!hystrixStreamOutput*, *, !channel*]` | An array of patterns against which channel names will be matched. @see org.springframework.integration.config.GlobalChannelInterceptor#patterns() Defaults to any channel name not matching the Hystrix Stream and functional Stream channel names. -|spring.sleuth.integration.websockets.enabled | `true` | Enable tracing for WebSockets. -|spring.sleuth.messaging.jms.enabled | `true` | Enable tracing of JMS. -|spring.sleuth.messaging.kafka.enabled | `true` | Enable tracing of Kafka. -|spring.sleuth.messaging.kafka.mapper.enabled | `true` | Enable DefaultKafkaHeaderMapper tracing for Kafka. |spring.sleuth.messaging.messaging.enabled | `false` | Should messaging be turned on. |spring.sleuth.messaging.messaging.jms.enabled | `false` | |spring.sleuth.messaging.messaging.jms.remote-service-name | `jms` | @@ -28,22 +22,30 @@ |spring.sleuth.messaging.messaging.kafka.remote-service-name | `kafka` | |spring.sleuth.messaging.messaging.rabbit.enabled | `false` | |spring.sleuth.messaging.messaging.rabbit.remote-service-name | `rabbitmq` | -|spring.sleuth.messaging.rabbit.enabled | `true` | Enable tracing of RabbitMQ. -|spring.sleuth.mongodb.enabled | `true` | Enable tracing for MongoDb. |spring.sleuth.opentracing.enabled | `true` | +|spring.sleuth.otel.config.instrumentation-name | `org.springframework.cloud.spring-cloud-sleuth` | Instrumentation name to be used to find a Tracer. +|spring.sleuth.otel.config.instrumentation-version | | Instrumentation version to be used to find a Tracer. +|spring.sleuth.otel.config.max-attr-length | `0` | Returns the global default max length of string attribute value in characters. +|spring.sleuth.otel.config.max-attrs | `0` | Returns the global default max number of attributes per {@link Span}. +|spring.sleuth.otel.config.max-event-attrs | `0` | Returns the global default max number of attributes per event. +|spring.sleuth.otel.config.max-events | `0` | Returns the global default max number of events per {@link Span}. +|spring.sleuth.otel.config.max-link-attrs | `0` | Returns the global default max number of attributes per link. +|spring.sleuth.otel.config.max-links | `0` | Returns the global default max number of link entries per {@link Span}. +|spring.sleuth.otel.exporter.sleuth-span-filter.enabled | `true` | This application service name. +|spring.sleuth.otel.log.exporter.enabled | `false` | Enable log support for Otel. +|spring.sleuth.otel.log.slf4j.enabled | `false` | Enable log support for Otel. +|spring.sleuth.otel.propagation.composite-text-map-propagator.enabled | `true` | Enable a composite text map propagator that can combine multiple propagation types into a single text map propagator. +|spring.sleuth.otel.propagation.sleuth-baggage.enabled | `true` | Enable propagating baggage in a Sleuth compatible way (baggage key & value pair means e.g. a key & value HTTP pair). |spring.sleuth.propagation.type | | Type of propagation. -|spring.sleuth.quartz.enabled | `true` | Enable tracing for Quartz. |spring.sleuth.reactor.decorate-on-each | `true` | When true decorates on each operator, will be less performing, but logging will always contain the tracing entries in each operator. When false decorates on last operator, will be more performing, but logging might not always contain the tracing entries. @deprecated use explicit value via {@link SleuthReactorProperties#instrumentationType} |spring.sleuth.reactor.enabled | `true` | When true enables instrumentation for reactor. |spring.sleuth.reactor.instrumentation-type | | |spring.sleuth.redis.enabled | `true` | Enable span information propagation when using Redis. |spring.sleuth.redis.remote-service-name | `redis` | Service name for the remote Redis endpoint. -|spring.sleuth.rpc.enabled | `true` | Enable tracing of RPC. |spring.sleuth.rxjava.schedulers.hook.enabled | `true` | Enable support for RxJava via RxJavaSchedulersHook. |spring.sleuth.rxjava.schedulers.ignoredthreads | `[HystrixMetricPoller, ^RxComputation.*$]` | Thread names for which spans will not be sampled. |spring.sleuth.sampler.probability | | Probability of requests that should be sampled. E.g. 1.0 - 100% requests should be sampled. The precision is whole-numbers only (i.e. there's no support for 0.1% of the traces). |spring.sleuth.sampler.rate | `10` | A rate per second can be a nice choice for low-traffic endpoints as it allows you surge protection. For example, you may never expect the endpoint to get more than 50 requests per second. If there was a sudden surge of traffic, to 5000 requests per second, you would still end up with 50 traces per second. Conversely, if you had a percentage, like 10%, the same surge would end up with 500 traces per second, possibly overloading your storage. Amazon X-Ray includes a rate-limited sampler (named Reservoir) for this purpose. Brave has taken the same approach via the {@link brave.sampler.RateLimitingSampler}. -|spring.sleuth.sampler.refresh.enabled | `true` | Enable refresh scope for sampler. |spring.sleuth.scheduled.enabled | `true` | Enable tracing for {@link org.springframework.scheduling.annotation.Scheduled}. |spring.sleuth.scheduled.skip-pattern | | Pattern for the fully qualified name of a class that should be skipped. |spring.sleuth.span-filter.additional-span-name-patterns-to-ignore | | Additional list of span names to ignore. Will be appended to {@link #spanNamePatternsToSkip}. @@ -51,14 +53,15 @@ |spring.sleuth.span-filter.span-name-patterns-to-skip | `^catalogWatchTaskScheduler$` | List of span names to ignore. They will not be sent to external systems. |spring.sleuth.supports-join | `true` | True means the tracing system supports sharing a span ID between a client and server. |spring.sleuth.trace-id128 | `false` | When true, generate 128-bit trace IDs instead of 64-bit ones. +|spring.sleuth.tracer.mode | | Set which tracer implementation should be picked. |spring.sleuth.web.additional-skip-pattern | | Additional pattern for URLs that should be skipped in tracing. This will be appended to the {@link SleuthWebProperties#skipPattern}. |spring.sleuth.web.client.enabled | `true` | Enable interceptor injecting into {@link org.springframework.web.client.RestTemplate}. |spring.sleuth.web.client.skip-pattern | | Pattern for URLs that should be skipped in client side tracing. |spring.sleuth.web.enabled | `true` | When true enables instrumentation for web applications. -|spring.sleuth.web.filter-order | | Order in which the tracing filters should be registered. Defaults to {@link TraceWebServletAutoConfiguration#TRACING_FILTER_ORDER}. -|spring.sleuth.web.ignore-auto-configured-skip-patterns | `false` | If set to true, auto-configured skip patterns will be ignored. @see SkipPatternConfiguration +|spring.sleuth.web.filter-order | `0` | Order in which the tracing filters should be registered. +|spring.sleuth.web.ignore-auto-configured-skip-patterns | `false` | If set to true, auto-configured skip patterns will be ignored. +|spring.sleuth.web.servlet.enabled | `true` | Enable servlet instrumentation. |spring.sleuth.web.skip-pattern | `/api-docs.*\|/swagger.*\|.*\.png\|.*\.css\|.*\.js\|.*\.html\|/favicon.ico\|/hystrix.stream` | Pattern for URLs that should be skipped in tracing. -|spring.sleuth.web.webclient.enabled | `true` | Enable tracing instrumentation for WebClient. |spring.zipkin.activemq.message-max-bytes | `100000` | Maximum number of bytes for a given message with spans sent to Zipkin over ActiveMQ. |spring.zipkin.activemq.queue | `zipkin` | Name of the ActiveMQ queue where spans should be sent to Zipkin. |spring.zipkin.base-url | `http://localhost:9411/` | URL of the zipkin query server instance. You can also provide the service id of the Zipkin server if Zipkin's registered in service discovery (e.g. https://zipkinserver/). diff --git a/docs/src/main/asciidoc/appendix.adoc b/docs/src/main/asciidoc/appendix.adoc index 8cb9df2dc..b2d7034c2 100644 --- a/docs/src/main/asciidoc/appendix.adoc +++ b/docs/src/main/asciidoc/appendix.adoc @@ -1,4 +1,5 @@ :numbered!: + [[appendix]] [[common-application-properties]] == Common application properties diff --git a/docs/src/main/asciidoc/documentation-overview.adoc b/docs/src/main/asciidoc/documentation-overview.adoc index 2ee63dc4b..c184f6f8e 100644 --- a/docs/src/main/asciidoc/documentation-overview.adoc +++ b/docs/src/main/asciidoc/documentation-overview.adoc @@ -1,11 +1,10 @@ [[documentation]] = Spring Cloud Sleuth Documentation + include::_attributes.adoc[] -This section provides a brief overview of {project-full-name} reference documentation. It serves -as a map for the rest of the document. - - +This section provides a brief overview of {project-full-name} reference documentation. +It serves as a map for the rest of the document. [[sleuth-documentation-about]] == About the Documentation @@ -16,32 +15,28 @@ The {project-full-name} reference guide is available as * {docs-url}/reference/htmlsingle[Single-page HTML] * {docs-url}/reference/pdf/{project-name}.pdf[PDF] -Copies of this document may be made for your own use and for distribution to others, -provided that you do not charge any fee for such copies and further provided that each -copy contains this Copyright Notice, whether distributed in print or electronically. - - +Copies of this document may be made for your own use and for distribution to others, provided that you do not charge any fee for such copies and further provided that each copy contains this Copyright Notice, whether distributed in print or electronically. [[documentation-getting-help]] == Getting Help + If you have trouble with {project-full-name}, we would like to help. -* Try the <>. They provide solutions to the most -common questions. -* Learn the {project-full-name} basics. If you are -starting out with {project-full-name}, try one of the https://spring.io/guides[guides]. -* Ask a question. We monitor https://stackoverflow.com[stackoverflow.com] for questions -tagged with https://stackoverflow.com/tags/{project-name}[`{project-name}`]. +* Try the <>. +They provide solutions to the most common questions. +* Learn the {project-full-name} basics. +If you are starting out with {project-full-name}, try one of the https://spring.io/guides[guides]. +* Ask a question. +We monitor https://stackoverflow.com[stackoverflow.com] for questions tagged with https://stackoverflow.com/tags/{project-name}[`{project-name}`]. * Report bugs with {project-full-name} at https://github.com/spring-cloud/{project-name}/issues. * Chat with us at http://https://gitter.im/spring-cloud/{project-name}[{project-full-name} Gitter] -NOTE: All of {project-full-name} is open source, including the documentation. If you find -problems with the docs or if you want to improve them, please {github-code}[get -involved]. - +NOTE: All of {project-full-name} is open source, including the documentation. +If you find problems with the docs or if you want to improve them, please {github-code}[get involved]. [[sleuth-documentation-first-steps]] == First Steps + If you are getting started with {project-full-name} or 'Spring' in general, start with <>: @@ -51,8 +46,8 @@ If you are getting started with {project-full-name} or 'Spring' in general, star [[sleuth-documentation-working-with-sleuth]] == Working with {project-full-name} -Ready to actually start using {project-full-name}? <>: + +Ready to actually start using {project-full-name}? <>: * <> * <> @@ -60,6 +55,7 @@ you covered>>: [[sleuth-documentation-features]] == Learning about {project-full-name} Features + Need more details about {project-full-name}'s core features? <>: @@ -78,6 +74,7 @@ Need more details about {project-full-name}'s core features? [[sleuth-documentation-integration]] == Integrations Topics + Finally, we have topics related to instrumentation integrations: * *Integrations:* diff --git a/docs/src/main/asciidoc/getting-started.adoc b/docs/src/main/asciidoc/getting-started.adoc index 4a4c88ef8..bb4fc3ed3 100644 --- a/docs/src/main/asciidoc/getting-started.adoc +++ b/docs/src/main/asciidoc/getting-started.adoc @@ -18,7 +18,8 @@ It integrates out of the box with two tracer implementations: * https://opentelemetry.io[OpenTelemetry SDK] Spring Cloud Sleuth is able to trace your requests and messages so that you can correlate that communication to corresponding log entries. -You can also export the tracing information to an external system to visualize latency. Spring Cloud Sleuth supports https://zipkin.io[OpenZipkin] compatible systems directly and various other ones via the OpenTelemetry integration. +You can also export the tracing information to an external system to visualize latency. +Spring Cloud Sleuth supports https://zipkin.io[OpenZipkin] compatible systems directly and various other ones via the OpenTelemetry integration. [[getting-started-terminology]] === Terminology @@ -92,7 +93,8 @@ image::{github-raw}/docs/src/main/asciidoc/images/parents.png[Parent child relat == Developing Your First Spring Cloud sleuth-based Application This section describes how to develop a small “Hello World!” web application that highlights some of Spring Cloud Sleuth’s key features. -We use Maven to build this project, since most IDEs support it. As the tracer implementation we'll use https://github.com/openzipkin/brave[OpenZipkin Brave]. +We use Maven to build this project, since most IDEs support it. +As the tracer implementation we'll use https://github.com/openzipkin/brave[OpenZipkin Brave]. [TIP] ==== @@ -191,7 +193,35 @@ To add the necessary dependencies, edit your `pom.xml` and add the `spring-boot- ---- -To use Sleuth with OpenTelemetry pass `spring-cloud-starter-sleuth-otel` instead of `spring-cloud-stater-sleuth`. +To use Sleuth with OpenTelemetry do the following. + +[source,xml,indent=0,subs="verbatim,quotes,attributes"] +---- + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.cloud + spring-cloud-starter-sleuth + + + + org.springframework.cloud + spring-cloud-sleuth-brave + + + + + + org.springframework.cloud + spring-cloud-sleuth-otel + + +---- [[getting-started-first-application-code]] === Writing the Code @@ -232,7 +262,8 @@ We step through the important parts in the next few sections. [getting-started-first-application-annotations]] ==== The @RestController and @RequestMapping Annotations -Spring Boot sets up the Rest Controller and makes our application bind to a Tomcat port. Spring Cloud Sleuth with Brave tracer will provide instrumentation of the incoming request. +Spring Boot sets up the Rest Controller and makes our application bind to a Tomcat port. +Spring Cloud Sleuth with Brave tracer will provide instrumentation of the incoming request. [[getting-started-first-application-run]] === Running the Example @@ -273,10 +304,11 @@ If you check the logs you should see a similar output 2020-10-21 12:01:16.285 INFO [backend,0b6aaf642574edd3,0b6aaf642574edd3,true] 289589 --- [nio-9000-exec-1] Example : Hello world! ---- -You can notice that the logging format has been updated with the following information `[backend,0b6aaf642574edd3,0b6aaf642574edd3,true]`. This entry corresponds to `[application name,trace id, span id, whether the trace should be propagated to an external system]`. The application name got read from the `SPRING_APPLICATION_NAME` environment variable. +You can notice that the logging format has been updated with the following information `[backend,0b6aaf642574edd3,0b6aaf642574edd3,true]`. +This entry corresponds to `[application name,trace id, span id, whether the trace should be propagated to an external system]`. +The application name got read from the `SPRING_APPLICATION_NAME` environment variable. -NOTE: Instead of logging the request in the handler explicitly, you -could set `logging.level.org.springframework.web.servlet.DispatcherServlet=DEBUG`. +NOTE: Instead of logging the request in the handler explicitly, you could set `logging.level.org.springframework.web.servlet.DispatcherServlet=DEBUG`. To gracefully exit the application, press `ctrl-c`. diff --git a/docs/src/main/asciidoc/howto.adoc b/docs/src/main/asciidoc/howto.adoc index 542f602af..efc2abd04 100644 --- a/docs/src/main/asciidoc/howto.adoc +++ b/docs/src/main/asciidoc/howto.adoc @@ -50,7 +50,7 @@ dependencyManagement { } dependencies { - compile "org.springframework.cloud:spring-cloud-starter-sleuth" + implementation "org.springframework.cloud:spring-cloud-starter-sleuth" } ---- ==== @@ -58,7 +58,7 @@ dependencies { [[how-to-set-up-sleuth-with-otel]] == How to Set Up Sleuth with OpenTelemetry? -Add the Sleuth OpenTelemetry starter to the classpath. +Add the Sleuth starter, exlcude Brave and add OpenTelemetry dependency to the classpath. ==== [source,xml,indent=0,subs="verbatim,attributes",role="primary"] @@ -78,7 +78,17 @@ Add the Sleuth OpenTelemetry starter to the classpath. org.springframework.cloud - spring-cloud-starter-sleuth-otel + spring-cloud-starter-sleuth + + + org.springframework.cloud + spring-cloud-sleuth-brave + + + + + org.springframework.cloud + spring-cloud-sleuth-otel ---- @@ -92,7 +102,9 @@ dependencyManagement { } dependencies { - compile "org.springframework.cloud:spring-cloud-starter-sleuth-otel" + implementation("org.springframework.cloud:spring-cloud-starter-sleuth") { + exclude group: 'org.springframework.cloud', module: 'spring-cloud-sleuth-brave' + } } ---- ==== @@ -138,8 +150,8 @@ dependencyManagement { } dependencies { - compile "org.springframework.cloud:spring-cloud-starter-sleuth" - compile "org.springframework.cloud:spring-cloud-sleuth-zipkin" + implementation "org.springframework.cloud:spring-cloud-starter-sleuth" + implementation "org.springframework.cloud:spring-cloud-sleuth-zipkin" } ---- ==== @@ -147,7 +159,7 @@ dependencies { [[how-to-set-up-sleuth-with-otel-zipkin-http]] == How to Set Up Sleuth with OpenTelemetry & Zipkin via HTTP? -Add the Sleuth starter and Zipkin to the classpath. +Add the Sleuth starter, exclude Brave, add OTel and Zipkin to the classpath. ==== [source,xml,indent=0,subs="verbatim,attributes",role="primary"] @@ -167,7 +179,17 @@ Add the Sleuth starter and Zipkin to the classpath. org.springframework.cloud - spring-cloud-starter-sleuth-otel + spring-cloud-starter-sleuth + + + org.springframework.cloud + spring-cloud-sleuth-brave + + + + + org.springframework.cloud + spring-cloud-sleuth-otel org.springframework.cloud @@ -185,8 +207,10 @@ dependencyManagement { } dependencies { - compile "org.springframework.cloud:spring-cloud-starter-sleuth-otel" - compile "org.springframework.cloud:spring-cloud-sleuth-zipkin" + implementation("org.springframework.cloud:spring-cloud-starter-sleuth") { + exclude group: 'org.springframework.cloud', module: 'spring-cloud-sleuth-brave' + } + implementation "org.springframework.cloud:spring-cloud-sleuth-zipkin" } ---- ==== @@ -239,9 +263,9 @@ dependencyManagement { } dependencies { - compile "org.springframework.cloud:spring-cloud-starter-sleuth" - compile "org.springframework.cloud:spring-cloud-sleuth-zipkin" - compile "org.springframework.kafka:spring-kafka" + implementation "org.springframework.cloud:spring-cloud-starter-sleuth" + implementation "org.springframework.cloud:spring-cloud-sleuth-zipkin" + implementation "org.springframework.kafka:spring-kafka" } ---- ==== @@ -295,9 +319,9 @@ dependencyManagement { } dependencies { - compile "org.springframework.cloud:spring-cloud-starter-sleuth" - compile "org.springframework.cloud:spring-cloud-sleuth-zipkin" - compile "org.springframework.amqp:spring-rabbit" + implementation "org.springframework.cloud:spring-cloud-starter-sleuth" + implementation "org.springframework.cloud:spring-cloud-sleuth-zipkin" + implementation "org.springframework.amqp:spring-rabbit" } ---- ==== @@ -344,9 +368,9 @@ dependencyManagement { } dependencies { - compile "org.springframework.cloud:spring-cloud-starter-sleuth" - compile "org.springframework.cloud:spring-cloud-sleuth-zipkin" - compile "org.apache.activemq:activemq-client" + implementation "org.springframework.cloud:spring-cloud-starter-sleuth" + implementation "org.springframework.cloud:spring-cloud-sleuth-zipkin" + implementation "org.apache.activemq:activemq-client" } ---- ==== @@ -384,7 +408,17 @@ If using Kafka, you must add the Kafka dependency. org.springframework.cloud - spring-cloud-starter-sleuth-otel + spring-cloud-starter-sleuth + + + org.springframework.cloud + spring-cloud-sleuth-brave + + + + + org.springframework.cloud + spring-cloud-sleuth-otel org.springframework.cloud @@ -406,9 +440,11 @@ dependencyManagement { } dependencies { - compile "org.springframework.cloud:spring-cloud-starter-sleuth-otel" - compile "org.springframework.cloud:spring-cloud-sleuth-zipkin" - compile "org.springframework.kafka:spring-kafka" + implementation("org.springframework.cloud:spring-cloud-starter-sleuth") { + exclude group: 'org.springframework.cloud', module: 'spring-cloud-sleuth-brave' + } + implementation "org.springframework.cloud:spring-cloud-sleuth-zipkin" + implementation "org.springframework.kafka:spring-kafka" } ---- ==== @@ -420,7 +456,7 @@ Also, you need to set the property `spring.zipkin.sender.type` property accordin spring.zipkin.sender.type: kafka ---- -If you want Sleuth over RabbitMQ, add the `spring-cloud-starter-sleuth-otel`, `spring-cloud-sleuth-zipkin` and `spring-rabbit` dependencies. +If you want Sleuth over RabbitMQ, add the `spring-cloud-sleuth-otel` (exclude `spring-cloud-sleuth-brave`), `spring-cloud-sleuth-zipkin` and `spring-rabbit` dependencies. ==== [source,xml,indent=0,subs="verbatim,attributes",role="primary"] @@ -462,14 +498,14 @@ dependencyManagement { } dependencies { - compile "org.springframework.cloud:spring-cloud-starter-sleuth" - compile "org.springframework.cloud:spring-cloud-sleuth-zipkin" - compile "org.springframework.amqp:spring-rabbit" + implementation "org.springframework.cloud:spring-cloud-starter-sleuth" + implementation "org.springframework.cloud:spring-cloud-sleuth-zipkin" + implementation "org.springframework.amqp:spring-rabbit" } ---- ==== -If you want Sleuth over RabbitMQ, add the `spring-cloud-starter-sleuth-otel`, `spring-cloud-sleuth-zipkin` and `activemq-client` dependencies. +If you want Sleuth over RabbitMQ, add the `spring-cloud-sleuth-otel` (exclude `spring-cloud-sleuth-brave`), `spring-cloud-sleuth-zipkin` and `activemq-client` dependencies. ==== [source,xml,indent=0,subs="verbatim,attributes",role="primary"] @@ -489,7 +525,17 @@ If you want Sleuth over RabbitMQ, add the `spring-cloud-starter-sleuth-otel`, `s org.springframework.cloud - spring-cloud-starter-sleuth-otel + spring-cloud-starter-sleuth + + + org.springframework.cloud + spring-cloud-sleuth-brave + + + + + org.springframework.cloud + spring-cloud-sleuth-otel org.springframework.cloud @@ -511,9 +557,11 @@ dependencyManagement { } dependencies { - compile "org.springframework.cloud:spring-cloud-starter-sleuth-otel" - compile "org.springframework.cloud:spring-cloud-sleuth-zipkin" - compile "org.apache.activemq:activemq-client" + implementation("org.springframework.cloud:spring-cloud-starter-sleuth") { + exclude group: 'org.springframework.cloud', module: 'spring-cloud-sleuth-brave' + } + implementation "org.springframework.cloud:spring-cloud-sleuth-zipkin" + implementation "org.apache.activemq:activemq-client" } ---- ==== @@ -570,7 +618,7 @@ For example if you want to use the OpenTelemetry Zipkin Exporter just add a depe .Gradle ---- dependencies { - compile "io.opentelemetry:opentelemetry-exporter-zipkin" + implementation "io.opentelemetry:opentelemetry-exporter-zipkin" } ---- ==== @@ -615,7 +663,7 @@ Example where instrumentation will work: import org.springframework.context.annotation.Configuration; import org.springframework.web.client.RestTemplate; -@Configuration +@Configuration(proxyBeanMethods = false) class MyConfiguration { @Bean RestTemplate myRestTemplate() { return new RestTemplate(); @@ -665,12 +713,12 @@ Register a bean of `HttpResponseParser` type whose name is `HttpServerResponsePa ==== [source,java,indent=0] ---- -import org.springframework.cloud.sleuth.api.http.HttpResponseParser; +import org.springframework.cloud.sleuth.http.HttpResponseParser; import org.springframework.cloud.sleuth.instrument.web.HttpServerResponseParser; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -@Configuration +@Configuration(proxyBeanMethods = false) class MyConfig { @Bean(name = HttpServerResponseParser.NAME) @@ -689,6 +737,8 @@ class MyConfig { ---- ==== +IMPORTANT: Your spans need to be sampled for the parser to work. That means that you need to be able to export spans to e.g. Zipkin. + [[how-to-cutomize-http-client-spans]] == How to Customize HTTP Client Spans? @@ -715,6 +765,8 @@ include::{common_tests_path}/src/main/java/org/springframework/cloud/sleuth/inst ---- ==== +IMPORTANT: Your spans need to be sampled for the parser to work. That means that you need to be able to export spans to e.g. Zipkin. + [[how-to-see-application-name-in-logs]] == How to See the Application Name in Logs? @@ -729,7 +781,7 @@ To use the provided defaults you can set the `spring.sleuth.propagation.type` pr The value can be a list in which case you will propagate more tracing headers. For Brave we support `AWS`, `B3`, `W3C` propagation types. -For OpenTelemetry we support `AWS`, `B3`, `JAEGER`, `W3C`, `OT_TRACER` and `W3C` via the `io.opentelemetry:opentelemetry-extension-trace-propagators` that we provide via the `spring-cloud-starter-sleuth-otel` starter. +For OpenTelemetry we support `AWS`, `B3`, `JAEGER`, `W3C`, `OT_TRACER` and `W3C` propagation types. If you want to provide a custom propagation mechanism set the `spring.sleuth.propagation.type` property to `CUSTOM` and implement your own bean (`Propagation.Factory` for Brave and `TextMapPropagator` for OpenTelemetry). Below you can find the examples: @@ -739,18 +791,20 @@ Below you can find the examples: .Brave ---- @Component -include::{brave_path}/src/test/java/org/springframework/cloud/sleuth/brave/propagation/TraceBravePropagationAutoConfigurationTests.java[tags=custom_propagator,indent=0] +include::{autoconfig_path}/src/test/java/org/springframework/cloud/sleuth/autoconfig/brave/BravePropagationTests.java[tags=custom_propagator,indent=0] ---- [source,java,indent=0,subs="verbatim,attributes",role="secondary"] .OpenTelemetry ---- @Component -include::{otel_path}/src/test/java/org/springframework/cloud/sleuth/otel/propagation/TraceOtelPropagationAutoConfigurationTests.java[tags=custom_propagator,indent=0] +include::{autoconfig_path}/src/test/java/org/springframework/cloud/sleuth/autoconfig/otel/OtelPropagationConfigurationTests.java[tags=custom_propagator,indent=0] ---- ==== [[how-to-implement-own-tracer]] == How to Implement My Own Tracer? -Spring Cloud Sleuth Core in its `api` module contains all necessary interfaces to be implemented by a tracer. The project comes with OpenZipkin Brave and OpenTelemetry implementations. You can check how both tracers are bridged to the Sleuth's API by looking at the `org.springframework.cloud.sleuth.brave.bridge` and `org.springframework.cloud.sleuth.otel.bridge` modules respectively. \ No newline at end of file +Spring Cloud Sleuth API contains all necessary interfaces to be implemented by a tracer. +The project comes with OpenZipkin Brave and OpenTelemetry implementations. +You can check how both tracers are bridged to the Sleuth's API by looking at the `org.springframework.cloud.sleuth.brave.bridge` and `org.springframework.cloud.sleuth.otel.bridge` modules respectively. \ No newline at end of file diff --git a/docs/src/main/asciidoc/integrations.adoc b/docs/src/main/asciidoc/integrations.adoc index 655a5ec32..c83059b2c 100644 --- a/docs/src/main/asciidoc/integrations.adoc +++ b/docs/src/main/asciidoc/integrations.adoc @@ -1,5 +1,6 @@ [[sleuth-integration]] = Spring Cloud Sleuth customization + include::_attributes.adoc[] In this section, we describe how to customize various parts of Spring Cloud Sleuth. @@ -43,7 +44,8 @@ If you want to skip span creation for some `@Scheduled` annotated classes, you c This feature is available for both Brave and OpenTelemetry tracer implementation. -We provide `LazyTraceExecutor`, `TraceableExecutorService`, and `TraceableScheduledExecutorService`. Those implementations create spans each time a new task is submitted, invoked, or scheduled. +We provide `LazyTraceExecutor`, `TraceableExecutorService`, and `TraceableScheduledExecutorService`. +Those implementations create spans each time a new task is submitted, invoked, or scheduled. The following example shows how to pass tracing information with `TraceableExecutorService` when working with `CompletableFuture`: @@ -56,8 +58,7 @@ include::{common_tests_path}/src/main/java/org/springframework/cloud/sleuth/inst IMPORTANT: Sleuth does not work with `parallelStream()` out of the box. If you want to have the tracing information propagated through the stream, you have to use the approach with `supplyAsync(...)`, as shown earlier. -If there are beans that implement the `Executor` interface that you would like -to exclude from span creation, you can use the `spring.sleuth.async.ignored-beans` +If there are beans that implement the `Executor` interface that you would like to exclude from span creation, you can use the `spring.sleuth.async.ignored-beans` property where you can provide a list of bean names. You can disable this behavior by setting the value of `spring.sleuth.async.enabled` to `false`. @@ -73,11 +74,9 @@ The following example shows how to set up such a custom `Executor`: include::{common_tests_path}/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/MultipleAsyncRestTemplateTests.java[tags=custom_executor,indent=0] ---- -TIP: To ensure that your configuration gets post processed, remember -to add the `@Role(BeanDefinition.ROLE_INFRASTRUCTURE)` on your +TIP: To ensure that your configuration gets post processed, remember to add the `@Role(BeanDefinition.ROLE_INFRASTRUCTURE)` on your `@Configuration` class - [[sleuth-http-client-integration]] == HTTP Client Integration @@ -101,7 +100,9 @@ If you create a `RestTemplate` instance with a `new` keyword, the instrumentatio This feature is available for both Brave and OpenTelemetry tracer implementation. -IMPORTANT: Starting with Sleuth `2.0.0`, we no longer register a bean of `AsyncRestTemplate` type. It is up to you to create such a bean. Then we instrument it. +IMPORTANT: Starting with Sleuth `2.0.0`, we no longer register a bean of `AsyncRestTemplate` type. +It is up to you to create such a bean. +Then we instrument it. To block the `AsyncRestTemplate` features, set `spring.sleuth.web.async.client.enabled` to `false`. To disable creation of the default `TraceAsyncClientHttpRequestFactoryWrapper`, set `spring.sleuth.web.async.client.factory.enabled` @@ -129,7 +130,7 @@ We inject a `ExchangeFilterFunction` implementation that creates a span and, thr To block this feature, set `spring.sleuth.web.client.enabled` to `false`. IMPORTANT: You have to register `WebClient` as a bean so that the tracing instrumentation gets applied. -If you create a `WebClient` instance with a `new` keyword, the instrumentation does NOT work. +If you create a `WebClient` instance with a `new` keyword, the instrumentation does NOT work. [[sleuth-http-client-traverson-integration]] ==== Traverson @@ -137,8 +138,8 @@ If you create a `WebClient` instance with a `new` keyword, the instrumentation This feature is available for both Brave and OpenTelemetry tracer implementation. If you use the https://docs.spring.io/spring-hateoas/docs/current/reference/html/#client.traverson[Traverson] library, you can inject a `RestTemplate` as a bean into your Traverson object. -Since `RestTemplate` is already intercepted, you get full support for tracing in your client. The following pseudo code -shows how to do that: +Since `RestTemplate` is already intercepted, you get full support for tracing in your client. +The following pseudo code shows how to do that: [source,java,indent=0] ---- @@ -154,8 +155,7 @@ Traverson traverson = new Traverson(URI.create("https://some/address"), This feature is available for Brave tracer implementation. -We instrument the `HttpClientBuilder` and `HttpAsyncClientBuilder` so that -tracing context gets injected to the sent requests. +We instrument the `HttpClientBuilder` and `HttpAsyncClientBuilder` so that tracing context gets injected to the sent requests. To block these features, set `spring.sleuth.web.client.enabled` to `false`. @@ -235,7 +235,9 @@ You can configure which URIs you would like to skip by using the `spring.sleuth. If you have `ManagementServerProperties` on the classpath, its value of `contextPath` gets appended to the provided skip pattern. If you want to reuse Sleuth's default skip patterns and append your own, pass those patterns by using the `spring.sleuth.web.additionalSkipPattern`. -In order to achieve best results in terms of performance and context propagation we suggest that you switch the `spring.sleuth.reactor.instrumentation-type` to `MANUAL`. In order to execute code with the span in scope you can call `WebFluxSleuthOperators.withSpanInScope`. Example: +In order to achieve best results in terms of performance and context propagation we suggest that you switch the `spring.sleuth.reactor.instrumentation-type` to `MANUAL`. +In order to execute code with the span in scope you can call `WebFluxSleuthOperators.withSpanInScope`. +Example: [source,java,indent=0] ----- @@ -265,8 +267,7 @@ By default, all channels but `hystrixStreamOutput` channel are included. IMPORTANT: When using the `Executor` to build a Spring Integration `IntegrationFlow`, you must use the untraced version of the `Executor`. Decorating the Spring Integration Executor Channel with `TraceableExecutorService` causes the spans to be improperly closed. -If you want to customize the way tracing context is read from and written to message headers, -it's enough for you to register beans of types: +If you want to customize the way tracing context is read from and written to message headers, it's enough for you to register beans of types: * `Propagator.Setter` - for writing headers to the message * `Propagator.Getter` - for reading headers from the message @@ -276,7 +277,10 @@ it's enough for you to register beans of types: This feature is available for both Brave and OpenTelemetry tracer implementation. -Spring Cloud Sleuth can instrument Spring Cloud Function. The way to achieve it is to provide a `Function` or `Consumer` or `Supplier` that takes in a `Message` as a parameter e.g. `Function, Message>`. If the type is not `Message` then instrumentation will not take place. Out of the box instrumentation will not take place when dealing with Reactor based streams - e.g. `Function>, Flux>>`. +Spring Cloud Sleuth can instrument Spring Cloud Function. +The way to achieve it is to provide a `Function` or `Consumer` or `Supplier` that takes in a `Message` as a parameter e.g. `Function, Message>`. +If the type is not `Message` then instrumentation will not take place. +Out of the box instrumentation will not take place when dealing with Reactor based streams - e.g. `Function>, Flux>>`. Since Spring Cloud Stream reuses Spring Cloud Function, you'll get the instrumentation out of the box. @@ -294,8 +298,7 @@ include::{project-root}/benchmarks/src/main/java/org/springframework/cloud/sleut This feature is available for Brave tracer implementation. -We instrument the `RabbitTemplate` so that tracing headers get injected -into the message. +We instrument the `RabbitTemplate` so that tracing headers get injected into the message. To block this feature, set `spring.sleuth.messaging.rabbit.enabled` to `false`. @@ -315,9 +318,7 @@ To block this feature, set `spring.sleuth.messaging.kafka.enabled` to `false`. This feature is available for Brave tracer implementation. -We instrument the `KafkaStreams` `KafkaClientSupplier` so that tracing headers -get injected into the `Producer` and `Consumer`s. A `KafkaStreamsTracing` bean -allows for further instrumentation through additional `TransformerSupplier` and +We instrument the `KafkaStreams` `KafkaClientSupplier` so that tracing headers get injected into the `Producer` and `Consumer`s. A `KafkaStreamsTracing` bean allows for further instrumentation through additional `TransformerSupplier` and `ProcessorSupplier` methods. To block this feature, set `spring.sleuth.messaging.kafka.streams.enabled` to `false`. @@ -327,8 +328,8 @@ To block this feature, set `spring.sleuth.messaging.kafka.streams.enabled` to `f This feature is available for Brave tracer implementation. -We instrument the `JmsTemplate` so that tracing headers get injected -into the message. We also support `@JmsListener` annotated methods on the consumer side. +We instrument the `JmsTemplate` so that tracing headers get injected into the message. +We also support `@JmsListener` annotated methods on the consumer side. To block this feature, set `spring.sleuth.messaging.jms.enabled` to `false`. @@ -348,7 +349,6 @@ You can disable it by setting `spring.sleuth.feign.processor.enabled` to `false` If you set it to `false`, Spring Cloud Sleuth does not instrument any of your custom Feign components. However, all the default instrumentation is still there. - [[sleuth-opentracing-integration]] == OpenTracing @@ -372,14 +372,20 @@ To turn off this feature, set the `spring.sleuth.quartz.enabled` property to `fa This feature is available for both Brave and OpenTelemetry tracer implementation. -We have three modes of instrumenting reactor based applications that can -be set via `spring.sleuth.reactor.instrumentation-type` property: +We have three modes of instrumenting reactor based applications that can be set via `spring.sleuth.reactor.instrumentation-type` property: -* `ON_EACH` - wraps every Reactor operator in a trace representation. Passes the tracing context in most cases. This mode might lead to drastic performance degradation. -* `ON_LAST` - wraps last Reactor operator in a trace representation. Passes the tracing context in some cases thus accessing MDC context might not work. This mode might lead to medium performance degradation. -* `MANUAL` - wraps every Reactor in the least invasive way without passing of tracing context. It's up to the user to do it. +* `ON_EACH` - wraps every Reactor operator in a trace representation. +Passes the tracing context in most cases. +This mode might lead to drastic performance degradation. +* `ON_LAST` - wraps last Reactor operator in a trace representation. +Passes the tracing context in some cases thus accessing MDC context might not work. +This mode might lead to medium performance degradation. +* `MANUAL` - wraps every Reactor in the least invasive way without passing of tracing context. +It's up to the user to do it. -Current default is `ON_EACH` for backward compatibility reasons, however we encourage the users to migrate to the `MANUAL` instrumentation and profit from `WebFluxSleuthOperators` and `MessagingSleuthOperators`. The performance improvement can be substantial. Example: +Current default is `ON_EACH` for backward compatibility reasons, however we encourage the users to migrate to the `MANUAL` instrumentation and profit from `WebFluxSleuthOperators` and `MessagingSleuthOperators`. +The performance improvement can be substantial. +Example: [source,java,indent=0] ----- @@ -403,45 +409,41 @@ If you wrap your logic in `Runnable` or `Callable`, you can wrap those classes i [source,java,indent=0] ---- -include::{brave_path}/src/test/java/org/springframework/cloud/sleuth/documentation/SpringCloudSleuthDocTests.java[tags=trace_runnable,indent=0] +include::{brave_path}/src/test/java/org/springframework/cloud/sleuth/brave/SpringCloudSleuthDocTests.java[tags=trace_runnable,indent=0] ---- The following example shows how to do so for `Callable`: [source,java,indent=0] ---- -include::{brave_path}/src/test/java/org/springframework/cloud/sleuth/documentation/SpringCloudSleuthDocTests.java[tags=trace_callable,indent=0] +include::{brave_path}/src/test/java/org/springframework/cloud/sleuth/brave/SpringCloudSleuthDocTests.java[tags=trace_callable,indent=0] ---- That way, you ensure that a new span is created and closed for each execution. - [[sleuth-rpc-integration]] == RPC This feature is available for Brave tracer implementation. -Sleuth automatically configures the `RpcTracing` bean which serves as a -foundation for RPC instrumentation such as gRPC or Dubbo. +Sleuth automatically configures the `RpcTracing` bean which serves as a foundation for RPC instrumentation such as gRPC or Dubbo. -If a customization of client / server sampling of the RPC traces is required, -just register a bean of type `brave.sampler.SamplerFunction` and -name the bean `sleuthRpcClientSampler` for client sampler and +If a customization of client / server sampling of the RPC traces is required, just register a bean of type `brave.sampler.SamplerFunction` and name the bean `sleuthRpcClientSampler` for client sampler and `sleuthRpcServerSampler` for server sampler. For your convenience the `@RpcClientSampler` and `@RpcServerSampler` -annotations can be used to inject the proper beans or to reference the bean -names via their static String `NAME` fields. +annotations can be used to inject the proper beans or to reference the bean names via their static String `NAME` fields. -Ex. Here's a sampler that traces 100 "GetUserToken" server requests per second. -This doesn't start new traces for requests to the health check service. Other -requests will use the global sampling configuration. +Ex. +Here's a sampler that traces 100 "GetUserToken" server requests per second. +This doesn't start new traces for requests to the health check service. +Other requests will use the global sampling configuration. [source,java,indent=0] ---- @Configuration(proxyBeanMethods = false) class Config { -include::{brave_path}/src/test/java/org/springframework/cloud/sleuth/brave/instrument/rpc/TraceRpcAutoConfigurationIntegrationTests.java[tags=custom_rpc_server_sampler,indent=2] +include::{autoconfig_path}/src/test/java/org/springframework/cloud/sleuth/autoconfig/brave/instrument/rpc/BraveRpcAutoConfigurationIntegrationTests.java[tags=custom_rpc_server_sampler,indent=2] } ---- @@ -474,16 +476,19 @@ An example of Spring Cloud Sleuth and Dubbo can be found https://github.com/open [[sleuth-rpc-grpc-integration]] === gRPC -Spring Cloud Sleuth provides instrumentation for https://grpc.io/[gRPC] through `TraceGrpcAutoConfiguration` via the Brave tracer. You can disable it entirely by setting `spring.sleuth.grpc.enabled` to `false`. +Spring Cloud Sleuth provides instrumentation for https://grpc.io/[gRPC] via the Brave tracer. +You can disable it entirely by setting `spring.sleuth.grpc.enabled` to `false`. [[sleuth-rpc-grpc-variant1-integration]] ==== Variant 1 [[sleuth-rpc-grpc-variant1-dependencies-integration]] ===== Dependencies + IMPORTANT: The gRPC integration relies on two external libraries to instrument clients and servers and both of those libraries must be on the class path to enable the instrumentation. Maven: + ``` io.github.lognet @@ -494,7 +499,9 @@ Maven: brave-instrumentation-grpc ``` + Gradle: + ``` compile("io.github.lognet:grpc-spring-boot-starter") compile("io.zipkin.brave:brave-instrumentation-grpc") @@ -508,9 +515,11 @@ Spring Cloud Sleuth leverages grpc-spring-boot-starter to register Brave's gRPC [[sleuth-rpc-grpc-variant1-client-integration]] ===== Client Instrumentation -gRPC clients leverage a `ManagedChannelBuilder` to construct a `ManagedChannel` used to communicate to the gRPC server. The native `ManagedChannelBuilder` provides static methods as entry points for construction of `ManagedChannel` instances, however, this mechanism is outside the influence of the Spring application context. +gRPC clients leverage a `ManagedChannelBuilder` to construct a `ManagedChannel` used to communicate to the gRPC server. +The native `ManagedChannelBuilder` provides static methods as entry points for construction of `ManagedChannel` instances, however, this mechanism is outside the influence of the Spring application context. -IMPORTANT: Spring Cloud Sleuth provides a `SpringAwareManagedChannelBuilder` that can be customized through the Spring application context and injected by gRPC clients. *This builder must be used when creating `ManagedChannel` instances.* +IMPORTANT: Spring Cloud Sleuth provides a `SpringAwareManagedChannelBuilder` that can be customized through the Spring application context and injected by gRPC clients. +*This builder must be used when creating `ManagedChannel` instances.* Sleuth creates a `TracingManagedChannelBuilderCustomizer` which inject Brave's client interceptor into the `SpringAwareManagedChannelBuilder`. @@ -531,12 +540,12 @@ To disable the custom `RxJavaSchedulersHook`, set the `spring.sleuth.rxjava.sche You can define a list of regular expressions for thread names for which you do not want spans to be created. To do so, provide a comma-separated list of regular expressions in the `spring.sleuth.rxjava.schedulers.ignoredthreads` property. -IMPORTANT: The suggested approach to reactive programming and Sleuth is to use -the Reactor support. +IMPORTANT: The suggested approach to reactive programming and Sleuth is to use the Reactor support. [[sleuth-circuitbreaker-integration]] == Spring Cloud CircuitBreaker This feature is available for both Brave and OpenTelemetry tracer implementation. -If you have Spring Cloud CircuitBreaker on the classpath, we will wrap the passed command `Supplier` and the fallback `Function` in its trace representations. In order to disable this instrumentation set `spring.sleuth.circuitbreaker.enabled` to `false`. \ No newline at end of file +If you have Spring Cloud CircuitBreaker on the classpath, we will wrap the passed command `Supplier` and the fallback `Function` in its trace representations. +In order to disable this instrumentation set `spring.sleuth.circuitbreaker.enabled` to `false`. \ No newline at end of file diff --git a/docs/src/main/asciidoc/legal.adoc b/docs/src/main/asciidoc/legal.adoc index e88a801e3..cc02760e7 100644 --- a/docs/src/main/asciidoc/legal.adoc +++ b/docs/src/main/asciidoc/legal.adoc @@ -5,7 +5,4 @@ Copyright © 2012-2020 -Copies of this document may be made for your own use and for distribution to -others, provided that you do not charge any fee for such copies and further -provided that each copy contains this Copyright Notice, whether distributed in -print or electronically. \ No newline at end of file +Copies of this document may be made for your own use and for distribution to others, provided that you do not charge any fee for such copies and further provided that each copy contains this Copyright Notice, whether distributed in print or electronically. \ No newline at end of file diff --git a/docs/src/main/asciidoc/project-features.adoc b/docs/src/main/asciidoc/project-features.adoc index 33859cca3..08265124e 100644 --- a/docs/src/main/asciidoc/project-features.adoc +++ b/docs/src/main/asciidoc/project-features.adoc @@ -1,24 +1,21 @@ [[features]] [[project-features]] = Spring Cloud Sleuth Features + include::_attributes.adoc[] -This section dives into the details of {project-full-name}. Here you can learn about the key -features that you may want to use and customize. If you have not already done so, you -might want to read the "<>" and -"<>" sections, so that you have a good grounding in the -basics. +This section dives into the details of {project-full-name}. +Here you can learn about the key features that you may want to use and customize. +If you have not already done so, you might want to read the "<>" and "<>" sections, so that you have a good grounding in the basics. [[features-context-propagation]] == Context Propagation -Traces connect from service to service using header propagation. The default -format is https://github.com/openzipkin/b3-propagation[B3]. Similar to data -formats, you can configure alternate header formats also, provided trace and -span IDs are compatible with B3. Most notably, this means the trace ID and span -IDs are lower-case hex, not UUIDs. Besides trace identifiers, other properties -(Baggage) can also be passed along with the request. Remote Baggage must be -predefined, but is flexible otherwise. +Traces connect from service to service using header propagation. +The default format is https://github.com/openzipkin/b3-propagation[B3]. +Similar to data formats, you can configure alternate header formats also, provided trace and span IDs are compatible with B3. Most notably, this means the trace ID and span IDs are lower-case hex, not UUIDs. +Besides trace identifiers, other properties (Baggage) can also be passed along with the request. +Remote Baggage must be predefined, but is flexible otherwise. To use the provided defaults you can set the `spring.sleuth.propagation.type` property. The value can be a list in which case you will propagate more tracing headers. @@ -31,21 +28,21 @@ You can read more about how to provide custom context propagation in this "<` implementation and define when a given `HttpRequest` should not be sampled. +One of such cases is skip reporting of certain client spans. +To achieve that you can set the `spring.sleuth.web.client.skip-pattern` with the path patterns to be skipped. +Another option is to provide your own custom `org.springframework.cloud.sleuth.SamplerFunction<`org.springframework.cloud.sleuth.http.HttpRequest>` implementation and define when a given `HttpRequest` should not be sampled. [[features-baggage]] == Baggage -Distributed tracing works by propagating fields inside and across services that -connect the trace together: traceId and spanId notably. The context that holds -these fields can optionally push other fields that need to be consistent -regardless of many services are touched. The simple name for these extra fields -is "Baggage". +Distributed tracing works by propagating fields inside and across services that connect the trace together: traceId and spanId notably. +The context that holds these fields can optionally push other fields that need to be consistent regardless of many services are touched. +The simple name for these extra fields is "Baggage". -Sleuth allows you to define which baggage are permitted to exist in the trace -context, including what header names are used. +Sleuth allows you to define which baggage are permitted to exist in the trace context, including what header names are used. The following example shows setting baggage values using Spring Cloud Sleuth's API: @@ -54,28 +51,24 @@ The following example shows setting baggage values using Spring Cloud Sleuth's A include::{common_tests_path}/src/main/java/org/springframework/cloud/sleuth/baggage/multiple/MultipleHopsIntegrationTests.java[tags=baggage,indent=0] ---- -IMPORTANT: There is currently no limitation of the count or size of baggage -items. Keep in mind that too many can decrease system throughput or increase -RPC latency. In extreme cases, too much baggage can crash the application, due -to exceeding transport-level message or header capacity. +IMPORTANT: There is currently no limitation of the count or size of baggage items. +Keep in mind that too many can decrease system throughput or increase RPC latency. +In extreme cases, too much baggage can crash the application, due to exceeding transport-level message or header capacity. -You can use -properties to define fields that have no special configuration such as name mapping: +You can use properties to define fields that have no special configuration such as name mapping: * `spring.sleuth.baggage.remote-fields` is a list of header names to accept and propagate to remote services. * `spring.sleuth.baggage.local-fields` is a list of names to propagate locally -No prefixing applies with these keys. What you set is literally what is used. +No prefixing applies with these keys. +What you set is literally what is used. A name set in either of these properties will result in a `Baggage` of the same name. -In order to automatically set the baggage values to Slf4j's MDC, you have to set -the `spring.sleuth.baggage.correlation-fields` property with a list of allowed -local or remote keys. E.g. `spring.sleuth.baggage.correlation-fields=country-code` will set the -value of the `country-code` baggage into MDC. +In order to automatically set the baggage values to Slf4j's MDC, you have to set the `spring.sleuth.baggage.correlation-fields` property with a list of allowed local or remote keys. E.g. `spring.sleuth.baggage.correlation-fields=country-code` will set the value of the `country-code` baggage into MDC. -Note that the extra field is propagated and added to MDC starting with the next downstream trace context. To immediately -add the extra field to MDC in the current trace context, configure the field to flush on update: +Note that the extra field is propagated and added to MDC starting with the next downstream trace context. +To immediately add the extra field to MDC in the current trace context, configure the field to flush on update: ``` // configuration @@ -104,18 +97,19 @@ countryCodeField.updateValue("new-value"); IMPORTANT: Remember that adding entries to MDC can drastically decrease the performance of your application! If you want to add the baggage entries as tags, to make it possible to search for spans via the baggage entries, you can set the value of -`spring.sleuth.baggage.tag-fields` with a list of allowed baggage keys. To disable the feature you have to pass the `spring.sleuth.propagation.tag.enabled=false` property. +`spring.sleuth.baggage.tag-fields` with a list of allowed baggage keys. +To disable the feature you have to pass the `spring.sleuth.propagation.tag.enabled=false` property. [[features-baggage-vs-tags]] === Baggage versus Tags -Like trace IDs, Baggage is attached to messages or requests, usually as -headers. Tags are key value pairs sent in a Span to Zipkin. Baggage values are -not added spans by default, which means you can't search based on Baggage -unless you opt-in. +Like trace IDs, Baggage is attached to messages or requests, usually as headers. +Tags are key value pairs sent in a Span to Zipkin. +Baggage values are not added spans by default, which means you can't search based on Baggage unless you opt-in. To make baggage also tags, use the property `spring.sleuth.baggage.tag-fields` like so: + [source,yml] ---- include::{brave_path}/src/test/resources/application-baggage.yml[indent=0] @@ -124,9 +118,11 @@ include::{brave_path}/src/test/resources/application-baggage.yml[indent=0] [[features-brave]] == OpenZipkin Brave Tracer Integration -Spring Cloud Sleuth integrates with the OpenZipkin Brave tracer via the bridge that is available in the `spring-cloud-sleuth-brave` module. In this section you can read about specific Brave integrations. +Spring Cloud Sleuth integrates with the OpenZipkin Brave tracer via the bridge that is available in the `spring-cloud-sleuth-brave` module. +In this section you can read about specific Brave integrations. -You can choose to use either Sleuth's API or the Brave API directly in your code (e.g. either Sleuth's `Tracer` or Brave's `Tracer`). If you want to use this tracer implementation's API directly please read https://github.com/openzipkin/brave[their documentation to learn more about it]. +You can choose to use either Sleuth's API or the Brave API directly in your code (e.g. either Sleuth's `Tracer` or Brave's `Tracer`). +If you want to use this tracer implementation's API directly please read https://github.com/openzipkin/brave[their documentation to learn more about it]. [[features-brave-basics]] === Brave Basics @@ -145,25 +141,28 @@ Here are the most relevant links from the OpenZipkin Brave project: [[features-brave-sampling]] === Brave Sampling -Sampling only applies to tracing backends, such as Zipkin. Trace IDs appear in logs regardless of -sample rate. Sampling is a way to prevent overloading the system, by consistently tracing some, but -not all requests. +Sampling only applies to tracing backends, such as Zipkin. +Trace IDs appear in logs regardless of sample rate. +Sampling is a way to prevent overloading the system, by consistently tracing some, but not all requests. The default rate of 10 traces per second is controlled by the `spring.sleuth.sampler.rate` -property and applies when we know Sleuth is used for reasons besides logging. Use a rate above 100 -traces per second with extreme caution as it can overload your tracing system. +property and applies when we know Sleuth is used for reasons besides logging. +Use a rate above 100 traces per second with extreme caution as it can overload your tracing system. The sampler can be set by Java Config also, as shown in the following example: [source,java,indent=0] ---- -include::{brave_path}/src/test/java/org/springframework/cloud/sleuth/documentation/SpringCloudSleuthDocTests.java[tags=always_sampler,indent=0] +include::{brave_path}/src/test/java/org/springframework/cloud/sleuth/brave/SpringCloudSleuthDocTests.java[tags=always_sampler,indent=0] ---- TIP: You can set the HTTP header `b3` to `1`, or, when doing messaging, you can set the `spanFlags` header to `1`. Doing so forces the current request to be sampled regardless of configuration. -By default samplers will work with the refresh scope mechanism. That means that you can change the sampling properties at runtime, refresh the application and the changes will be reflected. However, sometimes the fact of creating a proxy around samplers and calling it from too early (from `@PostConstruct` annotated method) may lead to dead locks. In such a case either create a sampler bean explicitly, or set the property `spring.sleuth.sampler.refresh.enabled` to `false` to disable the refresh scope support. +By default samplers will work with the refresh scope mechanism. +That means that you can change the sampling properties at runtime, refresh the application and the changes will be reflected. +However, sometimes the fact of creating a proxy around samplers and calling it from too early (from `@PostConstruct` annotated method) may lead to dead locks. +In such a case either create a sampler bean explicitly, or set the property `spring.sleuth.sampler.refresh.enabled` to `false` to disable the refresh scope support. [[features-brave-baggage]] === Brave Baggage Java configuration @@ -179,12 +178,10 @@ If you need to do anything more advanced than above, do not define properties an [[features-brave-customizations]] === Brave Customizations -The `brave.Tracer` object is fully managed by sleuth, so you rarely need to affect it. That said, -Sleuth supports a number of `Customizer` types, that allow you to configure -anything not already done by Sleuth with auto-configuration or properties. +The `brave.Tracer` object is fully managed by sleuth, so you rarely need to affect it. +That said, Sleuth supports a number of `Customizer` types, that allow you to configure anything not already done by Sleuth with auto-configuration or properties. -If you define one of the following as a `Bean`, Sleuth will invoke it to -customize behaviour: +If you define one of the following as a `Bean`, Sleuth will invoke it to customize behaviour: * `RpcTracingCustomizer` - for RPC tagging and sampling policy * `HttpTracingCustomizer` - for HTTP tagging and sampling policy @@ -196,21 +193,20 @@ customize behaviour: [[features-brave-sampling-customizations]] ==== Brave Sampling Customizations -If client /server sampling is required, just register a bean of type -`brave.sampler.SamplerFunction` and name the bean +If client /server sampling is required, just register a bean of type +`brave.sampler.SamplerFunction` and name the bean `sleuthHttpClientSampler` for client sampler and `sleuthHttpServerSampler` -for server sampler. +for server sampler. For your convenience the `@HttpClientSampler` and `@HttpServerSampler` -annotations can be used to inject the proper beans or to reference the bean -names via their static String `NAME` fields. +annotations can be used to inject the proper beans or to reference the bean names via their static String `NAME` fields. Check out Brave's code to see an example of how to make a path-based sampler https://github.com/openzipkin/brave/tree/master/instrumentation/http#sampling-policy If you want to completely rewrite the `HttpTracing` bean you can use the `SkipPatternProvider` -interface to retrieve the URL `Pattern` for spans that should be not sampled. Below you can see -an example of usage of `SkipPatternProvider` inside a server side, `Sampler`. +interface to retrieve the URL `Pattern` for spans that should be not sampled. +Below you can see an example of usage of `SkipPatternProvider` inside a server side, `Sampler`. [source,java,indent=0] ---- @@ -223,27 +219,24 @@ include::{tests_path}/brave/spring-cloud-sleuth-instrumentation-mvc-tests/src/te [[features-brave-messaging]] === Brave Messaging -Sleuth automatically configures the `MessagingTracing` bean which serves as a -foundation for Messaging instrumentation such as Kafka or JMS. +Sleuth automatically configures the `MessagingTracing` bean which serves as a foundation for Messaging instrumentation such as Kafka or JMS. -If a customization of producer / consumer sampling of messaging traces is required, -just register a bean of type `brave.sampler.SamplerFunction` and -name the bean `sleuthProducerSampler` for producer sampler and `sleuthConsumerSampler` +If a customization of producer / consumer sampling of messaging traces is required, just register a bean of type `brave.sampler.SamplerFunction` and name the bean `sleuthProducerSampler` for producer sampler and `sleuthConsumerSampler` for consumer sampler. For your convenience the `@ProducerSampler` and `@ConsumerSampler` -annotations can be used to inject the proper beans or to reference the bean -names via their static String `NAME` fields. +annotations can be used to inject the proper beans or to reference the bean names via their static String `NAME` fields. -Ex. Here's a sampler that traces 100 consumer requests per second, except for -the "alerts" channel. Other requests will use a global rate provided by the +Ex. +Here's a sampler that traces 100 consumer requests per second, except for the "alerts" channel. +Other requests will use a global rate provided by the `Tracing` component. [source,java,indent=0] ---- @Configuration(proxyBeanMethods = false) class Config { -include::{brave_path}/src/test/java/org/springframework/cloud/sleuth/brave/instrument/messaging/TraceMessagingAutoConfigurationIntegrationTests.java[tags=custom_messaging_consumer_sampler,indent=2] +include::{autoconfig_path}/src/test/java/org/springframework/cloud/sleuth/autoconfig/brave/instrument/messaging/BraveMessagingAutoConfigurationIntegrationTests.java[tags=custom_messaging_consumer_sampler,indent=2] } ---- @@ -253,34 +246,43 @@ For more, see https://github.com/openzipkin/brave/tree/master/instrumentation/me === Brave Opentracing You can integrate with Brave and https://opentracing.io/[OpenTracing] via the -`io.opentracing.brave:brave-opentracing` bridge. Just add it to the classpath and the OpenTracing `Tracer` will be set up automatically. +`io.opentracing.brave:brave-opentracing` bridge. +Just add it to the classpath and the OpenTracing `Tracer` will be set up automatically. [[features-otel]] == OpenTelemetry Tracer Integration -Spring Cloud Sleuth integrates with the OpenTelemetry (OTel in short) SDK tracer via the bridge that is available in the `spring-cloud-sleuth-otel` module. In this section you can read about specific OTel integrations. +Spring Cloud Sleuth integrates with the OpenTelemetry (OTel in short) SDK tracer via the bridge that is available in the `spring-cloud-sleuth-otel` module. +In this section you can read about specific OTel integrations. -You can choose to use either Sleuth's API or the OpenTelemetry API directly in your code (e.g. either Sleuth's `Tracer` or OpenTelemetry's `Tracer`). If you want to use this tracer implementation's API directly please read https://github.com/open-telemetry/opentelemetry-java[their documentation to learn more about it]. +You can choose to use either Sleuth's API or the OpenTelemetry API directly in your code (e.g. either Sleuth's `Tracer` or OpenTelemetry's `Tracer`). +If you want to use this tracer implementation's API directly please read https://github.com/open-telemetry/opentelemetry-java[their documentation to learn more about it]. [[features-otel-logging]] === OpenTelemetry Logging Integration We're providing an Slf4j integration via a `SpanProcessor` that injects to and removes entries (trace / span ids, baggage, tags etc.) from MDC. You can disable that via the `spring.sleuth.otel.log.slf4j.enabled=false` property. -If it's there on the classpath, we integrate with the `LoggingSpanExporter`. You can disable that integration via the `spring.sleuth.otel.log.exporter.enabled=false` property. +If it's there on the classpath, we integrate with the `LoggingSpanExporter`. +You can disable that integration via the `spring.sleuth.otel.log.exporter.enabled=false` property. [[features-otel-opentracing]] === OpenTelemetry Opentracing You can integrate with OpenTelemetry and https://opentracing.io/[OpenTracing] via the -`io.opentelemetry:opentelemetry-opentracing-shim` bridge. Just add it to the classpath and the OpenTracing `Tracer` will be set up automatically. +`io.opentelemetry:opentelemetry-opentracing-shim` bridge. +Just add it to the classpath and the OpenTracing `Tracer` will be set up automatically. [[features-zipkin]] == Sending Spans to Zipkin -Spring Cloud Sleuth provides various integrations with the https://zipkin.io[OpenZipkin] distributed tracing system. Regardless of the chosen tracer implementation it's enough to add `spring-cloud-sleuth-zipkin` to the classpath to start sending spans to Zipkin. You can choose whether to do that via HTTP or messaging. You can read more about how to do that in "<>". +Spring Cloud Sleuth provides various integrations with the https://zipkin.io[OpenZipkin] distributed tracing system. +Regardless of the chosen tracer implementation it's enough to add `spring-cloud-sleuth-zipkin` to the classpath to start sending spans to Zipkin. +You can choose whether to do that via HTTP or messaging. +You can read more about how to do that in "<>". -When the span is closed, it is sent to Zipkin over HTTP. The communication is asynchronous. You can configure the URL by setting the `spring.zipkin.baseUrl` property, as follows: +When the span is closed, it is sent to Zipkin over HTTP. The communication is asynchronous. +You can configure the URL by setting the `spring.zipkin.baseUrl` property, as follows: [source,yaml] ---- @@ -297,8 +299,8 @@ spring.zipkin.baseUrl: https://zipkinserver/ To disable this feature just set `spring.zipkin.discovery-client-enabled` to `false. When the Discovery Client feature is enabled, Sleuth uses -`LoadBalancerClient` to find the URL of the Zipkin Server. It means -that you can set up the load balancing configuration. +`LoadBalancerClient` to find the URL of the Zipkin Server. +It means that you can set up the load balancing configuration. If you have `web`, `rabbit`, `activemq` or `kafka` together on the classpath, you might need to pick the means by which you would like to send spans to zipkin. To do so, set `web`, `rabbit`, `activemq` or `kafka` to the `spring.zipkin.sender.type` property. @@ -309,8 +311,7 @@ The following example shows setting the sender type for `web`: spring.zipkin.sender.type: web ---- -To customize the `RestTemplate` that sends spans to Zipkin via HTTP, you can register -the `ZipkinRestTemplateCustomizer` bean. +To customize the `RestTemplate` that sends spans to Zipkin via HTTP, you can register the `ZipkinRestTemplateCustomizer` bean. [source,java,indent=0] ---- @@ -376,14 +377,16 @@ spring.zipkin.locator.discovery.enabled: true In Sleuth, we generate spans with a fixed name. Some users want to modify the name depending on values of tags. -Sleuth registers a `SpanFilter` bean that can automatically skip reporting spans of given name patterns. The property `spring.sleuth.span-filter.span-name-patterns-to-skip` contains the default skip patterns for span names. The property `spring.sleuth.span-filter.additional-span-name-patterns-to-skip` will append the provided span name patterns to the existing ones. In order to disable this functionality just set `spring.sleuth.span-filter.enabled` to `false`. +Sleuth registers a `SpanFilter` bean that can automatically skip reporting spans of given name patterns. +The property `spring.sleuth.span-filter.span-name-patterns-to-skip` contains the default skip patterns for span names. +The property `spring.sleuth.span-filter.additional-span-name-patterns-to-skip` will append the provided span name patterns to the existing ones. +In order to disable this functionality just set `spring.sleuth.span-filter.enabled` to `false`. [[features-zipkin-custom-reported-spans-brave]] ==== Brave Customization of Reported Spans IMPORTANT: This section is applicable for Brave tracer only. - Before reporting spans (for example, to Zipkin) you may want to modify that span in some way. You can do so by implementing a `SpanHandler`. @@ -391,33 +394,30 @@ The following example shows how to register two beans that implement `SpanHandle [source,java,indent=0] ---- -include::{brave_path}/src/test/java/org/springframework/cloud/sleuth/SpanHandlerTests.java[tags=spanHandler,indent=0] +include::{autoconfig_path}/src/test/java/org/springframework/cloud/sleuth/autoconfig/brave/SpanHandlerTests.java[tags=spanHandler,indent=0] ---- The preceding example results in changing the name of the reported span to `foo bar`, just before it gets reported (for example, to Zipkin). === Overriding the auto-configuration of Zipkin -Spring Cloud Sleuth supports sending traces to multiple tracing systems as of version 2.1.0. -In order to get this to work, every tracing system needs to have a `Reporter` and `Sender`. +Spring Cloud Sleuth supports sending traces to multiple tracing systems as of version 2.1.0. In order to get this to work, every tracing system needs to have a `Reporter` and `Sender`. If you want to override the provided beans you need to give them a specific name. To do this you can use respectively `ZipkinAutoConfiguration.REPORTER_BEAN_NAME` and `ZipkinAutoConfiguration.SENDER_BEAN_NAME`. [source,java,indent=0] ---- -include::{project-root}/spring-cloud-sleuth-zipkin/src/test/java/org/springframework/cloud/sleuth/zipkin2/ZipkinAutoConfigurationTests.java[tags=override_default_beans,indent=0] +include::{common_tests_path}/src/main/java/org/springframework/cloud/sleuth/autoconfig/zipkin2/ZipkinAutoConfigurationTests.java[tags=override_default_beans,indent=0] ---- [[features-log-integration]] == Log integration -Sleuth configures the logging context with variables including the service name -(`%{spring.zipkin.service.name}` or `%{spring.application.name}` if the previous one was not set), span ID (`%{spanId}`) and the trace ID (`%{traceId}`). These help -you connect logs with distributed traces and allow you choice in what tools you -use to troubleshoot your services. +Sleuth configures the logging context with variables including the service name (`%{spring.zipkin.service.name}` or `%{spring.application.name}` if the previous one was not set), span ID (`%{spanId}`) and the trace ID (`%{traceId}`). +These help you connect logs with distributed traces and allow you choice in what tools you use to troubleshoot your services. -Once you find any log with an error, you can look for the trace ID in the -message. Paste that into your distributed tracing system to visualize the entire trace, regardless of how many services the first request ended up hitting. +Once you find any log with an error, you can look for the trace ID in the message. +Paste that into your distributed tracing system to visualize the entire trace, regardless of how many services the first request ended up hitting. [source] ---- @@ -425,8 +425,9 @@ backend.log: 2020-04-09 17:45:40.516 ERROR [backend,5e8eeec48b08e26882aba313eb0 frontend.log:2020-04-09 17:45:40.574 ERROR [frontend,5e8eeec48b08e26882aba313eb08f0a4,82aba313eb08f0a4,true] 97192 --- [nio-8081-exec-2] o.s.c.s.i.web.ExceptionLoggingFilter : Uncaught exception thrown ---- -Above, you'll notice the trace ID is `5e8eeec48b08e26882aba313eb08f0a4`, for -example. This log configuration was automatically setup by Sleuth. You can disable it by disabling Sleuth via `spring.sleuth.enabled=false` property or putting your own `logging.pattern.level` property. +Above, you'll notice the trace ID is `5e8eeec48b08e26882aba313eb08f0a4`, for example. +This log configuration was automatically setup by Sleuth. +You can disable it by disabling Sleuth via `spring.sleuth.enabled=false` property or putting your own `logging.pattern.level` property. If you use a log aggregating tool (such as https://www.elastic.co/products/kibana[Kibana], https://www.splunk.com/[Splunk], and others), you can order the events that took place. An example from Kibana would resemble the following image: @@ -452,6 +453,7 @@ filter { ---- NOTE: If you want to use Grok together with the logs from Cloud Foundry, you have to use the following pattern: + [source] ---- filter { @@ -477,7 +479,8 @@ To do so, you have to do the following (for readability, we pass the dependencie *Dependencies Setup* . Ensure that Logback is on the classpath (`ch.qos.logback:logback-core`). -. Add Logstash Logback encode. For example, to use version `4.6`, add `net.logstash.logback:logstash-logback-encoder:4.6`. +. Add Logstash Logback encode. +For example, to use version `4.6`, add `net.logstash.logback:logstash-logback-encoder:4.6`. *Logback Setup* @@ -501,9 +504,9 @@ Otherwise, your custom logback file does not properly read the property. == What to Read Next If you want to learn more about any of the classes discussed in this section, you can browse the -{github-code}[source code directly]. If you have specific questions, see the +{github-code}[source code directly]. +If you have specific questions, see the <> section. -If you are comfortable with {project-full-name}'s core features, you can continue on and read -about +If you are comfortable with {project-full-name}'s core features, you can continue on and read about <>. diff --git a/docs/src/main/asciidoc/sagan-boot.adoc b/docs/src/main/asciidoc/sagan-boot.adoc index ad07ecc0f..5ae81198c 100644 --- a/docs/src/main/asciidoc/sagan-boot.adoc +++ b/docs/src/main/asciidoc/sagan-boot.adoc @@ -65,10 +65,11 @@ public class Application { } ``` -Run this app and then hit the home page. You will see traceId and spanId populated in the logs. -If this app calls out to another one (e.g. with `RestTemplate`) it will send the trace data in -headers and if the receiver is another Sleuth app you will see the trace continue there. +Run this app and then hit the home page. +You will see traceId and spanId populated in the logs. +If this app calls out to another one (e.g. with `RestTemplate`) it will send the trace data in headers and if the receiver is another Sleuth app you will see the trace continue there. * Instead of logging the request in the handler explicitly, you could set `logging.level.org.springframework.web.servlet.DispatcherServlet=DEBUG` -* Sleuth defaults to a rate limited sampler. That means that it will sample up to 1000 transactions per second. +* Sleuth defaults to a rate limited sampler. +That means that it will sample up to 1000 transactions per second. * Set `spring.application.name=bar` (for instance) to see the service name as well as the trace and span ids. \ No newline at end of file diff --git a/docs/src/main/asciidoc/sagan-index.adoc b/docs/src/main/asciidoc/sagan-index.adoc index 6fc2eb31f..bf0cde1d3 100644 --- a/docs/src/main/asciidoc/sagan-index.adoc +++ b/docs/src/main/asciidoc/sagan-index.adoc @@ -1,14 +1,13 @@ -Spring Cloud Sleuth provides Spring Boot auto-configuration for distributed -tracing. +Spring Cloud Sleuth provides Spring Boot auto-configuration for distributed tracing. ## Features -Sleuth configures everything you need to get started. This includes where trace -data (spans) are reported to, how many traces to keep (sampling), if remote -fields (baggage) are sent, and which libraries are traced. +Sleuth configures everything you need to get started. +This includes where trace data (spans) are reported to, how many traces to keep (sampling), if remote fields (baggage) are sent, and which libraries are traced. Specifically, Spring Cloud Sleuth... * Adds trace and span ids to the Slf4J MDC, so you can extract all the logs from a given trace or span in a log aggregator. * Instruments common ingress and egress points from Spring applications (servlet filter, rest template, scheduled actions, message channels, feign client). -* If `spring-cloud-sleuth-zipkin` is available then the app will generate and report https://zipkin.io[Zipkin]-compatible traces via HTTP. By default it sends them to a Zipkin collector service on localhost (port 9411). Configure the location of the service using `spring.zipkin.baseUrl`. +* If `spring-cloud-sleuth-zipkin` is available then the app will generate and report https://zipkin.io[Zipkin]-compatible traces via HTTP. By default it sends them to a Zipkin collector service on localhost (port 9411). +Configure the location of the service using `spring.zipkin.baseUrl`. diff --git a/docs/src/main/asciidoc/using.adoc b/docs/src/main/asciidoc/using.adoc index d1691fb02..99cca37fa 100644 --- a/docs/src/main/asciidoc/using.adoc +++ b/docs/src/main/asciidoc/using.adoc @@ -1,8 +1,11 @@ [[using]] = Using Spring Cloud Sleuth + include::_attributes.adoc[] -This section goes into more detail about how you should use {project-full-name}. It covers topics such as controlling the span lifecycle with {project-full-name} API or via annotations. We also cover some {project-full-name} best practices. +This section goes into more detail about how you should use {project-full-name}. +It covers topics such as controlling the span lifecycle with {project-full-name} API or via annotations. +We also cover some {project-full-name} best practices. If you are starting out with {project-full-name}, you should probably read the <> guide before diving into this section. @@ -10,12 +13,15 @@ If you are starting out with {project-full-name}, you should probably read the [[using-span-lifecycle]] == Span Lifecycle with Spring Cloud Sleuth's API -Spring Cloud Sleuth Core in its `api` module contains all necessary interfaces to be implemented by a tracer. The project comes with OpenZipkin Brave and OpenTelemetry implementations. You can check how both tracers are bridged to the Sleuth's API by looking at the `org.springframework.cloud.sleuth.brave.bridge` and `org.springframework.cloud.sleuth.otel.bridge` modules respectively. +Spring Cloud Sleuth Core in its `api` module contains all necessary interfaces to be implemented by a tracer. +The project comes with OpenZipkin Brave and OpenTelemetry implementations. +You can check how both tracers are bridged to the Sleuth's API by looking at the `org.springframework.cloud.sleuth.brave.bridge` and `org.springframework.cloud.sleuth.otel.bridge` modules respectively. The most commonly used interfaces are: -* `org.springframework.cloud.sleuth.api.Tracer` - Using a tracer, you can create a root span capturing the critical path of a request. -* `org.springframework.cloud.sleuth.api.Span` - Span is a single unit of work that needs to be started and stopped. Contains timing information and events and tags. +* `org.springframework.cloud.sleuth.Tracer` - Using a tracer, you can create a root span capturing the critical path of a request. +* `org.springframework.cloud.sleuth.Span` - Span is a single unit of work that needs to be started and stopped. +Contains timing information and events and tags. You can also use your tracer implementation's API directly. @@ -26,7 +32,8 @@ Let's look at the following Span lifecycle actions. * <>: The span gets continued e.g. in another thread. * <>: You can create a new span and set an explicit parent for it. -TIP: Spring Cloud Sleuth creates an instance of `Tracer` for you. In order to use it, you can autowire it. +TIP: Spring Cloud Sleuth creates an instance of `Tracer` for you. +In order to use it, you can autowire it. [[using-creating-and-ending-spans]] === Creating and Ending Spans @@ -35,7 +42,7 @@ You can manually create spans by using the `Tracer`, as shown in the following e [source,java,indent=0] ---- -include::{brave_path}/src/test/java/org/springframework/cloud/sleuth/documentation/SpringCloudSleuthDocTests.java[tags=manual_span_creation,indent=0] +include::{brave_path}/src/test/java/org/springframework/cloud/sleuth/brave/SpringCloudSleuthDocTests.java[tags=manual_span_creation,indent=0] ---- In the preceding example, we could see how to create a new instance of the span. @@ -44,13 +51,14 @@ If there is already a span in this thread, it becomes the parent of the new span IMPORTANT: Always clean after you create a span. IMPORTANT: If your span contains a name greater than 50 chars, that name is truncated to 50 chars. -Your names have to be explicit and concrete. Big names lead to latency issues and sometimes even exceptions. +Your names have to be explicit and concrete. +Big names lead to latency issues and sometimes even exceptions. [[using-continuing-spans]] === Continuing Spans -Sometimes, you do not want to create a new span but you want to continue one. An example of such a -situation might be as follows: +Sometimes, you do not want to create a new span but you want to continue one. +An example of such a situation might be as follows: * *AOP*: If there was already a span created before an aspect was reached, you might not want to create a new span. @@ -58,7 +66,7 @@ To continue a span, you can store the span in one thread and pass it on to anoth [source,java,indent=0] ---- -include::{brave_path}/src/test/java/org/springframework/cloud/sleuth/documentation/SpringCloudSleuthDocTests.java[tags=manual_span_continuation,indent=0] +include::{brave_path}/src/test/java/org/springframework/cloud/sleuth/brave/SpringCloudSleuthDocTests.java[tags=manual_span_continuation,indent=0] ---- [[using-creating-spans-with-explicit-parent]] @@ -71,17 +79,19 @@ You can put the span in scope and then call `Tracer.nextSpan()`, as shown in the [source,java,indent=0] ---- -include::{brave_path}/src/test/java/org/springframework/cloud/sleuth/documentation/SpringCloudSleuthDocTests.java[tags=manual_span_joining,indent=0] +include::{brave_path}/src/test/java/org/springframework/cloud/sleuth/brave/SpringCloudSleuthDocTests.java[tags=manual_span_joining,indent=0] ---- -IMPORTANT: After creating such a span, you must finish it. Otherwise it is not reported (e.g. to Zipkin). +IMPORTANT: After creating such a span, you must finish it. +Otherwise it is not reported (e.g. to Zipkin). You can also use the `Tracer.nextSpan(Span parentSpan)` version to provide the parent span explicitly. [[using-naming-spans]] == Naming Spans -Picking a span name is not a trivial task. A span name should depict an operation name. +Picking a span name is not a trivial task. +A span name should depict an operation name. The name should be low cardinality, so it should not include identifiers. Since there is a lot of instrumentation going on, some span names are artificial: @@ -99,14 +109,14 @@ You can name the span explicitly by using the `@SpanName` annotation, as shown i [source,java,indent=0] ---- -include::{brave_path}/src/test/java/org/springframework/cloud/sleuth/documentation/SpringCloudSleuthDocTests.java[tags=span_name_annotation,indent=0] +include::{brave_path}/src/test/java/org/springframework/cloud/sleuth/brave/SpringCloudSleuthDocTests.java[tags=span_name_annotation,indent=0] ---- In this case, when processed in the following manner, the span is named `calculateTax`: [source,java,indent=0] ---- -include::{brave_path}/src/test/java/org/springframework/cloud/sleuth/documentation/SpringCloudSleuthDocTests.java[tags=span_name_annotated_runnable_execution,indent=0] +include::{brave_path}/src/test/java/org/springframework/cloud/sleuth/brave/SpringCloudSleuthDocTests.java[tags=span_name_annotated_runnable_execution,indent=0] ---- [[using-naming-spans-to-string]] @@ -121,7 +131,7 @@ Running such code leads to creating a span named `calculateTax`, as shown in the [source,java,indent=0] ---- -include::{brave_path}/src/test/java/org/springframework/cloud/sleuth/documentation/SpringCloudSleuthDocTests.java[tags=span_name_to_string_runnable_execution,indent=0] +include::{brave_path}/src/test/java/org/springframework/cloud/sleuth/brave/SpringCloudSleuthDocTests.java[tags=span_name_to_string_runnable_execution,indent=0] ---- [[using-annotations]] @@ -129,11 +139,14 @@ include::{brave_path}/src/test/java/org/springframework/cloud/sleuth/documentati There are a number of good reasons to manage spans with annotations, including: -* API-agnostic means to collaborate with a span. Use of annotations lets users add to a span with no library dependency on a span api. +* API-agnostic means to collaborate with a span. +Use of annotations lets users add to a span with no library dependency on a span api. Doing so lets Sleuth change its core API to create less impact to user code. -* Reduced surface area for basic span operations. Without this feature, you must use the span api, which has lifecycle commands that could be used incorrectly. +* Reduced surface area for basic span operations. +Without this feature, you must use the span api, which has lifecycle commands that could be used incorrectly. By only exposing scope, tag, and log functionality, you can collaborate without accidentally breaking span lifecycle. -* Collaboration with runtime generated code. With libraries such as Spring Data and Feign, the implementations of interfaces are generated at runtime. +* Collaboration with runtime generated code. +With libraries such as Spring Data and Feign, the implementations of interfaces are generated at runtime. Consequently, span wrapping of objects was tedious. Now you can provide annotations over interfaces and the arguments of those interfaces. @@ -147,14 +160,14 @@ Now we can consider some examples of usage. [source,java,indent=0] ---- -include::{common_tests_path}/src/main/java/org/springframework/cloud/sleuth/annotation/SleuthSpanCreatorAspectTests.java[tags=annotated_method,indent=0] +include::{common_tests_path}/src/main/java/org/springframework/cloud/sleuth/instrument/annotation/SleuthSpanCreatorAspectTests.java[tags=annotated_method,indent=0] ---- Annotating the method without any parameter leads to creating a new span whose name equals the annotated method name. [source,java,indent=0] ---- -include::{common_tests_path}/src/main/java/org/springframework/cloud/sleuth/annotation/SleuthSpanCreatorAspectTests.java[tags=custom_name_on_annotated_method,indent=0] +include::{common_tests_path}/src/main/java/org/springframework/cloud/sleuth/instrument/annotation/SleuthSpanCreatorAspectTests.java[tags=custom_name_on_annotated_method,indent=0] ---- If you provide the value in the annotation (either directly or by setting the `name` parameter), the created span has the provided value as the name. @@ -162,24 +175,24 @@ If you provide the value in the annotation (either directly or by setting the `n [source,java,indent=0] ---- // method declaration -include::{common_tests_path}/src/main/java/org/springframework/cloud/sleuth/annotation/SleuthSpanCreatorAspectTests.java[tags=custom_name_and_tag_on_annotated_method,indent=0] +include::{common_tests_path}/src/main/java/org/springframework/cloud/sleuth/instrument/annotation/SleuthSpanCreatorAspectTests.java[tags=custom_name_and_tag_on_annotated_method,indent=0] // and method execution -include::{common_tests_path}/src/main/java/org/springframework/cloud/sleuth/annotation/SleuthSpanCreatorAspectTests.java[tags=execution,indent=0] +include::{common_tests_path}/src/main/java/org/springframework/cloud/sleuth/instrument/annotation/SleuthSpanCreatorAspectTests.java[tags=execution,indent=0] ---- -You can combine both the name and a tag. Let's focus on the latter. +You can combine both the name and a tag. +Let's focus on the latter. In this case, the value of the annotated method's parameter runtime value becomes the value of the tag. In our sample, the tag key is `testTag`, and the tag value is `test`. [source,java,indent=0] ---- -include::{common_tests_path}/src/main/java/org/springframework/cloud/sleuth/annotation/SleuthSpanCreatorAspectTests.java[tags=name_on_implementation,indent=0] +include::{common_tests_path}/src/main/java/org/springframework/cloud/sleuth/instrument/annotation/SleuthSpanCreatorAspectTests.java[tags=name_on_implementation,indent=0] ---- You can place the `@NewSpan` annotation on both the class and an interface. -If you override the interface's method and provide a different value for the `@NewSpan` annotation, the most -concrete one wins (in this case `customNameOnTestMethod3` is set). +If you override the interface's method and provide a different value for the `@NewSpan` annotation, the most concrete one wins (in this case `customNameOnTestMethod3` is set). [[using-annotations-continuing-spans]] === Continuing Spans @@ -189,10 +202,10 @@ If you want to add tags and annotations to an existing span, you can use the `@C [source,java,indent=0] ---- // method declaration -include::{common_tests_path}/src/main/java/org/springframework/cloud/sleuth/annotation/SleuthSpanCreatorAspectTests.java[tags=continue_span,indent=0] +include::{common_tests_path}/src/main/java/org/springframework/cloud/sleuth/instrument/annotation/SleuthSpanCreatorAspectTests.java[tags=continue_span,indent=0] // method execution -include::{common_tests_path}/src/main/java/org/springframework/cloud/sleuth/annotation/SleuthSpanCreatorAspectTests.java[tags=continue_span_execution,indent=0] +include::{common_tests_path}/src/main/java/org/springframework/cloud/sleuth/instrument/annotation/SleuthSpanCreatorAspectTests.java[tags=continue_span_execution,indent=0] ---- (Note that, in contrast with the `@NewSpan` annotation ,you can also add logs with the `log` parameter.) @@ -206,14 +219,16 @@ That way, the span gets continued and: [[using-annotations-advanced-tag-setting]] === Advanced Tag Setting -There are 3 different ways to add tags to a span. All of them are controlled by the `SpanTag` annotation. +There are 3 different ways to add tags to a span. +All of them are controlled by the `SpanTag` annotation. The precedence is as follows: . Try with a bean of `TagValueResolver` type and a provided name. . If the bean name has not been provided, try to evaluate an expression. We search for a `TagValueExpressionResolver` bean. The default implementation uses SPEL expression resolution. -**IMPORTANT** You can only reference properties from the SPEL expression. Method execution is not allowed due to security constraints. +**IMPORTANT** You can only reference properties from the SPEL expression. +Method execution is not allowed due to security constraints. . If we do not find any expression to evaluate, return the `toString()` value of the parameter. [[using-annotations-custom-extractor]] @@ -226,14 +241,14 @@ Consider the following annotated method: [source,java,indent=0] ---- -include::{common_tests_path}/src/main/java/org/springframework/cloud/sleuth/annotation/SpanTagAnnotationHandlerTests.java[tags=resolver_bean,indent=0] +include::{common_tests_path}/src/main/java/org/springframework/cloud/sleuth/instrument/annotation/SpanTagAnnotationHandlerTests.java[tags=resolver_bean,indent=0] ---- Now further consider the following `TagValueResolver` bean implementation: [source,java,indent=0] ---- -include::{common_tests_path}/src/main/java/org/springframework/cloud/sleuth/annotation/SpanTagAnnotationHandlerTests.java[tags=custom_resolver,indent=0] +include::{common_tests_path}/src/main/java/org/springframework/cloud/sleuth/instrument/annotation/SpanTagAnnotationHandlerTests.java[tags=custom_resolver,indent=0] ---- The two preceding examples lead to setting a tag value equal to `Value from myCustomTagValueResolver`. @@ -245,7 +260,7 @@ Consider the following annotated method: [source,java,indent=0] ---- -include::{common_tests_path}/src/main/java/org/springframework/cloud/sleuth/annotation/SpanTagAnnotationHandlerTests.java[tags=spel,indent=0] +include::{common_tests_path}/src/main/java/org/springframework/cloud/sleuth/instrument/annotation/SpanTagAnnotationHandlerTests.java[tags=spel,indent=0] ---- No custom implementation of a `TagValueExpressionResolver` leads to evaluation of the SPEL expression, and a tag with a value of `4 characters` is set on the span. @@ -258,7 +273,7 @@ Consider the following annotated method: [source,java,indent=0] ---- -include::{common_tests_path}/src/main/java/org/springframework/cloud/sleuth/annotation/SpanTagAnnotationHandlerTests.java[tags=toString,indent=0] +include::{common_tests_path}/src/main/java/org/springframework/cloud/sleuth/instrument/annotation/SpanTagAnnotationHandlerTests.java[tags=toString,indent=0] ---- Running the preceding method with a value of `15` leads to setting a tag with a String value of `"15"`. @@ -266,7 +281,6 @@ Running the preceding method with a value of `15` leads to setting a tag with a [[using-whats-next]] == What to Read Next -You should now understand how you can use {project-full-name} and some best practices that you -should follow. You can now go on to learn about specific -<>, or you could -skip ahead and read about the link:integrations[integrations available in {project-full-name}]. +You should now understand how you can use {project-full-name} and some best practices that you should follow. +You can now go on to learn about specific +<>, or you could skip ahead and read about the link:integrations[integrations available in {project-full-name}]. diff --git a/mvnw b/mvnw index a08b219e3..5e20f6ea6 100755 --- a/mvnw +++ b/mvnw @@ -34,151 +34,158 @@ # MAVEN_SKIP_RC - flag to disable loading of mavenrc files # ---------------------------------------------------------------------------- -if [ -z "$MAVEN_SKIP_RC" ] ; then +if [ -z "$MAVEN_SKIP_RC" ]; then - if [ -f /etc/mavenrc ] ; then + if [ -f /etc/mavenrc ]; then . /etc/mavenrc fi - if [ -f "$HOME/.mavenrc" ] ; then + if [ -f "$HOME/.mavenrc" ]; then . "$HOME/.mavenrc" fi fi # OS specific support. $var _must_ be set to either true or false. -cygwin=false; -darwin=false; +cygwin=false +darwin=false mingw=false -case "`uname`" in - CYGWIN*) cygwin=true ;; - MINGW*) mingw=true;; - Darwin*) darwin=true - # - # Look for the Apple JDKs first to preserve the existing behaviour, and then look - # for the new JDKs provided by Oracle. - # - if [ -z "$JAVA_HOME" ] && [ -L /System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK ] ; then - # - # Apple JDKs - # - export JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK/Home - fi +case "$(uname)" in +CYGWIN*) cygwin=true ;; +MINGW*) mingw=true ;; +Darwin*) + darwin=true + # + # Look for the Apple JDKs first to preserve the existing behaviour, and then look + # for the new JDKs provided by Oracle. + # + if [ -z "$JAVA_HOME" ] && [ -L /System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK ]; then + # + # Apple JDKs + # + export JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK/Home + fi - if [ -z "$JAVA_HOME" ] && [ -L /System/Library/Java/JavaVirtualMachines/CurrentJDK ] ; then - # - # Apple JDKs - # - export JAVA_HOME=/System/Library/Java/JavaVirtualMachines/CurrentJDK/Contents/Home - fi + if [ -z "$JAVA_HOME" ] && [ -L /System/Library/Java/JavaVirtualMachines/CurrentJDK ]; then + # + # Apple JDKs + # + export JAVA_HOME=/System/Library/Java/JavaVirtualMachines/CurrentJDK/Contents/Home + fi - if [ -z "$JAVA_HOME" ] && [ -L "/Library/Java/JavaVirtualMachines/CurrentJDK" ] ; then - # - # Oracle JDKs - # - export JAVA_HOME=/Library/Java/JavaVirtualMachines/CurrentJDK/Contents/Home - fi + if [ -z "$JAVA_HOME" ] && [ -L "/Library/Java/JavaVirtualMachines/CurrentJDK" ]; then + # + # Oracle JDKs + # + export JAVA_HOME=/Library/Java/JavaVirtualMachines/CurrentJDK/Contents/Home + fi - if [ -z "$JAVA_HOME" ] && [ -x "/usr/libexec/java_home" ]; then - # - # Apple JDKs - # - export JAVA_HOME=`/usr/libexec/java_home` - fi - ;; + if [ -z "$JAVA_HOME" ] && [ -x "/usr/libexec/java_home" ]; then + # + # Apple JDKs + # + export JAVA_HOME=$(/usr/libexec/java_home) + fi + ;; esac -if [ -z "$JAVA_HOME" ] ; then - if [ -r /etc/gentoo-release ] ; then - JAVA_HOME=`java-config --jre-home` +if [ -z "$JAVA_HOME" ]; then + if [ -r /etc/gentoo-release ]; then + JAVA_HOME=$(java-config --jre-home) fi fi -if [ -z "$M2_HOME" ] ; then +if [ -z "$M2_HOME" ]; then ## resolve links - $0 may be a link to maven's home PRG="$0" # need this for relative symlinks - while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then + while [ -h "$PRG" ]; do + ls=$(ls -ld "$PRG") + link=$(expr "$ls" : '.*-> \(.*\)$') + if expr "$link" : '/.*' >/dev/null; then PRG="$link" else - PRG="`dirname "$PRG"`/$link" + PRG="$(dirname "$PRG")/$link" fi done - saveddir=`pwd` + saveddir=$(pwd) - M2_HOME=`dirname "$PRG"`/.. + M2_HOME=$(dirname "$PRG")/.. # make it fully qualified - M2_HOME=`cd "$M2_HOME" && pwd` + M2_HOME=$(cd "$M2_HOME" && pwd) cd "$saveddir" # echo Using m2 at $M2_HOME fi # For Cygwin, ensure paths are in UNIX format before anything is touched -if $cygwin ; then +if $cygwin; then [ -n "$M2_HOME" ] && - M2_HOME=`cygpath --unix "$M2_HOME"` + M2_HOME=$(cygpath --unix "$M2_HOME") [ -n "$JAVA_HOME" ] && - JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + JAVA_HOME=$(cygpath --unix "$JAVA_HOME") [ -n "$CLASSPATH" ] && - CLASSPATH=`cygpath --path --unix "$CLASSPATH"` + CLASSPATH=$(cygpath --path --unix "$CLASSPATH") fi # For Migwn, ensure paths are in UNIX format before anything is touched -if $mingw ; then +if $mingw; then [ -n "$M2_HOME" ] && - M2_HOME="`(cd "$M2_HOME"; pwd)`" + M2_HOME="$( ( + cd "$M2_HOME" + pwd + ))" [ -n "$JAVA_HOME" ] && - JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" + JAVA_HOME="$( ( + cd "$JAVA_HOME" + pwd + ))" # TODO classpath? fi if [ -z "$JAVA_HOME" ]; then - javaExecutable="`which javac`" - if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then + javaExecutable="$(which javac)" + if [ -n "$javaExecutable" ] && ! [ "$(expr \"$javaExecutable\" : '\([^ ]*\)')" = "no" ]; then # readlink(1) is not available as standard on Solaris 10. - readLink=`which readlink` - if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then - if $darwin ; then - javaHome="`dirname \"$javaExecutable\"`" - javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" + readLink=$(which readlink) + if [ ! $(expr "$readLink" : '\([^ ]*\)') = "no" ]; then + if $darwin; then + javaHome="$(dirname \"$javaExecutable\")" + javaExecutable="$(cd \"$javaHome\" && pwd -P)/javac" else - javaExecutable="`readlink -f \"$javaExecutable\"`" + javaExecutable="$(readlink -f \"$javaExecutable\")" fi - javaHome="`dirname \"$javaExecutable\"`" - javaHome=`expr "$javaHome" : '\(.*\)/bin'` + javaHome="$(dirname \"$javaExecutable\")" + javaHome=$(expr "$javaHome" : '\(.*\)/bin') JAVA_HOME="$javaHome" export JAVA_HOME fi fi fi -if [ -z "$JAVACMD" ] ; then - if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then +if [ -z "$JAVACMD" ]; then + if [ -n "$JAVA_HOME" ]; then + if [ -x "$JAVA_HOME/jre/sh/java" ]; then # IBM's JDK on AIX uses strange locations for the executables JAVACMD="$JAVA_HOME/jre/sh/java" else JAVACMD="$JAVA_HOME/bin/java" fi else - JAVACMD="`which java`" + JAVACMD="$(which java)" fi fi -if [ ! -x "$JAVACMD" ] ; then +if [ ! -x "$JAVACMD" ]; then echo "Error: JAVA_HOME is not defined correctly." >&2 echo " We cannot execute $JAVACMD" >&2 exit 1 fi -if [ -z "$JAVA_HOME" ] ; then +if [ -z "$JAVA_HOME" ]; then echo "Warning: JAVA_HOME environment variable is not set." fi @@ -187,11 +194,11 @@ CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher # For Cygwin, switch paths to Windows format before running java if $cygwin; then [ -n "$M2_HOME" ] && - M2_HOME=`cygpath --path --windows "$M2_HOME"` + M2_HOME=$(cygpath --path --windows "$M2_HOME") [ -n "$JAVA_HOME" ] && - JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` + JAVA_HOME=$(cygpath --path --windows "$JAVA_HOME") [ -n "$CLASSPATH" ] && - CLASSPATH=`cygpath --path --windows "$CLASSPATH"` + CLASSPATH=$(cygpath --path --windows "$CLASSPATH") fi # traverses directory structure from process work directory to filesystem root @@ -199,12 +206,15 @@ fi find_maven_basedir() { local basedir=$(pwd) local wdir=$(pwd) - while [ "$wdir" != '/' ] ; do - if [ -d "$wdir"/.mvn ] ; then + while [ "$wdir" != '/' ]; do + if [ -d "$wdir"/.mvn ]; then basedir=$wdir break fi - wdir=$(cd "$wdir/.."; pwd) + wdir=$( + cd "$wdir/.." + pwd + ) done echo "${basedir}" } @@ -212,7 +222,7 @@ find_maven_basedir() { # concatenates all lines of a file concat_lines() { if [ -f "$1" ]; then - echo "$(tr -s '\n' ' ' < "$1")" + echo "$(tr -s '\n' ' ' <"$1")" fi } @@ -227,23 +237,23 @@ export MAVEN_CMD_LINE_ARGS WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain echo "Running version check" -VERSION=$( sed '\!//' -e 's!.*$!!' ) +VERSION=$(sed '\!//' -e 's!.*$!!') echo "The found version is [${VERSION}]" if echo $VERSION | egrep -q 'M|RC'; then - echo Activating \"milestone\" profile for version=\"$VERSION\" - echo $MAVEN_ARGS | grep -q milestone || MAVEN_ARGS="$MAVEN_ARGS -Pmilestone" + echo Activating \"milestone\" profile for version=\"$VERSION\" + echo $MAVEN_ARGS | grep -q milestone || MAVEN_ARGS="$MAVEN_ARGS -Pmilestone" else - echo Deactivating \"milestone\" profile for version=\"$VERSION\" - echo $MAVEN_ARGS | grep -q milestone && MAVEN_ARGS=$(echo $MAVEN_ARGS | sed -e 's/-Pmilestone//') + echo Deactivating \"milestone\" profile for version=\"$VERSION\" + echo $MAVEN_ARGS | grep -q milestone && MAVEN_ARGS=$(echo $MAVEN_ARGS | sed -e 's/-Pmilestone//') fi if echo $VERSION | egrep -q 'RELEASE'; then - echo Activating \"central\" profile for version=\"$VERSION\" - echo $MAVEN_ARGS | grep -q milestone || MAVEN_ARGS="$MAVEN_ARGS -Pcentral" + echo Activating \"central\" profile for version=\"$VERSION\" + echo $MAVEN_ARGS | grep -q milestone || MAVEN_ARGS="$MAVEN_ARGS -Pcentral" else - echo Deactivating \"central\" profile for version=\"$VERSION\" - echo $MAVEN_ARGS | grep -q central && MAVEN_ARGS=$(echo $MAVEN_ARGS | sed -e 's/-Pcentral//') + echo Deactivating \"central\" profile for version=\"$VERSION\" + echo $MAVEN_ARGS | grep -q central && MAVEN_ARGS=$(echo $MAVEN_ARGS | sed -e 's/-Pcentral//') fi exec "$JAVACMD" \ diff --git a/pom.xml b/pom.xml index 3e7aa6b67..eeb1b1755 100644 --- a/pom.xml +++ b/pom.xml @@ -46,13 +46,14 @@ spring-cloud-sleuth-dependencies - spring-cloud-sleuth-core + spring-cloud-sleuth-api + spring-cloud-sleuth-instrumentation spring-cloud-sleuth-brave spring-cloud-sleuth-otel + spring-cloud-sleuth-autoconfigure tests spring-cloud-sleuth-zipkin spring-cloud-starter-sleuth - spring-cloud-starter-sleuth-otel spring-cloud-sleuth-samples docs @@ -92,6 +93,7 @@ 2.2 4.0.3 0.21.3 + 0.14.1 @@ -287,6 +289,11 @@ ${awaitility.version} test + + com.tngtech.archunit + archunit-junit5 + ${archunit-junit5.version} + diff --git a/scripts/runJmhBenchmarks.sh b/scripts/runJmhBenchmarks.sh index 9fb2d3630..579f6d06e 100755 --- a/scripts/runJmhBenchmarks.sh +++ b/scripts/runJmhBenchmarks.sh @@ -1,7 +1,7 @@ #!/bin/bash echo "Running JMH Benchmarks" -ROOT="$( pwd )" +ROOT="$(pwd)" JMH_RESULT_FILE_PARENT="${ROOT}" mkdir -p "${JMH_RESULT_FILE_PARENT}" JMH_RESULT_FILE="${JMH_RESULT_FILE_PARENT}/jmh-result.csv" diff --git a/spring-cloud-starter-sleuth-otel/pom.xml b/spring-cloud-sleuth-api/pom.xml similarity index 50% rename from spring-cloud-starter-sleuth-otel/pom.xml rename to spring-cloud-sleuth-api/pom.xml index 30762434e..0f5e653ae 100644 --- a/spring-cloud-starter-sleuth-otel/pom.xml +++ b/spring-cloud-sleuth-api/pom.xml @@ -19,38 +19,72 @@ xmlns="http://maven.apache.org/POM/4.0.0" 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-api + jar + Spring Cloud Sleuth API + Spring Cloud Sleuth API + org.springframework.cloud spring-cloud-sleuth 3.0.0-SNAPSHOT .. - spring-cloud-starter-sleuth-otel - Spring Cloud Starter Sleuth with OpenTelemetry - Spring Cloud Starter Sleuth with OpenTelemetry - - ${basedir}/../.. - + - org.springframework.cloud - spring-cloud-starter + org.springframework.boot + spring-boot-starter-web + true org.springframework.boot - spring-boot-starter-aop + spring-boot-configuration-processor + true - org.springframework.cloud - spring-cloud-sleuth-otel + org.springframework.boot + spring-boot-autoconfigure-processor + true + + + + org.springframework.boot + spring-boot-starter-test + test - io.opentelemetry - opentelemetry-extension-auto-annotations + org.awaitility + awaitility + test - io.opentelemetry - opentelemetry-extension-trace-propagators + com.tngtech.archunit + archunit-junit5 + test + + + + fast + + false + + + + + maven-surefire-plugin + + 4 + true + -Xmx1024m -XX:MaxPermSize=256m + + + + + + + diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/BaggageInScope.java b/spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/BaggageInScope.java similarity index 97% rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/BaggageInScope.java rename to spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/BaggageInScope.java index d9abc7ab0..4b806a9f4 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/BaggageInScope.java +++ b/spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/BaggageInScope.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.sleuth.api; +package org.springframework.cloud.sleuth; import java.io.Closeable; diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/BaggageManager.java b/spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/BaggageManager.java similarity index 97% rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/BaggageManager.java rename to spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/BaggageManager.java index 3c4810f61..459f071e4 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/BaggageManager.java +++ b/spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/BaggageManager.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.sleuth.api; +package org.springframework.cloud.sleuth; import java.util.Map; diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/CurrentTraceContext.java b/spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/CurrentTraceContext.java similarity index 98% rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/CurrentTraceContext.java rename to spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/CurrentTraceContext.java index 480712567..c92c7d910 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/CurrentTraceContext.java +++ b/spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/CurrentTraceContext.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.sleuth.api; +package org.springframework.cloud.sleuth; import java.io.Closeable; import java.util.concurrent.Callable; diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/SamplerFunction.java b/spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/SamplerFunction.java similarity index 98% rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/SamplerFunction.java rename to spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/SamplerFunction.java index 92438dade..ded583cea 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/SamplerFunction.java +++ b/spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/SamplerFunction.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.sleuth.api; +package org.springframework.cloud.sleuth; import org.springframework.lang.Nullable; diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/ScopedSpan.java b/spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/ScopedSpan.java similarity index 97% rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/ScopedSpan.java rename to spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/ScopedSpan.java index a4eb57180..44ea086d3 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/ScopedSpan.java +++ b/spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/ScopedSpan.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.sleuth.api; +package org.springframework.cloud.sleuth; /** * Represents the "current span" until {@link ScopedSpan#end()} ()} is called. diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/Span.java b/spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/Span.java similarity index 97% rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/Span.java rename to spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/Span.java index 98b39c5d3..769f7a3c9 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/Span.java +++ b/spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/Span.java @@ -14,9 +14,9 @@ * limitations under the License. */ -package org.springframework.cloud.sleuth.api; +package org.springframework.cloud.sleuth; -import org.springframework.cloud.sleuth.api.propagation.Propagator; +import org.springframework.cloud.sleuth.propagation.Propagator; /** * diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/SpanCustomizer.java b/spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/SpanCustomizer.java similarity index 96% rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/SpanCustomizer.java rename to spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/SpanCustomizer.java index a7f0b1d0c..8b8718103 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/SpanCustomizer.java +++ b/spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/SpanCustomizer.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.sleuth.api; +package org.springframework.cloud.sleuth; /** * Allows to customize the current span in scope. diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/SpanName.java b/spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/SpanName.java similarity index 100% rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/SpanName.java rename to spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/SpanName.java diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/SpanNamer.java b/spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/SpanNamer.java similarity index 100% rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/SpanNamer.java rename to spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/SpanNamer.java diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/TraceContext.java b/spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/TraceContext.java similarity index 95% rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/TraceContext.java rename to spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/TraceContext.java index 65bf0ce59..b4085c96b 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/TraceContext.java +++ b/spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/TraceContext.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.sleuth.api; +package org.springframework.cloud.sleuth; import org.springframework.lang.Nullable; diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/Tracer.java b/spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/Tracer.java similarity index 97% rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/Tracer.java rename to spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/Tracer.java index 0fd8b14f5..86a027864 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/Tracer.java +++ b/spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/Tracer.java @@ -14,11 +14,11 @@ * limitations under the License. */ -package org.springframework.cloud.sleuth.api; +package org.springframework.cloud.sleuth; import java.io.Closeable; -import org.springframework.cloud.sleuth.api.propagation.Propagator; +import org.springframework.cloud.sleuth.propagation.Propagator; import org.springframework.lang.Nullable; /** diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/ContinueSpan.java b/spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/annotation/ContinueSpan.java similarity index 100% rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/ContinueSpan.java rename to spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/annotation/ContinueSpan.java diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/NewSpan.java b/spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/annotation/NewSpan.java similarity index 100% rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/NewSpan.java rename to spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/annotation/NewSpan.java diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/NewSpanParser.java b/spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/annotation/NewSpanParser.java similarity index 95% rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/NewSpanParser.java rename to spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/annotation/NewSpanParser.java index fb07d23f9..bd2d3ffb5 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/NewSpanParser.java +++ b/spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/annotation/NewSpanParser.java @@ -18,7 +18,7 @@ package org.springframework.cloud.sleuth.annotation; import org.aopalliance.intercept.MethodInvocation; -import org.springframework.cloud.sleuth.api.Span; +import org.springframework.cloud.sleuth.Span; /** * Parses data for a span created via a {@link NewSpan} annotation. diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/NoOpTagValueResolver.java b/spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/annotation/NoOpTagValueResolver.java similarity index 92% rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/NoOpTagValueResolver.java rename to spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/annotation/NoOpTagValueResolver.java index 92d261cb2..82e021172 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/NoOpTagValueResolver.java +++ b/spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/annotation/NoOpTagValueResolver.java @@ -22,7 +22,7 @@ package org.springframework.cloud.sleuth.annotation; * @author Marcin Grzejszczak * @since 1.2.0 */ -class NoOpTagValueResolver implements TagValueResolver { +public class NoOpTagValueResolver implements TagValueResolver { @Override public String resolve(Object parameter) { diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/SleuthMethodInvocationProcessor.java b/spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/annotation/SleuthMethodInvocationProcessor.java similarity index 75% rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/SleuthMethodInvocationProcessor.java rename to spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/annotation/SleuthMethodInvocationProcessor.java index 8c802efe6..a6fd706d4 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/SleuthMethodInvocationProcessor.java +++ b/spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/annotation/SleuthMethodInvocationProcessor.java @@ -24,8 +24,16 @@ import org.aopalliance.intercept.MethodInvocation; * @author Marcin Grzejszczak * @since 2.1.0 */ -interface SleuthMethodInvocationProcessor { +public interface SleuthMethodInvocationProcessor { + /** + * Executes a given Sleuth annotated method. + * @param invocation method invocation + * @param newSpan annotation + * @param continueSpan annotation + * @return executed method result + * @throws Throwable exception upon running a method + */ 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/SpanTag.java b/spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/annotation/SpanTag.java similarity index 100% rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/SpanTag.java rename to spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/annotation/SpanTag.java diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/TagValueExpressionResolver.java b/spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/annotation/TagValueExpressionResolver.java similarity index 100% rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/TagValueExpressionResolver.java rename to spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/annotation/TagValueExpressionResolver.java diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/TagValueResolver.java b/spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/annotation/TagValueResolver.java similarity index 100% rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/TagValueResolver.java rename to spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/annotation/TagValueResolver.java diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/SingleSkipPattern.java b/spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/autoconfig/SingleSkipPattern.java similarity index 78% rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/SingleSkipPattern.java rename to spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/autoconfig/SingleSkipPattern.java index f325a0713..12a5293c1 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/SingleSkipPattern.java +++ b/spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/autoconfig/SingleSkipPattern.java @@ -14,21 +14,24 @@ * limitations under the License. */ -package org.springframework.cloud.sleuth.instrument.web; +package org.springframework.cloud.sleuth.autoconfig; import java.util.Optional; import java.util.regex.Pattern; /** * Provides a URL {@link Pattern} for spans that should be not sampled. The default - * implementation of {@link SkipPatternProvider} will harvest all - * {@link SingleSkipPattern}s and combine them in a single pattern + * implementation will harvest all {@link SingleSkipPattern}s and combine them in a single + * pattern * * @author Marcin Grzejszczak * @since 2.1.0 */ -interface SingleSkipPattern { +public interface SingleSkipPattern { + /** + * @return optional pattern to skip + */ Optional skipPattern(); } diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/exporter/FinishedSpan.java b/spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/exporter/FinishedSpan.java similarity index 95% rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/exporter/FinishedSpan.java rename to spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/exporter/FinishedSpan.java index 38de22724..14063d155 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/exporter/FinishedSpan.java +++ b/spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/exporter/FinishedSpan.java @@ -14,12 +14,12 @@ * limitations under the License. */ -package org.springframework.cloud.sleuth.api.exporter; +package org.springframework.cloud.sleuth.exporter; import java.util.Collection; import java.util.Map; -import org.springframework.cloud.sleuth.api.Span; +import org.springframework.cloud.sleuth.Span; import org.springframework.lang.Nullable; /** diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/exporter/SpanFilter.java b/spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/exporter/SpanFilter.java similarity index 94% rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/exporter/SpanFilter.java rename to spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/exporter/SpanFilter.java index cc2946b33..756b3e044 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/exporter/SpanFilter.java +++ b/spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/exporter/SpanFilter.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.sleuth.api.exporter; +package org.springframework.cloud.sleuth.exporter; /** * An interface that allows to filter whether a given reported span should be exported or diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/autoconfig/SpanIgnoringSpanFilter.java b/spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/exporter/SpanIgnoringSpanFilter.java similarity index 73% rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/autoconfig/SpanIgnoringSpanFilter.java rename to spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/exporter/SpanIgnoringSpanFilter.java index 8bdd99866..49a7b8d50 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/autoconfig/SpanIgnoringSpanFilter.java +++ b/spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/exporter/SpanIgnoringSpanFilter.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.sleuth.autoconfig; +package org.springframework.cloud.sleuth.exporter; import java.util.ArrayList; import java.util.List; @@ -26,8 +26,6 @@ import java.util.stream.Collectors; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.springframework.cloud.sleuth.api.exporter.FinishedSpan; -import org.springframework.cloud.sleuth.api.exporter.SpanFilter; import org.springframework.util.StringUtils; /** @@ -36,16 +34,20 @@ import org.springframework.util.StringUtils; * @author Marcin Grzejszczak * @since 3.0.0 */ -class SpanIgnoringSpanFilter implements SpanFilter { +public class SpanIgnoringSpanFilter implements SpanFilter { private static final Log log = LogFactory.getLog(SpanIgnoringSpanFilter.class); - private final SleuthSpanFilterProperties sleuthSpanFilterProperties; + private final List spanNamePatternsToSkip; + + private final List additionalSpanNamePatternsToIgnore; static final Map cache = new ConcurrentHashMap<>(); - SpanIgnoringSpanFilter(SleuthSpanFilterProperties sleuthSpanFilterProperties) { - this.sleuthSpanFilterProperties = sleuthSpanFilterProperties; + public SpanIgnoringSpanFilter(List spanNamePatternsToSkip, + List additionalSpanNamePatternsToIgnore) { + this.spanNamePatternsToSkip = spanNamePatternsToSkip; + this.additionalSpanNamePatternsToIgnore = additionalSpanNamePatternsToIgnore; } private List spanNamesToIgnore() { @@ -54,8 +56,8 @@ class SpanIgnoringSpanFilter implements SpanFilter { } private List spanNames() { - List spanNamesToIgnore = new ArrayList<>(this.sleuthSpanFilterProperties.getSpanNamePatternsToSkip()); - spanNamesToIgnore.addAll(this.sleuthSpanFilterProperties.getAdditionalSpanNamePatternsToIgnore()); + List spanNamesToIgnore = new ArrayList<>(this.spanNamePatternsToSkip); + spanNamesToIgnore.addAll(this.additionalSpanNamePatternsToIgnore); return spanNamesToIgnore; } diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/http/HttpClientHandler.java b/spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/http/HttpClientHandler.java similarity index 92% rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/http/HttpClientHandler.java rename to spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/http/HttpClientHandler.java index 7e29be066..5aac0f7f9 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/http/HttpClientHandler.java +++ b/spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/http/HttpClientHandler.java @@ -14,10 +14,10 @@ * limitations under the License. */ -package org.springframework.cloud.sleuth.api.http; +package org.springframework.cloud.sleuth.http; -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; /** diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/http/HttpClientRequest.java b/spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/http/HttpClientRequest.java similarity index 91% rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/http/HttpClientRequest.java rename to spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/http/HttpClientRequest.java index 266b873a8..ea5d9fa9f 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/http/HttpClientRequest.java +++ b/spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/http/HttpClientRequest.java @@ -14,9 +14,9 @@ * limitations under the License. */ -package org.springframework.cloud.sleuth.api.http; +package org.springframework.cloud.sleuth.http; -import org.springframework.cloud.sleuth.api.Span; +import org.springframework.cloud.sleuth.Span; /** * This API is taken from OpenZipkin Brave. diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/http/HttpClientResponse.java b/spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/http/HttpClientResponse.java similarity index 92% rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/http/HttpClientResponse.java rename to spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/http/HttpClientResponse.java index 70dc6ac06..99ffa6f87 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/http/HttpClientResponse.java +++ b/spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/http/HttpClientResponse.java @@ -14,9 +14,9 @@ * limitations under the License. */ -package org.springframework.cloud.sleuth.api.http; +package org.springframework.cloud.sleuth.http; -import org.springframework.cloud.sleuth.api.Span; +import org.springframework.cloud.sleuth.Span; import org.springframework.lang.Nullable; /** diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/http/HttpRequest.java b/spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/http/HttpRequest.java similarity index 97% rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/http/HttpRequest.java rename to spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/http/HttpRequest.java index d1651d113..2fa3ce7d4 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/http/HttpRequest.java +++ b/spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/http/HttpRequest.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.sleuth.api.http; +package org.springframework.cloud.sleuth.http; import org.springframework.lang.Nullable; diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/http/HttpRequestParser.java b/spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/http/HttpRequestParser.java similarity index 87% rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/http/HttpRequestParser.java rename to spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/http/HttpRequestParser.java index 9430f9d5c..4edd2c055 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/http/HttpRequestParser.java +++ b/spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/http/HttpRequestParser.java @@ -14,10 +14,10 @@ * limitations under the License. */ -package org.springframework.cloud.sleuth.api.http; +package org.springframework.cloud.sleuth.http; -import org.springframework.cloud.sleuth.api.SpanCustomizer; -import org.springframework.cloud.sleuth.api.TraceContext; +import org.springframework.cloud.sleuth.SpanCustomizer; +import org.springframework.cloud.sleuth.TraceContext; /** * This API is taken from OpenZipkin Brave. diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/http/HttpResponse.java b/spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/http/HttpResponse.java similarity index 97% rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/http/HttpResponse.java rename to spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/http/HttpResponse.java index 52284a312..f8b2fc8ee 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/http/HttpResponse.java +++ b/spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/http/HttpResponse.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.sleuth.api.http; +package org.springframework.cloud.sleuth.http; import org.springframework.lang.Nullable; diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/http/HttpResponseParser.java b/spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/http/HttpResponseParser.java similarity index 87% rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/http/HttpResponseParser.java rename to spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/http/HttpResponseParser.java index c42f93efb..eef2026fc 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/http/HttpResponseParser.java +++ b/spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/http/HttpResponseParser.java @@ -14,10 +14,10 @@ * limitations under the License. */ -package org.springframework.cloud.sleuth.api.http; +package org.springframework.cloud.sleuth.http; -import org.springframework.cloud.sleuth.api.SpanCustomizer; -import org.springframework.cloud.sleuth.api.TraceContext; +import org.springframework.cloud.sleuth.SpanCustomizer; +import org.springframework.cloud.sleuth.TraceContext; /** * This API is taken from OpenZipkin Brave. diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/http/HttpServerHandler.java b/spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/http/HttpServerHandler.java similarity index 93% rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/http/HttpServerHandler.java rename to spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/http/HttpServerHandler.java index be12545ee..47c4f5b20 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/http/HttpServerHandler.java +++ b/spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/http/HttpServerHandler.java @@ -14,9 +14,9 @@ * limitations under the License. */ -package org.springframework.cloud.sleuth.api.http; +package org.springframework.cloud.sleuth.http; -import org.springframework.cloud.sleuth.api.Span; +import org.springframework.cloud.sleuth.Span; /** * This API is taken from OpenZipkin Brave. diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/http/HttpServerRequest.java b/spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/http/HttpServerRequest.java similarity index 92% rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/http/HttpServerRequest.java rename to spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/http/HttpServerRequest.java index 7acb5d02a..3da043e2c 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/http/HttpServerRequest.java +++ b/spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/http/HttpServerRequest.java @@ -14,9 +14,9 @@ * limitations under the License. */ -package org.springframework.cloud.sleuth.api.http; +package org.springframework.cloud.sleuth.http; -import org.springframework.cloud.sleuth.api.Span; +import org.springframework.cloud.sleuth.Span; /** * This API is taken from OpenZipkin Brave. diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/http/HttpServerResponse.java b/spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/http/HttpServerResponse.java similarity index 92% rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/http/HttpServerResponse.java rename to spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/http/HttpServerResponse.java index 833a3c4cf..4c76251e7 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/http/HttpServerResponse.java +++ b/spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/http/HttpServerResponse.java @@ -14,9 +14,9 @@ * limitations under the License. */ -package org.springframework.cloud.sleuth.api.http; +package org.springframework.cloud.sleuth.http; -import org.springframework.cloud.sleuth.api.Span; +import org.springframework.cloud.sleuth.Span; import org.springframework.lang.Nullable; /** diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/http/Request.java b/spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/http/Request.java similarity index 92% rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/http/Request.java rename to spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/http/Request.java index 1e30d294e..ea7af4287 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/http/Request.java +++ b/spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/http/Request.java @@ -14,11 +14,11 @@ * limitations under the License. */ -package org.springframework.cloud.sleuth.api.http; +package org.springframework.cloud.sleuth.http; import java.util.Collection; -import org.springframework.cloud.sleuth.api.Span; +import org.springframework.cloud.sleuth.Span; /** * This API is taken from OpenZipkin Brave. diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/http/Response.java b/spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/http/Response.java similarity index 93% rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/http/Response.java rename to spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/http/Response.java index b8a69548e..4f74be603 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/http/Response.java +++ b/spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/http/Response.java @@ -14,11 +14,11 @@ * limitations under the License. */ -package org.springframework.cloud.sleuth.api.http; +package org.springframework.cloud.sleuth.http; import java.util.Collection; -import org.springframework.cloud.sleuth.api.Span; +import org.springframework.cloud.sleuth.Span; import org.springframework.lang.Nullable; /** diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/propagation/Propagator.java b/spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/propagation/Propagator.java similarity index 96% rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/propagation/Propagator.java rename to spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/propagation/Propagator.java index 48d7c20c6..bdedb6de0 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/api/propagation/Propagator.java +++ b/spring-cloud-sleuth-api/src/main/java/org/springframework/cloud/sleuth/propagation/Propagator.java @@ -14,12 +14,12 @@ * limitations under the License. */ -package org.springframework.cloud.sleuth.api.propagation; +package org.springframework.cloud.sleuth.propagation; 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.lang.Nullable; /** diff --git a/spring-cloud-sleuth-core/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/spring-cloud-sleuth-api/src/main/resources/META-INF/additional-spring-configuration-metadata.json similarity index 100% rename from spring-cloud-sleuth-core/src/main/resources/META-INF/additional-spring-configuration-metadata.json rename to spring-cloud-sleuth-api/src/main/resources/META-INF/additional-spring-configuration-metadata.json diff --git a/spring-cloud-sleuth-api/src/test/java/org/springframework/cloud/sleuth/ArchitectureTests.java b/spring-cloud-sleuth-api/src/test/java/org/springframework/cloud/sleuth/ArchitectureTests.java new file mode 100644 index 000000000..434c404af --- /dev/null +++ b/spring-cloud-sleuth-api/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-core/src/test/java/org/springframework/cloud/sleuth/annotation/NoOpTagValueResolverTests.java b/spring-cloud-sleuth-api/src/test/java/org/springframework/cloud/sleuth/annotation/NoOpTagValueResolverTests.java similarity index 100% rename from spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/annotation/NoOpTagValueResolverTests.java rename to spring-cloud-sleuth-api/src/test/java/org/springframework/cloud/sleuth/annotation/NoOpTagValueResolverTests.java diff --git a/spring-cloud-sleuth-api/src/test/java/org/springframework/cloud/sleuth/exporter/SpanIgnoringSpanFilterTests.java b/spring-cloud-sleuth-api/src/test/java/org/springframework/cloud/sleuth/exporter/SpanIgnoringSpanFilterTests.java new file mode 100644 index 000000000..3a3a14172 --- /dev/null +++ b/spring-cloud-sleuth-api/src/test/java/org/springframework/cloud/sleuth/exporter/SpanIgnoringSpanFilterTests.java @@ -0,0 +1,74 @@ +/* + * 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.exporter; + +import java.util.Collections; + +import org.junit.jupiter.api.Test; +import org.mockito.BDDMockito; + +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() { + SpanIgnoringSpanFilter handler = new SpanIgnoringSpanFilter(Collections.singletonList("someName"), + Collections.emptyList()); + + then(handler.isExportable(namedSpan())).isFalse(); + } + + @Test + void should_not_handle_span_when_present_in_additional_list_of_spans_to_skip() { + SpanIgnoringSpanFilter handler = new SpanIgnoringSpanFilter(Collections.emptyList(), + Collections.singletonList("someName")); + + then(handler.isExportable(namedSpan())).isFalse(); + } + + @Test + void should_use_cached_entry_for_same_patterns() { + export(handler("someOtherName")); + export(handler("someOtherName")); + export(handler("someOtherName")); + + then(SpanIgnoringSpanFilter.cache).containsKey("someOtherName"); + + export(handler("a")); + export(handler("b")); + export(handler("c")); + + then(SpanIgnoringSpanFilter.cache).containsKey("someOtherName").containsKey("a").containsKey("b") + .containsKey("c"); + } + + private void export(SpanIgnoringSpanFilter handler) { + handler.isExportable(namedSpan()); + } + + private SpanIgnoringSpanFilter handler(String name) { + return new SpanIgnoringSpanFilter(Collections.emptyList(), Collections.singletonList(name)); + } + +} diff --git a/spring-cloud-sleuth-api/src/test/resources/META-INF/spring.factories b/spring-cloud-sleuth-api/src/test/resources/META-INF/spring.factories new file mode 100644 index 000000000..93ad5a8d7 --- /dev/null +++ b/spring-cloud-sleuth-api/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-core/src/test/resources/application.yml b/spring-cloud-sleuth-api/src/test/resources/application.yml similarity index 100% rename from spring-cloud-sleuth-core/src/test/resources/application.yml rename to spring-cloud-sleuth-api/src/test/resources/application.yml diff --git a/spring-cloud-sleuth-core/src/test/resources/logback.xml b/spring-cloud-sleuth-api/src/test/resources/logback.xml similarity index 100% rename from spring-cloud-sleuth-core/src/test/resources/logback.xml rename to spring-cloud-sleuth-api/src/test/resources/logback.xml diff --git a/spring-cloud-sleuth-autoconfigure/pom.xml b/spring-cloud-sleuth-autoconfigure/pom.xml new file mode 100644 index 000000000..52876f5ff --- /dev/null +++ b/spring-cloud-sleuth-autoconfigure/pom.xml @@ -0,0 +1,526 @@ + + + + + 4.0.0 + + spring-cloud-sleuth-autoconfigure + jar + Spring Cloud Sleuth AutoConfigure + Spring Cloud Sleuth AutoConfigure + + + org.springframework.cloud + spring-cloud-sleuth + 3.0.0-SNAPSHOT + .. + + + + + + org.springframework.cloud + spring-cloud-sleuth-instrumentation + + + org.springframework.boot + spring-boot-starter-web + true + + + io.micrometer + micrometer-core + true + + + io.projectreactor + reactor-core + true + + + org.reactivestreams + reactive-streams + true + + + org.springframework.boot + spring-boot-configuration-processor + true + + + org.springframework.boot + spring-boot-starter-actuator + true + + + org.springframework.integration + spring-integration-core + true + + + org.springframework.cloud + spring-cloud-function-context + true + + + org.springframework.boot + spring-boot-starter-websocket + true + + + org.springframework.cloud + spring-cloud-stream + true + + + org.springframework.cloud + spring-cloud-commons + + + org.springframework + spring-context + + + org.springframework.cloud + spring-cloud-context + true + + + io.reactivex + rxjava + true + + + io.github.openfeign + feign-okhttp + true + + + org.springframework.cloud + spring-cloud-starter-openfeign + true + + + org.springframework.cloud + spring-cloud-starter-loadbalancer + true + + + org.springframework.cloud + spring-cloud-starter-gateway + true + + + org.aspectj + aspectjrt + + + + org.springframework.boot + spring-boot-starter-quartz + true + + + org.springframework.boot + spring-boot-autoconfigure-processor + true + + + org.springframework.security.oauth + spring-security-oauth2 + true + + + org.springframework.security.oauth.boot + spring-security-oauth2-autoconfigure + true + + + + + org.springframework.cloud + spring-cloud-sleuth-brave + true + + + io.zipkin.brave + brave + + + io.zipkin.reporter2 + * + + + io.zipkin.zipkin2 + * + + + true + + + io.zipkin.brave + brave-context-slf4j + true + + + io.zipkin.brave + brave-instrumentation-messaging + true + + + io.zipkin.brave + brave-instrumentation-rpc + true + + + io.zipkin.brave + brave-instrumentation-spring-rabbit + true + + + io.zipkin.brave + brave-instrumentation-kafka-clients + true + + + io.zipkin.brave + brave-instrumentation-kafka-streams + true + + + io.zipkin.brave + brave-instrumentation-httpclient + true + + + io.zipkin.brave + brave-instrumentation-httpasyncclient + true + + + io.zipkin.brave + brave-instrumentation-jms + true + + + io.zipkin.brave + brave-instrumentation-mongodb + true + + + io.zipkin.aws + brave-propagation-aws + true + + + javax.jms + javax.jms-api + true + + + io.opentracing.brave + brave-opentracing + true + + + org.apache.httpcomponents + httpasyncclient + true + + + org.springframework + spring-jms + true + + + + io.github.lognet + grpc-spring-boot-starter + true + + + org.springframework.boot + spring-boot-starter + + + + + io.zipkin.brave + brave-instrumentation-grpc + true + + + io.zipkin.reporter2 + zipkin-reporter-metrics-micrometer + + + io.micrometer + micrometer-core + + + true + + + + io.lettuce + lettuce-core + true + + + org.springframework.kafka + spring-kafka + true + + + org.apache.kafka + kafka-streams + true + + + org.springframework.amqp + spring-rabbit + true + + + org.springframework.boot + spring-boot-starter-data-mongodb + true + + + + + org.springframework.cloud + spring-cloud-sleuth-otel + true + + + io.opentelemetry + opentelemetry-api + true + + + io.opentelemetry + opentelemetry-sdk-common + true + + + io.opentelemetry + * + + + + + io.opentelemetry + opentelemetry-sdk-tracing + true + + + io.opentelemetry + * + + + + + io.opentelemetry.instrumentation + opentelemetry-instrumentation-api + true + + + io.opentelemetry + * + + + io.opentelemetry.instrumentation + * + + + + + io.opentelemetry + opentelemetry-extension-auto-annotations + true + + + io.opentelemetry + * + + + + + io.opentelemetry + opentelemetry-exporter-logging + true + + + io.opentelemetry + * + + + + + io.opentelemetry + opentelemetry-extension-trace-propagators + true + + + io.opentelemetry + * + + + + + io.opentelemetry + opentelemetry-opentracing-shim + true + + + io.opentelemetry + * + + + + + + + org.springframework.cloud + spring-cloud-sleuth-zipkin + true + + + io.opentelemetry + opentelemetry-exporter-zipkin + true + + + io.zipkin.zipkin2 + zipkin + true + + + io.zipkin.reporter2 + zipkin-reporter + true + + + io.zipkin.reporter2 + zipkin-reporter-brave + true + + + io.zipkin.reporter2 + zipkin-sender-kafka + true + + + + org.apache.kafka + kafka-clients + + + + + io.zipkin.reporter2 + zipkin-sender-activemq-client + true + + + org.apache.activemq + activemq-client + + + + + org.apache.activemq + activemq-client + true + + + io.zipkin.reporter2 + zipkin-sender-amqp-client + true + + + + com.rabbitmq + amqp-client + + + + + + org.springframework.boot + spring-boot-starter-test + test + + + org.awaitility + awaitility + test + + + + + io.zipkin.brave + brave-instrumentation-http-tests + test + + + com.squareup.okhttp3 + mockwebserver + test + + + + + com.squareup.okhttp3 + okhttp + + 4.8.0 + test + + + com.tngtech.archunit + archunit-junit5 + test + + + + + + + fast + + false + + + + + maven-surefire-plugin + + 4 + true + -Xmx1024m -XX:MaxPermSize=256m + + + + + + + + diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/SleuthAnnotationAutoConfiguration.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/SleuthAnnotationConfiguration.java similarity index 70% rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/SleuthAnnotationAutoConfiguration.java rename to spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/SleuthAnnotationConfiguration.java index 93edc1d01..1d5062634 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/SleuthAnnotationAutoConfiguration.java +++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/SleuthAnnotationConfiguration.java @@ -14,17 +14,24 @@ * limitations under the License. */ -package org.springframework.cloud.sleuth.annotation; +package org.springframework.cloud.sleuth.autoconfig; 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.ConditionalOnMissingClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.cloud.sleuth.api.Tracer; -import org.springframework.cloud.sleuth.autoconfig.TraceAutoConfiguration; +import org.springframework.cloud.sleuth.annotation.NewSpan; +import org.springframework.cloud.sleuth.annotation.NewSpanParser; +import org.springframework.cloud.sleuth.annotation.NoOpTagValueResolver; +import org.springframework.cloud.sleuth.annotation.SleuthMethodInvocationProcessor; +import org.springframework.cloud.sleuth.annotation.TagValueExpressionResolver; +import org.springframework.cloud.sleuth.annotation.TagValueResolver; +import org.springframework.cloud.sleuth.instrument.annotation.DefaultSpanCreator; +import org.springframework.cloud.sleuth.instrument.annotation.NonReactorSleuthMethodInvocationProcessor; +import org.springframework.cloud.sleuth.instrument.annotation.ReactorSleuthMethodInvocationProcessor; +import org.springframework.cloud.sleuth.instrument.annotation.SleuthAdvisorConfig; +import org.springframework.cloud.sleuth.instrument.annotation.SpelTagValueExpressionResolver; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Role; @@ -41,10 +48,8 @@ import org.springframework.context.annotation.Role; */ @Configuration(proxyBeanMethods = false) @Role(BeanDefinition.ROLE_INFRASTRUCTURE) -@ConditionalOnBean(Tracer.class) -@ConditionalOnProperty(name = "spring.sleuth.annotation.enabled", matchIfMissing = true) -@AutoConfigureAfter(TraceAutoConfiguration.class) -class SleuthAnnotationAutoConfiguration { +@ConditionalOnProperty(name = { "spring.sleuth.enabled", "spring.sleuth.annotation.enabled" }, matchIfMissing = true) +public class SleuthAnnotationConfiguration { @Bean @ConditionalOnMissingBean diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/autoconfig/SleuthBaggageProperties.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/SleuthBaggageProperties.java similarity index 100% rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/autoconfig/SleuthBaggageProperties.java rename to spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/SleuthBaggageProperties.java diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/opentracing/SleuthOpentracingProperties.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/SleuthOpentracingProperties.java similarity index 95% rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/opentracing/SleuthOpentracingProperties.java rename to spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/SleuthOpentracingProperties.java index b6729ba67..1f39984e1 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/opentracing/SleuthOpentracingProperties.java +++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/SleuthOpentracingProperties.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.sleuth.opentracing; +package org.springframework.cloud.sleuth.autoconfig; import org.springframework.boot.context.properties.ConfigurationProperties; diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/autoconfig/SleuthSpanFilterProperties.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/SleuthSpanFilterProperties.java similarity index 98% rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/autoconfig/SleuthSpanFilterProperties.java rename to spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/SleuthSpanFilterProperties.java index 982126e2b..e780c5942 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/autoconfig/SleuthSpanFilterProperties.java +++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/SleuthSpanFilterProperties.java @@ -29,7 +29,7 @@ import org.springframework.boot.context.properties.ConfigurationProperties; * @since 1.0.11 */ @ConfigurationProperties("spring.sleuth.span-filter") -class SleuthSpanFilterProperties { +public class SleuthSpanFilterProperties { /** * Will turn on the default Sleuth handler mechanism. Might ignore exporting of diff --git a/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/SleuthTracerProperties.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/SleuthTracerProperties.java new file mode 100644 index 000000000..b7a3cf55e --- /dev/null +++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/SleuthTracerProperties.java @@ -0,0 +1,65 @@ +/* + * 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.context.properties.ConfigurationProperties; + +/** + * Sets tracer related properties. + * + * @author Marcin Grzejszczak + * @since 3.0 + */ +@ConfigurationProperties("spring.sleuth.tracer") +public class SleuthTracerProperties { + + /** + * Set which tracer implementation should be picked. + */ + private TracerMode mode = TracerMode.AUTO; + + public TracerMode getMode() { + return this.mode; + } + + public void setMode(TracerMode mode) { + this.mode = mode; + } + + /** + * Tracer implementation modes. + */ + public enum TracerMode { + + /** + * Automatically picks the tracer implementation. + */ + AUTO, + + /** + * Picks the OpenZipkin Brave tracer implementation. + */ + BRAVE, + + /** + * Picks the OpenTelemetry tracer implementation. + */ + OTEL + + } + +} diff --git a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/propagation/TraceBravePropagationAutoConfiguration.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/TraceConfiguration.java similarity index 55% rename from spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/propagation/TraceBravePropagationAutoConfiguration.java rename to spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/TraceConfiguration.java index 2d3325b00..a55d2c28a 100644 --- a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/propagation/TraceBravePropagationAutoConfiguration.java +++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/TraceConfiguration.java @@ -14,33 +14,44 @@ * limitations under the License. */ -package org.springframework.cloud.sleuth.brave.propagation; +package org.springframework.cloud.sleuth.autoconfig; -import org.springframework.beans.factory.BeanFactory; 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.SpanNamer; +import org.springframework.cloud.sleuth.exporter.SpanFilter; +import org.springframework.cloud.sleuth.exporter.SpanIgnoringSpanFilter; +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 propagation factories. + * Auto-configuration} to enable tracing via Spring Cloud Sleuth. * + * @author Spencer Gibb * @author Marcin Grzejszczak - * @since 3.0.0 + * @author Tim Ysewyn + * @since 2.0.0 */ @Configuration(proxyBeanMethods = false) @ConditionalOnProperty(value = "spring.sleuth.enabled", matchIfMissing = true) -@EnableConfigurationProperties(SleuthPropagationProperties.class) -public class TraceBravePropagationAutoConfiguration { +@EnableConfigurationProperties({ SleuthSpanFilterProperties.class, SleuthBaggageProperties.class, + SleuthTracerProperties.class }) +public class TraceConfiguration { @Bean @ConditionalOnMissingBean - PropagationFactorySupplier compositePropagationFactorySupplier(BeanFactory beanFactory, - SleuthBaggageProperties baggageProperties, SleuthPropagationProperties properties) { - return new CompositePropagationFactorySupplier(beanFactory, baggageProperties, properties); + SpanNamer defaultSpanNamer() { + return new DefaultSpanNamer(); + } + + @Bean + @ConditionalOnProperty(value = "spring.sleuth.span-filter.enabled", matchIfMissing = true) + SpanFilter spanIgnoringSpanExporter(SleuthSpanFilterProperties sleuthSpanFilterProperties) { + return new SpanIgnoringSpanFilter(sleuthSpanFilterProperties.getSpanNamePatternsToSkip(), + sleuthSpanFilterProperties.getAdditionalSpanNamePatternsToIgnore()); } } diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/autoconfig/TraceEnvironmentPostProcessor.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/TraceEnvironmentPostProcessor.java similarity index 100% rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/autoconfig/TraceEnvironmentPostProcessor.java rename to spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/TraceEnvironmentPostProcessor.java diff --git a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/autoconfig/TraceBraveAutoConfiguration.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/brave/BraveAutoConfiguration.java similarity index 78% rename from spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/autoconfig/TraceBraveAutoConfiguration.java rename to spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/brave/BraveAutoConfiguration.java index f078919ff..6df060570 100644 --- a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/autoconfig/TraceBraveAutoConfiguration.java +++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/brave/BraveAutoConfiguration.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.Collections; import java.util.List; @@ -30,18 +30,18 @@ import brave.propagation.Propagation; import brave.propagation.ThreadLocalCurrentTraceContext; import brave.sampler.Sampler; -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.boot.context.properties.EnableConfigurationProperties; import org.springframework.cloud.sleuth.SpanNamer; -import org.springframework.cloud.sleuth.api.exporter.SpanFilter; -import org.springframework.cloud.sleuth.autoconfig.TraceAutoConfiguration; +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.autoconfig.brave.instrument.web.BraveHttpConfiguration; import org.springframework.cloud.sleuth.brave.LocalServiceName; -import org.springframework.cloud.sleuth.brave.bridge.BraveBaggageManager; -import org.springframework.cloud.sleuth.brave.propagation.TraceBravePropagationAutoConfiguration; -import org.springframework.cloud.sleuth.brave.sampler.SamplerAutoConfiguration; import org.springframework.cloud.sleuth.internal.DefaultSpanNamer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -59,14 +59,15 @@ import org.springframework.util.StringUtils; * @since 3.0.0 */ @Configuration(proxyBeanMethods = false) +@ConditionalOnBraveEnabled @ConditionalOnProperty(value = "spring.sleuth.enabled", matchIfMissing = true) -@EnableConfigurationProperties(SleuthProperties.class) -@Import({ TraceBaggageConfiguration.class, SamplerAutoConfiguration.class }) -@AutoConfigureBefore(TraceAutoConfiguration.class) -@AutoConfigureAfter(TraceBravePropagationAutoConfiguration.class) -// public allows @AutoConfigureAfter(TraceAutoConfiguration) -// for components needing Tracing -public class TraceBraveAutoConfiguration { +@ConditionalOnMissingBean(org.springframework.cloud.sleuth.Tracer.class) +@ConditionalOnClass({ Tracer.class, SleuthProperties.class }) +@EnableConfigurationProperties({ SleuthProperties.class, SleuthSpanFilterProperties.class, + SleuthBaggageProperties.class, SleuthTracerProperties.class, SleuthBaggageProperties.class }) +@Import({ BraveBridgeConfiguration.class, BraveBaggageConfiguration.class, BraveSamplerConfiguration.class, + BraveHttpConfiguration.class, TraceConfiguration.class, SleuthAnnotationConfiguration.class }) +public class BraveAutoConfiguration { /** * Tracing bean name. Name of the bean matters for some instrumentations. @@ -81,13 +82,7 @@ public class TraceBraveAutoConfiguration { /** * Default value used for service name if none provided. */ - public static final String DEFAULT_SERVICE_NAME = "default"; - - @Bean - @ConditionalOnMissingBean - BraveBaggageManager braveBaggageManager() { - return new BraveBaggageManager(); - } + private static final String DEFAULT_SERVICE_NAME = "default"; @Bean(name = TRACING_BEAN_NAME) @ConditionalOnMissingBean @@ -158,9 +153,4 @@ public class TraceBraveAutoConfiguration { return CurrentSpanCustomizer.create(tracing); } - @Bean - SpanHandler compositeSpanHandler(@Nullable List exporters) { - return new CompositeSpanHandler(exporters); - } - } diff --git a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/autoconfig/TraceBaggageConfiguration.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/brave/BraveBaggageConfiguration.java similarity index 96% rename from spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/autoconfig/TraceBaggageConfiguration.java rename to spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/brave/BraveBaggageConfiguration.java index 8ba1c94bf..87d5aec14 100644 --- a/spring-cloud-sleuth-brave/src/main/java/org/springframework/cloud/sleuth/brave/autoconfig/TraceBaggageConfiguration.java +++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/brave/BraveBaggageConfiguration.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.ArrayList; import java.util.List; @@ -47,7 +47,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.context.properties.ConfigurationProperties; -import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.cloud.sleuth.autoconfig.SleuthBaggageProperties; import org.springframework.cloud.sleuth.brave.propagation.PropagationFactorySupplier; import org.springframework.context.annotation.Bean; @@ -64,10 +63,9 @@ import org.springframework.lang.Nullable; * @since 2.0.0 */ @Configuration(proxyBeanMethods = false) -@EnableConfigurationProperties(SleuthBaggageProperties.class) -class TraceBaggageConfiguration { +class BraveBaggageConfiguration { - static final Log logger = LogFactory.getLog(TraceBaggageConfiguration.class); + static final Log logger = LogFactory.getLog(BraveBaggageConfiguration.class); static final String LOCAL_KEYS = "spring.sleuth.local-keys"; static final String BAGGAGE_KEYS = "spring.sleuth.baggage-keys"; @@ -218,7 +216,6 @@ class TraceBaggageConfiguration { */ @Configuration(proxyBeanMethods = false) @Conditional(BaggageTagSpanHandlerCondition.class) - @EnableConfigurationProperties(SleuthBaggageProperties.class) static class BaggageTagSpanHandlerConfiguration { @Bean(WHITELISTED_KEYS) diff --git a/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/brave/BraveBridgeConfiguration.java b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/brave/BraveBridgeConfiguration.java new file mode 100644 index 000000000..44005ed02 --- /dev/null +++ b/spring-cloud-sleuth-autoconfigure/src/main/java/org/springframework/cloud/sleuth/autoconfig/brave/BraveBridgeConfiguration.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.autoconfig.brave; + +import java.util.List; + +import brave.Tracing; +import brave.handler.SpanHandler; + +import org.springframework.beans.factory.BeanFactory; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.cloud.sleuth.SpanCustomizer; +import org.springframework.cloud.sleuth.autoconfig.SleuthBaggageProperties; +import org.springframework.cloud.sleuth.brave.bridge.BraveBaggageManager; +import org.springframework.cloud.sleuth.brave.bridge.BraveCurrentTraceContext; +import org.springframework.cloud.sleuth.brave.bridge.BravePropagator; +import org.springframework.cloud.sleuth.brave.bridge.BraveSpanCustomizer; +import org.springframework.cloud.sleuth.brave.bridge.BraveTracer; +import org.springframework.cloud.sleuth.brave.bridge.CompositePropagationFactorySupplier; +import org.springframework.cloud.sleuth.brave.bridge.CompositeSpanHandler; +import org.springframework.cloud.sleuth.brave.propagation.PropagationFactorySupplier; +import org.springframework.cloud.sleuth.exporter.SpanFilter; +import org.springframework.cloud.sleuth.propagation.Propagator; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.lang.Nullable; + +@Configuration(proxyBeanMethods = false) +@EnableConfigurationProperties(SleuthPropagationProperties.class) +class BraveBridgeConfiguration { + + @Bean + org.springframework.cloud.sleuth.Tracer braveTracer(brave.Tracer tracer) { + return new BraveTracer(tracer, new BraveBaggageManager()); + } + + @Bean + org.springframework.cloud.sleuth.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); + } + + @Bean + @ConditionalOnMissingBean + PropagationFactorySupplier compositePropagationFactorySupplier(BeanFactory beanFactory, + SleuthBaggageProperties baggageProperties, SleuthPropagationProperties properties) { + return new CompositePropagationFactorySupplier(beanFactory, baggageProperties.getLocalFields(), + properties.getType()); + } + + // Name is important for sampling conditions + @Bean(name = "traceCompositeSpanHandler") + SpanHandler compositeSpanHandler(@Nullable List 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, 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, ? 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, ? 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 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 types) { + this.types = types; if (isOnClasspath("io.opentelemetry.extension.trace.propagation.AwsXRayPropagator")) { - this.mapping.put(SleuthPropagationProperties.PropagationType.AWS, beanFactory - .getBeanProvider(AwsXRayPropagator.class).getIfAvailable(AwsXRayPropagator::getInstance)); + this.mapping.put(PropagationType.AWS, beanFactory.getBeanProvider(AwsXRayPropagator.class) + .getIfAvailable(AwsXRayPropagator::getInstance)); } if (isOnClasspath("io.opentelemetry.extension.trace.propagation.B3Propagator")) { - this.mapping.put(SleuthPropagationProperties.PropagationType.B3, + this.mapping.put(PropagationType.B3, beanFactory.getBeanProvider(B3Propagator.class).getIfAvailable(B3Propagator::getInstance)); } if (isOnClasspath("io.opentelemetry.extension.trace.propagation.JaegerPropagator")) { - this.mapping.put(SleuthPropagationProperties.PropagationType.JAEGER, + this.mapping.put(PropagationType.JAEGER, beanFactory.getBeanProvider(JaegerPropagator.class).getIfAvailable(JaegerPropagator::getInstance)); } if (isOnClasspath("io.opentelemetry.extension.trace.propagation.OtTracerPropagator")) { - this.mapping.put(SleuthPropagationProperties.PropagationType.OT_TRACER, beanFactory - .getBeanProvider(OtTracerPropagator.class).getIfAvailable(OtTracerPropagator::getInstance)); + this.mapping.put(PropagationType.OT_TRACER, beanFactory.getBeanProvider(OtTracerPropagator.class) + .getIfAvailable(OtTracerPropagator::getInstance)); } - this.mapping.put(SleuthPropagationProperties.PropagationType.W3C, new MultiTextMapPropagator( + this.mapping.put(PropagationType.W3C, new MultiTextMapPropagator( Arrays.asList(HttpTraceContext.getInstance(), W3CBaggagePropagator.getInstance()))); - this.mapping.put(SleuthPropagationProperties.PropagationType.CUSTOM, NoopTextMapPropagator.INSTANCE); + this.mapping.put(PropagationType.CUSTOM, NoopTextMapPropagator.INSTANCE); log.info("Registered the following context propagation types " + this.mapping.keySet()); } @@ -149,20 +87,19 @@ class CompositeTextMapPropagator implements TextMapPropagator { @Override public List fields() { - return this.properties.getType().stream() - .map(key -> this.mapping.getOrDefault(key, NoopTextMapPropagator.INSTANCE)) + return this.types.stream().map(key -> this.mapping.getOrDefault(key, NoopTextMapPropagator.INSTANCE)) .flatMap(p -> p.fields().stream()).collect(Collectors.toList()); } @Override public void inject(Context context, C carrier, Setter setter) { - this.properties.getType().stream().map(key -> this.mapping.getOrDefault(key, NoopTextMapPropagator.INSTANCE)) + this.types.stream().map(key -> this.mapping.getOrDefault(key, NoopTextMapPropagator.INSTANCE)) .forEach(p -> p.inject(context, carrier, setter)); } @Override public Context extract(Context context, C carrier, Getter getter) { - for (SleuthPropagationProperties.PropagationType type : this.properties.getType()) { + for (PropagationType type : this.types) { TextMapPropagator propagator = this.mapping.get(type); if (propagator == null || propagator == NoopTextMapPropagator.INSTANCE) { continue; diff --git a/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/propagation/PropagationType.java b/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/propagation/PropagationType.java new file mode 100644 index 000000000..be3e67b17 --- /dev/null +++ b/spring-cloud-sleuth-otel/src/main/java/org/springframework/cloud/sleuth/otel/propagation/PropagationType.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.otel.propagation; + +/* + * Supported propagation types. + * + * @author Marcin Grzejszczak + * @since 3.0.0 + */ +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/resources/META-INF/spring.factories b/spring-cloud-sleuth-otel/src/main/resources/META-INF/spring.factories deleted file mode 100644 index c8ec1eb35..000000000 --- a/spring-cloud-sleuth-otel/src/main/resources/META-INF/spring.factories +++ /dev/null @@ -1,9 +0,0 @@ -# Auto Configuration -org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ -org.springframework.cloud.sleuth.otel.autoconfig.TraceOtelAutoConfiguration,\ -org.springframework.cloud.sleuth.otel.bridge.TraceOtelBridgeAutoConfiguation,\ -org.springframework.cloud.sleuth.otel.bridge.http.TraceOtelHttpBridgeAutoConfiguration,\ -org.springframework.cloud.sleuth.otel.propagation.TraceOtelPropagationAutoConfiguration,\ -org.springframework.cloud.sleuth.otel.opentracing.OpentracingAutoConfiguration,\ -org.springframework.cloud.sleuth.otel.log.TraceOtelLogAutoConfiguration,\ -org.springframework.cloud.sleuth.otel.exporter.TraceOtelExporterAutoConfiguration \ No newline at end of file diff --git a/spring-cloud-sleuth-otel/src/test/java/org/springframework/cloud/sleuth/ArchitectureTests.java b/spring-cloud-sleuth-otel/src/test/java/org/springframework/cloud/sleuth/ArchitectureTests.java new file mode 100644 index 000000000..434c404af --- /dev/null +++ b/spring-cloud-sleuth-otel/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-samples/README.adoc b/spring-cloud-sleuth-samples/README.adoc index 770e19e58..01b4942ae 100644 --- a/spring-cloud-sleuth-samples/README.adoc +++ b/spring-cloud-sleuth-samples/README.adoc @@ -2,7 +2,10 @@ === Running the samples -There are a few samples with slightly different features. You can run all of them from an IDE via the main method, or on the command line with `mvn spring-boot:run`. They all log trace and span data on the console by default. Here's a list: +There are a few samples with slightly different features. +You can run all of them from an IDE via the main method, or on the command line with `mvn spring-boot:run`. +They all log trace and span data on the console by default. +Here's a list: * `spring-cloud-sleuth-sample`: vanilla (no zipkin) web app that calls back to itself on various endpoints ("/", "/call", "/async") @@ -13,7 +16,8 @@ There are a few samples with slightly different features. You can run all of the === Running samples with Zipkin 1. Optionally run the https://github.com/openzipkin/zipkin[Zipkin] Server, e.g. via docker compose (there's a `docker-compose.yml` in https://github.com/spring-cloud/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-zipkin[Spring Cloud Sleuth], or in https://github.com/openzipkin/docker-zipkin[Docker Zipkin] -7. Run the zipkin sample application (set `sample.zipkin.enabled=false` if you have no Zipkin running). If you are using a VM to run docker you might need to tunnel port 9411 to localhost, or change the `spring.zipkin.baseUrl`. +7. Run the zipkin sample application (set `sample.zipkin.enabled=false` if you have no Zipkin running). +If you are using a VM to run docker you might need to tunnel port 9411 to localhost, or change the `spring.zipkin.baseUrl`. 8. Hit `http://localhost:3380`, `http://localhost:3380/call`, `http://localhost:3380/async` for some interesting sample traces (the app callas back to itself). 9. Go to `http://localhost:9411` for Zipkin's UI (if you are using boot2docker the host will be different) diff --git a/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-feign/pom.xml b/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-feign/pom.xml index 778b79703..c90717f15 100644 --- a/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-feign/pom.xml +++ b/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-feign/pom.xml @@ -72,6 +72,10 @@ org.springframework.cloud spring-cloud-starter-loadbalancer + + org.springframework.cloud + spring-cloud-starter-sleuth + org.springframework.cloud spring-cloud-sleuth-zipkin diff --git a/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-feign/src/main/java/sample/SampleFeignApplication.java b/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-feign/src/main/java/sample/SampleFeignApplication.java index 8264dac44..c35052421 100644 --- a/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-feign/src/main/java/sample/SampleFeignApplication.java +++ b/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-feign/src/main/java/sample/SampleFeignApplication.java @@ -23,7 +23,7 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.cloud.openfeign.EnableFeignClients; -import org.springframework.cloud.sleuth.api.exporter.SpanFilter; +import org.springframework.cloud.sleuth.exporter.SpanFilter; import org.springframework.context.annotation.Bean; /** diff --git a/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-feign/src/main/resources/application.yml b/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-feign/src/main/resources/application.yml index 9b520c0ca..3eb7cc4fa 100644 --- a/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-feign/src/main/resources/application.yml +++ b/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-feign/src/main/resources/application.yml @@ -6,3 +6,4 @@ logging.level.com.netflix.discovery: 'OFF' sample: zipkin: enabled: false +spring: diff --git a/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-messaging/pom.xml b/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-messaging/pom.xml index fa031cb39..c5fa11afd 100644 --- a/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-messaging/pom.xml +++ b/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-messaging/pom.xml @@ -77,7 +77,7 @@ org.springframework.cloud - spring-cloud-sleuth-brave + spring-cloud-starter-sleuth org.springframework.cloud diff --git a/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-messaging/src/main/java/sample/SampleBackground.java b/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-messaging/src/main/java/sample/SampleBackground.java index 88814f7ac..b1b50b9bd 100644 --- a/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-messaging/src/main/java/sample/SampleBackground.java +++ b/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-messaging/src/main/java/sample/SampleBackground.java @@ -19,7 +19,7 @@ package sample; import java.util.Random; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.cloud.sleuth.api.Tracer; +import org.springframework.cloud.sleuth.Tracer; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; diff --git a/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-test-core/pom.xml b/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-test-core/pom.xml index bcc95ff49..18a71fa8d 100644 --- a/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-test-core/pom.xml +++ b/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-test-core/pom.xml @@ -75,7 +75,7 @@ org.springframework.cloud - spring-cloud-sleuth-core + spring-cloud-starter-sleuth org.springframework.boot diff --git a/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-websocket/pom.xml b/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-websocket/pom.xml index 1fc5aa6f2..add5826b1 100644 --- a/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-websocket/pom.xml +++ b/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-websocket/pom.xml @@ -77,7 +77,7 @@ org.springframework.cloud - spring-cloud-sleuth-core + spring-cloud-starter-sleuth org.springframework.cloud diff --git a/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-websocket/src/main/resources/application.yml b/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-websocket/src/main/resources/application.yml index cc2a2395c..0481026b8 100644 --- a/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-websocket/src/main/resources/application.yml +++ b/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-websocket/src/main/resources/application.yml @@ -4,6 +4,10 @@ server: spring: application: name: testSleuthWebsocket + sleuth: + tracer: + mode: noop + sample: zipkin: diff --git a/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-zipkin/pom.xml b/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-zipkin/pom.xml index f6693989b..72b0a937f 100644 --- a/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-zipkin/pom.xml +++ b/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-zipkin/pom.xml @@ -73,7 +73,7 @@ org.springframework.cloud - spring-cloud-sleuth-brave + spring-cloud-starter-sleuth org.springframework.cloud diff --git a/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-zipkin/src/main/java/sample/SampleBackground.java b/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-zipkin/src/main/java/sample/SampleBackground.java index 88814f7ac..b1b50b9bd 100644 --- a/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-zipkin/src/main/java/sample/SampleBackground.java +++ b/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-zipkin/src/main/java/sample/SampleBackground.java @@ -19,7 +19,7 @@ package sample; import java.util.Random; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.cloud.sleuth.api.Tracer; +import org.springframework.cloud.sleuth.Tracer; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; diff --git a/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-zipkin/src/main/java/sample/SampleController.java b/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-zipkin/src/main/java/sample/SampleController.java index 1908ea34c..da57c5d9c 100644 --- a/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-zipkin/src/main/java/sample/SampleController.java +++ b/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-zipkin/src/main/java/sample/SampleController.java @@ -24,8 +24,8 @@ import org.apache.commons.logging.LogFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.web.servlet.context.ServletWebServerInitializedEvent; -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.context.ApplicationListener; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; diff --git a/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample/pom.xml b/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample/pom.xml index aab697e5b..3f00d549a 100644 --- a/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample/pom.xml +++ b/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample/pom.xml @@ -66,11 +66,7 @@ org.springframework.cloud - spring-cloud-sleuth-core - - - org.springframework.cloud - spring-cloud-sleuth-brave + spring-cloud-starter-sleuth org.springframework.boot diff --git a/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample/src/main/java/sample/SampleBackground.java b/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample/src/main/java/sample/SampleBackground.java index a94ff89d5..94e408cbe 100644 --- a/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample/src/main/java/sample/SampleBackground.java +++ b/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample/src/main/java/sample/SampleBackground.java @@ -22,7 +22,7 @@ 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.Tracer; +import org.springframework.cloud.sleuth.Tracer; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; diff --git a/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample/src/main/java/sample/SampleController.java b/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample/src/main/java/sample/SampleController.java index 4a8375c52..95656d8db 100644 --- a/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample/src/main/java/sample/SampleController.java +++ b/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample/src/main/java/sample/SampleController.java @@ -24,8 +24,8 @@ import org.apache.commons.logging.LogFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.web.servlet.context.ServletWebServerInitializedEvent; -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.context.ApplicationListener; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; diff --git a/spring-cloud-sleuth-zipkin/pom.xml b/spring-cloud-sleuth-zipkin/pom.xml index 84b10c0d0..485f7f2db 100644 --- a/spring-cloud-sleuth-zipkin/pom.xml +++ b/spring-cloud-sleuth-zipkin/pom.xml @@ -35,7 +35,7 @@ org.springframework.cloud - spring-cloud-sleuth-core + spring-cloud-sleuth-instrumentation org.springframework.cloud diff --git a/spring-cloud-sleuth-zipkin/src/main/java/org/springframework/cloud/sleuth/zipkin2/CachingZipkinUrlExtractor.java b/spring-cloud-sleuth-zipkin/src/main/java/org/springframework/cloud/sleuth/zipkin2/CachingZipkinUrlExtractor.java new file mode 100644 index 000000000..14c027d4a --- /dev/null +++ b/spring-cloud-sleuth-zipkin/src/main/java/org/springframework/cloud/sleuth/zipkin2/CachingZipkinUrlExtractor.java @@ -0,0 +1,84 @@ +/* + * 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.zipkin2; + +import java.net.URI; +import java.util.concurrent.atomic.AtomicInteger; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +/** + * {@link ZipkinUrlExtractor} with caching mechanism. + * + * @author Marcin Grzejszczak + * @since 3.0.0 + */ +public class CachingZipkinUrlExtractor implements ZipkinUrlExtractor { + + private static final Log log = LogFactory.getLog(CachingZipkinUrlExtractor.class); + + final AtomicInteger zipkinPort = new AtomicInteger(); + + private final ZipkinLoadBalancer zipkinLoadBalancer; + + public CachingZipkinUrlExtractor(ZipkinLoadBalancer zipkinLoadBalancer) { + this.zipkinLoadBalancer = zipkinLoadBalancer; + } + + @Override + public URI zipkinUrl(ZipkinProperties zipkinProperties) { + int cachedZipkinPort = zipkinPort(zipkinProperties); + if (cachedZipkinPort == -1) { + if (log.isDebugEnabled()) { + log.debug("The port in Zipkin's URL [" + zipkinProperties.getBaseUrl() + + "] wasn't provided - that means that load balancing might take place"); + } + return this.zipkinLoadBalancer.instance(); + } + if (log.isDebugEnabled()) { + log.debug("The port in Zipkin's URL [" + zipkinProperties.getBaseUrl() + + "] is provided - that means that load balancing will not take place"); + } + return noOpZipkinLoadBalancer(zipkinProperties).instance(); + } + + StaticInstanceZipkinLoadBalancer noOpZipkinLoadBalancer(ZipkinProperties zipkinProperties) { + return new StaticInstanceZipkinLoadBalancer(zipkinProperties); + } + + private int zipkinPort(ZipkinProperties zipkinProperties) { + int cachedZipkinPort = this.zipkinPort.get(); + if (cachedZipkinPort != 0) { + return cachedZipkinPort; + } + return calculatePort(zipkinProperties); + } + + int calculatePort(ZipkinProperties zipkinProperties) { + String baseUrl = zipkinProperties.getBaseUrl(); + URI uri = createUri(baseUrl); + int zipkinPort = uri.getPort(); + this.zipkinPort.set(zipkinPort); + return zipkinPort; + } + + URI createUri(String baseUrl) { + return URI.create(baseUrl); + } + +} diff --git a/spring-cloud-sleuth-zipkin/src/main/java/org/springframework/cloud/sleuth/zipkin2/DefaultEndpointLocator.java b/spring-cloud-sleuth-zipkin/src/main/java/org/springframework/cloud/sleuth/zipkin2/DefaultEndpointLocator.java index 61564ea78..9ed33285c 100644 --- a/spring-cloud-sleuth-zipkin/src/main/java/org/springframework/cloud/sleuth/zipkin2/DefaultEndpointLocator.java +++ b/spring-cloud-sleuth-zipkin/src/main/java/org/springframework/cloud/sleuth/zipkin2/DefaultEndpointLocator.java @@ -40,8 +40,9 @@ import org.springframework.util.StringUtils; * You can override the name using {@link ZipkinProperties.Service#setName(String)} * * @author Dave Syer + * @since 3.0.0 */ -class DefaultEndpointLocator implements EndpointLocator, ApplicationListener { +public class DefaultEndpointLocator implements EndpointLocator, ApplicationListener { private static final Log log = LogFactory.getLog(DefaultEndpointLocator.class); @@ -59,7 +60,7 @@ class DefaultEndpointLocator implements EndpointLocator, ApplicationListener encoder) { + public RestTemplateSender(RestTemplate restTemplate, String baseUrl, BytesEncoder encoder) { this.restTemplate = restTemplate; this.encoding = encoder.encoding(); if (encoder.equals(JSON_V2)) { diff --git a/spring-cloud-sleuth-zipkin/src/main/java/org/springframework/cloud/sleuth/zipkin2/StaticInstanceZipkinLoadBalancer.java b/spring-cloud-sleuth-zipkin/src/main/java/org/springframework/cloud/sleuth/zipkin2/StaticInstanceZipkinLoadBalancer.java new file mode 100644 index 000000000..e7d271065 --- /dev/null +++ b/spring-cloud-sleuth-zipkin/src/main/java/org/springframework/cloud/sleuth/zipkin2/StaticInstanceZipkinLoadBalancer.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.zipkin2; + +import java.net.URI; + +/** + * {@link ZipkinLoadBalancer} that provides a fixed URI for Zipkin. + * + * @author Marcin Grzejszczak + * @since 3.0.0 + */ +public class StaticInstanceZipkinLoadBalancer implements ZipkinLoadBalancer { + + private final ZipkinProperties zipkinProperties; + + public StaticInstanceZipkinLoadBalancer(ZipkinProperties zipkinProperties) { + this.zipkinProperties = zipkinProperties; + } + + @Override + public URI instance() { + return URI.create(this.zipkinProperties.getBaseUrl()); + } + +} diff --git a/spring-cloud-sleuth-zipkin/src/main/java/org/springframework/cloud/sleuth/zipkin2/ZipkinRestTemplateWrapper.java b/spring-cloud-sleuth-zipkin/src/main/java/org/springframework/cloud/sleuth/zipkin2/ZipkinRestTemplateWrapper.java new file mode 100644 index 000000000..e1b5e2f33 --- /dev/null +++ b/spring-cloud-sleuth-zipkin/src/main/java/org/springframework/cloud/sleuth/zipkin2/ZipkinRestTemplateWrapper.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.zipkin2; + +import java.net.URI; +import java.net.URISyntaxException; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import org.springframework.http.HttpMethod; +import org.springframework.http.client.ClientHttpRequestFactory; +import org.springframework.http.client.SimpleClientHttpRequestFactory; +import org.springframework.web.client.RequestCallback; +import org.springframework.web.client.ResponseExtractor; +import org.springframework.web.client.RestClientException; +import org.springframework.web.client.RestTemplate; + +/** + * Resolves at runtime where the Zipkin server is. If there's no discovery client then + * {@link URI} from the properties is taken. Otherwise service discovery is pinged for + * current Zipkin address. + * + * @author Marcin Grzejszczak + * @since 3.0.0 + */ +public class ZipkinRestTemplateWrapper extends RestTemplate { + + private static final Log log = LogFactory.getLog(ZipkinRestTemplateWrapper.class); + + private static final int DEFAULT_TIMEOUT = 500; + + private final ZipkinProperties zipkinProperties; + + private final ZipkinUrlExtractor extractor; + + public ZipkinRestTemplateWrapper(ZipkinProperties zipkinProperties, ZipkinUrlExtractor extractor) { + this.zipkinProperties = zipkinProperties; + this.extractor = extractor; + setRequestFactory(clientHttpRequestFactory()); + } + + private ClientHttpRequestFactory clientHttpRequestFactory() { + SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory(); + factory.setReadTimeout(DEFAULT_TIMEOUT); + factory.setConnectTimeout(DEFAULT_TIMEOUT); + return factory; + } + + @Override + protected T doExecute(URI originalUrl, HttpMethod method, RequestCallback requestCallback, + ResponseExtractor responseExtractor) throws RestClientException { + URI uri = this.extractor.zipkinUrl(this.zipkinProperties); + URI newUri = resolvedZipkinUri(originalUrl, uri); + return super.doExecute(newUri, method, requestCallback, responseExtractor); + } + + private URI resolvedZipkinUri(URI originalUrl, URI resolvedZipkinUri) { + try { + return new URI(resolvedZipkinUri.getScheme(), resolvedZipkinUri.getUserInfo(), resolvedZipkinUri.getHost(), + resolvedZipkinUri.getPort(), originalUrl.getPath(), originalUrl.getQuery(), + originalUrl.getFragment()); + } + catch (URISyntaxException e) { + if (log.isDebugEnabled()) { + log.debug("Failed to create the new URI from original [" + originalUrl + "] and new one [" + + resolvedZipkinUri + "]"); + } + return originalUrl; + } + } + +} diff --git a/spring-cloud-sleuth-zipkin/src/main/java/org/springframework/cloud/sleuth/zipkin2/ZipkinUrlExtractor.java b/spring-cloud-sleuth-zipkin/src/main/java/org/springframework/cloud/sleuth/zipkin2/ZipkinUrlExtractor.java new file mode 100644 index 000000000..373ce4734 --- /dev/null +++ b/spring-cloud-sleuth-zipkin/src/main/java/org/springframework/cloud/sleuth/zipkin2/ZipkinUrlExtractor.java @@ -0,0 +1,32 @@ +/* + * 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.zipkin2; + +import java.net.URI; + +/** + * Provides a way to retrieve Zipkin URI. If there's no discovery client then this value + * will be taken from the properties. Otherwise host will be assumed to be a service id. + * + * @author Marcin Grzejszczak + * @since 3.0.0 + */ +public interface ZipkinUrlExtractor { + + URI zipkinUrl(ZipkinProperties zipkinProperties); + +} diff --git a/spring-cloud-sleuth-zipkin/src/main/java/org/springframework/cloud/sleuth/zipkin2/sender/ZipkinRestTemplateSenderConfiguration.java b/spring-cloud-sleuth-zipkin/src/main/java/org/springframework/cloud/sleuth/zipkin2/sender/ZipkinRestTemplateSenderConfiguration.java deleted file mode 100644 index 7db9800a3..000000000 --- a/spring-cloud-sleuth-zipkin/src/main/java/org/springframework/cloud/sleuth/zipkin2/sender/ZipkinRestTemplateSenderConfiguration.java +++ /dev/null @@ -1,254 +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.zipkin2.sender; - -import java.net.URI; -import java.net.URISyntaxException; -import java.util.concurrent.atomic.AtomicInteger; - -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.ZipkinAutoConfiguration; -import org.springframework.cloud.sleuth.zipkin2.ZipkinLoadBalancer; -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.Conditional; -import org.springframework.context.annotation.Configuration; -import org.springframework.http.HttpMethod; -import org.springframework.http.client.ClientHttpRequestFactory; -import org.springframework.http.client.SimpleClientHttpRequestFactory; -import org.springframework.web.client.RequestCallback; -import org.springframework.web.client.ResponseExtractor; -import org.springframework.web.client.RestClientException; -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); - - @Autowired - ZipkinUrlExtractor extractor; - - @Bean(ZipkinAutoConfiguration.SENDER_BEAN_NAME) - public Sender restTemplateSender(ZipkinProperties zipkin, - ZipkinRestTemplateCustomizer zipkinRestTemplateCustomizer) { - RestTemplate restTemplate = new ZipkinRestTemplateWrapper(zipkin, this.extractor); - restTemplate = zipkinRestTemplateCustomizer.customizeTemplate(restTemplate); - return new RestTemplateSender(restTemplate, zipkin.getBaseUrl(), zipkin.getEncoder()); - } - - @Bean - ZipkinUrlExtractor zipkinUrlExtractor(final ZipkinLoadBalancer zipkinLoadBalancer) { - return new CachingZipkinUrlExtractor(zipkinLoadBalancer); - } - - static class CachingZipkinUrlExtractor implements ZipkinUrlExtractor { - - final AtomicInteger zipkinPort = new AtomicInteger(); - - private final ZipkinLoadBalancer zipkinLoadBalancer; - - CachingZipkinUrlExtractor(ZipkinLoadBalancer zipkinLoadBalancer) { - this.zipkinLoadBalancer = zipkinLoadBalancer; - } - - @Override - public URI zipkinUrl(ZipkinProperties zipkinProperties) { - int cachedZipkinPort = zipkinPort(zipkinProperties); - if (cachedZipkinPort == -1) { - if (log.isDebugEnabled()) { - log.debug("The port in Zipkin's URL [" + zipkinProperties.getBaseUrl() - + "] wasn't provided - that means that load balancing might take place"); - } - return this.zipkinLoadBalancer.instance(); - } - if (log.isDebugEnabled()) { - log.debug("The port in Zipkin's URL [" + zipkinProperties.getBaseUrl() - + "] is provided - that means that load balancing will not take place"); - } - return noOpZipkinLoadBalancer(zipkinProperties).instance(); - } - - NoOpZipkinLoadBalancer noOpZipkinLoadBalancer(ZipkinProperties zipkinProperties) { - return new NoOpZipkinLoadBalancer(zipkinProperties); - } - - private int zipkinPort(ZipkinProperties zipkinProperties) { - int cachedZipkinPort = this.zipkinPort.get(); - if (cachedZipkinPort != 0) { - return cachedZipkinPort; - } - return calculatePort(zipkinProperties); - } - - int calculatePort(ZipkinProperties zipkinProperties) { - String baseUrl = zipkinProperties.getBaseUrl(); - URI uri = createUri(baseUrl); - int zipkinPort = uri.getPort(); - this.zipkinPort.set(zipkinPort); - return zipkinPort; - } - - URI createUri(String baseUrl) { - return URI.create(baseUrl); - } - - } - - @Configuration(proxyBeanMethods = false) - @ConditionalOnMissingClass("org.springframework.cloud.client.loadbalancer.LoadBalancerClient") - static class DefaultZipkinUrlExtractorConfiguration { - - @Autowired(required = false) - LoadBalancerClient client; - - @Bean - @ConditionalOnMissingBean - ZipkinLoadBalancer noOpLoadBalancer(final ZipkinProperties zipkinProperties) { - return new NoOpZipkinLoadBalancer(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 noOpLoadBalancer(final ZipkinProperties zipkinProperties) { - return new NoOpZipkinLoadBalancer(zipkinProperties); - } - - } - - } - -} - -/** - * Resolves at runtime where the Zipkin server is. If there's no discovery client then - * {@link URI} from the properties is taken. Otherwise service discovery is pinged for - * current Zipkin address. - */ -class ZipkinRestTemplateWrapper extends RestTemplate { - - private static final Log log = LogFactory.getLog(ZipkinRestTemplateWrapper.class); - - private static final int DEFAULT_TIMEOUT = 500; - - private final ZipkinProperties zipkinProperties; - - private final ZipkinUrlExtractor extractor; - - ZipkinRestTemplateWrapper(ZipkinProperties zipkinProperties, ZipkinUrlExtractor extractor) { - this.zipkinProperties = zipkinProperties; - this.extractor = extractor; - setRequestFactory(clientHttpRequestFactory()); - } - - private ClientHttpRequestFactory clientHttpRequestFactory() { - SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory(); - factory.setReadTimeout(DEFAULT_TIMEOUT); - factory.setConnectTimeout(DEFAULT_TIMEOUT); - return factory; - } - - @Override - protected T doExecute(URI originalUrl, HttpMethod method, RequestCallback requestCallback, - ResponseExtractor responseExtractor) throws RestClientException { - URI uri = this.extractor.zipkinUrl(this.zipkinProperties); - URI newUri = resolvedZipkinUri(originalUrl, uri); - return super.doExecute(newUri, method, requestCallback, responseExtractor); - } - - private URI resolvedZipkinUri(URI originalUrl, URI resolvedZipkinUri) { - try { - return new URI(resolvedZipkinUri.getScheme(), resolvedZipkinUri.getUserInfo(), resolvedZipkinUri.getHost(), - resolvedZipkinUri.getPort(), originalUrl.getPath(), originalUrl.getQuery(), - originalUrl.getFragment()); - } - catch (URISyntaxException e) { - if (log.isDebugEnabled()) { - log.debug("Failed to create the new URI from original [" + originalUrl + "] and new one [" - + resolvedZipkinUri + "]"); - } - return originalUrl; - } - } - -} - -/** - * Internal interface to provide a way to retrieve Zipkin URI. If there's no discovery - * client then this value will be taken from the properties. Otherwise host will be - * assumed to be a service id. - */ -interface ZipkinUrlExtractor { - - URI zipkinUrl(ZipkinProperties zipkinProperties); - -} - -class NoOpZipkinLoadBalancer implements ZipkinLoadBalancer { - - private final ZipkinProperties zipkinProperties; - - NoOpZipkinLoadBalancer(ZipkinProperties zipkinProperties) { - this.zipkinProperties = zipkinProperties; - } - - @Override - public URI instance() { - return URI.create(this.zipkinProperties.getBaseUrl()); - } - -} diff --git a/spring-cloud-sleuth-zipkin/src/main/resources/META-INF/spring.factories b/spring-cloud-sleuth-zipkin/src/main/resources/META-INF/spring.factories deleted file mode 100644 index 59010d21f..000000000 --- a/spring-cloud-sleuth-zipkin/src/main/resources/META-INF/spring.factories +++ /dev/null @@ -1,5 +0,0 @@ -# Auto Configuration -org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ -org.springframework.cloud.sleuth.zipkin2.ZipkinAutoConfiguration,\ -org.springframework.cloud.sleuth.zipkin2.ZipkinBraveAutoConfiguration,\ -org.springframework.cloud.sleuth.zipkin2.ZipkinOtelAutoConfiguration diff --git a/spring-cloud-sleuth-zipkin/src/test/java/org/springframework/cloud/sleuth/zipkin2/sender/RestTemplateSenderTest.java b/spring-cloud-sleuth-zipkin/src/test/java/org/springframework/cloud/sleuth/zipkin2/RestTemplateSenderTest.java similarity index 98% rename from spring-cloud-sleuth-zipkin/src/test/java/org/springframework/cloud/sleuth/zipkin2/sender/RestTemplateSenderTest.java rename to spring-cloud-sleuth-zipkin/src/test/java/org/springframework/cloud/sleuth/zipkin2/RestTemplateSenderTest.java index f27265e6d..4cf08a4e1 100644 --- a/spring-cloud-sleuth-zipkin/src/test/java/org/springframework/cloud/sleuth/zipkin2/sender/RestTemplateSenderTest.java +++ b/spring-cloud-sleuth-zipkin/src/test/java/org/springframework/cloud/sleuth/zipkin2/RestTemplateSenderTest.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.sleuth.zipkin2.sender; +package org.springframework.cloud.sleuth.zipkin2; import java.io.IOException; import java.util.concurrent.TimeUnit; diff --git a/spring-cloud-sleuth-zipkin/src/test/java/org/springframework/cloud/sleuth/zipkin2/ZipkinAutoConfigurationTests.java b/spring-cloud-sleuth-zipkin/src/test/java/org/springframework/cloud/sleuth/zipkin2/ZipkinAutoConfigurationTests.java deleted file mode 100644 index 4c936e3c6..000000000 --- a/spring-cloud-sleuth-zipkin/src/test/java/org/springframework/cloud/sleuth/zipkin2/ZipkinAutoConfigurationTests.java +++ /dev/null @@ -1,570 +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.zipkin2; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; - -import brave.Span; -import brave.Tracing; -import brave.handler.MutableSpan; -import brave.handler.SpanHandler; -import brave.propagation.TraceContext; -import brave.sampler.Sampler; -import io.micrometer.core.instrument.MeterRegistry; -import io.micrometer.core.instrument.simple.SimpleMeterRegistry; -import okhttp3.mockwebserver.MockWebServer; -import okhttp3.mockwebserver.RecordedRequest; -import org.assertj.core.api.BDDAssertions; -import org.awaitility.Awaitility; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import zipkin2.Call; -import zipkin2.CheckResult; -import zipkin2.codec.Encoding; -import zipkin2.reporter.AsyncReporter; -import zipkin2.reporter.InMemoryReporterMetrics; -import zipkin2.reporter.Reporter; -import zipkin2.reporter.ReporterMetrics; -import zipkin2.reporter.Sender; -import zipkin2.reporter.activemq.ActiveMQSender; -import zipkin2.reporter.amqp.RabbitMQSender; -import zipkin2.reporter.brave.ZipkinSpanHandler; -import zipkin2.reporter.kafka.KafkaSender; -import zipkin2.reporter.metrics.micrometer.MicrometerReporterMetrics; - -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.boot.autoconfigure.AutoConfigurations; -import org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration; -import org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration; -import org.springframework.boot.autoconfigure.jms.activemq.ActiveMQAutoConfiguration; -import org.springframework.boot.autoconfigure.kafka.KafkaAutoConfiguration; -import org.springframework.boot.test.context.FilteredClassLoader; -import org.springframework.boot.test.context.SpringBootTest; -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.context.annotation.AnnotationConfigApplicationContext; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.mock.env.MockEnvironment; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.BDDAssertions.then; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; -import static org.springframework.cloud.sleuth.zipkin2.ZipkinBraveAutoConfiguration.SPAN_HANDLER_COMPARATOR; - -/** - * Not using {@linkplain SpringBootTest} as we need to change properties per test. - * - * @author Adrian Cole - */ -public class ZipkinAutoConfigurationTests { - - private final ApplicationContextRunner contextRunner = new ApplicationContextRunner().withConfiguration( - AutoConfigurations.of(ZipkinAutoConfiguration.class, ZipkinBraveAutoConfiguration.class)); - - public MockWebServer server = new MockWebServer(); - - MockEnvironment environment = new MockEnvironment(); - - AnnotationConfigApplicationContext context; - - @BeforeEach - void setup() throws IOException { - server.start(); - } - - @AfterEach - void clean() throws IOException { - server.close(); - } - - @AfterEach - public void close() { - if (this.context != null) { - this.context.close(); - } - } - - @Test - void span_handler_comparator() { - SpanHandler handler1 = mock(SpanHandler.class); - SpanHandler handler2 = mock(SpanHandler.class); - ZipkinSpanHandler zipkin1 = mock(ZipkinSpanHandler.class); - ZipkinSpanHandler zipkin2 = mock(ZipkinSpanHandler.class); - - ArrayList spanHandlers = new ArrayList<>(); - spanHandlers.add(handler1); - spanHandlers.add(zipkin1); - spanHandlers.add(handler2); - spanHandlers.add(zipkin2); - - spanHandlers.sort(SPAN_HANDLER_COMPARATOR); - - assertThat(spanHandlers).containsExactly(handler1, handler2, zipkin1, zipkin2); - } - - @Test - void should_apply_micrometer_reporter_metrics_when_meter_registry_bean_present() { - this.contextRunner.withUserConfiguration(WithMeterRegistry.class).run((context) -> { - ReporterMetrics bean = context.getBean(ReporterMetrics.class); - - BDDAssertions.then(bean).isInstanceOf(MicrometerReporterMetrics.class); - }); - } - - @Test - void should_apply_in_memory_metrics_when_meter_registry_bean_missing() { - this.contextRunner.run((context) -> { - ReporterMetrics bean = context.getBean(ReporterMetrics.class); - - BDDAssertions.then(bean).isInstanceOf(InMemoryReporterMetrics.class); - }); - } - - @Test - void should_apply_in_memory_metrics_when_meter_registry_class_missing() { - this.contextRunner.withClassLoader(new FilteredClassLoader(MeterRegistry.class)).run((context) -> { - ReporterMetrics bean = context.getBean(ReporterMetrics.class); - - BDDAssertions.then(bean).isInstanceOf(InMemoryReporterMetrics.class); - }); - } - - @Test - void defaultsToV2Endpoint() throws Exception { - this.context = new AnnotationConfigApplicationContext(); - environment().setProperty("spring.zipkin.base-url", this.server.url("/").toString()); - this.context.register(ZipkinAutoConfiguration.class, ZipkinBraveAutoConfiguration.class, - PropertyPlaceholderAutoConfiguration.class, TraceAutoConfiguration.class, - TraceBraveAutoConfiguration.class, Config.class); - this.context.refresh(); - Span span = this.context.getBean(Tracing.class).tracer().nextSpan().name("foo").tag("foo", "bar").start(); - - span.finish(); - - this.context.getBean(ZipkinAutoConfiguration.REPORTER_BEAN_NAME, AsyncReporter.class).flush(); - Awaitility.await().atMost(250, TimeUnit.MILLISECONDS) - .untilAsserted(() -> then(this.server.getRequestCount()).isGreaterThan(1)); - - Awaitility.await().atMost(5, TimeUnit.SECONDS).untilAsserted(() -> { - RecordedRequest request = this.server.takeRequest(1, TimeUnit.SECONDS); - then(request.getPath()).isEqualTo("/api/v2/spans"); - then(request.getBody().readUtf8()).contains("localEndpoint"); - }); - } - - private MockEnvironment environment() { - this.context.setEnvironment(this.environment); - return this.environment; - } - - @Test - public void encoderDirectsEndpoint() throws Exception { - this.context = new AnnotationConfigApplicationContext(); - environment().setProperty("spring.zipkin.base-url", this.server.url("/").toString()); - environment().setProperty("spring.zipkin.encoder", "JSON_V1"); - this.context.register(ZipkinAutoConfiguration.class, ZipkinBraveAutoConfiguration.class, - PropertyPlaceholderAutoConfiguration.class, TraceAutoConfiguration.class, - TraceBraveAutoConfiguration.class, Config.class); - this.context.refresh(); - Span span = this.context.getBean(Tracing.class).tracer().nextSpan().name("foo").tag("foo", "bar").start(); - - span.finish(); - - Awaitility.await().atMost(250, TimeUnit.MILLISECONDS) - .untilAsserted(() -> then(this.server.getRequestCount()).isGreaterThan(0)); - - Awaitility.await().atMost(5, TimeUnit.SECONDS).untilAsserted(() -> { - RecordedRequest request = this.server.takeRequest(1, TimeUnit.SECONDS); - then(request.getPath()).isEqualTo("/api/v1/spans"); - then(request.getBody().readUtf8()).contains("binaryAnnotations"); - }); - } - - @Test - public void overrideRabbitMQQueue() throws Exception { - this.context = new AnnotationConfigApplicationContext(); - environment().setProperty("spring.zipkin.rabbitmq.queue", "zipkin2"); - environment().setProperty("spring.zipkin.sender.type", "rabbit"); - this.context.register(PropertyPlaceholderAutoConfiguration.class, RabbitAutoConfiguration.class, - ZipkinAutoConfiguration.class, TraceAutoConfiguration.class); - this.context.refresh(); - - then(this.context.getBean(Sender.class)).isInstanceOf(RabbitMQSender.class); - - this.context.close(); - } - - @Test - public void overrideKafkaTopic() throws Exception { - this.context = new AnnotationConfigApplicationContext(); - environment().setProperty("spring.zipkin.kafka.topic", "zipkin2"); - environment().setProperty("spring.zipkin.sender.type", "kafka"); - this.context.register(PropertyPlaceholderAutoConfiguration.class, KafkaAutoConfiguration.class, - ZipkinAutoConfiguration.class, TraceAutoConfiguration.class); - this.context.refresh(); - - then(this.context.getBean(Sender.class)).isInstanceOf(KafkaSender.class); - - this.context.close(); - } - - @Test - public void overrideActiveMqQueue() throws Exception { - this.context = new AnnotationConfigApplicationContext(); - environment().setProperty("spring.jms.cache.enabled", "false"); - environment().setProperty("spring.zipkin.activemq.queue", "zipkin2"); - environment().setProperty("spring.zipkin.activemq.message-max-bytes", "50"); - environment().setProperty("spring.zipkin.sender.type", "activemq"); - this.context.register(PropertyPlaceholderAutoConfiguration.class, ActiveMQAutoConfiguration.class, - ZipkinAutoConfiguration.class, TraceAutoConfiguration.class); - this.context.refresh(); - - then(this.context.getBean(Sender.class)).isInstanceOf(ActiveMQSender.class); - - this.context.close(); - } - - @Test - public void canOverrideBySender() throws Exception { - this.context = new AnnotationConfigApplicationContext(); - environment().setProperty("spring.zipkin.sender.type", "web"); - this.context.register(PropertyPlaceholderAutoConfiguration.class, RabbitAutoConfiguration.class, - KafkaAutoConfiguration.class, ZipkinAutoConfiguration.class, TraceAutoConfiguration.class); - this.context.refresh(); - - then(this.context.getBean(Sender.class).getClass().getName()).contains("RestTemplateSender"); - - this.context.close(); - } - - @Test - public void canOverrideBySenderAndIsCaseInsensitive() throws Exception { - this.context = new AnnotationConfigApplicationContext(); - environment().setProperty("spring.zipkin.sender.type", "WEB"); - this.context.register(PropertyPlaceholderAutoConfiguration.class, RabbitAutoConfiguration.class, - KafkaAutoConfiguration.class, ZipkinAutoConfiguration.class, TraceAutoConfiguration.class); - this.context.refresh(); - - then(this.context.getBean(Sender.class).getClass().getName()).contains("RestTemplateSender"); - - this.context.close(); - } - - @Test - public void rabbitWinsWhenKafkaPresent() throws Exception { - this.context = new AnnotationConfigApplicationContext(); - environment().setProperty("spring.zipkin.sender.type", "rabbit"); - this.context.register(PropertyPlaceholderAutoConfiguration.class, RabbitAutoConfiguration.class, - KafkaAutoConfiguration.class, ZipkinAutoConfiguration.class, TraceAutoConfiguration.class); - this.context.refresh(); - - then(this.context.getBean(Sender.class)).isInstanceOf(RabbitMQSender.class); - - this.context.close(); - } - - @Test - public void supportsMultipleReporters() throws Exception { - this.context = new AnnotationConfigApplicationContext(); - environment().setProperty("spring.zipkin.base-url", this.server.url("/").toString()); - this.context.register(ZipkinAutoConfiguration.class, ZipkinBraveAutoConfiguration.class, - PropertyPlaceholderAutoConfiguration.class, TraceAutoConfiguration.class, - TraceBraveAutoConfiguration.class, Config.class, MultipleReportersConfig.class); - this.context.refresh(); - - then(this.context.getBeansOfType(Sender.class)).hasSize(2); - then(this.context.getBeansOfType(Sender.class)).containsKeys(ZipkinAutoConfiguration.SENDER_BEAN_NAME, - "otherSender"); - - then(this.context.getBeansOfType(Reporter.class)).hasSize(2); - then(this.context.getBeansOfType(Reporter.class)).containsKeys(ZipkinAutoConfiguration.REPORTER_BEAN_NAME, - "otherReporter"); - - Span span = this.context.getBean(Tracing.class).tracer().nextSpan().name("foo").tag("foo", "bar").start(); - - span.finish(); - - this.context.getBean(ZipkinAutoConfiguration.REPORTER_BEAN_NAME, AsyncReporter.class).flush(); - Awaitility.await().atMost(250, TimeUnit.MILLISECONDS) - .untilAsserted(() -> then(this.server.getRequestCount()).isGreaterThan(1)); - - Awaitility.await().atMost(5, TimeUnit.SECONDS).untilAsserted(() -> { - RecordedRequest request = this.server.takeRequest(1, TimeUnit.SECONDS); - then(request.getPath()).isEqualTo("/api/v2/spans"); - then(request.getBody().readUtf8()).contains("localEndpoint"); - }); - - MultipleReportersConfig.OtherSender sender = this.context.getBean(MultipleReportersConfig.OtherSender.class); - Awaitility.await().atMost(250, TimeUnit.MILLISECONDS).untilAsserted(() -> then(sender.isSpanSent()).isTrue()); - } - - @Test - public void shouldOverrideDefaultBeans() { - this.context = new AnnotationConfigApplicationContext(); - this.context.register(ZipkinAutoConfiguration.class, ZipkinBraveAutoConfiguration.class, - PropertyPlaceholderAutoConfiguration.class, TraceAutoConfiguration.class, - TraceBraveAutoConfiguration.class, Config.class, MyConfig.class); - this.context.refresh(); - - then(this.context.getBeansOfType(Sender.class)).hasSize(1); - then(this.context.getBeansOfType(Sender.class)).containsKeys(ZipkinAutoConfiguration.SENDER_BEAN_NAME); - - then(this.context.getBeansOfType(Reporter.class)).hasSize(1); - then(this.context.getBeansOfType(Reporter.class)).containsKeys(ZipkinAutoConfiguration.REPORTER_BEAN_NAME); - - Span span = this.context.getBean(Tracing.class).tracer().nextSpan().name("foo").tag("foo", "bar").start(); - - span.finish(); - - Awaitility.await().atMost(250, TimeUnit.MILLISECONDS) - .untilAsserted(() -> then(this.server.getRequestCount()).isEqualTo(0)); - - this.context.getBean(ZipkinAutoConfiguration.REPORTER_BEAN_NAME, AsyncReporter.class).flush(); - MyConfig.MySender sender = this.context.getBean(MyConfig.MySender.class); - Awaitility.await().atMost(250, TimeUnit.MILLISECONDS).untilAsserted(() -> then(sender.isSpanSent()).isTrue()); - } - - @Test - public void checkResult_onTime() { - Sender sender = mock(Sender.class); - when(sender.check()).thenReturn(CheckResult.OK); - - assertThat(ZipkinAutoConfiguration.checkResult(sender, 200).ok()).isTrue(); - } - - @Test - public void checkResult_onTime_notOk() { - Sender sender = mock(Sender.class); - RuntimeException exception = new RuntimeException("dead"); - when(sender.check()).thenReturn(CheckResult.failed(exception)); - - assertThat(ZipkinAutoConfiguration.checkResult(sender, 200).error()).isSameAs(exception); - } - - /** Bug in {@link Sender} as it shouldn't throw */ - @Test - public void checkResult_thrown() { - Sender sender = mock(Sender.class); - RuntimeException exception = new RuntimeException("dead"); - when(sender.check()).thenThrow(exception); - - assertThat(ZipkinAutoConfiguration.checkResult(sender, 200).error()).isSameAs(exception); - } - - @Test - public void checkResult_slow() { - assertThat(ZipkinAutoConfiguration.checkResult(new Sender() { - @Override - public CheckResult check() { - try { - Thread.sleep(500L); - } - catch (InterruptedException e) { - throw new AssertionError(e); - } - return CheckResult.OK; - } - - @Override - public Encoding encoding() { - return Encoding.JSON; - } - - @Override - public int messageMaxBytes() { - return 0; - } - - @Override - public int messageSizeInBytes(List list) { - return 0; - } - - @Override - public Call sendSpans(List list) { - return Call.create(null); - } - - @Override - public String toString() { - return "FakeSender{}"; - } - }, 200).error()).isInstanceOf(TimeoutException.class).hasMessage("FakeSender{} check() timed out after 200ms"); - } - - @Configuration(proxyBeanMethods = false) - protected static class Config { - - @Bean - Sampler sampler() { - return Sampler.ALWAYS_SAMPLE; - } - - } - - @Configuration(proxyBeanMethods = false) - protected static class HandlersConfig { - - @Bean - SpanHandler handlerOne() { - return new SpanHandler() { - @Override - public boolean end(TraceContext traceContext, MutableSpan span, Cause cause) { - span.name("foo"); - return true; // keep this span - } - }; - } - - @Bean - SpanHandler handlerTwo() { - return new SpanHandler() { - @Override - public boolean end(TraceContext traceContext, MutableSpan span, Cause cause) { - span.name(span.name() + " bar"); - return true; // keep this span - } - }; - } - - } - - @Configuration(proxyBeanMethods = false) - static class WithMeterRegistry { - - @Bean - MeterRegistry meterRegistry() { - return new SimpleMeterRegistry(); - } - - } - - @Configuration(proxyBeanMethods = false) - static class WithReporter { - - @Bean - Reporter spanReporter() { - return zipkin2.Span::toString; - } - - } - - @Configuration(proxyBeanMethods = false) - protected static class MultipleReportersConfig { - - @Bean - Reporter otherReporter(OtherSender otherSender) { - return AsyncReporter.create(otherSender); - } - - @Bean - OtherSender otherSender() { - return new OtherSender(); - } - - static class OtherSender extends Sender { - - private boolean spanSent = false; - - boolean isSpanSent() { - return this.spanSent; - } - - @Override - public Encoding encoding() { - return Encoding.JSON; - } - - @Override - public int messageMaxBytes() { - return Integer.MAX_VALUE; - } - - @Override - public int messageSizeInBytes(List encodedSpans) { - return encoding().listSizeInBytes(encodedSpans); - } - - @Override - public Call sendSpans(List encodedSpans) { - this.spanSent = true; - return Call.create(null); - } - - } - - } - - // tag::override_default_beans[] - - @Configuration(proxyBeanMethods = false) - protected static class MyConfig { - - @Bean(ZipkinAutoConfiguration.REPORTER_BEAN_NAME) - Reporter myReporter(@Qualifier(ZipkinAutoConfiguration.SENDER_BEAN_NAME) MySender mySender) { - return AsyncReporter.create(mySender); - } - - @Bean(ZipkinAutoConfiguration.SENDER_BEAN_NAME) - MySender mySender() { - return new MySender(); - } - - static class MySender extends Sender { - - private boolean spanSent = false; - - boolean isSpanSent() { - return this.spanSent; - } - - @Override - public Encoding encoding() { - return Encoding.JSON; - } - - @Override - public int messageMaxBytes() { - return Integer.MAX_VALUE; - } - - @Override - public int messageSizeInBytes(List encodedSpans) { - return encoding().listSizeInBytes(encodedSpans); - } - - @Override - public Call sendSpans(List encodedSpans) { - this.spanSent = true; - return Call.create(null); - } - - } - - } - - // end::override_default_beans[] - -} diff --git a/spring-cloud-sleuth-zipkin/src/test/java/org/springframework/cloud/sleuth/zipkin2/sender/ZipkinRestTemplateSenderConfigurationTest.java b/spring-cloud-sleuth-zipkin/src/test/java/org/springframework/cloud/sleuth/zipkin2/ZipkinRestTemplateSenderConfigurationTest.java similarity index 68% rename from spring-cloud-sleuth-zipkin/src/test/java/org/springframework/cloud/sleuth/zipkin2/sender/ZipkinRestTemplateSenderConfigurationTest.java rename to spring-cloud-sleuth-zipkin/src/test/java/org/springframework/cloud/sleuth/zipkin2/ZipkinRestTemplateSenderConfigurationTest.java index 20c8a6fc3..944372c95 100644 --- a/spring-cloud-sleuth-zipkin/src/test/java/org/springframework/cloud/sleuth/zipkin2/sender/ZipkinRestTemplateSenderConfigurationTest.java +++ b/spring-cloud-sleuth-zipkin/src/test/java/org/springframework/cloud/sleuth/zipkin2/ZipkinRestTemplateSenderConfigurationTest.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.sleuth.zipkin2.sender; +package org.springframework.cloud.sleuth.zipkin2; import java.net.URI; import java.util.concurrent.atomic.AtomicBoolean; @@ -22,14 +22,11 @@ import java.util.concurrent.atomic.AtomicBoolean; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.SpringApplication; 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.test.context.runner.ApplicationContextRunner; import org.springframework.cloud.client.loadbalancer.LoadBalancerClient; -import org.springframework.cloud.sleuth.zipkin2.ZipkinLoadBalancer; -import org.springframework.cloud.sleuth.zipkin2.ZipkinProperties; -import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -42,28 +39,29 @@ public class ZipkinRestTemplateSenderConfigurationTest { @Test public void disableZipkinDiscoveryClient() { - ConfigurableApplicationContext ctxt = new SpringApplication( - ZipkinRestTemplateSenderConfigurationTest.MyDiscoveryClientZipkinUrlExtractorConfiguration.class, - ZipkinProperties.class).run("--spring.zipkin.discovery-client-enabled=false"); - assertThat(ctxt.getBean(ZipkinLoadBalancer.class)).isInstanceOf(NoOpZipkinLoadBalancer.class); - ctxt.close(); + ApplicationContextRunner runner = new ApplicationContextRunner() + .withPropertyValues("spring.zipkin.discovery-client-enabled=false") + .withUserConfiguration(MyDiscoveryClientZipkinUrlExtractorConfiguration.class, ZipkinProperties.class); + + runner.run(context -> assertThat(context).hasSingleBean(StaticInstanceZipkinLoadBalancer.class)); + } @Test public void enableZipkinDiscoveryClient() { - ConfigurableApplicationContext ctxt = new SpringApplication( - ZipkinRestTemplateSenderConfigurationTest.MyDiscoveryClientZipkinUrlExtractorConfiguration.class, - ZipkinProperties.class).run("--spring.zipkin.discovery-client-enabled=true"); - assertThat(ctxt.getBean(ZipkinLoadBalancer.class)).isInstanceOf(LoadBalancerClientZipkinLoadBalancer.class); - ctxt.close(); + ApplicationContextRunner runner = new ApplicationContextRunner() + .withPropertyValues("spring.zipkin.discovery-client-enabled=true") + .withUserConfiguration(MyDiscoveryClientZipkinUrlExtractorConfiguration.class, ZipkinProperties.class); + + runner.run(context -> assertThat(context).hasSingleBean(LoadBalancerClientZipkinLoadBalancer.class)); } @Test public void shouldReturnCachedPortValueIfPresent() { final AtomicBoolean portCalculated = new AtomicBoolean(); ZipkinProperties zipkinProperties = new ZipkinProperties(); - ZipkinRestTemplateSenderConfiguration.CachingZipkinUrlExtractor extractor = new ZipkinRestTemplateSenderConfiguration.CachingZipkinUrlExtractor( - new NoOpZipkinLoadBalancer(zipkinProperties)) { + CachingZipkinUrlExtractor extractor = new CachingZipkinUrlExtractor( + new StaticInstanceZipkinLoadBalancer(zipkinProperties)) { @Override int calculatePort(ZipkinProperties zipkinProperties) { portCalculated.set(true); @@ -82,8 +80,7 @@ public class ZipkinRestTemplateSenderConfigurationTest { public void shouldDelegateToLoadBalancingWhenNoPortPresent() { ZipkinProperties zipkinProperties = new ZipkinProperties(); zipkinProperties.setBaseUrl("https://somehostnamewithnoport/endpoint"); - ZipkinRestTemplateSenderConfiguration.CachingZipkinUrlExtractor extractor = new ZipkinRestTemplateSenderConfiguration.CachingZipkinUrlExtractor( - () -> URI.create("https://example.com")); + CachingZipkinUrlExtractor extractor = new CachingZipkinUrlExtractor(() -> URI.create("https://example.com")); URI uri = extractor.zipkinUrl(zipkinProperties); @@ -93,8 +90,7 @@ public class ZipkinRestTemplateSenderConfigurationTest { @Test public void shouldDelegateToNonLoadBalancingWhenPortPresent() { ZipkinProperties zipkinProperties = new ZipkinProperties(); - ZipkinRestTemplateSenderConfiguration.CachingZipkinUrlExtractor extractor = new ZipkinRestTemplateSenderConfiguration.CachingZipkinUrlExtractor( - () -> URI.create("https://example.com")); + CachingZipkinUrlExtractor extractor = new CachingZipkinUrlExtractor(() -> URI.create("https://example.com")); URI uri = extractor.zipkinUrl(zipkinProperties); @@ -128,7 +124,7 @@ public class ZipkinRestTemplateSenderConfigurationTest { @Bean @ConditionalOnMissingBean ZipkinLoadBalancer noOpLoadBalancer(final ZipkinProperties zipkinProperties) { - return new NoOpZipkinLoadBalancer(zipkinProperties); + return new StaticInstanceZipkinLoadBalancer(zipkinProperties); } } diff --git a/spring-cloud-starter-sleuth/pom.xml b/spring-cloud-starter-sleuth/pom.xml index c62bb5fab..89b271695 100644 --- a/spring-cloud-starter-sleuth/pom.xml +++ b/spring-cloud-starter-sleuth/pom.xml @@ -40,6 +40,10 @@ org.springframework.boot spring-boot-starter-aop + + org.springframework.cloud + spring-cloud-sleuth-autoconfigure + org.springframework.cloud spring-cloud-sleuth-brave diff --git a/src/checkstyle/checkstyle-suppressions.xml b/src/checkstyle/checkstyle-suppressions.xml index e75174d51..0b83bfb26 100644 --- a/src/checkstyle/checkstyle-suppressions.xml +++ b/src/checkstyle/checkstyle-suppressions.xml @@ -1,7 +1,7 @@ + "-//Puppy Crawl//DTD Suppressions 1.1//EN" + "https://www.puppycrawl.com/dtds/suppressions_1_1.dtd"> @@ -32,5 +32,6 @@ + diff --git a/tests/brave/pom.xml b/tests/brave/pom.xml index 3110c2d7b..bddfa649c 100644 --- a/tests/brave/pom.xml +++ b/tests/brave/pom.xml @@ -50,6 +50,7 @@ spring-cloud-sleuth-instrumentation-rxjava-tests spring-cloud-sleuth-instrumentation-scheduling-tests spring-cloud-sleuth-instrumentation-webflux-tests + spring-cloud-sleuth-zipkin-tests diff --git a/tests/brave/spring-cloud-sleuth-instrumentation-annotation-tests/pom.xml b/tests/brave/spring-cloud-sleuth-instrumentation-annotation-tests/pom.xml index fd9072f9b..c9ad4e1ab 100644 --- a/tests/brave/spring-cloud-sleuth-instrumentation-annotation-tests/pom.xml +++ b/tests/brave/spring-cloud-sleuth-instrumentation-annotation-tests/pom.xml @@ -63,27 +63,22 @@ org.springframework.boot spring-boot-starter-webflux - test org.springframework.cloud - spring-cloud-sleuth-brave - test + spring-cloud-starter-sleuth org.springframework.boot spring-boot-starter-test - test io.zipkin.brave brave-tests - test org.awaitility awaitility - test diff --git a/tests/brave/spring-cloud-sleuth-instrumentation-annotation-tests/src/test/java/org/springframework/cloud/sleuth/brave/annotation/NullSpanTagAnnotationHandlerTests.java b/tests/brave/spring-cloud-sleuth-instrumentation-annotation-tests/src/test/java/org/springframework/cloud/sleuth/brave/annotation/NullSpanTagAnnotationHandlerTests.java index f570e2412..824d45e15 100644 --- a/tests/brave/spring-cloud-sleuth-instrumentation-annotation-tests/src/test/java/org/springframework/cloud/sleuth/brave/annotation/NullSpanTagAnnotationHandlerTests.java +++ b/tests/brave/spring-cloud-sleuth-instrumentation-annotation-tests/src/test/java/org/springframework/cloud/sleuth/brave/annotation/NullSpanTagAnnotationHandlerTests.java @@ -28,7 +28,7 @@ import org.springframework.test.context.ContextConfiguration; @SpringBootTest @ContextConfiguration(classes = NullSpanTagAnnotationHandlerTests.Config.class) public class NullSpanTagAnnotationHandlerTests - extends org.springframework.cloud.sleuth.annotation.NullSpanTagAnnotationHandlerTests { + extends org.springframework.cloud.sleuth.instrument.annotation.NullSpanTagAnnotationHandlerTests { @Configuration(proxyBeanMethods = false) static class Config { diff --git a/tests/brave/spring-cloud-sleuth-instrumentation-annotation-tests/src/test/java/org/springframework/cloud/sleuth/brave/annotation/SleuthSpanCreatorAspectFluxTests.java b/tests/brave/spring-cloud-sleuth-instrumentation-annotation-tests/src/test/java/org/springframework/cloud/sleuth/brave/annotation/SleuthSpanCreatorAspectFluxTests.java index 951d275a3..f1c745655 100644 --- a/tests/brave/spring-cloud-sleuth-instrumentation-annotation-tests/src/test/java/org/springframework/cloud/sleuth/brave/annotation/SleuthSpanCreatorAspectFluxTests.java +++ b/tests/brave/spring-cloud-sleuth-instrumentation-annotation-tests/src/test/java/org/springframework/cloud/sleuth/brave/annotation/SleuthSpanCreatorAspectFluxTests.java @@ -19,9 +19,9 @@ package org.springframework.cloud.sleuth.brave.annotation; import brave.sampler.Sampler; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.cloud.sleuth.api.TraceContext; +import org.springframework.cloud.sleuth.TraceContext; import org.springframework.cloud.sleuth.brave.BraveTestSpanHandler; -import org.springframework.cloud.sleuth.brave.bridge.BraveTraceContext; +import org.springframework.cloud.sleuth.brave.bridge.BraveAccessor; import org.springframework.cloud.sleuth.test.TestSpanHandler; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -30,12 +30,12 @@ import org.springframework.test.context.ContextConfiguration; @SpringBootTest @ContextConfiguration(classes = SleuthSpanCreatorAspectFluxTests.Config.class) public class SleuthSpanCreatorAspectFluxTests - extends org.springframework.cloud.sleuth.annotation.SleuthSpanCreatorAspectFluxTests { + extends org.springframework.cloud.sleuth.instrument.annotation.SleuthSpanCreatorAspectFluxTests { @Override public TraceContext traceContext() { - return BraveTraceContext - .fromBrave(brave.propagation.TraceContext.newBuilder().traceId(1).spanId(2).sampled(true).build()); + return BraveAccessor + .traceContext(brave.propagation.TraceContext.newBuilder().traceId(1).spanId(2).sampled(true).build()); } @Configuration(proxyBeanMethods = false) diff --git a/tests/brave/spring-cloud-sleuth-instrumentation-annotation-tests/src/test/java/org/springframework/cloud/sleuth/brave/annotation/SleuthSpanCreatorAspectMonoTests.java b/tests/brave/spring-cloud-sleuth-instrumentation-annotation-tests/src/test/java/org/springframework/cloud/sleuth/brave/annotation/SleuthSpanCreatorAspectMonoTests.java index a66d81a22..82a2862c1 100644 --- a/tests/brave/spring-cloud-sleuth-instrumentation-annotation-tests/src/test/java/org/springframework/cloud/sleuth/brave/annotation/SleuthSpanCreatorAspectMonoTests.java +++ b/tests/brave/spring-cloud-sleuth-instrumentation-annotation-tests/src/test/java/org/springframework/cloud/sleuth/brave/annotation/SleuthSpanCreatorAspectMonoTests.java @@ -28,7 +28,7 @@ import org.springframework.test.context.ContextConfiguration; @SpringBootTest @ContextConfiguration(classes = SleuthSpanCreatorAspectMonoTests.Config.class) public class SleuthSpanCreatorAspectMonoTests - extends org.springframework.cloud.sleuth.annotation.SleuthSpanCreatorAspectMonoTests { + extends org.springframework.cloud.sleuth.instrument.annotation.SleuthSpanCreatorAspectMonoTests { @Configuration(proxyBeanMethods = false) static class Config { diff --git a/tests/brave/spring-cloud-sleuth-instrumentation-annotation-tests/src/test/java/org/springframework/cloud/sleuth/brave/annotation/SleuthSpanCreatorAspectNegativeTests.java b/tests/brave/spring-cloud-sleuth-instrumentation-annotation-tests/src/test/java/org/springframework/cloud/sleuth/brave/annotation/SleuthSpanCreatorAspectNegativeTests.java index f82d314c7..13756ad38 100644 --- a/tests/brave/spring-cloud-sleuth-instrumentation-annotation-tests/src/test/java/org/springframework/cloud/sleuth/brave/annotation/SleuthSpanCreatorAspectNegativeTests.java +++ b/tests/brave/spring-cloud-sleuth-instrumentation-annotation-tests/src/test/java/org/springframework/cloud/sleuth/brave/annotation/SleuthSpanCreatorAspectNegativeTests.java @@ -28,7 +28,7 @@ import org.springframework.test.context.ContextConfiguration; @SpringBootTest @ContextConfiguration(classes = SleuthSpanCreatorAspectNegativeTests.Config.class) public class SleuthSpanCreatorAspectNegativeTests - extends org.springframework.cloud.sleuth.annotation.SleuthSpanCreatorAspectNegativeTests { + extends org.springframework.cloud.sleuth.instrument.annotation.SleuthSpanCreatorAspectNegativeTests { @Configuration(proxyBeanMethods = false) static class Config { diff --git a/tests/brave/spring-cloud-sleuth-instrumentation-annotation-tests/src/test/java/org/springframework/cloud/sleuth/brave/annotation/SleuthSpanCreatorAspectTests.java b/tests/brave/spring-cloud-sleuth-instrumentation-annotation-tests/src/test/java/org/springframework/cloud/sleuth/brave/annotation/SleuthSpanCreatorAspectTests.java index c623c2b31..1b457deea 100644 --- a/tests/brave/spring-cloud-sleuth-instrumentation-annotation-tests/src/test/java/org/springframework/cloud/sleuth/brave/annotation/SleuthSpanCreatorAspectTests.java +++ b/tests/brave/spring-cloud-sleuth-instrumentation-annotation-tests/src/test/java/org/springframework/cloud/sleuth/brave/annotation/SleuthSpanCreatorAspectTests.java @@ -28,7 +28,7 @@ import org.springframework.test.context.ContextConfiguration; @SpringBootTest @ContextConfiguration(classes = SleuthSpanCreatorAspectTests.Config.class) public class SleuthSpanCreatorAspectTests - extends org.springframework.cloud.sleuth.annotation.SleuthSpanCreatorAspectTests { + extends org.springframework.cloud.sleuth.instrument.annotation.SleuthSpanCreatorAspectTests { @Configuration(proxyBeanMethods = false) static class Config { diff --git a/tests/brave/spring-cloud-sleuth-instrumentation-annotation-tests/src/test/java/org/springframework/cloud/sleuth/brave/annotation/SleuthSpanCreatorCircularDependencyTests.java b/tests/brave/spring-cloud-sleuth-instrumentation-annotation-tests/src/test/java/org/springframework/cloud/sleuth/brave/annotation/SleuthSpanCreatorCircularDependencyTests.java index 7f365bf88..29b03356c 100644 --- a/tests/brave/spring-cloud-sleuth-instrumentation-annotation-tests/src/test/java/org/springframework/cloud/sleuth/brave/annotation/SleuthSpanCreatorCircularDependencyTests.java +++ b/tests/brave/spring-cloud-sleuth-instrumentation-annotation-tests/src/test/java/org/springframework/cloud/sleuth/brave/annotation/SleuthSpanCreatorCircularDependencyTests.java @@ -28,7 +28,7 @@ import org.springframework.test.context.ContextConfiguration; @SpringBootTest @ContextConfiguration(classes = SleuthSpanCreatorCircularDependencyTests.Config.class) public class SleuthSpanCreatorCircularDependencyTests - extends org.springframework.cloud.sleuth.annotation.SleuthSpanCreatorCircularDependencyTests { + extends org.springframework.cloud.sleuth.instrument.annotation.SleuthSpanCreatorCircularDependencyTests { @Configuration(proxyBeanMethods = false) static class Config { diff --git a/tests/brave/spring-cloud-sleuth-instrumentation-annotation-tests/src/test/java/org/springframework/cloud/sleuth/brave/annotation/SpanTagAnnotationHandlerTests.java b/tests/brave/spring-cloud-sleuth-instrumentation-annotation-tests/src/test/java/org/springframework/cloud/sleuth/brave/annotation/SpanTagAnnotationHandlerTests.java index 90c5c1ae8..0147f2538 100644 --- a/tests/brave/spring-cloud-sleuth-instrumentation-annotation-tests/src/test/java/org/springframework/cloud/sleuth/brave/annotation/SpanTagAnnotationHandlerTests.java +++ b/tests/brave/spring-cloud-sleuth-instrumentation-annotation-tests/src/test/java/org/springframework/cloud/sleuth/brave/annotation/SpanTagAnnotationHandlerTests.java @@ -28,7 +28,7 @@ import org.springframework.test.context.ContextConfiguration; @SpringBootTest @ContextConfiguration(classes = SpanTagAnnotationHandlerTests.Config.class) public class SpanTagAnnotationHandlerTests - extends org.springframework.cloud.sleuth.annotation.SpanTagAnnotationHandlerTests { + extends org.springframework.cloud.sleuth.instrument.annotation.SpanTagAnnotationHandlerTests { @Configuration(proxyBeanMethods = false) static class Config { diff --git a/tests/brave/spring-cloud-sleuth-instrumentation-async-tests/pom.xml b/tests/brave/spring-cloud-sleuth-instrumentation-async-tests/pom.xml index c83cfcfb2..08a320668 100644 --- a/tests/brave/spring-cloud-sleuth-instrumentation-async-tests/pom.xml +++ b/tests/brave/spring-cloud-sleuth-instrumentation-async-tests/pom.xml @@ -64,25 +64,17 @@ org.springframework.cloud spring-cloud-starter-sleuth - - org.springframework.cloud - spring-cloud-sleuth-brave - test - org.springframework.boot spring-boot-starter-test - test io.zipkin.brave brave-tests - test org.awaitility awaitility - test diff --git a/tests/brave/spring-cloud-sleuth-instrumentation-async-tests/src/test/java/org/springframework/cloud/sleuth/brave/instrument/async/TraceRunnableTests.java b/tests/brave/spring-cloud-sleuth-instrumentation-async-tests/src/test/java/org/springframework/cloud/sleuth/brave/instrument/async/TraceRunnableTests.java index aabd21051..24804e7b2 100644 --- a/tests/brave/spring-cloud-sleuth-instrumentation-async-tests/src/test/java/org/springframework/cloud/sleuth/brave/instrument/async/TraceRunnableTests.java +++ b/tests/brave/spring-cloud-sleuth-instrumentation-async-tests/src/test/java/org/springframework/cloud/sleuth/brave/instrument/async/TraceRunnableTests.java @@ -18,7 +18,7 @@ package org.springframework.cloud.sleuth.brave.instrument.async; import org.assertj.core.api.BDDAssertions; -import org.springframework.cloud.sleuth.api.Span; +import org.springframework.cloud.sleuth.Span; import org.springframework.cloud.sleuth.brave.BraveTestTracing; import org.springframework.cloud.sleuth.test.TestTracingAware; diff --git a/tests/brave/spring-cloud-sleuth-instrumentation-async-tests/src/test/java/org/springframework/cloud/sleuth/brave/instrument/async/issues/issue410/Issue410Tests.java b/tests/brave/spring-cloud-sleuth-instrumentation-async-tests/src/test/java/org/springframework/cloud/sleuth/brave/instrument/async/issues/issue410/Issue410Tests.java index 0f241766f..00ece718e 100644 --- a/tests/brave/spring-cloud-sleuth-instrumentation-async-tests/src/test/java/org/springframework/cloud/sleuth/brave/instrument/async/issues/issue410/Issue410Tests.java +++ b/tests/brave/spring-cloud-sleuth-instrumentation-async-tests/src/test/java/org/springframework/cloud/sleuth/brave/instrument/async/issues/issue410/Issue410Tests.java @@ -151,8 +151,8 @@ public class Issue410Tests { @Test public void should_pass_tracing_info_for_completable_futures_with_task_scheduler() { Span span = this.tracer.nextSpan().name("foo"); - log.info("Starting test"); try (Tracer.SpanInScope ws = this.tracer.withSpanInScope(span)) { + log.info("Starting test"); String response = this.restTemplate.getForObject("http://localhost:" + port() + "/taskScheduler", String.class); @@ -175,8 +175,8 @@ public class Issue410Tests { @Test public void should_pass_tracing_info_for_submitted_tasks_with_threadPoolTaskScheduler() { Span span = this.tracer.nextSpan().name("foo"); - log.info("Starting test"); try (Tracer.SpanInScope ws = this.tracer.withSpanInScope(span)) { + log.info("Starting test"); String response = this.restTemplate .getForObject("http://localhost:" + port() + "/threadPoolTaskScheduler_submit", String.class); @@ -196,8 +196,8 @@ public class Issue410Tests { @Test public void should_pass_tracing_info_for_scheduled_tasks_with_threadPoolTaskScheduler() { Span span = this.tracer.nextSpan().name("foo"); - log.info("Starting test"); try (Tracer.SpanInScope ws = this.tracer.withSpanInScope(span)) { + log.info("Starting test"); String response = this.restTemplate .getForObject("http://localhost:" + port() + "/threadPoolTaskScheduler_schedule", String.class); @@ -220,8 +220,8 @@ public class Issue410Tests { @Test public void should_pass_tracing_info_for_completable_futures_with_scheduledThreadPoolExecutor() { Span span = this.tracer.nextSpan().name("foo"); - log.info("Starting test"); try (Tracer.SpanInScope ws = this.tracer.withSpanInScope(span)) { + log.info("Starting test"); String response = this.restTemplate .getForObject("http://localhost:" + port() + "/scheduledThreadPoolExecutor", String.class); diff --git a/tests/brave/spring-cloud-sleuth-instrumentation-baggage-tests/pom.xml b/tests/brave/spring-cloud-sleuth-instrumentation-baggage-tests/pom.xml index 70fd407d7..894241490 100644 --- a/tests/brave/spring-cloud-sleuth-instrumentation-baggage-tests/pom.xml +++ b/tests/brave/spring-cloud-sleuth-instrumentation-baggage-tests/pom.xml @@ -70,23 +70,19 @@ org.springframework.cloud - spring-cloud-sleuth-brave - test + spring-cloud-starter-sleuth org.springframework.boot spring-boot-starter-test - test io.zipkin.brave brave-tests - test org.awaitility awaitility - test diff --git a/tests/brave/spring-cloud-sleuth-instrumentation-baggage-tests/src/test/java/org/springframework/cloud/sleuth/brave/baggage/BaggageEntryTagSpanHandlerTest.java b/tests/brave/spring-cloud-sleuth-instrumentation-baggage-tests/src/test/java/org/springframework/cloud/sleuth/brave/baggage/BaggageEntryTagSpanHandlerTest.java index 8750e0699..a2e79da1f 100644 --- a/tests/brave/spring-cloud-sleuth-instrumentation-baggage-tests/src/test/java/org/springframework/cloud/sleuth/brave/baggage/BaggageEntryTagSpanHandlerTest.java +++ b/tests/brave/spring-cloud-sleuth-instrumentation-baggage-tests/src/test/java/org/springframework/cloud/sleuth/brave/baggage/BaggageEntryTagSpanHandlerTest.java @@ -23,13 +23,13 @@ import org.springframework.cloud.sleuth.brave.BraveTestSpanHandler; import org.springframework.cloud.sleuth.test.TestSpanHandler; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.core.env.Environment; import org.springframework.test.context.ContextConfiguration; /** * @author Taras Danylchuk */ -@SpringBootTest(// WebEnvironment.NONE will not read a Yaml profile - webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE) @ContextConfiguration(classes = BaggageEntryTagSpanHandlerTest.Config.class) public class BaggageEntryTagSpanHandlerTest extends org.springframework.cloud.sleuth.baggage.BaggageEntryTagSpanHandlerTest { @@ -38,7 +38,7 @@ public class BaggageEntryTagSpanHandlerTest static class Config { @Bean - TestSpanHandler testSpanHandlerSupplier(brave.test.TestSpanHandler testSpanHandler) { + TestSpanHandler testSpanHandlerSupplier(brave.test.TestSpanHandler testSpanHandler, Environment environment) { return new BraveTestSpanHandler(testSpanHandler); } diff --git a/tests/brave/spring-cloud-sleuth-instrumentation-baggage-tests/src/test/java/org/springframework/cloud/sleuth/brave/baggage/MultipleHopsIntegrationTests.java b/tests/brave/spring-cloud-sleuth-instrumentation-baggage-tests/src/test/java/org/springframework/cloud/sleuth/brave/baggage/MultipleHopsIntegrationTests.java index d54d34c95..ce58ed6bd 100644 --- a/tests/brave/spring-cloud-sleuth-instrumentation-baggage-tests/src/test/java/org/springframework/cloud/sleuth/brave/baggage/MultipleHopsIntegrationTests.java +++ b/tests/brave/spring-cloud-sleuth-instrumentation-baggage-tests/src/test/java/org/springframework/cloud/sleuth/brave/baggage/MultipleHopsIntegrationTests.java @@ -20,11 +20,15 @@ import brave.baggage.BaggageField; import brave.baggage.BaggagePropagationConfig; import brave.sampler.Sampler; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration; +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.sleuth.api.Span; -import org.springframework.cloud.sleuth.api.exporter.FinishedSpan; +import org.springframework.cloud.sleuth.Span; import org.springframework.cloud.sleuth.brave.BraveTestSpanHandler; -import org.springframework.cloud.sleuth.brave.bridge.BraveTraceContext; +import org.springframework.cloud.sleuth.brave.bridge.BraveAccessor; +import org.springframework.cloud.sleuth.exporter.FinishedSpan; import org.springframework.cloud.sleuth.test.TestSpanHandler; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -52,15 +56,17 @@ public class MultipleHopsIntegrationTests // set with baggage api then(this.application.allSpans()).as("All have request ID") .allMatch(span -> "f4308d05-2228-4468-80f6-92a8377ba193" - .equals(REQUEST_ID.getValue(BraveTraceContext.toBrave(span.context())))); + .equals(REQUEST_ID.getValue(BraveAccessor.traceContext(span.context())))); // baz is not tagged in the initial span, only downstream! then(this.application.allSpans()).as("All downstream have country-code") .filteredOn(span -> !span.equals(initialSpan)) - .allMatch(span -> "FO".equals(COUNTRY_CODE.getValue(BraveTraceContext.toBrave(span.context())))); + .allMatch(span -> "FO".equals(COUNTRY_CODE.getValue(BraveAccessor.traceContext(span.context())))); } @Configuration(proxyBeanMethods = false) + @EnableAutoConfiguration( + exclude = { MongoAutoConfiguration.class, QuartzAutoConfiguration.class, JmxAutoConfiguration.class }) static class Config { @Bean diff --git a/tests/brave/spring-cloud-sleuth-instrumentation-circuitbreaker-tests/pom.xml b/tests/brave/spring-cloud-sleuth-instrumentation-circuitbreaker-tests/pom.xml index 25c03d501..4e7588912 100644 --- a/tests/brave/spring-cloud-sleuth-instrumentation-circuitbreaker-tests/pom.xml +++ b/tests/brave/spring-cloud-sleuth-instrumentation-circuitbreaker-tests/pom.xml @@ -66,23 +66,19 @@ org.springframework.cloud - spring-cloud-sleuth-brave - test + spring-cloud-starter-sleuth org.springframework.boot spring-boot-starter-test - test io.zipkin.brave brave-tests - test org.awaitility awaitility - test diff --git a/tests/brave/spring-cloud-sleuth-instrumentation-circuitbreaker-tests/src/test/java/org/springframework/cloud/sleuth/brave/instrument/circuitbreaker/CircuitBreakerIntegrationTests.java b/tests/brave/spring-cloud-sleuth-instrumentation-circuitbreaker-tests/src/test/java/org/springframework/cloud/sleuth/brave/instrument/circuitbreaker/CircuitBreakerIntegrationTests.java index d22a5a6d9..b1702188c 100644 --- a/tests/brave/spring-cloud-sleuth-instrumentation-circuitbreaker-tests/src/test/java/org/springframework/cloud/sleuth/brave/instrument/circuitbreaker/CircuitBreakerIntegrationTests.java +++ b/tests/brave/spring-cloud-sleuth-instrumentation-circuitbreaker-tests/src/test/java/org/springframework/cloud/sleuth/brave/instrument/circuitbreaker/CircuitBreakerIntegrationTests.java @@ -20,8 +20,8 @@ import brave.sampler.Sampler; import org.assertj.core.api.BDDAssertions; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.cloud.sleuth.api.exporter.FinishedSpan; import org.springframework.cloud.sleuth.brave.BraveTestSpanHandler; +import org.springframework.cloud.sleuth.exporter.FinishedSpan; import org.springframework.cloud.sleuth.test.TestSpanHandler; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/tests/brave/spring-cloud-sleuth-instrumentation-circuitbreaker-tests/src/test/java/org/springframework/cloud/sleuth/brave/instrument/circuitbreaker/CircuitBreakerTests.java b/tests/brave/spring-cloud-sleuth-instrumentation-circuitbreaker-tests/src/test/java/org/springframework/cloud/sleuth/brave/instrument/circuitbreaker/CircuitBreakerTests.java index 4fc8cdaf4..2d8aae8f1 100644 --- a/tests/brave/spring-cloud-sleuth-instrumentation-circuitbreaker-tests/src/test/java/org/springframework/cloud/sleuth/brave/instrument/circuitbreaker/CircuitBreakerTests.java +++ b/tests/brave/spring-cloud-sleuth-instrumentation-circuitbreaker-tests/src/test/java/org/springframework/cloud/sleuth/brave/instrument/circuitbreaker/CircuitBreakerTests.java @@ -18,8 +18,8 @@ package org.springframework.cloud.sleuth.brave.instrument.circuitbreaker; import org.assertj.core.api.BDDAssertions; -import org.springframework.cloud.sleuth.api.exporter.FinishedSpan; import org.springframework.cloud.sleuth.brave.BraveTestTracing; +import org.springframework.cloud.sleuth.exporter.FinishedSpan; import org.springframework.cloud.sleuth.test.TestTracingAware; public class CircuitBreakerTests diff --git a/tests/brave/spring-cloud-sleuth-instrumentation-feign-tests/pom.xml b/tests/brave/spring-cloud-sleuth-instrumentation-feign-tests/pom.xml index b3534ddc5..9f87a7f11 100644 --- a/tests/brave/spring-cloud-sleuth-instrumentation-feign-tests/pom.xml +++ b/tests/brave/spring-cloud-sleuth-instrumentation-feign-tests/pom.xml @@ -71,11 +71,6 @@ 4.8.0 compile - - org.springframework.cloud - spring-cloud-sleuth-brave - test - org.springframework.cloud spring-cloud-starter-sleuth @@ -95,22 +90,18 @@ io.github.openfeign feign-okhttp - true org.springframework.boot spring-boot-starter-test - test io.zipkin.brave brave-tests - test org.awaitility awaitility - test diff --git a/tests/brave/spring-cloud-sleuth-instrumentation-feign-tests/src/test/java/org/springframework/cloud/sleuth/brave/instrument/feign/issues/issue362/Issue362Tests.java b/tests/brave/spring-cloud-sleuth-instrumentation-feign-tests/src/test/java/org/springframework/cloud/sleuth/brave/instrument/feign/issues/issue362/Issue362Tests.java index 5c4ab8c73..01873f772 100644 --- a/tests/brave/spring-cloud-sleuth-instrumentation-feign-tests/src/test/java/org/springframework/cloud/sleuth/brave/instrument/feign/issues/issue362/Issue362Tests.java +++ b/tests/brave/spring-cloud-sleuth-instrumentation-feign-tests/src/test/java/org/springframework/cloud/sleuth/brave/instrument/feign/issues/issue362/Issue362Tests.java @@ -42,7 +42,6 @@ import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.cloud.openfeign.EnableFeignClients; import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.cloud.sleuth.instrument.web.TraceWebServletAutoConfiguration; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.HttpStatus; @@ -72,7 +71,7 @@ interface MyFeignClient { */ @SpringBootTest(classes = Application.class, webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT) -@TestPropertySource(properties = { "server.port=9998" }) +@TestPropertySource(properties = { "server.port=9998", "spring.sleuth.web.servlet.enabled=false" }) public class Issue362Tests { RestTemplate template = new RestTemplate(); @@ -126,10 +125,7 @@ public class Issue362Tests { } @Configuration(proxyBeanMethods = false) -@EnableAutoConfiguration( - // spring boot test will otherwise instrument the client and server with the - // same bean factory which isn't expected - exclude = TraceWebServletAutoConfiguration.class) +@EnableAutoConfiguration @EnableFeignClients(basePackageClasses = { SleuthTestController.class }) class Application { diff --git a/tests/brave/spring-cloud-sleuth-instrumentation-feign-tests/src/test/java/org/springframework/cloud/sleuth/brave/instrument/feign/issues/issue393/Issue393Tests.java b/tests/brave/spring-cloud-sleuth-instrumentation-feign-tests/src/test/java/org/springframework/cloud/sleuth/brave/instrument/feign/issues/issue393/Issue393Tests.java index e32fbfd80..217af80e7 100644 --- a/tests/brave/spring-cloud-sleuth-instrumentation-feign-tests/src/test/java/org/springframework/cloud/sleuth/brave/instrument/feign/issues/issue393/Issue393Tests.java +++ b/tests/brave/spring-cloud-sleuth-instrumentation-feign-tests/src/test/java/org/springframework/cloud/sleuth/brave/instrument/feign/issues/issue393/Issue393Tests.java @@ -32,7 +32,6 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.openfeign.EnableFeignClients; import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.cloud.sleuth.instrument.web.TraceWebServletAutoConfiguration; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.ResponseEntity; @@ -58,7 +57,8 @@ interface MyNameRemote { */ @SpringBootTest(classes = Application.class, webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT) -@TestPropertySource(properties = { "spring.application.name=demo-feign-uri", "server.port=9978" }) +@TestPropertySource(properties = { "spring.application.name=demo-feign-uri", "server.port=9978", + "spring.sleuth.web.servlet.enabled=false" }) public class Issue393Tests { RestTemplate template = new RestTemplate(); @@ -90,10 +90,7 @@ public class Issue393Tests { } @Configuration(proxyBeanMethods = false) -@EnableAutoConfiguration( - // spring boot test will otherwise instrument the client and server with the - // same bean factory which isn't expected - exclude = TraceWebServletAutoConfiguration.class) +@EnableAutoConfiguration @EnableFeignClients @EnableDiscoveryClient class Application { diff --git a/tests/brave/spring-cloud-sleuth-instrumentation-gateway-tests/pom.xml b/tests/brave/spring-cloud-sleuth-instrumentation-gateway-tests/pom.xml index f60006b9b..ff17b7b42 100644 --- a/tests/brave/spring-cloud-sleuth-instrumentation-gateway-tests/pom.xml +++ b/tests/brave/spring-cloud-sleuth-instrumentation-gateway-tests/pom.xml @@ -62,23 +62,19 @@ org.springframework.cloud - spring-cloud-sleuth-brave - test + spring-cloud-starter-sleuth org.springframework.boot spring-boot-starter-test - test io.zipkin.brave brave-tests - test org.awaitility awaitility - test diff --git a/tests/brave/spring-cloud-sleuth-instrumentation-grpc-tests/pom.xml b/tests/brave/spring-cloud-sleuth-instrumentation-grpc-tests/pom.xml index 692e8dee1..fd17ca255 100644 --- a/tests/brave/spring-cloud-sleuth-instrumentation-grpc-tests/pom.xml +++ b/tests/brave/spring-cloud-sleuth-instrumentation-grpc-tests/pom.xml @@ -61,41 +61,34 @@ org.springframework.cloud - spring-cloud-sleuth-brave - test + spring-cloud-starter-sleuth org.springframework.boot spring-boot-starter-test - test io.zipkin.brave brave-tests - test org.awaitility awaitility - test com.google.guava guava ${guava.version} - test io.github.lognet grpc-spring-boot-starter - test io.zipkin.brave brave-instrumentation-grpc - test diff --git a/tests/brave/spring-cloud-sleuth-instrumentation-lettuce-tests/pom.xml b/tests/brave/spring-cloud-sleuth-instrumentation-lettuce-tests/pom.xml index 4e53a5237..61e5d66af 100644 --- a/tests/brave/spring-cloud-sleuth-instrumentation-lettuce-tests/pom.xml +++ b/tests/brave/spring-cloud-sleuth-instrumentation-lettuce-tests/pom.xml @@ -61,29 +61,24 @@ org.springframework.cloud - spring-cloud-sleuth-brave - test + spring-cloud-starter-sleuth org.springframework.boot spring-boot-starter-test - test io.zipkin.brave brave-tests - test org.awaitility awaitility - test io.lettuce lettuce-core - true diff --git a/tests/brave/spring-cloud-sleuth-instrumentation-lettuce-tests/src/test/java/org/springframework/cloud/sleuth/brave/instrument/redis/TraceRedisAutoConfigurationTests.java b/tests/brave/spring-cloud-sleuth-instrumentation-lettuce-tests/src/test/java/org/springframework/cloud/sleuth/brave/instrument/redis/BraveRedisAutoConfigurationTests.java similarity index 90% rename from tests/brave/spring-cloud-sleuth-instrumentation-lettuce-tests/src/test/java/org/springframework/cloud/sleuth/brave/instrument/redis/TraceRedisAutoConfigurationTests.java rename to tests/brave/spring-cloud-sleuth-instrumentation-lettuce-tests/src/test/java/org/springframework/cloud/sleuth/brave/instrument/redis/BraveRedisAutoConfigurationTests.java index 90a053db3..dad4687e1 100644 --- a/tests/brave/spring-cloud-sleuth-instrumentation-lettuce-tests/src/test/java/org/springframework/cloud/sleuth/brave/instrument/redis/TraceRedisAutoConfigurationTests.java +++ b/tests/brave/spring-cloud-sleuth-instrumentation-lettuce-tests/src/test/java/org/springframework/cloud/sleuth/brave/instrument/redis/BraveRedisAutoConfigurationTests.java @@ -24,6 +24,8 @@ import org.springframework.beans.factory.BeanFactory; 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.autoconfig.brave.instrument.redis.TraceRedisProperties; +import org.springframework.cloud.sleuth.autoconfig.instrument.redis.TraceLettuceClientResourcesBeanPostProcessor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -32,9 +34,9 @@ import static org.assertj.core.api.BDDAssertions.then; /** * @author Chao Chang */ -@SpringBootTest(classes = TraceRedisAutoConfigurationTests.Config.class, +@SpringBootTest(classes = BraveRedisAutoConfigurationTests.Config.class, webEnvironment = SpringBootTest.WebEnvironment.NONE) -public class TraceRedisAutoConfigurationTests { +public class BraveRedisAutoConfigurationTests { @Autowired ClientResources clientResources; diff --git a/tests/brave/spring-cloud-sleuth-instrumentation-messaging-tests/pom.xml b/tests/brave/spring-cloud-sleuth-instrumentation-messaging-tests/pom.xml index f32873c79..5abeee25a 100644 --- a/tests/brave/spring-cloud-sleuth-instrumentation-messaging-tests/pom.xml +++ b/tests/brave/spring-cloud-sleuth-instrumentation-messaging-tests/pom.xml @@ -19,8 +19,7 @@ + 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-instrumentation-messaging-tests @@ -67,8 +66,7 @@ https://www.w3.org/2001/XMLSchema-instance "> org.springframework.cloud - spring-cloud-sleuth-brave - test + spring-cloud-starter-sleuth org.springframework.cloud @@ -79,13 +77,11 @@ https://www.w3.org/2001/XMLSchema-instance "> org.springframework.cloud spring-cloud-stream test-jar - test test-binder org.springframework.boot spring-boot-starter-test - test org.junit.vintage @@ -96,12 +92,10 @@ https://www.w3.org/2001/XMLSchema-instance "> io.zipkin.brave brave-tests - test org.awaitility awaitility - test io.zipkin.brave @@ -147,19 +141,16 @@ https://www.w3.org/2001/XMLSchema-instance "> org.springframework.boot spring-boot-starter-activemq - test javax.resource javax.resource-api 1.7.1 - test org.apache.activemq activemq-ra - test org.springframework.boot diff --git a/tests/brave/spring-cloud-sleuth-instrumentation-messaging-tests/src/test/java/org/springframework/cloud/sleuth/brave/instrument/messaging/TraceMessagingAutoConfiguration1664Tests.java b/tests/brave/spring-cloud-sleuth-instrumentation-messaging-tests/src/test/java/org/springframework/cloud/sleuth/brave/instrument/messaging/BraveMessagingAutoConfiguration1664Tests.java similarity index 95% rename from tests/brave/spring-cloud-sleuth-instrumentation-messaging-tests/src/test/java/org/springframework/cloud/sleuth/brave/instrument/messaging/TraceMessagingAutoConfiguration1664Tests.java rename to tests/brave/spring-cloud-sleuth-instrumentation-messaging-tests/src/test/java/org/springframework/cloud/sleuth/brave/instrument/messaging/BraveMessagingAutoConfiguration1664Tests.java index 4678c53ca..347ed1f66 100644 --- a/tests/brave/spring-cloud-sleuth-instrumentation-messaging-tests/src/test/java/org/springframework/cloud/sleuth/brave/instrument/messaging/TraceMessagingAutoConfiguration1664Tests.java +++ b/tests/brave/spring-cloud-sleuth-instrumentation-messaging-tests/src/test/java/org/springframework/cloud/sleuth/brave/instrument/messaging/BraveMessagingAutoConfiguration1664Tests.java @@ -41,9 +41,9 @@ import static org.assertj.core.api.BDDAssertions.then; * @author Roberto Tassi */ @RunWith(SpringRunner.class) -@SpringBootTest(classes = TraceMessagingAutoConfiguration1664Tests.Config.class, +@SpringBootTest(classes = BraveMessagingAutoConfiguration1664Tests.Config.class, webEnvironment = SpringBootTest.WebEnvironment.NONE) -public class TraceMessagingAutoConfiguration1664Tests { +public class BraveMessagingAutoConfiguration1664Tests { @Autowired MySleuthKafka1664Aspect mySleuthKafka1664Aspect; diff --git a/tests/brave/spring-cloud-sleuth-instrumentation-messaging-tests/src/test/java/org/springframework/cloud/sleuth/brave/instrument/messaging/TraceMessagingAutoConfigurationTests.java b/tests/brave/spring-cloud-sleuth-instrumentation-messaging-tests/src/test/java/org/springframework/cloud/sleuth/brave/instrument/messaging/BraveMessagingAutoConfigurationTests.java similarity index 94% rename from tests/brave/spring-cloud-sleuth-instrumentation-messaging-tests/src/test/java/org/springframework/cloud/sleuth/brave/instrument/messaging/TraceMessagingAutoConfigurationTests.java rename to tests/brave/spring-cloud-sleuth-instrumentation-messaging-tests/src/test/java/org/springframework/cloud/sleuth/brave/instrument/messaging/BraveMessagingAutoConfigurationTests.java index 4166bee9b..406a8c15d 100644 --- a/tests/brave/spring-cloud-sleuth-instrumentation-messaging-tests/src/test/java/org/springframework/cloud/sleuth/brave/instrument/messaging/TraceMessagingAutoConfigurationTests.java +++ b/tests/brave/spring-cloud-sleuth-instrumentation-messaging-tests/src/test/java/org/springframework/cloud/sleuth/brave/instrument/messaging/BraveMessagingAutoConfigurationTests.java @@ -41,8 +41,8 @@ import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.test.context.SpringBootTest; 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.brave.instrument.messaging.BraveMessagingAutoConfiguration; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.kafka.annotation.KafkaListener; @@ -55,9 +55,9 @@ import static org.assertj.core.api.BDDAssertions.then; /** * @author Marcin Grzejszczak */ -@SpringBootTest(classes = TraceMessagingAutoConfigurationTests.Config.class, +@SpringBootTest(classes = BraveMessagingAutoConfigurationTests.Config.class, webEnvironment = SpringBootTest.WebEnvironment.NONE) -public class TraceMessagingAutoConfigurationTests { +public class BraveMessagingAutoConfigurationTests { @Autowired RabbitTemplate rabbitTemplate; @@ -144,9 +144,8 @@ public class TraceMessagingAutoConfigurationTests { } private ApplicationContextRunner contextRunner(String... propertyValues) { - return new ApplicationContextRunner().withPropertyValues(propertyValues) - .withConfiguration(AutoConfigurations.of(TraceBraveAutoConfiguration.class, - TraceAutoConfiguration.class, TraceMessagingAutoConfiguration.class)); + return new ApplicationContextRunner().withPropertyValues(propertyValues).withConfiguration( + AutoConfigurations.of(BraveAutoConfiguration.class, BraveMessagingAutoConfiguration.class)); } @Configuration(proxyBeanMethods = false) diff --git a/tests/brave/spring-cloud-sleuth-instrumentation-messaging-tests/src/test/java/org/springframework/cloud/sleuth/instrument/messaging/SleuthKafkaStreamsConfigurationTest.java b/tests/brave/spring-cloud-sleuth-instrumentation-messaging-tests/src/test/java/org/springframework/cloud/sleuth/instrument/messaging/BraveKafkaStreamsAutoConfigurationTest.java similarity index 92% rename from tests/brave/spring-cloud-sleuth-instrumentation-messaging-tests/src/test/java/org/springframework/cloud/sleuth/instrument/messaging/SleuthKafkaStreamsConfigurationTest.java rename to tests/brave/spring-cloud-sleuth-instrumentation-messaging-tests/src/test/java/org/springframework/cloud/sleuth/instrument/messaging/BraveKafkaStreamsAutoConfigurationTest.java index 3d6c99392..6a65fce7c 100644 --- a/tests/brave/spring-cloud-sleuth-instrumentation-messaging-tests/src/test/java/org/springframework/cloud/sleuth/instrument/messaging/SleuthKafkaStreamsConfigurationTest.java +++ b/tests/brave/spring-cloud-sleuth-instrumentation-messaging-tests/src/test/java/org/springframework/cloud/sleuth/instrument/messaging/BraveKafkaStreamsAutoConfigurationTest.java @@ -33,8 +33,8 @@ import static org.assertj.core.api.BDDAssertions.then; /** * @author Tim te Beek */ -@SpringBootTest(classes = SleuthKafkaStreamsConfigurationTest.Config.class, webEnvironment = WebEnvironment.NONE) -public class SleuthKafkaStreamsConfigurationTest { +@SpringBootTest(classes = BraveKafkaStreamsAutoConfigurationTest.Config.class, webEnvironment = WebEnvironment.NONE) +public class BraveKafkaStreamsAutoConfigurationTest { @Autowired TestTraceStreamsBuilderFactoryBean streamsBuilderFactoryBean; diff --git a/tests/brave/spring-cloud-sleuth-instrumentation-messaging-tests/src/test/java/org/springframework/cloud/sleuth/instrument/messaging/JmsTracingConfigurationTest.java b/tests/brave/spring-cloud-sleuth-instrumentation-messaging-tests/src/test/java/org/springframework/cloud/sleuth/instrument/messaging/JmsTracingConfigurationTest.java index 9de90e78c..9d92eaedc 100644 --- a/tests/brave/spring-cloud-sleuth-instrumentation-messaging-tests/src/test/java/org/springframework/cloud/sleuth/instrument/messaging/JmsTracingConfigurationTest.java +++ b/tests/brave/spring-cloud-sleuth-instrumentation-messaging-tests/src/test/java/org/springframework/cloud/sleuth/instrument/messaging/JmsTracingConfigurationTest.java @@ -37,6 +37,8 @@ import org.springframework.boot.autoconfigure.AutoConfigureBefore; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.jms.activemq.ActiveMQAutoConfiguration; import org.springframework.boot.autoconfigure.kafka.KafkaAutoConfiguration; +import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration; +import org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration; import org.springframework.boot.jms.XAConnectionFactoryWrapper; import org.springframework.boot.test.context.assertj.AssertableApplicationContext; import org.springframework.boot.test.context.runner.ApplicationContextRunner; @@ -164,7 +166,8 @@ public class JmsTracingConfigurationTest { } @Configuration(proxyBeanMethods = false) -@EnableAutoConfiguration(exclude = KafkaAutoConfiguration.class) +@EnableAutoConfiguration( + exclude = { KafkaAutoConfiguration.class, MongoAutoConfiguration.class, QuartzAutoConfiguration.class }) class JmsTestTracingConfiguration { } diff --git a/tests/brave/spring-cloud-sleuth-instrumentation-mvc-tests/pom.xml b/tests/brave/spring-cloud-sleuth-instrumentation-mvc-tests/pom.xml index 13a22027e..f523f8dbc 100644 --- a/tests/brave/spring-cloud-sleuth-instrumentation-mvc-tests/pom.xml +++ b/tests/brave/spring-cloud-sleuth-instrumentation-mvc-tests/pom.xml @@ -78,7 +78,6 @@ org.springframework.boot spring-boot-starter-actuator - true org.springframework.boot @@ -90,23 +89,19 @@ org.springframework.cloud - spring-cloud-sleuth-brave - test + spring-cloud-starter-sleuth org.springframework.boot spring-boot-starter-test - test io.zipkin.brave brave-tests - test org.awaitility awaitility - test diff --git a/tests/brave/spring-cloud-sleuth-instrumentation-mvc-tests/src/test/java/org/springframework/cloud/sleuth/brave/instrument/web/TraceFilterIntegrationTests.java b/tests/brave/spring-cloud-sleuth-instrumentation-mvc-tests/src/test/java/org/springframework/cloud/sleuth/brave/instrument/web/TraceFilterIntegrationTests.java index b394b9bda..b2527190b 100644 --- a/tests/brave/spring-cloud-sleuth-instrumentation-mvc-tests/src/test/java/org/springframework/cloud/sleuth/brave/instrument/web/TraceFilterIntegrationTests.java +++ b/tests/brave/spring-cloud-sleuth-instrumentation-mvc-tests/src/test/java/org/springframework/cloud/sleuth/brave/instrument/web/TraceFilterIntegrationTests.java @@ -45,7 +45,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.actuate.autoconfigure.web.server.ManagementServerProperties; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.cloud.sleuth.instrument.web.TraceWebServletAutoConfiguration; +import org.springframework.cloud.sleuth.autoconfig.instrument.web.SleuthWebProperties; import org.springframework.cloud.sleuth.instrument.web.servlet.TracingFilter; import org.springframework.cloud.sleuth.util.SpanUtil; import org.springframework.context.annotation.Bean; @@ -299,7 +299,7 @@ public class TraceFilterIntegrationTests extends AbstractMvcIntegrationTest { } @Bean - @Order(TraceWebServletAutoConfiguration.TRACING_FILTER_ORDER + 1) + @Order(SleuthWebProperties.TRACING_FILTER_ORDER + 1) Filter myFilter(Tracer tracer) { return new MyFilter(tracer); } @@ -359,7 +359,7 @@ public class TraceFilterIntegrationTests extends AbstractMvcIntegrationTest { // tag::response_headers[] @Component -@Order(TraceWebServletAutoConfiguration.TRACING_FILTER_ORDER + 1) +@Order(SleuthWebProperties.TRACING_FILTER_ORDER + 1) class MyFilter extends GenericFilterBean { private final Tracer tracer; diff --git a/tests/brave/spring-cloud-sleuth-instrumentation-mvc-tests/src/test/java/org/springframework/cloud/sleuth/brave/instrument/web/TraceFilterTests.java b/tests/brave/spring-cloud-sleuth-instrumentation-mvc-tests/src/test/java/org/springframework/cloud/sleuth/brave/instrument/web/TraceFilterTests.java index de40f8cb9..65ac88d6b 100644 --- a/tests/brave/spring-cloud-sleuth-instrumentation-mvc-tests/src/test/java/org/springframework/cloud/sleuth/brave/instrument/web/TraceFilterTests.java +++ b/tests/brave/spring-cloud-sleuth-instrumentation-mvc-tests/src/test/java/org/springframework/cloud/sleuth/brave/instrument/web/TraceFilterTests.java @@ -22,9 +22,9 @@ import brave.http.HttpTracing; import org.assertj.core.api.BDDAssertions; import org.junit.jupiter.api.Test; -import org.springframework.cloud.sleuth.api.http.HttpServerHandler; import org.springframework.cloud.sleuth.brave.BraveTestTracing; -import org.springframework.cloud.sleuth.brave.bridge.http.BraveHttpServerHandler; +import org.springframework.cloud.sleuth.brave.bridge.BraveAccessor; +import org.springframework.cloud.sleuth.http.HttpServerHandler; import org.springframework.cloud.sleuth.instrument.web.servlet.TracingFilter; import org.springframework.cloud.sleuth.test.TestTracingAware; import org.springframework.cloud.sleuth.test.TracerAware; @@ -50,7 +50,7 @@ public class TraceFilterTests extends org.springframework.cloud.sleuth.instrumen public HttpServerHandler httpServerHandler() { HttpTracing httpTracing = this.testTracing.httpTracingBuilder() .serverSampler(new SkipPatternHttpServerSampler(() -> Pattern.compile(""))).build(); - return new BraveHttpServerHandler(brave.http.HttpServerHandler.create(httpTracing)); + return BraveAccessor.httpServerHandler(brave.http.HttpServerHandler.create(httpTracing)); } @Test diff --git a/tests/brave/spring-cloud-sleuth-instrumentation-mvc-tests/src/test/java/org/springframework/cloud/sleuth/brave/instrument/web/client/RestTemplateTraceAspectIntegrationTests.java b/tests/brave/spring-cloud-sleuth-instrumentation-mvc-tests/src/test/java/org/springframework/cloud/sleuth/brave/instrument/web/client/RestTemplateTraceAspectIntegrationTests.java index 6e1fc0083..fa3dcf840 100644 --- a/tests/brave/spring-cloud-sleuth-instrumentation-mvc-tests/src/test/java/org/springframework/cloud/sleuth/brave/instrument/web/client/RestTemplateTraceAspectIntegrationTests.java +++ b/tests/brave/spring-cloud-sleuth-instrumentation-mvc-tests/src/test/java/org/springframework/cloud/sleuth/brave/instrument/web/client/RestTemplateTraceAspectIntegrationTests.java @@ -36,8 +36,7 @@ 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.api.http.HttpClientHandler; -import org.springframework.cloud.sleuth.instrument.web.TraceWebServletAutoConfiguration; +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.Import; @@ -67,7 +66,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. @SpringBootTest(classes = RestTemplateTraceAspectIntegrationTests.Config.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, - properties = "spring.sleuth.web.client.skipPattern=/issue.*") + properties = { "spring.sleuth.web.client.skipPattern=/issue.*", "spring.sleuth.web.servlet.enabled=false" }) @DirtiesContext public class RestTemplateTraceAspectIntegrationTests { @@ -175,10 +174,7 @@ public class RestTemplateTraceAspectIntegrationTests { this.mockMvc.perform(asyncDispatch(mvcResult)).andDo(print()).andExpect(status().isOk()); } - @EnableAutoConfiguration( - // spring boot test will otherwise instrument the client and server with the - // same bean factory which isn't expected - exclude = TraceWebServletAutoConfiguration.class) + @EnableAutoConfiguration @Import(AspectTestingController.class) public static class Config { @@ -194,7 +190,7 @@ public class RestTemplateTraceAspectIntegrationTests { @Bean public AsyncRestTemplate asyncRestTemplate( - org.springframework.cloud.sleuth.api.CurrentTraceContext currentTraceContext, + org.springframework.cloud.sleuth.CurrentTraceContext currentTraceContext, HttpClientHandler httpClientHandler) { AsyncRestTemplate asyncRestTemplate = new AsyncRestTemplate(); asyncRestTemplate.setInterceptors(Collections.singletonList( diff --git a/tests/brave/spring-cloud-sleuth-instrumentation-mvc-tests/src/test/java/org/springframework/cloud/sleuth/brave/instrument/web/client/TraceRestTemplateInterceptorTests.java b/tests/brave/spring-cloud-sleuth-instrumentation-mvc-tests/src/test/java/org/springframework/cloud/sleuth/brave/instrument/web/client/TraceRestTemplateInterceptorTests.java index 2556c17e9..ba66f0e18 100644 --- a/tests/brave/spring-cloud-sleuth-instrumentation-mvc-tests/src/test/java/org/springframework/cloud/sleuth/brave/instrument/web/client/TraceRestTemplateInterceptorTests.java +++ b/tests/brave/spring-cloud-sleuth-instrumentation-mvc-tests/src/test/java/org/springframework/cloud/sleuth/brave/instrument/web/client/TraceRestTemplateInterceptorTests.java @@ -18,7 +18,7 @@ package org.springframework.cloud.sleuth.brave.instrument.web.client; import java.util.Map; -import org.springframework.cloud.sleuth.api.Span; +import org.springframework.cloud.sleuth.Span; import org.springframework.cloud.sleuth.brave.BraveTestTracing; import org.springframework.cloud.sleuth.test.TestTracingAware; diff --git a/tests/brave/spring-cloud-sleuth-instrumentation-mvc-tests/src/test/java/org/springframework/cloud/sleuth/brave/instrument/web/client/TraceWebAsyncClientAutoConfigurationTests.java b/tests/brave/spring-cloud-sleuth-instrumentation-mvc-tests/src/test/java/org/springframework/cloud/sleuth/brave/instrument/web/client/TraceWebAsyncClientAutoConfigurationTests.java index 0dba8011d..6997dc907 100644 --- a/tests/brave/spring-cloud-sleuth-instrumentation-mvc-tests/src/test/java/org/springframework/cloud/sleuth/brave/instrument/web/client/TraceWebAsyncClientAutoConfigurationTests.java +++ b/tests/brave/spring-cloud-sleuth-instrumentation-mvc-tests/src/test/java/org/springframework/cloud/sleuth/brave/instrument/web/client/TraceWebAsyncClientAutoConfigurationTests.java @@ -35,7 +35,6 @@ 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.instrument.web.TraceWebServletAutoConfiguration; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.env.Environment; @@ -53,7 +52,7 @@ import static org.springframework.boot.test.context.SpringBootTest.WebEnvironmen */ @SpringBootTest(classes = { TraceWebAsyncClientAutoConfigurationTests.TestConfiguration.class }, - webEnvironment = RANDOM_PORT) + webEnvironment = RANDOM_PORT, properties = "spring.sleuth.web.servlet.enabled=false") public class TraceWebAsyncClientAutoConfigurationTests { @Autowired @@ -120,10 +119,7 @@ public class TraceWebAsyncClientAutoConfigurationTests { return this.environment.getProperty("local.server.port", Integer.class); } - @EnableAutoConfiguration( - // spring boot test will otherwise instrument the client and server with the - // same bean factory which isn't expected - exclude = TraceWebServletAutoConfiguration.class) + @EnableAutoConfiguration @Configuration(proxyBeanMethods = false) public static class TestConfiguration { diff --git a/tests/brave/spring-cloud-sleuth-instrumentation-quartz-tests/pom.xml b/tests/brave/spring-cloud-sleuth-instrumentation-quartz-tests/pom.xml index 372729b77..75a78f716 100644 --- a/tests/brave/spring-cloud-sleuth-instrumentation-quartz-tests/pom.xml +++ b/tests/brave/spring-cloud-sleuth-instrumentation-quartz-tests/pom.xml @@ -62,23 +62,19 @@ org.springframework.cloud - spring-cloud-sleuth-brave - test + spring-cloud-starter-sleuth org.springframework.boot spring-boot-starter-test - test io.zipkin.brave brave-tests - test org.awaitility awaitility - test diff --git a/tests/brave/spring-cloud-sleuth-instrumentation-reactor-tests/pom.xml b/tests/brave/spring-cloud-sleuth-instrumentation-reactor-tests/pom.xml index 3c8ce77e8..bdae19184 100644 --- a/tests/brave/spring-cloud-sleuth-instrumentation-reactor-tests/pom.xml +++ b/tests/brave/spring-cloud-sleuth-instrumentation-reactor-tests/pom.xml @@ -51,6 +51,11 @@ + + org.springframework.cloud + spring-cloud-sleuth-tests-common + ${project.version} + org.springframework.boot spring-boot-starter-webflux @@ -61,13 +66,11 @@ org.springframework.cloud - spring-cloud-sleuth-brave - test + spring-cloud-starter-sleuth io.zipkin.brave brave-instrumentation-http-tests - test org.eclipse.jetty @@ -78,32 +81,26 @@ org.springframework.boot spring-boot-starter-test - test io.zipkin.brave brave-tests - test org.awaitility awaitility - test io.projectreactor reactor-core - true io.projectreactor.netty reactor-netty-http - true org.reactivestreams reactive-streams - true diff --git a/tests/brave/spring-cloud-sleuth-instrumentation-reactor-tests/src/test/java/org/springframework/cloud/sleuth/brave/instrument/reactor/FlatMapTests.java b/tests/brave/spring-cloud-sleuth-instrumentation-reactor-tests/src/test/java/org/springframework/cloud/sleuth/brave/instrument/reactor/FlatMapTests.java new file mode 100644 index 000000000..b1530374e --- /dev/null +++ b/tests/brave/spring-cloud-sleuth-instrumentation-reactor-tests/src/test/java/org/springframework/cloud/sleuth/brave/instrument/reactor/FlatMapTests.java @@ -0,0 +1,53 @@ +/* + * 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.reactor; + +import brave.sampler.Sampler; + +import org.springframework.cloud.sleuth.brave.BraveTestSpanHandler; +import org.springframework.cloud.sleuth.test.TestSpanHandler; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +public class FlatMapTests extends org.springframework.cloud.sleuth.instrument.reactor.sample.FlatMapTests { + + @Override + protected Class testConfiguration() { + return Config.class; + } + + @Configuration(proxyBeanMethods = false) + static class Config { + + @Bean + TestSpanHandler testSpanHandlerSupplier(brave.test.TestSpanHandler testSpanHandler) { + return new BraveTestSpanHandler(testSpanHandler); + } + + @Bean + Sampler alwaysSampler() { + return Sampler.ALWAYS_SAMPLE; + } + + @Bean + brave.test.TestSpanHandler braveTestSpanHandler() { + return new brave.test.TestSpanHandler(); + } + + } + +} diff --git a/tests/brave/spring-cloud-sleuth-instrumentation-reactor-tests/src/test/java/org/springframework/cloud/sleuth/brave/instrument/reactor/FlowsScopePassingSpanSubscriberTests.java b/tests/brave/spring-cloud-sleuth-instrumentation-reactor-tests/src/test/java/org/springframework/cloud/sleuth/brave/instrument/reactor/FlowsScopePassingSpanSubscriberTests.java new file mode 100644 index 000000000..d3fd5806c --- /dev/null +++ b/tests/brave/spring-cloud-sleuth-instrumentation-reactor-tests/src/test/java/org/springframework/cloud/sleuth/brave/instrument/reactor/FlowsScopePassingSpanSubscriberTests.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.brave.instrument.reactor; + +import org.springframework.cloud.sleuth.CurrentTraceContext; +import org.springframework.cloud.sleuth.TraceContext; +import org.springframework.cloud.sleuth.brave.bridge.BraveAccessor; + +/** + * @author Marcin Grzejszczak + */ +public class FlowsScopePassingSpanSubscriberTests + extends org.springframework.cloud.sleuth.instrument.reactor.FlowsScopePassingSpanSubscriberTests { + + brave.propagation.CurrentTraceContext traceContext = brave.propagation.CurrentTraceContext.Default.create(); + + CurrentTraceContext currentTraceContext = BraveAccessor.currentTraceContext(traceContext); + + TraceContext context = BraveAccessor + .traceContext(brave.propagation.TraceContext.newBuilder().traceId(1).spanId(1).sampled(true).build()); + + @Override + protected CurrentTraceContext currentTraceContext() { + return this.currentTraceContext; + } + + @Override + protected TraceContext context() { + return this.context; + } + +} diff --git a/tests/brave/spring-cloud-sleuth-instrumentation-reactor-tests/src/test/java/org/springframework/cloud/sleuth/brave/instrument/reactor/ScopePassingSpanSubscriberSpringBootTests.java b/tests/brave/spring-cloud-sleuth-instrumentation-reactor-tests/src/test/java/org/springframework/cloud/sleuth/brave/instrument/reactor/ScopePassingSpanSubscriberSpringBootTests.java new file mode 100644 index 000000000..1756ee5da --- /dev/null +++ b/tests/brave/spring-cloud-sleuth-instrumentation-reactor-tests/src/test/java/org/springframework/cloud/sleuth/brave/instrument/reactor/ScopePassingSpanSubscriberSpringBootTests.java @@ -0,0 +1,76 @@ +/* + * 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.reactor; + +import brave.sampler.Sampler; + +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.cloud.sleuth.TraceContext; +import org.springframework.cloud.sleuth.brave.BraveTestSpanHandler; +import org.springframework.cloud.sleuth.brave.bridge.BraveAccessor; +import org.springframework.cloud.sleuth.test.TestSpanHandler; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * Like {@link ScopePassingSpanSubscriberTests}, except this tests wiring with spring boot + * config. + */ +@SpringBootTest(classes = ScopePassingSpanSubscriberSpringBootTests.Config.class, + webEnvironment = SpringBootTest.WebEnvironment.NONE) +public class ScopePassingSpanSubscriberSpringBootTests + extends org.springframework.cloud.sleuth.instrument.reactor.ScopePassingSpanSubscriberSpringBootTests { + + TraceContext context = BraveAccessor + .traceContext(brave.propagation.TraceContext.newBuilder().traceId(1).spanId(1).sampled(true).build()); + + TraceContext context2 = BraveAccessor + .traceContext(brave.propagation.TraceContext.newBuilder().traceId(1).spanId(2).sampled(true).build()); + + @Override + protected TraceContext context() { + return this.context; + } + + @Override + protected TraceContext context2() { + return this.context2; + } + + @Configuration(proxyBeanMethods = false) + @EnableAutoConfiguration + static class Config { + + @Bean + TestSpanHandler testSpanHandlerSupplier(brave.test.TestSpanHandler testSpanHandler) { + return new BraveTestSpanHandler(testSpanHandler); + } + + @Bean + Sampler alwaysSampler() { + return Sampler.ALWAYS_SAMPLE; + } + + @Bean + brave.test.TestSpanHandler braveTestSpanHandler() { + return new brave.test.TestSpanHandler(); + } + + } + +} diff --git a/tests/brave/spring-cloud-sleuth-instrumentation-reactor-tests/src/test/java/org/springframework/cloud/sleuth/brave/instrument/reactor/ScopePassingSpanSubscriberTests.java b/tests/brave/spring-cloud-sleuth-instrumentation-reactor-tests/src/test/java/org/springframework/cloud/sleuth/brave/instrument/reactor/ScopePassingSpanSubscriberTests.java new file mode 100644 index 000000000..66f18cb11 --- /dev/null +++ b/tests/brave/spring-cloud-sleuth-instrumentation-reactor-tests/src/test/java/org/springframework/cloud/sleuth/brave/instrument/reactor/ScopePassingSpanSubscriberTests.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.brave.instrument.reactor; + +import brave.propagation.StrictCurrentTraceContext; + +import org.springframework.cloud.sleuth.CurrentTraceContext; +import org.springframework.cloud.sleuth.TraceContext; +import org.springframework.cloud.sleuth.brave.bridge.BraveAccessor; + +/** + * @author Marcin Grzejszczak + */ +public class ScopePassingSpanSubscriberTests + extends org.springframework.cloud.sleuth.instrument.reactor.ScopePassingSpanSubscriberTests { + + StrictCurrentTraceContext traceContext = StrictCurrentTraceContext.create(); + + CurrentTraceContext currentTraceContext = BraveAccessor.currentTraceContext(traceContext); + + TraceContext context = BraveAccessor + .traceContext(brave.propagation.TraceContext.newBuilder().traceId(1).spanId(1).sampled(true).build()); + + TraceContext context2 = BraveAccessor + .traceContext(brave.propagation.TraceContext.newBuilder().traceId(1).spanId(2).sampled(true).build()); + + @Override + protected CurrentTraceContext currentTraceContext() { + return this.currentTraceContext; + } + + @Override + protected TraceContext context() { + return this.context; + } + + @Override + protected TraceContext context2() { + return this.context2; + } + +} diff --git a/tests/brave/spring-cloud-sleuth-instrumentation-reactor-tests/src/test/java/org/springframework/cloud/sleuth/instrument/web/client/ITSpringConfiguredReactorClient.java b/tests/brave/spring-cloud-sleuth-instrumentation-reactor-tests/src/test/java/org/springframework/cloud/sleuth/instrument/web/client/ITSpringConfiguredReactorClient.java index 977db36af..d0e9d0aad 100644 --- a/tests/brave/spring-cloud-sleuth-instrumentation-reactor-tests/src/test/java/org/springframework/cloud/sleuth/instrument/web/client/ITSpringConfiguredReactorClient.java +++ b/tests/brave/spring-cloud-sleuth-instrumentation-reactor-tests/src/test/java/org/springframework/cloud/sleuth/instrument/web/client/ITSpringConfiguredReactorClient.java @@ -37,7 +37,7 @@ import reactor.core.publisher.BaseSubscriber; import reactor.core.publisher.Mono; import reactor.netty.http.client.HttpClient; -import org.springframework.cloud.sleuth.instrument.reactor.TraceReactorAutoConfigurationAccessorConfiguration; +import org.springframework.cloud.sleuth.autoconfig.instrument.reactor.TraceReactorAutoConfigurationAccessorConfiguration; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import static brave.Span.Kind.CLIENT; diff --git a/tests/brave/spring-cloud-sleuth-instrumentation-reactor-tests/src/test/java/org/springframework/cloud/sleuth/instrument/web/client/ReactorNettyHttpClientBraveTests.java b/tests/brave/spring-cloud-sleuth-instrumentation-reactor-tests/src/test/java/org/springframework/cloud/sleuth/instrument/web/client/ReactorNettyHttpClientBraveTests.java index c6e5fd5da..c35e89e5f 100644 --- a/tests/brave/spring-cloud-sleuth-instrumentation-reactor-tests/src/test/java/org/springframework/cloud/sleuth/instrument/web/client/ReactorNettyHttpClientBraveTests.java +++ b/tests/brave/spring-cloud-sleuth-instrumentation-reactor-tests/src/test/java/org/springframework/cloud/sleuth/instrument/web/client/ReactorNettyHttpClientBraveTests.java @@ -24,7 +24,7 @@ import reactor.netty.ByteBufFlux; import reactor.netty.http.client.HttpClient; import org.springframework.beans.factory.config.BeanPostProcessor; -import org.springframework.cloud.sleuth.instrument.reactor.TraceReactorAutoConfigurationAccessorConfiguration; +import org.springframework.cloud.sleuth.autoconfig.instrument.reactor.TraceReactorAutoConfigurationAccessorConfiguration; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.web.reactive.function.client.WebClient; diff --git a/tests/brave/spring-cloud-sleuth-instrumentation-rxjava-tests/pom.xml b/tests/brave/spring-cloud-sleuth-instrumentation-rxjava-tests/pom.xml index a8a411e39..58e88f028 100644 --- a/tests/brave/spring-cloud-sleuth-instrumentation-rxjava-tests/pom.xml +++ b/tests/brave/spring-cloud-sleuth-instrumentation-rxjava-tests/pom.xml @@ -51,34 +51,34 @@ + + org.springframework.cloud + spring-cloud-sleuth-tests-common + ${project.version} + org.springframework.cloud spring-cloud-starter-sleuth org.springframework.cloud - spring-cloud-sleuth-brave - test + spring-cloud-starter-sleuth org.springframework.boot spring-boot-starter-test - test io.zipkin.brave brave-tests - test org.awaitility awaitility - test io.reactivex rxjava - true diff --git a/tests/brave/spring-cloud-sleuth-instrumentation-rxjava-tests/src/test/java/org/springframework/cloud/sleuth/instrument/rxjava/SleuthRxJavaSchedulersHookTests.java b/tests/brave/spring-cloud-sleuth-instrumentation-rxjava-tests/src/test/java/org/springframework/cloud/sleuth/instrument/rxjava/SleuthRxJavaSchedulersHookTests.java index d8966d636..8ab4bda76 100644 --- a/tests/brave/spring-cloud-sleuth-instrumentation-rxjava-tests/src/test/java/org/springframework/cloud/sleuth/instrument/rxjava/SleuthRxJavaSchedulersHookTests.java +++ b/tests/brave/spring-cloud-sleuth-instrumentation-rxjava-tests/src/test/java/org/springframework/cloud/sleuth/instrument/rxjava/SleuthRxJavaSchedulersHookTests.java @@ -38,9 +38,8 @@ import rx.plugins.RxJavaObservableExecutionHook; import rx.plugins.RxJavaPlugins; import rx.plugins.RxJavaSchedulersHook; -import org.springframework.cloud.sleuth.api.Tracer; -import org.springframework.cloud.sleuth.brave.bridge.BraveBaggageManager; -import org.springframework.cloud.sleuth.brave.bridge.BraveTracer; +import org.springframework.cloud.sleuth.Tracer; +import org.springframework.cloud.sleuth.brave.bridge.BraveAccessor; import static org.assertj.core.api.BDDAssertions.then; @@ -60,9 +59,7 @@ public class SleuthRxJavaSchedulersHookTests { Tracing tracing = Tracing.newBuilder().currentTraceContext(this.currentTraceContext).addSpanHandler(this.spans) .build(); - BraveBaggageManager braveBaggageManager = new BraveBaggageManager(); - - Tracer tracer = BraveTracer.fromBrave(this.tracing.tracer(), this.braveBaggageManager); + Tracer tracer = BraveAccessor.tracer(this.tracing.tracer()); @AfterEach public void clean() { diff --git a/tests/brave/spring-cloud-sleuth-instrumentation-scheduling-tests/pom.xml b/tests/brave/spring-cloud-sleuth-instrumentation-scheduling-tests/pom.xml index 16b1f91cc..8864fb685 100644 --- a/tests/brave/spring-cloud-sleuth-instrumentation-scheduling-tests/pom.xml +++ b/tests/brave/spring-cloud-sleuth-instrumentation-scheduling-tests/pom.xml @@ -57,23 +57,19 @@ org.springframework.cloud - spring-cloud-sleuth-brave - test + spring-cloud-starter-sleuth org.springframework.boot spring-boot-starter-test - test io.zipkin.brave brave-tests - test org.awaitility awaitility - test diff --git a/tests/brave/spring-cloud-sleuth-instrumentation-webflux-tests/pom.xml b/tests/brave/spring-cloud-sleuth-instrumentation-webflux-tests/pom.xml index 2633d5891..0f82ac3bb 100644 --- a/tests/brave/spring-cloud-sleuth-instrumentation-webflux-tests/pom.xml +++ b/tests/brave/spring-cloud-sleuth-instrumentation-webflux-tests/pom.xml @@ -74,8 +74,7 @@ org.springframework.cloud - spring-cloud-sleuth-brave - test + spring-cloud-starter-sleuth org.springframework.boot @@ -92,17 +91,14 @@ org.springframework.boot spring-boot-starter-test - test io.zipkin.brave brave-tests - test org.awaitility awaitility - test diff --git a/tests/brave/spring-cloud-sleuth-instrumentation-webflux-tests/src/test/java/org/springframework/cloud/sleuth/brave/instrument/web/client/HttpClientBeanPostProcessorTest.java b/tests/brave/spring-cloud-sleuth-instrumentation-webflux-tests/src/test/java/org/springframework/cloud/sleuth/brave/instrument/web/client/HttpClientBeanPostProcessorTest.java index 5b4fd9384..2c53a02f5 100644 --- a/tests/brave/spring-cloud-sleuth-instrumentation-webflux-tests/src/test/java/org/springframework/cloud/sleuth/brave/instrument/web/client/HttpClientBeanPostProcessorTest.java +++ b/tests/brave/spring-cloud-sleuth-instrumentation-webflux-tests/src/test/java/org/springframework/cloud/sleuth/brave/instrument/web/client/HttpClientBeanPostProcessorTest.java @@ -16,16 +16,16 @@ package org.springframework.cloud.sleuth.brave.instrument.web.client; -import org.springframework.cloud.sleuth.api.TraceContext; -import org.springframework.cloud.sleuth.brave.bridge.BraveTraceContext; +import org.springframework.cloud.sleuth.TraceContext; +import org.springframework.cloud.sleuth.brave.bridge.BraveAccessor; public class HttpClientBeanPostProcessorTest extends org.springframework.cloud.sleuth.instrument.web.client.HttpClientBeanPostProcessorTest { @Override public TraceContext traceContext() { - return BraveTraceContext - .fromBrave(brave.propagation.TraceContext.newBuilder().traceId(1).spanId(2).sampled(true).build()); + return BraveAccessor + .traceContext(brave.propagation.TraceContext.newBuilder().traceId(1).spanId(2).sampled(true).build()); } } diff --git a/tests/brave/spring-cloud-sleuth-instrumentation-webflux-tests/src/test/java/org/springframework/cloud/sleuth/brave/instrument/web/client/ReactorNettyHttpClientSpringBootTests.java b/tests/brave/spring-cloud-sleuth-instrumentation-webflux-tests/src/test/java/org/springframework/cloud/sleuth/brave/instrument/web/client/ReactorNettyHttpClientSpringBootTests.java index 3f153b506..c56a87dab 100644 --- a/tests/brave/spring-cloud-sleuth-instrumentation-webflux-tests/src/test/java/org/springframework/cloud/sleuth/brave/instrument/web/client/ReactorNettyHttpClientSpringBootTests.java +++ b/tests/brave/spring-cloud-sleuth-instrumentation-webflux-tests/src/test/java/org/springframework/cloud/sleuth/brave/instrument/web/client/ReactorNettyHttpClientSpringBootTests.java @@ -23,10 +23,10 @@ import brave.sampler.Sampler; import org.assertj.core.api.Assertions; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.cloud.sleuth.api.TraceContext; -import org.springframework.cloud.sleuth.api.exporter.FinishedSpan; +import org.springframework.cloud.sleuth.TraceContext; import org.springframework.cloud.sleuth.brave.BraveTestSpanHandler; -import org.springframework.cloud.sleuth.brave.bridge.BraveTraceContext; +import org.springframework.cloud.sleuth.brave.bridge.BraveAccessor; +import org.springframework.cloud.sleuth.exporter.FinishedSpan; import org.springframework.cloud.sleuth.test.TestSpanHandler; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -39,8 +39,8 @@ public class ReactorNettyHttpClientSpringBootTests @Override public TraceContext traceContext() { - return BraveTraceContext - .fromBrave(brave.propagation.TraceContext.newBuilder().traceId(1).spanId(2).sampled(true).build()); + return BraveAccessor + .traceContext(brave.propagation.TraceContext.newBuilder().traceId(1).spanId(2).sampled(true).build()); } @Override diff --git a/tests/brave/spring-cloud-sleuth-zipkin-tests/pom.xml b/tests/brave/spring-cloud-sleuth-zipkin-tests/pom.xml new file mode 100644 index 000000000..ecea79f6f --- /dev/null +++ b/tests/brave/spring-cloud-sleuth-zipkin-tests/pom.xml @@ -0,0 +1,151 @@ + + + + + 4.0.0 + + spring-cloud-sleuth-zipkin-tests + jar + Spring Cloud Sleuth Brave Zipkin Tests + Spring Cloud Sleuth Brave Zipkin Tests + + + org.springframework.cloud + spring-cloud-sleuth-tests-brave + 3.0.0-SNAPSHOT + .. + + + + true + + + + + + + maven-deploy-plugin + + true + + + + + + + + org.springframework.cloud + spring-cloud-sleuth-tests-common + ${project.version} + + + org.springframework.boot + spring-boot-starter-actuator + + + org.springframework.cloud + spring-cloud-sleuth-zipkin + + + org.springframework.cloud + spring-cloud-starter-sleuth + + + org.springframework.kafka + spring-kafka + + + org.springframework.amqp + spring-rabbit + + + io.zipkin.zipkin2 + zipkin + + + io.zipkin.reporter2 + zipkin-reporter + + + io.zipkin.reporter2 + zipkin-reporter-brave + + + io.zipkin.reporter2 + zipkin-sender-kafka + + + + org.apache.kafka + kafka-clients + + + + + io.zipkin.reporter2 + zipkin-sender-activemq-client + + + org.apache.activemq + activemq-client + + + + + org.apache.activemq + activemq-client + + + io.zipkin.reporter2 + zipkin-sender-amqp-client + + + + com.rabbitmq + amqp-client + + + + + org.springframework.boot + spring-boot-starter-test + + + io.zipkin.brave + brave-tests + + + org.awaitility + awaitility + + + com.squareup.okhttp3 + mockwebserver + + + com.squareup.okhttp3 + okhttp + + 4.8.0 + + + + diff --git a/spring-cloud-sleuth-zipkin/src/test/java/org/springframework/cloud/sleuth/zipkin2/BraveDefaultEndpointLocatorConfigurationTest.java b/tests/brave/spring-cloud-sleuth-zipkin-tests/src/test/java/org/springframework/cloud/sleuth/autoconfig/zipkin2/BraveDefaultEndpointLocatorConfigurationTest.java similarity index 59% rename from spring-cloud-sleuth-zipkin/src/test/java/org/springframework/cloud/sleuth/zipkin2/BraveDefaultEndpointLocatorConfigurationTest.java rename to tests/brave/spring-cloud-sleuth-zipkin-tests/src/test/java/org/springframework/cloud/sleuth/autoconfig/zipkin2/BraveDefaultEndpointLocatorConfigurationTest.java index b450a9410..04cf3c7c1 100644 --- a/spring-cloud-sleuth-zipkin/src/test/java/org/springframework/cloud/sleuth/zipkin2/BraveDefaultEndpointLocatorConfigurationTest.java +++ b/tests/brave/spring-cloud-sleuth-zipkin-tests/src/test/java/org/springframework/cloud/sleuth/autoconfig/zipkin2/BraveDefaultEndpointLocatorConfigurationTest.java @@ -14,31 +14,11 @@ * limitations under the License. */ -package org.springframework.cloud.sleuth.zipkin2; +package org.springframework.cloud.sleuth.autoconfig.zipkin2; /** * @author Matcin Wielgus */ public class BraveDefaultEndpointLocatorConfigurationTest extends DefaultEndpointLocatorConfigurationTest { - @Override - protected Class emptyConfiguration() { - return BraveEmptyConfiguration.class; - } - - @Override - protected Class configurationWithRegistrationClass() { - return BraveConfigurationWithRegistration.class; - } - - @Override - protected Class configurationWithCustomLocatorClass() { - return BraveConfigurationWithCustomLocator.class; - } - - @Override - protected EndpointLocator locatorFromConfiguration() { - return BraveConfigurationWithCustomLocator.locator; - } - } diff --git a/tests/brave/spring-cloud-sleuth-zipkin-tests/src/test/java/org/springframework/cloud/sleuth/autoconfig/zipkin2/BraveZipkinAutoConfigurationTests.java b/tests/brave/spring-cloud-sleuth-zipkin-tests/src/test/java/org/springframework/cloud/sleuth/autoconfig/zipkin2/BraveZipkinAutoConfigurationTests.java new file mode 100644 index 000000000..63d471246 --- /dev/null +++ b/tests/brave/spring-cloud-sleuth-zipkin-tests/src/test/java/org/springframework/cloud/sleuth/autoconfig/zipkin2/BraveZipkinAutoConfigurationTests.java @@ -0,0 +1,148 @@ +/* + * 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 java.util.ArrayList; +import java.util.concurrent.TimeUnit; + +import brave.handler.MutableSpan; +import brave.handler.SpanHandler; +import brave.propagation.TraceContext; +import brave.sampler.Sampler; +import okhttp3.mockwebserver.RecordedRequest; +import org.awaitility.Awaitility; +import org.junit.jupiter.api.Test; +import zipkin2.reporter.AsyncReporter; +import zipkin2.reporter.Reporter; +import zipkin2.reporter.Sender; +import zipkin2.reporter.brave.ZipkinSpanHandler; + +import org.springframework.cloud.sleuth.Tracer; +import org.springframework.cloud.sleuth.autoconfig.brave.BraveAutoConfiguration; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.BDDAssertions.then; +import static org.mockito.Mockito.mock; +import static org.springframework.cloud.sleuth.autoconfig.zipkin2.ZipkinBraveConfiguration.SPAN_HANDLER_COMPARATOR; + +public class BraveZipkinAutoConfigurationTests + extends org.springframework.cloud.sleuth.autoconfig.zipkin2.ZipkinAutoConfigurationTests { + + @Override + protected Class tracerZipkinConfiguration() { + return ZipkinBraveConfiguration.class; + } + + @Override + protected Class tracerConfiguration() { + return BraveAutoConfiguration.class; + } + + @Override + protected Class configurationClass() { + return Config.class; + } + + @Test + public void supportsMultipleReporters() throws Exception { + zipkinRunner().withUserConfiguration(MultipleReportersConfig.class) + .withPropertyValues("spring.zipkin.base-url=" + this.server.url("/").toString()).run(context -> { + then(context.getBeansOfType(Sender.class)).hasSize(2); + then(context.getBeansOfType(Sender.class)).containsKeys(ZipkinAutoConfiguration.SENDER_BEAN_NAME, + "otherSender"); + + then(context.getBeansOfType(Reporter.class)).hasSize(2); + then(context.getBeansOfType(Reporter.class)) + .containsKeys(ZipkinAutoConfiguration.REPORTER_BEAN_NAME, "otherReporter"); + + context.getBean(Tracer.class).nextSpan().name("foo").tag("foo", "bar").start().end(); + + context.getBean(ZipkinAutoConfiguration.REPORTER_BEAN_NAME, AsyncReporter.class).flush(); + Awaitility.await().atMost(250, TimeUnit.MILLISECONDS) + .untilAsserted(() -> then(this.server.getRequestCount()).isGreaterThan(1)); + + Awaitility.await().atMost(5, TimeUnit.SECONDS).untilAsserted(() -> { + RecordedRequest request = this.server.takeRequest(1, TimeUnit.SECONDS); + then(request.getPath()).isEqualTo("/api/v2/spans"); + then(request.getBody().readUtf8()).contains("localEndpoint"); + }); + + MultipleReportersConfig.OtherSender sender = context + .getBean(MultipleReportersConfig.OtherSender.class); + Awaitility.await().atMost(250, TimeUnit.MILLISECONDS) + .untilAsserted(() -> then(sender.isSpanSent()).isTrue()); + }); + } + + @Test + void span_handler_comparator() { + SpanHandler handler1 = mock(SpanHandler.class); + SpanHandler handler2 = mock(SpanHandler.class); + ZipkinSpanHandler zipkin1 = mock(ZipkinSpanHandler.class); + ZipkinSpanHandler zipkin2 = mock(ZipkinSpanHandler.class); + + ArrayList spanHandlers = new ArrayList<>(); + spanHandlers.add(handler1); + spanHandlers.add(zipkin1); + spanHandlers.add(handler2); + spanHandlers.add(zipkin2); + + spanHandlers.sort(SPAN_HANDLER_COMPARATOR); + + assertThat(spanHandlers).containsExactly(handler1, handler2, zipkin1, zipkin2); + } + + @Configuration(proxyBeanMethods = false) + protected static class Config { + + @Bean + Sampler sampler() { + return Sampler.ALWAYS_SAMPLE; + } + + } + + @Configuration(proxyBeanMethods = false) + protected static class HandlersConfig { + + @Bean + SpanHandler handlerOne() { + return new SpanHandler() { + @Override + public boolean end(TraceContext traceContext, MutableSpan span, Cause cause) { + span.name("foo"); + return true; // keep this span + } + }; + } + + @Bean + SpanHandler handlerTwo() { + return new SpanHandler() { + @Override + public boolean end(TraceContext traceContext, MutableSpan span, Cause cause) { + span.name(span.name() + " bar"); + return true; // keep this span + } + }; + } + + } + +} diff --git a/spring-cloud-sleuth-zipkin/src/test/java/org/springframework/cloud/sleuth/zipkin2/BraveZipkinDiscoveryClientTests.java b/tests/brave/spring-cloud-sleuth-zipkin-tests/src/test/java/org/springframework/cloud/sleuth/autoconfig/zipkin2/BraveZipkinDiscoveryClientTests.java similarity index 79% rename from spring-cloud-sleuth-zipkin/src/test/java/org/springframework/cloud/sleuth/zipkin2/BraveZipkinDiscoveryClientTests.java rename to tests/brave/spring-cloud-sleuth-zipkin-tests/src/test/java/org/springframework/cloud/sleuth/autoconfig/zipkin2/BraveZipkinDiscoveryClientTests.java index 621dc3197..d5b71be30 100644 --- a/spring-cloud-sleuth-zipkin/src/test/java/org/springframework/cloud/sleuth/zipkin2/BraveZipkinDiscoveryClientTests.java +++ b/tests/brave/spring-cloud-sleuth-zipkin-tests/src/test/java/org/springframework/cloud/sleuth/autoconfig/zipkin2/BraveZipkinDiscoveryClientTests.java @@ -14,21 +14,21 @@ * limitations under the License. */ -package org.springframework.cloud.sleuth.zipkin2; +package org.springframework.cloud.sleuth.autoconfig.zipkin2; import brave.sampler.Sampler; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.cloud.sleuth.otel.autoconfig.TraceOtelAutoConfiguration; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @SpringBootTest(classes = BraveZipkinDiscoveryClientTests.TestConfig.class) -public class BraveZipkinDiscoveryClientTests extends ZipkinDiscoveryClientTests { +public class BraveZipkinDiscoveryClientTests + extends org.springframework.cloud.sleuth.zipkin2.ZipkinDiscoveryClientTests { @Configuration(proxyBeanMethods = false) - @EnableAutoConfiguration(exclude = TraceOtelAutoConfiguration.class) + @EnableAutoConfiguration static class TestConfig { @Bean diff --git a/tests/brave/spring-cloud-sleuth-zipkin-tests/src/test/resources/application.yml b/tests/brave/spring-cloud-sleuth-zipkin-tests/src/test/resources/application.yml new file mode 100644 index 000000000..caf171df7 --- /dev/null +++ b/tests/brave/spring-cloud-sleuth-zipkin-tests/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 \ No newline at end of file diff --git a/tests/common/pom.xml b/tests/common/pom.xml index 86e50d1f5..3ee08d7da 100644 --- a/tests/common/pom.xml +++ b/tests/common/pom.xml @@ -41,7 +41,7 @@ org.springframework.cloud - spring-cloud-sleuth-core + spring-cloud-sleuth-instrumentation org.springframework.boot @@ -118,6 +118,11 @@ httpclient true + + org.springframework.cloud + spring-cloud-sleuth-autoconfigure + true + org.springframework.cloud spring-cloud-sleuth-brave @@ -138,6 +143,71 @@ opentelemetry-extension-trace-propagators true + + org.springframework.cloud + spring-cloud-sleuth-zipkin + true + + + io.opentelemetry + opentelemetry-exporter-zipkin + true + + + io.zipkin.zipkin2 + zipkin + true + + + io.zipkin.reporter2 + zipkin-reporter + true + + + io.zipkin.reporter2 + zipkin-reporter-brave + true + + + io.zipkin.reporter2 + zipkin-sender-kafka + true + + + + org.apache.kafka + kafka-clients + + + + + io.zipkin.reporter2 + zipkin-sender-activemq-client + true + + + org.apache.activemq + activemq-client + + + + + org.apache.activemq + activemq-client + true + + + io.zipkin.reporter2 + zipkin-sender-amqp-client + true + + + + com.rabbitmq + amqp-client + + + diff --git a/spring-cloud-sleuth-zipkin/src/test/java/org/springframework/cloud/sleuth/zipkin2/DefaultEndpointLocatorConfigurationTest.java b/tests/common/src/main/java/org/springframework/cloud/sleuth/autoconfig/zipkin2/DefaultEndpointLocatorConfigurationTest.java similarity index 56% rename from spring-cloud-sleuth-zipkin/src/test/java/org/springframework/cloud/sleuth/zipkin2/DefaultEndpointLocatorConfigurationTest.java rename to tests/common/src/main/java/org/springframework/cloud/sleuth/autoconfig/zipkin2/DefaultEndpointLocatorConfigurationTest.java index a09e37c9c..7eff7f51d 100644 --- a/spring-cloud-sleuth-zipkin/src/test/java/org/springframework/cloud/sleuth/zipkin2/DefaultEndpointLocatorConfigurationTest.java +++ b/tests/common/src/main/java/org/springframework/cloud/sleuth/autoconfig/zipkin2/DefaultEndpointLocatorConfigurationTest.java @@ -14,25 +14,26 @@ * limitations under the License. */ -package org.springframework.cloud.sleuth.zipkin2; +package org.springframework.cloud.sleuth.autoconfig.zipkin2; import java.net.InetAddress; import java.net.URI; import java.net.UnknownHostException; import java.util.Map; +import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; import org.mockito.Mockito; -import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.web.ServerProperties; +import org.springframework.boot.test.context.runner.ApplicationContextRunner; import org.springframework.cloud.client.serviceregistry.Registration; import org.springframework.cloud.commons.util.InetUtils; import org.springframework.cloud.commons.util.InetUtilsProperties; -import org.springframework.cloud.sleuth.brave.autoconfig.TraceBraveAutoConfiguration; -import org.springframework.cloud.sleuth.otel.autoconfig.TraceOtelAutoConfiguration; -import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.cloud.sleuth.zipkin2.DefaultEndpointLocator; +import org.springframework.cloud.sleuth.zipkin2.EndpointLocator; +import org.springframework.cloud.sleuth.zipkin2.ZipkinProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.env.Environment; @@ -45,74 +46,55 @@ import static org.assertj.core.api.Assertions.assertThat; */ public abstract class DefaultEndpointLocatorConfigurationTest { - public static final byte[] ADDRESS1234 = { 1, 2, 3, 4 }; + protected static final byte[] ADDRESS1234 = { 1, 2, 3, 4 }; Environment environment = new MockEnvironment(); @Test public void endpointLocatorShouldDefaultToServerPropertiesEndpointLocator() { - ConfigurableApplicationContext ctxt = new SpringApplication(emptyConfiguration()) - .run("--spring.jmx.enabled=false"); - assertThat(ctxt.getBean(EndpointLocator.class)).isInstanceOf(DefaultEndpointLocator.class); - ctxt.close(); - } - - protected Class emptyConfiguration() { - throw new UnsupportedOperationException("Provide configuration"); + new ApplicationContextRunner().withUserConfiguration(EmptyConfiguration.class) + .withPropertyValues("spring.jmx.enabled=false") + .run(ctxt -> assertThat(ctxt).hasSingleBean(DefaultEndpointLocator.class)); } @Test public void endpointLocatorShouldDefaultToServerPropertiesEndpointLocatorEvenWhenDiscoveryClientPresent() { - ConfigurableApplicationContext ctxt = new SpringApplication(configurationWithRegistrationClass()) - .run("--spring.jmx.enabled=false"); - assertThat(ctxt.getBean(EndpointLocator.class)).isInstanceOf(DefaultEndpointLocator.class); - ctxt.close(); - } - - protected Class configurationWithRegistrationClass() { - throw new UnsupportedOperationException("Provide configuration"); + new ApplicationContextRunner().withUserConfiguration(ConfigurationWithRegistration.class) + .withPropertyValues("spring.jmx.enabled=false") + .run(ctxt -> assertThat(ctxt).hasSingleBean(DefaultEndpointLocator.class)); } @Test public void endpointLocatorShouldRespectExistingEndpointLocator() { - ConfigurableApplicationContext ctxt = new SpringApplication(configurationWithCustomLocatorClass()) - .run("--spring.jmx.enabled=false"); - assertThat(ctxt.getBean(EndpointLocator.class)).isSameAs(locatorFromConfiguration()); - ctxt.close(); - } - - protected Class configurationWithCustomLocatorClass() { - throw new UnsupportedOperationException("Provide configuration"); + new ApplicationContextRunner().withUserConfiguration(ConfigurationWithCustomLocator.class) + .withPropertyValues("spring.jmx.enabled=false") + .run(ctxt -> Assertions.assertThat(ctxt.getBean(EndpointLocator.class)) + .isSameAs(ConfigurationWithCustomLocator.locator)); } @Test public void endpointLocatorShouldSetServiceNameToServiceId() { - ConfigurableApplicationContext ctxt = new SpringApplication(configurationWithRegistrationClass()) - .run("--spring.jmx.enabled=false", "--spring.zipkin.locator.discovery.enabled=true"); - assertThat(ctxt.getBean(EndpointLocator.class).local().serviceName()).isEqualTo("from-registration"); - ctxt.close(); + new ApplicationContextRunner().withUserConfiguration(ConfigurationWithRegistration.class) + .withPropertyValues("spring.jmx.enabled=false", "spring.zipkin.locator.discovery.enabled=true") + .run(ctxt -> assertThat(ctxt.getBean(EndpointLocator.class).local().serviceName()) + .isEqualTo("from-registration")); } @Test public void endpointLocatorShouldAcceptServiceNameOverride() { - ConfigurableApplicationContext ctxt = new SpringApplication(configurationWithRegistrationClass()).run( - "--spring.jmx.enabled=false", "--spring.zipkin.locator.discovery.enabled=true", - "--spring.zipkin.service.name=foo"); - assertThat(ctxt.getBean(EndpointLocator.class).local().serviceName()).isEqualTo("foo"); - ctxt.close(); + new ApplicationContextRunner().withUserConfiguration(ConfigurationWithRegistration.class) + .withPropertyValues("spring.jmx.enabled=false", "spring.zipkin.locator.discovery.enabled=true", + "spring.zipkin.service.name=foo") + .run(ctxt -> assertThat(ctxt.getBean(EndpointLocator.class).local().serviceName()).isEqualTo("foo")); } @Test public void endpointLocatorShouldRespectExistingEndpointLocatorEvenWhenAskedToBeDiscovery() { - ConfigurableApplicationContext ctxt = new SpringApplication(configurationWithRegistrationClass(), - configurationWithCustomLocatorClass()).run("--spring.jmx.enabled=false", - "--spring.zipkin.locator.discovery.enabled=true"); - assertThat(ctxt.getBean(EndpointLocator.class)).isSameAs(locatorFromConfiguration()); - ctxt.close(); - } - - protected EndpointLocator locatorFromConfiguration() { - throw new UnsupportedOperationException("Provide the locator"); + new ApplicationContextRunner() + .withUserConfiguration(ConfigurationWithRegistration.class, ConfigurationWithCustomLocator.class) + .withPropertyValues("spring.jmx.enabled=false", "spring.zipkin.locator.discovery.enabled=true") + .run(ctxt -> assertThat(ctxt.getBean(EndpointLocator.class)) + .isSameAs(ConfigurationWithCustomLocator.locator)); } @Test @@ -183,14 +165,14 @@ public abstract class DefaultEndpointLocatorConfigurationTest { } @Configuration(proxyBeanMethods = false) - @EnableAutoConfiguration(exclude = TraceOtelAutoConfiguration.class) - public static class BraveEmptyConfiguration { + @EnableAutoConfiguration + public static class EmptyConfiguration { } @Configuration(proxyBeanMethods = false) - @EnableAutoConfiguration(exclude = TraceOtelAutoConfiguration.class) - public static class BraveConfigurationWithRegistration { + @EnableAutoConfiguration + public static class ConfigurationWithRegistration { @Bean public Registration getRegistration() { @@ -230,68 +212,8 @@ public abstract class DefaultEndpointLocatorConfigurationTest { } @Configuration(proxyBeanMethods = false) - @EnableAutoConfiguration(exclude = TraceOtelAutoConfiguration.class) - public static class BraveConfigurationWithCustomLocator { - - static EndpointLocator locator = Mockito.mock(EndpointLocator.class); - - @Bean - public EndpointLocator getEndpointLocator() { - return locator; - } - - } - - @Configuration(proxyBeanMethods = false) - @EnableAutoConfiguration(exclude = TraceBraveAutoConfiguration.class) - public static class OtelEmptyConfiguration { - - } - - @Configuration(proxyBeanMethods = false) - @EnableAutoConfiguration(exclude = TraceBraveAutoConfiguration.class) - public static class OtelConfigurationWithRegistration { - - @Bean - public Registration getRegistration() { - return new Registration() { - @Override - public String getServiceId() { - return "from-registration"; - } - - @Override - public String getHost() { - return null; - } - - @Override - public int getPort() { - return 0; - } - - @Override - public boolean isSecure() { - return false; - } - - @Override - public URI getUri() { - return null; - } - - @Override - public Map getMetadata() { - return null; - } - }; - } - - } - - @Configuration(proxyBeanMethods = false) - @EnableAutoConfiguration(exclude = TraceBraveAutoConfiguration.class) - public static class OtelConfigurationWithCustomLocator { + @EnableAutoConfiguration + public static class ConfigurationWithCustomLocator { static EndpointLocator locator = Mockito.mock(EndpointLocator.class); diff --git a/tests/common/src/main/java/org/springframework/cloud/sleuth/autoconfig/zipkin2/ZipkinAutoConfigurationTests.java b/tests/common/src/main/java/org/springframework/cloud/sleuth/autoconfig/zipkin2/ZipkinAutoConfigurationTests.java new file mode 100644 index 000000000..1f34584cb --- /dev/null +++ b/tests/common/src/main/java/org/springframework/cloud/sleuth/autoconfig/zipkin2/ZipkinAutoConfigurationTests.java @@ -0,0 +1,406 @@ +/* + * 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 java.io.IOException; +import java.util.List; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; + +import io.micrometer.core.instrument.MeterRegistry; +import io.micrometer.core.instrument.simple.SimpleMeterRegistry; +import okhttp3.mockwebserver.MockWebServer; +import okhttp3.mockwebserver.RecordedRequest; +import org.assertj.core.api.BDDAssertions; +import org.awaitility.Awaitility; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import zipkin2.Call; +import zipkin2.CheckResult; +import zipkin2.codec.Encoding; +import zipkin2.reporter.AsyncReporter; +import zipkin2.reporter.InMemoryReporterMetrics; +import zipkin2.reporter.Reporter; +import zipkin2.reporter.ReporterMetrics; +import zipkin2.reporter.Sender; +import zipkin2.reporter.activemq.ActiveMQSender; +import zipkin2.reporter.amqp.RabbitMQSender; +import zipkin2.reporter.kafka.KafkaSender; +import zipkin2.reporter.metrics.micrometer.MicrometerReporterMetrics; + +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.autoconfigure.AutoConfigurations; +import org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration; +import org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration; +import org.springframework.boot.autoconfigure.jms.activemq.ActiveMQAutoConfiguration; +import org.springframework.boot.autoconfigure.kafka.KafkaAutoConfiguration; +import org.springframework.boot.test.context.FilteredClassLoader; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.runner.ApplicationContextRunner; +import org.springframework.cloud.sleuth.Tracer; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.BDDAssertions.then; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +/** + * Not using {@linkplain SpringBootTest} as we need to change properties per test. + * + * @author Adrian Cole + */ +public abstract class ZipkinAutoConfigurationTests { + + private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() + .withConfiguration(AutoConfigurations.of(ZipkinAutoConfiguration.class, tracerZipkinConfiguration())); + + public MockWebServer server = new MockWebServer(); + + protected abstract Class tracerZipkinConfiguration(); + + protected abstract Class tracerConfiguration(); + + @BeforeEach + void setup() throws IOException { + server.start(); + } + + @AfterEach + void clean() throws IOException { + server.close(); + } + + @Test + void should_apply_micrometer_reporter_metrics_when_meter_registry_bean_present() { + this.contextRunner.withUserConfiguration(WithMeterRegistry.class).run((context) -> { + ReporterMetrics bean = context.getBean(ReporterMetrics.class); + + BDDAssertions.then(bean).isInstanceOf(MicrometerReporterMetrics.class); + }); + } + + @Test + void should_apply_in_memory_metrics_when_meter_registry_bean_missing() { + this.contextRunner.run((context) -> { + ReporterMetrics bean = context.getBean(ReporterMetrics.class); + + BDDAssertions.then(bean).isInstanceOf(InMemoryReporterMetrics.class); + }); + } + + @Test + void should_apply_in_memory_metrics_when_meter_registry_class_missing() { + this.contextRunner.withClassLoader(new FilteredClassLoader(MeterRegistry.class)).run((context) -> { + ReporterMetrics bean = context.getBean(ReporterMetrics.class); + + BDDAssertions.then(bean).isInstanceOf(InMemoryReporterMetrics.class); + }); + } + + @Test + void defaultsToV2Endpoint() throws Exception { + zipkinRunner().withPropertyValues("spring.zipkin.base-url=" + this.server.url("/").toString()).run(context -> { + context.getBean(Tracer.class).nextSpan().name("foo").tag("foo", "bar").start().end(); + + context.getBean(ZipkinAutoConfiguration.REPORTER_BEAN_NAME, AsyncReporter.class).flush(); + Awaitility.await().atMost(250, TimeUnit.MILLISECONDS) + .untilAsserted(() -> then(this.server.getRequestCount()).isGreaterThan(1)); + + Awaitility.await().atMost(5, TimeUnit.SECONDS).untilAsserted(() -> { + RecordedRequest request = this.server.takeRequest(1, TimeUnit.SECONDS); + then(request.getPath()).isEqualTo("/api/v2/spans"); + then(request.getBody().readUtf8()).contains("localEndpoint"); + }); + }); + } + + protected ApplicationContextRunner zipkinRunner() { + return new ApplicationContextRunner() + .withConfiguration(AutoConfigurations.of(ZipkinAutoConfiguration.class, tracerZipkinConfiguration(), + PropertyPlaceholderAutoConfiguration.class, tracerConfiguration(), KafkaAutoConfiguration.class, + RabbitAutoConfiguration.class, ActiveMQAutoConfiguration.class)) + .withUserConfiguration(configurationClass()); + } + + protected abstract Class configurationClass(); + + @Test + public void encoderDirectsEndpoint() throws Exception { + zipkinRunner().withPropertyValues("spring.zipkin.base-url=" + this.server.url("/").toString(), + "spring.zipkin.encoder=JSON_V1").run(context -> { + context.getBean(Tracer.class).nextSpan().name("foo").tag("foo", "bar").start().end(); + + Awaitility.await().atMost(250, TimeUnit.MILLISECONDS) + .untilAsserted(() -> then(this.server.getRequestCount()).isGreaterThan(0)); + + Awaitility.await().atMost(5, TimeUnit.SECONDS).untilAsserted(() -> { + RecordedRequest request = this.server.takeRequest(1, TimeUnit.SECONDS); + then(request.getPath()).isEqualTo("/api/v1/spans"); + then(request.getBody().readUtf8()).contains("binaryAnnotations"); + }); + }); + } + + @Test + public void overrideRabbitMQQueue() throws Exception { + zipkinRunner().withPropertyValues("spring.zipkin.rabbitmq.queue=zipkin2", "spring.zipkin.sender.type=rabbit") + .run(context -> then(context.getBean(Sender.class)).isInstanceOf(RabbitMQSender.class)); + } + + @Test + public void overrideKafkaTopic() throws Exception { + zipkinRunner().withPropertyValues("spring.zipkin.kafka.topic=zipkin2", "spring.zipkin.sender.type=kafka") + .run(context -> then(context.getBean(Sender.class)).isInstanceOf(KafkaSender.class)); + } + + @Test + public void overrideActiveMqQueue() throws Exception { + zipkinRunner() + .withPropertyValues("spring.jms.cache.enabled=false", "spring.zipkin.activemq.queue=zipkin2", + "spring.zipkin.activemq.message-max-bytes=50", "spring.zipkin.sender.type=activemq") + .run(context -> then(context.getBean(Sender.class)).isInstanceOf(ActiveMQSender.class)); + } + + @Test + public void canOverrideBySender() throws Exception { + zipkinRunner().withPropertyValues("spring.zipkin.sender.type=web").run( + context -> then(context.getBean(Sender.class).getClass().getName()).contains("RestTemplateSender")); + } + + @Test + public void canOverrideBySenderAndIsCaseInsensitive() throws Exception { + zipkinRunner().withPropertyValues("spring.zipkin.sender.type=WEB").run( + context -> then(context.getBean(Sender.class).getClass().getName()).contains("RestTemplateSender")); + } + + @Test + public void rabbitWinsWhenKafkaPresent() throws Exception { + zipkinRunner().withPropertyValues("spring.zipkin.sender.type=rabbit") + .run(context -> then(context.getBean(Sender.class)).isInstanceOf(RabbitMQSender.class)); + } + + @Test + public void shouldOverrideDefaultBeans() { + zipkinRunner().withUserConfiguration(MyConfig.class).withPropertyValues("spring.zipkin.sender.type=rabbit", + "spring.zipkin.base-url=" + this.server.url("/").toString()).run(context -> { + then(context.getBeansOfType(Sender.class)).hasSize(1); + then(context.getBeansOfType(Sender.class)).containsKeys(ZipkinAutoConfiguration.SENDER_BEAN_NAME); + + then(context.getBeansOfType(Reporter.class)).hasSize(1); + then(context.getBeansOfType(Reporter.class)) + .containsKeys(ZipkinAutoConfiguration.REPORTER_BEAN_NAME); + + context.getBean(Tracer.class).nextSpan().name("foo").tag("foo", "bar").start().end(); + + Awaitility.await().atMost(250, TimeUnit.MILLISECONDS) + .untilAsserted(() -> then(this.server.getRequestCount()).isEqualTo(0)); + + context.getBean(ZipkinAutoConfiguration.REPORTER_BEAN_NAME, AsyncReporter.class).flush(); + MyConfig.MySender sender = context.getBean(MyConfig.MySender.class); + Awaitility.await().atMost(250, TimeUnit.MILLISECONDS) + .untilAsserted(() -> then(sender.isSpanSent()).isTrue()); + }); + } + + @Test + public void checkResult_onTime() { + Sender sender = mock(Sender.class); + when(sender.check()).thenReturn(CheckResult.OK); + + assertThat(ZipkinAutoConfiguration.checkResult(sender, 200).ok()).isTrue(); + } + + @Test + public void checkResult_onTime_notOk() { + Sender sender = mock(Sender.class); + RuntimeException exception = new RuntimeException("dead"); + when(sender.check()).thenReturn(CheckResult.failed(exception)); + + assertThat(ZipkinAutoConfiguration.checkResult(sender, 200).error()).isSameAs(exception); + } + + /** Bug in {@link Sender} as it shouldn't throw */ + @Test + public void checkResult_thrown() { + Sender sender = mock(Sender.class); + RuntimeException exception = new RuntimeException("dead"); + when(sender.check()).thenThrow(exception); + + assertThat(ZipkinAutoConfiguration.checkResult(sender, 200).error()).isSameAs(exception); + } + + @Test + public void checkResult_slow() { + assertThat(ZipkinAutoConfiguration.checkResult(new Sender() { + @Override + public CheckResult check() { + try { + Thread.sleep(500L); + } + catch (InterruptedException e) { + throw new AssertionError(e); + } + return CheckResult.OK; + } + + @Override + public Encoding encoding() { + return Encoding.JSON; + } + + @Override + public int messageMaxBytes() { + return 0; + } + + @Override + public int messageSizeInBytes(List list) { + return 0; + } + + @Override + public Call sendSpans(List list) { + return Call.create(null); + } + + @Override + public String toString() { + return "FakeSender{}"; + } + }, 200).error()).isInstanceOf(TimeoutException.class).hasMessage("FakeSender{} check() timed out after 200ms"); + } + + @Configuration(proxyBeanMethods = false) + static class WithMeterRegistry { + + @Bean + MeterRegistry meterRegistry() { + return new SimpleMeterRegistry(); + } + + } + + @Configuration(proxyBeanMethods = false) + static class WithReporter { + + @Bean + Reporter spanReporter() { + return zipkin2.Span::toString; + } + + } + + @Configuration(proxyBeanMethods = false) + protected static class MultipleReportersConfig { + + @Bean + Reporter otherReporter(OtherSender otherSender) { + return AsyncReporter.create(otherSender); + } + + @Bean + OtherSender otherSender() { + return new OtherSender(); + } + + static class OtherSender extends Sender { + + private boolean spanSent = false; + + boolean isSpanSent() { + return this.spanSent; + } + + @Override + public Encoding encoding() { + return Encoding.JSON; + } + + @Override + public int messageMaxBytes() { + return Integer.MAX_VALUE; + } + + @Override + public int messageSizeInBytes(List encodedSpans) { + return encoding().listSizeInBytes(encodedSpans); + } + + @Override + public Call sendSpans(List encodedSpans) { + this.spanSent = true; + return Call.create(null); + } + + } + + } + + // tag::override_default_beans[] + + @Configuration(proxyBeanMethods = false) + protected static class MyConfig { + + @Bean(ZipkinAutoConfiguration.REPORTER_BEAN_NAME) + Reporter myReporter(@Qualifier(ZipkinAutoConfiguration.SENDER_BEAN_NAME) MySender mySender) { + return AsyncReporter.create(mySender); + } + + @Bean(ZipkinAutoConfiguration.SENDER_BEAN_NAME) + MySender mySender() { + return new MySender(); + } + + static class MySender extends Sender { + + private boolean spanSent = false; + + boolean isSpanSent() { + return this.spanSent; + } + + @Override + public Encoding encoding() { + return Encoding.JSON; + } + + @Override + public int messageMaxBytes() { + return Integer.MAX_VALUE; + } + + @Override + public int messageSizeInBytes(List encodedSpans) { + return encoding().listSizeInBytes(encodedSpans); + } + + @Override + public Call sendSpans(List encodedSpans) { + this.spanSent = true; + return Call.create(null); + } + + } + + } + + // end::override_default_beans[] + +} diff --git a/tests/common/src/main/java/org/springframework/cloud/sleuth/baggage/BaggageEntryTagSpanHandlerTest.java b/tests/common/src/main/java/org/springframework/cloud/sleuth/baggage/BaggageEntryTagSpanHandlerTest.java index 2e7f6c170..972140657 100644 --- a/tests/common/src/main/java/org/springframework/cloud/sleuth/baggage/BaggageEntryTagSpanHandlerTest.java +++ b/tests/common/src/main/java/org/springframework/cloud/sleuth/baggage/BaggageEntryTagSpanHandlerTest.java @@ -22,19 +22,21 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.cloud.sleuth.api.BaggageInScope; -import org.springframework.cloud.sleuth.api.ScopedSpan; -import org.springframework.cloud.sleuth.api.Tracer; +import org.springframework.cloud.sleuth.BaggageInScope; +import org.springframework.cloud.sleuth.ScopedSpan; +import org.springframework.cloud.sleuth.Tracer; import org.springframework.cloud.sleuth.test.TestSpanHandler; import org.springframework.context.annotation.Configuration; -import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.TestPropertySource; /** * @author Taras Danylchuk */ @ContextConfiguration(classes = BaggageEntryTagSpanHandlerTest.TestConfig.class) -@ActiveProfiles("baggage") // application-baggage.yml +@TestPropertySource(properties = { "spring.sleuth.baggage.remote-fields[0]=country-code", + "spring.sleuth.baggage.remote-fields[1]=x-vcap-request-id", + "spring.sleuth.baggage.tag-fields[0]=country-code" }) public abstract class BaggageEntryTagSpanHandlerTest { BaggageInScope countryCode; @@ -64,11 +66,8 @@ public abstract class BaggageEntryTagSpanHandlerTest { this.span.end(); Assertions.assertThat(this.spans).hasSize(1); - Assertions.assertThat(this.spans.get(0).getTags()).hasSize(1) // REQUEST_ID is not - // in - // the - // tag-fields - .containsEntry(countryCode.name(), "FO"); + // REQUEST_ID is NOT in the tag fields + Assertions.assertThat(this.spans.get(0).getTags()).hasSize(1).containsEntry(countryCode.name(), "FO"); } @EnableAutoConfiguration diff --git a/tests/common/src/main/java/org/springframework/cloud/sleuth/baggage/multiple/DemoApplication.java b/tests/common/src/main/java/org/springframework/cloud/sleuth/baggage/multiple/DemoApplication.java index 904471e48..0485ca987 100644 --- a/tests/common/src/main/java/org/springframework/cloud/sleuth/baggage/multiple/DemoApplication.java +++ b/tests/common/src/main/java/org/springframework/cloud/sleuth/baggage/multiple/DemoApplication.java @@ -23,9 +23,9 @@ 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.BaggageInScope; -import org.springframework.cloud.sleuth.api.Span; -import org.springframework.cloud.sleuth.api.Tracer; +import org.springframework.cloud.sleuth.BaggageInScope; +import org.springframework.cloud.sleuth.Span; +import org.springframework.cloud.sleuth.Tracer; import org.springframework.http.HttpHeaders; import org.springframework.integration.annotation.Aggregator; import org.springframework.integration.annotation.Gateway; diff --git a/tests/common/src/main/java/org/springframework/cloud/sleuth/baggage/multiple/MultipleHopsIntegrationTests.java b/tests/common/src/main/java/org/springframework/cloud/sleuth/baggage/multiple/MultipleHopsIntegrationTests.java index 409d47132..d6bc105fe 100644 --- a/tests/common/src/main/java/org/springframework/cloud/sleuth/baggage/multiple/MultipleHopsIntegrationTests.java +++ b/tests/common/src/main/java/org/springframework/cloud/sleuth/baggage/multiple/MultipleHopsIntegrationTests.java @@ -27,14 +27,11 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration; -import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.web.servlet.context.ServletWebServerInitializedEvent; -import org.springframework.cloud.sleuth.api.BaggageInScope; -import org.springframework.cloud.sleuth.api.Span; -import org.springframework.cloud.sleuth.api.Tracer; -import org.springframework.cloud.sleuth.api.exporter.FinishedSpan; +import org.springframework.cloud.sleuth.BaggageInScope; +import org.springframework.cloud.sleuth.Span; +import org.springframework.cloud.sleuth.Tracer; +import org.springframework.cloud.sleuth.exporter.FinishedSpan; import org.springframework.cloud.sleuth.test.TestSpanHandler; import org.springframework.context.ApplicationListener; import org.springframework.context.annotation.Bean; @@ -53,9 +50,7 @@ import static java.util.stream.Collectors.toList; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.BDDAssertions.then; import static org.awaitility.Awaitility.await; -import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT; -@SpringBootTest(webEnvironment = RANDOM_PORT) @ContextConfiguration(classes = MultipleHopsIntegrationTests.TestConfig.class) @TestPropertySource(properties = { "spring.sleuth.baggage.remote-fields=x-vcap-request-id,country-code", "spring.sleuth.baggage.local-fields=bp", "spring.sleuth.integration.enabled=true" }) @@ -109,7 +104,6 @@ public abstract class MultipleHopsIntegrationTests { @Test public void should_propagate_the_baggage() { Span initialSpan = this.tracer.nextSpan().name("span").start(); - System.out.println("FOO: " + initialSpan.context().traceId()); // tag::baggage[] try (Tracer.SpanInScope ws = this.tracer.withSpan(initialSpan)) { BaggageInScope businessProcess = this.tracer.createBaggage(BUSINESS_PROCESS).set("ALM"); @@ -159,7 +153,6 @@ public abstract class MultipleHopsIntegrationTests { } @Configuration(proxyBeanMethods = false) - @EnableAutoConfiguration(exclude = JmxAutoConfiguration.class) @Import(DemoApplication.class) public static class TestConfig implements ApplicationListener { diff --git a/tests/common/src/main/java/org/springframework/cloud/sleuth/brave/BraveTestSpanHandler.java b/tests/common/src/main/java/org/springframework/cloud/sleuth/brave/BraveTestSpanHandler.java index 3bf992d46..38292b568 100644 --- a/tests/common/src/main/java/org/springframework/cloud/sleuth/brave/BraveTestSpanHandler.java +++ b/tests/common/src/main/java/org/springframework/cloud/sleuth/brave/BraveTestSpanHandler.java @@ -22,9 +22,9 @@ import java.util.stream.Collectors; import brave.test.IntegrationTestSpanHandler; -import org.springframework.cloud.sleuth.api.Span; -import org.springframework.cloud.sleuth.api.exporter.FinishedSpan; -import org.springframework.cloud.sleuth.brave.bridge.BraveFinishedSpan; +import org.springframework.cloud.sleuth.Span; +import org.springframework.cloud.sleuth.brave.bridge.BraveAccessor; +import org.springframework.cloud.sleuth.exporter.FinishedSpan; import org.springframework.cloud.sleuth.test.TestSpanHandler; public class BraveTestSpanHandler implements TestSpanHandler { @@ -50,12 +50,12 @@ public class BraveTestSpanHandler implements TestSpanHandler { @Override public List reportedSpans() { - return this.spans.spans().stream().map(BraveFinishedSpan::new).collect(Collectors.toList()); + return this.spans.spans().stream().map(BraveAccessor::finishedSpan).collect(Collectors.toList()); } @Override public FinishedSpan takeLocalSpan() { - return new BraveFinishedSpan(this.integrationSpans.takeLocalSpan()); + return BraveAccessor.finishedSpan(this.integrationSpans.takeLocalSpan()); } @Override @@ -67,18 +67,18 @@ public class BraveTestSpanHandler implements TestSpanHandler { @Override public FinishedSpan takeRemoteSpan(Span.Kind kind) { - return new BraveFinishedSpan(this.integrationSpans.takeRemoteSpan(brave.Span.Kind.valueOf(kind.name()))); + return BraveAccessor.finishedSpan(this.integrationSpans.takeRemoteSpan(brave.Span.Kind.valueOf(kind.name()))); } @Override public FinishedSpan takeRemoteSpanWithError(Span.Kind kind) { - return new BraveFinishedSpan( - this.integrationSpans.takeRemoteSpanWithError(brave.Span.Kind.valueOf(kind.name()))); + return BraveAccessor + .finishedSpan(this.integrationSpans.takeRemoteSpanWithError(brave.Span.Kind.valueOf(kind.name()))); } @Override public FinishedSpan get(int index) { - return new BraveFinishedSpan(this.spans.get(index)); + return BraveAccessor.finishedSpan(this.spans.get(index)); } @Override @@ -86,4 +86,9 @@ public class BraveTestSpanHandler implements TestSpanHandler { return reportedSpans().iterator(); } + @Override + public String toString() { + return "BraveTestSpanHandler{" + "spans=" + spans + ", integrationSpans=" + integrationSpans + '}'; + } + } diff --git a/tests/common/src/main/java/org/springframework/cloud/sleuth/brave/BraveTestTracing.java b/tests/common/src/main/java/org/springframework/cloud/sleuth/brave/BraveTestTracing.java index f823851d8..16f8fcc9e 100644 --- a/tests/common/src/main/java/org/springframework/cloud/sleuth/brave/BraveTestTracing.java +++ b/tests/common/src/main/java/org/springframework/cloud/sleuth/brave/BraveTestTracing.java @@ -25,19 +25,13 @@ import brave.propagation.StrictScopeDecorator; import brave.propagation.ThreadLocalCurrentTraceContext; import brave.sampler.Sampler; -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.http.HttpRequestParser; -import org.springframework.cloud.sleuth.api.http.HttpServerHandler; -import org.springframework.cloud.sleuth.api.propagation.Propagator; -import org.springframework.cloud.sleuth.brave.bridge.BraveBaggageManager; -import org.springframework.cloud.sleuth.brave.bridge.BraveCurrentTraceContext; -import org.springframework.cloud.sleuth.brave.bridge.BravePropagator; -import org.springframework.cloud.sleuth.brave.bridge.BraveTracer; -import org.springframework.cloud.sleuth.brave.bridge.http.BraveHttpClientHandler; -import org.springframework.cloud.sleuth.brave.bridge.http.BraveHttpRequestParser; -import org.springframework.cloud.sleuth.brave.bridge.http.BraveHttpServerHandler; +import org.springframework.cloud.sleuth.CurrentTraceContext; +import org.springframework.cloud.sleuth.Tracer; +import org.springframework.cloud.sleuth.brave.bridge.BraveAccessor; +import org.springframework.cloud.sleuth.http.HttpClientHandler; +import org.springframework.cloud.sleuth.http.HttpRequestParser; +import org.springframework.cloud.sleuth.http.HttpServerHandler; +import org.springframework.cloud.sleuth.propagation.Propagator; import org.springframework.cloud.sleuth.test.TestSpanHandler; import org.springframework.cloud.sleuth.test.TestTracingAssertions; import org.springframework.cloud.sleuth.test.TestTracingAware; @@ -71,8 +65,6 @@ public class BraveTestTracing implements TracerAware, TestTracingAware, TestTrac brave.Tracer tracer = this.tracing.tracer(); - BraveBaggageManager braveBaggageManager = new BraveBaggageManager(); - HttpTracing httpTracing = httpTracingBuilder().build(); public HttpTracing.Builder httpTracingBuilder() { @@ -81,7 +73,7 @@ public class BraveTestTracing implements TracerAware, TestTracingAware, TestTrac @Override public Tracer tracer() { - return BraveTracer.fromBrave(this.tracer, this.braveBaggageManager); + return BraveAccessor.tracer(this.tracer); } @Override @@ -104,30 +96,30 @@ public class BraveTestTracing implements TracerAware, TestTracingAware, TestTrac @Override public CurrentTraceContext currentTraceContext() { - return BraveCurrentTraceContext.fromBrave(this.context); + return BraveAccessor.currentTraceContext(this.context); } @Override public Propagator propagator() { - return new BravePropagator(this.tracing); + return BraveAccessor.propagator(this.tracing); } @Override public HttpServerHandler httpServerHandler() { - return new BraveHttpServerHandler(brave.http.HttpServerHandler.create(this.httpTracing)); + return BraveAccessor.httpServerHandler(brave.http.HttpServerHandler.create(this.httpTracing)); } @Override public TracerAware clientRequestParser(HttpRequestParser httpRequestParser) { reset(); this.httpTracing = this.httpTracing.toBuilder() - .clientRequestParser(BraveHttpRequestParser.toBrave(httpRequestParser)).build(); + .clientRequestParser(BraveAccessor.httpRequestParser(httpRequestParser)).build(); return this; } @Override public HttpClientHandler httpClientHandler() { - return new BraveHttpClientHandler(brave.http.HttpClientHandler.create(this.httpTracing)); + return BraveAccessor.httpClientHandler(brave.http.HttpClientHandler.create(this.httpTracing)); } @Override diff --git a/tests/common/src/main/java/org/springframework/cloud/sleuth/brave/BraveTestTracingAssertions.java b/tests/common/src/main/java/org/springframework/cloud/sleuth/brave/BraveTestTracingAssertions.java index ba2d4f8bb..0a3d3707e 100644 --- a/tests/common/src/main/java/org/springframework/cloud/sleuth/brave/BraveTestTracingAssertions.java +++ b/tests/common/src/main/java/org/springframework/cloud/sleuth/brave/BraveTestTracingAssertions.java @@ -18,7 +18,7 @@ package org.springframework.cloud.sleuth.brave; import org.assertj.core.api.BDDAssertions; -import org.springframework.cloud.sleuth.api.exporter.FinishedSpan; +import org.springframework.cloud.sleuth.exporter.FinishedSpan; import org.springframework.cloud.sleuth.test.TestTracingAssertions; public class BraveTestTracingAssertions implements TestTracingAssertions { diff --git a/tests/common/src/main/java/org/springframework/cloud/sleuth/brave/bridge/BraveAccessor.java b/tests/common/src/main/java/org/springframework/cloud/sleuth/brave/bridge/BraveAccessor.java new file mode 100644 index 000000000..5462222c6 --- /dev/null +++ b/tests/common/src/main/java/org/springframework/cloud/sleuth/brave/bridge/BraveAccessor.java @@ -0,0 +1,80 @@ +/* + * 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 brave.handler.MutableSpan; + +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.exporter.FinishedSpan; +import org.springframework.cloud.sleuth.http.HttpClientHandler; +import org.springframework.cloud.sleuth.http.HttpRequestParser; +import org.springframework.cloud.sleuth.http.HttpServerHandler; +import org.springframework.cloud.sleuth.propagation.Propagator; + +public final class BraveAccessor { + + private BraveAccessor() { + throw new IllegalStateException("Can't instantiate a utility class"); + } + + public static Tracer tracer(brave.Tracer braveTracer) { + return new BraveTracer(braveTracer, new BraveBaggageManager()); + } + + public static CurrentTraceContext currentTraceContext(brave.propagation.CurrentTraceContext context) { + return BraveCurrentTraceContext.fromBrave(context); + } + + public static TraceContext traceContext(brave.propagation.TraceContext traceContext) { + return BraveTraceContext.fromBrave(traceContext); + } + + public static brave.propagation.TraceContext traceContext(TraceContext traceContext) { + return BraveTraceContext.toBrave(traceContext); + } + + public static brave.Span braveSpan(Span span) { + return BraveSpan.toBrave(span); + } + + public static Propagator propagator(Tracing tracing) { + return new BravePropagator(tracing); + } + + public static HttpClientHandler httpClientHandler( + brave.http.HttpClientHandler delegate) { + return new BraveHttpClientHandler(delegate); + } + + public static HttpServerHandler httpServerHandler( + brave.http.HttpServerHandler delegate) { + return new BraveHttpServerHandler(delegate); + } + + public static brave.http.HttpRequestParser httpRequestParser(HttpRequestParser delegate) { + return BraveHttpRequestParser.toBrave(delegate); + } + + public static FinishedSpan finishedSpan(MutableSpan mutableSpan) { + return new BraveFinishedSpan(mutableSpan); + } + +} diff --git a/tests/common/src/main/java/org/springframework/cloud/sleuth/annotation/NullSpanTagAnnotationHandlerTests.java b/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/annotation/NullSpanTagAnnotationHandlerTests.java similarity index 93% rename from tests/common/src/main/java/org/springframework/cloud/sleuth/annotation/NullSpanTagAnnotationHandlerTests.java rename to tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/annotation/NullSpanTagAnnotationHandlerTests.java index 438aed44b..7eb82595a 100644 --- a/tests/common/src/main/java/org/springframework/cloud/sleuth/annotation/NullSpanTagAnnotationHandlerTests.java +++ b/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/annotation/NullSpanTagAnnotationHandlerTests.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; @@ -25,6 +25,9 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.cloud.sleuth.annotation.NewSpan; +import org.springframework.cloud.sleuth.annotation.SpanTag; +import org.springframework.cloud.sleuth.annotation.TagValueResolver; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.test.context.ContextConfiguration; diff --git a/tests/common/src/main/java/org/springframework/cloud/sleuth/annotation/SleuthSpanCreatorAspectFluxTests.java b/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/annotation/SleuthSpanCreatorAspectFluxTests.java similarity index 96% rename from tests/common/src/main/java/org/springframework/cloud/sleuth/annotation/SleuthSpanCreatorAspectFluxTests.java rename to tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/annotation/SleuthSpanCreatorAspectFluxTests.java index 38e3d3d1d..880b9ee12 100644 --- a/tests/common/src/main/java/org/springframework/cloud/sleuth/annotation/SleuthSpanCreatorAspectFluxTests.java +++ b/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/annotation/SleuthSpanCreatorAspectFluxTests.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.sleuth.annotation; +package org.springframework.cloud.sleuth.instrument.annotation; import java.util.Iterator; import java.util.Map; @@ -33,19 +33,22 @@ import reactor.util.context.Context; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -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.api.exporter.FinishedSpan; +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.cloud.sleuth.annotation.SpanTag; +import org.springframework.cloud.sleuth.exporter.FinishedSpan; import org.springframework.cloud.sleuth.test.TestSpanHandler; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.test.context.ContextConfiguration; import static org.assertj.core.api.BDDAssertions.then; -import static org.springframework.cloud.sleuth.annotation.SleuthSpanCreatorAspectFluxTests.TestBean.TEST_STRING1; -import static org.springframework.cloud.sleuth.annotation.SleuthSpanCreatorAspectFluxTests.TestBean.TEST_STRING2; +import static org.springframework.cloud.sleuth.instrument.annotation.SleuthSpanCreatorAspectFluxTests.TestBean.TEST_STRING1; +import static org.springframework.cloud.sleuth.instrument.annotation.SleuthSpanCreatorAspectFluxTests.TestBean.TEST_STRING2; @ContextConfiguration(classes = SleuthSpanCreatorAspectFluxTests.TestConfiguration.class) public abstract class SleuthSpanCreatorAspectFluxTests { diff --git a/tests/common/src/main/java/org/springframework/cloud/sleuth/annotation/SleuthSpanCreatorAspectMonoTests.java b/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/annotation/SleuthSpanCreatorAspectMonoTests.java similarity index 97% rename from tests/common/src/main/java/org/springframework/cloud/sleuth/annotation/SleuthSpanCreatorAspectMonoTests.java rename to tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/annotation/SleuthSpanCreatorAspectMonoTests.java index 9b21ea580..5eb357b10 100644 --- a/tests/common/src/main/java/org/springframework/cloud/sleuth/annotation/SleuthSpanCreatorAspectMonoTests.java +++ b/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/annotation/SleuthSpanCreatorAspectMonoTests.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.sleuth.annotation; +package org.springframework.cloud.sleuth.instrument.annotation; import java.util.Map; import java.util.Objects; @@ -29,16 +29,19 @@ import reactor.core.publisher.Mono; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.cloud.sleuth.api.Span; -import org.springframework.cloud.sleuth.api.Tracer; -import org.springframework.cloud.sleuth.api.exporter.FinishedSpan; +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.cloud.sleuth.annotation.SpanTag; +import org.springframework.cloud.sleuth.exporter.FinishedSpan; import org.springframework.cloud.sleuth.test.TestSpanHandler; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.test.context.ContextConfiguration; import static org.assertj.core.api.BDDAssertions.then; -import static org.springframework.cloud.sleuth.annotation.SleuthSpanCreatorAspectMonoTests.TestBean.TEST_STRING; +import static org.springframework.cloud.sleuth.instrument.annotation.SleuthSpanCreatorAspectMonoTests.TestBean.TEST_STRING; import static reactor.core.publisher.Mono.just; @ContextConfiguration(classes = SleuthSpanCreatorAspectMonoTests.TestConfiguration.class) diff --git a/tests/common/src/main/java/org/springframework/cloud/sleuth/annotation/SleuthSpanCreatorAspectNegativeTests.java b/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/annotation/SleuthSpanCreatorAspectNegativeTests.java similarity index 94% rename from tests/common/src/main/java/org/springframework/cloud/sleuth/annotation/SleuthSpanCreatorAspectNegativeTests.java rename to tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/annotation/SleuthSpanCreatorAspectNegativeTests.java index 500b47e1a..197dfa947 100644 --- a/tests/common/src/main/java/org/springframework/cloud/sleuth/annotation/SleuthSpanCreatorAspectNegativeTests.java +++ b/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/annotation/SleuthSpanCreatorAspectNegativeTests.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.sleuth.annotation; +package org.springframework.cloud.sleuth.instrument.annotation; import org.assertj.core.api.BDDAssertions; import org.junit.jupiter.api.BeforeEach; @@ -22,6 +22,8 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.cloud.sleuth.annotation.NewSpan; +import org.springframework.cloud.sleuth.annotation.SpanTag; import org.springframework.cloud.sleuth.test.TestSpanHandler; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/tests/common/src/main/java/org/springframework/cloud/sleuth/annotation/SleuthSpanCreatorAspectTests.java b/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/annotation/SleuthSpanCreatorAspectTests.java similarity index 97% rename from tests/common/src/main/java/org/springframework/cloud/sleuth/annotation/SleuthSpanCreatorAspectTests.java rename to tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/annotation/SleuthSpanCreatorAspectTests.java index 54816c9f2..39c24949a 100644 --- a/tests/common/src/main/java/org/springframework/cloud/sleuth/annotation/SleuthSpanCreatorAspectTests.java +++ b/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/annotation/SleuthSpanCreatorAspectTests.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.sleuth.annotation; +package org.springframework.cloud.sleuth.instrument.annotation; import java.util.Map; import java.util.stream.Collectors; @@ -25,8 +25,11 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -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.cloud.sleuth.annotation.SpanTag; import org.springframework.cloud.sleuth.test.TestSpanHandler; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/tests/common/src/main/java/org/springframework/cloud/sleuth/annotation/SleuthSpanCreatorCircularDependencyTests.java b/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/annotation/SleuthSpanCreatorCircularDependencyTests.java similarity index 93% rename from tests/common/src/main/java/org/springframework/cloud/sleuth/annotation/SleuthSpanCreatorCircularDependencyTests.java rename to tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/annotation/SleuthSpanCreatorCircularDependencyTests.java index f6a287966..12555ded1 100644 --- a/tests/common/src/main/java/org/springframework/cloud/sleuth/annotation/SleuthSpanCreatorCircularDependencyTests.java +++ b/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/annotation/SleuthSpanCreatorCircularDependencyTests.java @@ -14,12 +14,13 @@ * limitations under the License. */ -package org.springframework.cloud.sleuth.annotation; +package org.springframework.cloud.sleuth.instrument.annotation; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.cloud.sleuth.annotation.NewSpan; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.test.context.ContextConfiguration; diff --git a/tests/common/src/main/java/org/springframework/cloud/sleuth/annotation/SpanTagAnnotationHandlerTests.java b/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/annotation/SpanTagAnnotationHandlerTests.java similarity index 94% rename from tests/common/src/main/java/org/springframework/cloud/sleuth/annotation/SpanTagAnnotationHandlerTests.java rename to tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/annotation/SpanTagAnnotationHandlerTests.java index a7615fb6e..7286c1e19 100644 --- a/tests/common/src/main/java/org/springframework/cloud/sleuth/annotation/SpanTagAnnotationHandlerTests.java +++ b/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/annotation/SpanTagAnnotationHandlerTests.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; @@ -25,6 +25,9 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.cloud.sleuth.annotation.NewSpan; +import org.springframework.cloud.sleuth.annotation.SpanTag; +import org.springframework.cloud.sleuth.annotation.TagValueResolver; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.test.context.ContextConfiguration; diff --git a/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/async/AsyncDisabledTests.java b/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/async/AsyncDisabledTests.java index b36b512b7..720a56320 100644 --- a/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/async/AsyncDisabledTests.java +++ b/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/async/AsyncDisabledTests.java @@ -27,7 +27,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; -import org.springframework.cloud.sleuth.api.CurrentTraceContext; +import org.springframework.cloud.sleuth.CurrentTraceContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.EnableAsync; diff --git a/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/async/LazyTraceThreadPoolTaskSchedulerTests.java b/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/async/LazyTraceThreadPoolTaskSchedulerTests.java index 1942d513a..ca5affe3b 100644 --- a/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/async/LazyTraceThreadPoolTaskSchedulerTests.java +++ b/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/async/LazyTraceThreadPoolTaskSchedulerTests.java @@ -33,7 +33,7 @@ import org.mockito.junit.jupiter.MockitoExtension; 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; import org.springframework.cloud.sleuth.internal.DefaultSpanNamer; import org.springframework.cloud.sleuth.test.TestTracingAwareSupplier; import org.springframework.scheduling.Trigger; diff --git a/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/async/TraceAsyncListenableTaskExecutorTest.java b/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/async/TraceAsyncListenableTaskExecutorTest.java index 9d1667311..4cfdff322 100644 --- a/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/async/TraceAsyncListenableTaskExecutorTest.java +++ b/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/async/TraceAsyncListenableTaskExecutorTest.java @@ -24,8 +24,8 @@ import org.assertj.core.api.BDDAssertions; import org.awaitility.Awaitility; import org.junit.jupiter.api.Test; -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.DefaultSpanNamer; import org.springframework.cloud.sleuth.test.TestTracingAwareSupplier; import org.springframework.core.task.AsyncListenableTaskExecutor; diff --git a/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/async/TraceCallableTests.java b/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/async/TraceCallableTests.java index 3259d6ab3..346f10536 100644 --- a/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/async/TraceCallableTests.java +++ b/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/async/TraceCallableTests.java @@ -26,9 +26,9 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.cloud.sleuth.Span; import org.springframework.cloud.sleuth.SpanName; -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.DefaultSpanNamer; import org.springframework.cloud.sleuth.test.TestTracingAwareSupplier; diff --git a/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/async/TraceRunnableTests.java b/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/async/TraceRunnableTests.java index 0fbad4955..826fbf0fd 100644 --- a/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/async/TraceRunnableTests.java +++ b/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/async/TraceRunnableTests.java @@ -26,9 +26,9 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.cloud.sleuth.Span; import org.springframework.cloud.sleuth.SpanName; -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.DefaultSpanNamer; import org.springframework.cloud.sleuth.test.TestTracingAwareSupplier; diff --git a/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/async/TraceableExecutorServiceTests.java b/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/async/TraceableExecutorServiceTests.java index fe239a42d..6be6765dc 100644 --- a/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/async/TraceableExecutorServiceTests.java +++ b/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/async/TraceableExecutorServiceTests.java @@ -40,11 +40,11 @@ import org.mockito.Mockito; import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.beans.factory.BeanFactory; +import org.springframework.cloud.sleuth.CurrentTraceContext; +import org.springframework.cloud.sleuth.ScopedSpan; import org.springframework.cloud.sleuth.SpanNamer; -import org.springframework.cloud.sleuth.api.CurrentTraceContext; -import org.springframework.cloud.sleuth.api.ScopedSpan; -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.internal.DefaultSpanNamer; import org.springframework.cloud.sleuth.test.TestTracingAwareSupplier; @@ -206,7 +206,7 @@ public abstract class TraceableExecutorServiceTests implements TestTracingAwareS } BeanFactory beanFactory(boolean refreshed) { - BDDMockito.given(this.beanFactory.getBean(org.springframework.cloud.sleuth.api.Tracer.class)) + BDDMockito.given(this.beanFactory.getBean(org.springframework.cloud.sleuth.Tracer.class)) .willReturn(this.tracer); BDDMockito.given(this.beanFactory.getBean(SpanNamer.class)).willReturn(new DefaultSpanNamer()); SleuthContextListenerAccessor.set(this.beanFactory, refreshed); diff --git a/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/async/TraceableScheduledExecutorServiceTest.java b/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/async/TraceableScheduledExecutorServiceTest.java index 9f87c902c..8272cfff4 100644 --- a/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/async/TraceableScheduledExecutorServiceTest.java +++ b/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/async/TraceableScheduledExecutorServiceTest.java @@ -34,7 +34,7 @@ import org.mockito.junit.jupiter.MockitoExtension; 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; import org.springframework.cloud.sleuth.internal.DefaultSpanNamer; import org.springframework.cloud.sleuth.test.TestTracingAwareSupplier; diff --git a/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/circuitbreaker/CircuitBreakerIntegrationTests.java b/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/circuitbreaker/CircuitBreakerIntegrationTests.java index 211829b4d..af2d4baa5 100644 --- a/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/circuitbreaker/CircuitBreakerIntegrationTests.java +++ b/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/circuitbreaker/CircuitBreakerIntegrationTests.java @@ -26,10 +26,10 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.cloud.circuitbreaker.resilience4j.Resilience4JCircuitBreakerFactory; import org.springframework.cloud.client.circuitbreaker.CircuitBreakerFactory; -import org.springframework.cloud.sleuth.api.ScopedSpan; -import org.springframework.cloud.sleuth.api.Span; -import org.springframework.cloud.sleuth.api.Tracer; -import org.springframework.cloud.sleuth.api.exporter.FinishedSpan; +import org.springframework.cloud.sleuth.ScopedSpan; +import org.springframework.cloud.sleuth.Span; +import org.springframework.cloud.sleuth.Tracer; +import org.springframework.cloud.sleuth.exporter.FinishedSpan; import org.springframework.cloud.sleuth.test.TestSpanHandler; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/circuitbreaker/CircuitBreakerTests.java b/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/circuitbreaker/CircuitBreakerTests.java index 76c8bbb48..b60cd516d 100644 --- a/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/circuitbreaker/CircuitBreakerTests.java +++ b/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/circuitbreaker/CircuitBreakerTests.java @@ -22,10 +22,10 @@ import org.assertj.core.api.BDDAssertions; import org.junit.jupiter.api.Test; import org.springframework.cloud.circuitbreaker.resilience4j.Resilience4JCircuitBreakerFactory; -import org.springframework.cloud.sleuth.api.ScopedSpan; -import org.springframework.cloud.sleuth.api.Span; -import org.springframework.cloud.sleuth.api.Tracer; -import org.springframework.cloud.sleuth.api.exporter.FinishedSpan; +import org.springframework.cloud.sleuth.ScopedSpan; +import org.springframework.cloud.sleuth.Span; +import org.springframework.cloud.sleuth.Tracer; +import org.springframework.cloud.sleuth.exporter.FinishedSpan; import org.springframework.cloud.sleuth.test.TestTracingAwareSupplier; public abstract class CircuitBreakerTests implements TestTracingAwareSupplier { diff --git a/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/TracingChannelInterceptorTest.java b/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/TracingChannelInterceptorTest.java index daf0431cf..4114a7c65 100644 --- a/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/TracingChannelInterceptorTest.java +++ b/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/TracingChannelInterceptorTest.java @@ -25,8 +25,8 @@ import org.assertj.core.api.BDDAssertions; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; -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; import org.springframework.cloud.sleuth.test.TestSpanHandler; import org.springframework.cloud.sleuth.test.TestTracingAwareSupplier; import org.springframework.integration.channel.DirectChannel; @@ -48,8 +48,8 @@ import static org.springframework.messaging.support.NativeMessageHeaderAccessor. public abstract class TracingChannelInterceptorTest implements TestTracingAwareSupplier { - protected ChannelInterceptor interceptor = TracingChannelInterceptor.create(tracerTest().tracing().tracer(), - tracerTest().tracing().propagator(), new SleuthIntegrationMessagingProperties()); + protected ChannelInterceptor interceptor = new TracingChannelInterceptor(tracerTest().tracing().tracer(), + tracerTest().tracing().propagator()); protected TestSpanHandler spans = tracerTest().handler(); diff --git a/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/quartz/TracingJobListenerTest.java b/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/quartz/TracingJobListenerTest.java index 35670effb..164f93dd0 100644 --- a/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/quartz/TracingJobListenerTest.java +++ b/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/quartz/TracingJobListenerTest.java @@ -42,9 +42,9 @@ import org.quartz.listeners.JobListenerSupport; import org.quartz.listeners.TriggerListenerSupport; import org.quartz.utils.StringKeyDirtyFlagMap; -import org.springframework.cloud.sleuth.api.Span; -import org.springframework.cloud.sleuth.api.Tracer; -import org.springframework.cloud.sleuth.api.exporter.FinishedSpan; +import org.springframework.cloud.sleuth.Span; +import org.springframework.cloud.sleuth.Tracer; +import org.springframework.cloud.sleuth.exporter.FinishedSpan; import org.springframework.cloud.sleuth.test.TestTracingAwareSupplier; import static org.assertj.core.api.Assertions.assertThat; diff --git a/tests/brave/spring-cloud-sleuth-instrumentation-reactor-tests/src/test/java/org/springframework/cloud/sleuth/instrument/reactor/FlowsScopePassingSpanSubscriberTests.java b/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/reactor/FlowsScopePassingSpanSubscriberTests.java similarity index 81% rename from tests/brave/spring-cloud-sleuth-instrumentation-reactor-tests/src/test/java/org/springframework/cloud/sleuth/instrument/reactor/FlowsScopePassingSpanSubscriberTests.java rename to tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/reactor/FlowsScopePassingSpanSubscriberTests.java index fd9f8f84f..eb42b4786 100644 --- a/tests/brave/spring-cloud-sleuth-instrumentation-reactor-tests/src/test/java/org/springframework/cloud/sleuth/instrument/reactor/FlowsScopePassingSpanSubscriberTests.java +++ b/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/reactor/FlowsScopePassingSpanSubscriberTests.java @@ -19,9 +19,6 @@ package org.springframework.cloud.sleuth.instrument.reactor; import java.util.Objects; import java.util.function.Function; -import brave.propagation.CurrentTraceContext; -import brave.propagation.CurrentTraceContext.Scope; -import brave.propagation.TraceContext; import org.assertj.core.presentation.StandardRepresentation; import org.awaitility.Awaitility; import org.junit.jupiter.api.AfterEach; @@ -35,17 +32,18 @@ import reactor.core.publisher.Hooks; import reactor.core.publisher.Mono; import reactor.core.scheduler.Schedulers; +import org.springframework.cloud.sleuth.CurrentTraceContext; +import org.springframework.cloud.sleuth.TraceContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.BDDAssertions.then; import static org.springframework.cloud.sleuth.instrument.reactor.ReactorSleuth.scopePassingSpanOperator; -import static org.springframework.cloud.sleuth.instrument.reactor.TraceReactorAutoConfiguration.TraceReactorConfiguration.SLEUTH_TRACE_REACTOR_KEY; /** * @author Marcin Grzejszczak */ -public class FlowsScopePassingSpanSubscriberTests { +public abstract class FlowsScopePassingSpanSubscriberTests { static { // AssertJ will recognise QueueSubscription implements queue and try to invoke @@ -55,16 +53,18 @@ public class FlowsScopePassingSpanSubscriberTests { StandardRepresentation.registerFormatterForType(ScopePassingSpanSubscriber.class, Objects::toString); } - final CurrentTraceContext currentTraceContext = CurrentTraceContext.Default.create(); + protected abstract CurrentTraceContext currentTraceContext(); - TraceContext context = TraceContext.newBuilder().traceId(1).spanId(1).sampled(true).build(); + protected abstract TraceContext context(); AnnotationConfigApplicationContext springContext = new AnnotationConfigApplicationContext(); @BeforeEach public void setup() { - Hooks.resetOnEachOperator(SLEUTH_TRACE_REACTOR_KEY); - Hooks.resetOnLastOperator(SLEUTH_TRACE_REACTOR_KEY); + Hooks.resetOnEachOperator( + "org.springframework.cloud.sleuth.autoconfig.instrument.reactor.TraceReactorAutoConfiguration.TraceReactorConfiguration"); + Hooks.resetOnLastOperator( + "org.springframework.cloud.sleuth.autoconfig.instrument.reactor.TraceReactorAutoConfiguration.TraceReactorConfiguration"); Schedulers.resetOnScheduleHooks(); } @@ -75,13 +75,13 @@ public class FlowsScopePassingSpanSubscriberTests { @Test public void should_not_trace_scalar_flows() { - springContext.registerBean(CurrentTraceContext.class, () -> currentTraceContext); + springContext.registerBean(CurrentTraceContext.class, this::currentTraceContext); springContext.refresh(); Function, ? extends Publisher> transformer = scopePassingSpanOperator( this.springContext); - try (Scope ws = this.currentTraceContext.newScope(context)) { + try (CurrentTraceContext.Scope ws = currentTraceContext().newScope(context())) { Subscriber assertNoSpanSubscriber = new CoreSubscriber() { @Override public void onSubscribe(Subscription s) { @@ -141,7 +141,7 @@ public class FlowsScopePassingSpanSubscriberTests { } - Awaitility.await().untilAsserted(() -> then(this.currentTraceContext.get()).isNull()); + Awaitility.await().untilAsserted(() -> then(currentTraceContext().context()).isNull()); } } diff --git a/tests/brave/spring-cloud-sleuth-instrumentation-reactor-tests/src/test/java/org/springframework/cloud/sleuth/instrument/reactor/ScopePassingSpanSubscriberSpringBootTests.java b/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/reactor/ScopePassingSpanSubscriberSpringBootTests.java similarity index 60% rename from tests/brave/spring-cloud-sleuth-instrumentation-reactor-tests/src/test/java/org/springframework/cloud/sleuth/instrument/reactor/ScopePassingSpanSubscriberSpringBootTests.java rename to tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/reactor/ScopePassingSpanSubscriberSpringBootTests.java index 43e2427db..0c67be78d 100644 --- a/tests/brave/spring-cloud-sleuth-instrumentation-reactor-tests/src/test/java/org/springframework/cloud/sleuth/instrument/reactor/ScopePassingSpanSubscriberSpringBootTests.java +++ b/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/reactor/ScopePassingSpanSubscriberSpringBootTests.java @@ -19,10 +19,6 @@ package org.springframework.cloud.sleuth.instrument.reactor; import java.time.Duration; import java.util.concurrent.atomic.AtomicReference; -import brave.propagation.CurrentTraceContext; -import brave.propagation.CurrentTraceContext.Scope; -import brave.propagation.TraceContext; -import brave.sampler.Sampler; import org.awaitility.Awaitility; import org.junit.jupiter.api.Test; import org.reactivestreams.Publisher; @@ -32,9 +28,10 @@ import reactor.core.scheduler.Schedulers; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.context.annotation.Bean; +import org.springframework.cloud.sleuth.CurrentTraceContext; +import org.springframework.cloud.sleuth.TraceContext; import org.springframework.context.annotation.Configuration; +import org.springframework.test.context.ContextConfiguration; import static org.assertj.core.api.BDDAssertions.then; @@ -42,86 +39,85 @@ import static org.assertj.core.api.BDDAssertions.then; * Like {@link ScopePassingSpanSubscriberTests}, except this tests wiring with spring boot * config. */ -@SpringBootTest(classes = ScopePassingSpanSubscriberSpringBootTests.Config.class, - webEnvironment = SpringBootTest.WebEnvironment.NONE) -public class ScopePassingSpanSubscriberSpringBootTests { +@ContextConfiguration(classes = ScopePassingSpanSubscriberSpringBootTests.TestConfig.class) +public abstract class ScopePassingSpanSubscriberSpringBootTests { @Autowired CurrentTraceContext currentTraceContext; - TraceContext context = TraceContext.newBuilder().traceId(1).spanId(1).sampled(true).build(); + protected abstract TraceContext context(); - TraceContext context2 = TraceContext.newBuilder().traceId(1).spanId(2).sampled(true).build(); + protected abstract TraceContext context2(); @Test public void should_pass_tracing_info_when_using_reactor() { final AtomicReference spanInOperation = new AtomicReference<>(); Publisher traced = Flux.just(1, 2, 3); - try (Scope ws = this.currentTraceContext.newScope(context)) { + try (CurrentTraceContext.Scope ws = this.currentTraceContext.newScope(context())) { Flux.from(traced).map(d -> d + 1).map(d -> d + 1).map((d) -> { - spanInOperation.set(this.currentTraceContext.get()); + spanInOperation.set(this.currentTraceContext.context()); return d + 1; }).map(d -> d + 1).subscribe(d -> { }); } - then(this.currentTraceContext.get()).isNull(); - then(spanInOperation.get()).isEqualTo(context); + then(this.currentTraceContext.context()).isNull(); + then(spanInOperation.get()).isEqualTo(context()); } @Test public void should_support_reactor_fusion_optimization() { final AtomicReference spanInOperation = new AtomicReference<>(); - try (Scope ws = this.currentTraceContext.newScope(context)) { + try (CurrentTraceContext.Scope ws = this.currentTraceContext.newScope(context())) { Mono.just(1).flatMap(d -> Flux.just(d + 1).collectList().map(p -> p.get(0))).map(d -> d + 1).map((d) -> { - spanInOperation.set(this.currentTraceContext.get()); + spanInOperation.set(this.currentTraceContext.context()); return d + 1; }).map(d -> d + 1).subscribe(d -> { }); } - then(this.currentTraceContext.get()).isNull(); - then(spanInOperation.get()).isEqualTo(context); + then(this.currentTraceContext.context()).isNull(); + then(spanInOperation.get()).isEqualTo(context()); } @Test public void should_pass_tracing_info_when_using_reactor_async() { final AtomicReference spanInOperation = new AtomicReference<>(); - try (Scope ws = this.currentTraceContext.newScope(context)) { + try (CurrentTraceContext.Scope ws = this.currentTraceContext.newScope(context())) { Flux.just(1, 2, 3).publishOn(Schedulers.single()).log("reactor.1").map(d -> d + 1).map(d -> d + 1) .publishOn(Schedulers.newSingle("secondThread")).log("reactor.2").map((d) -> { - spanInOperation.set(this.currentTraceContext.get()); + spanInOperation.set(this.currentTraceContext.context()); return d + 1; }).map(d -> d + 1).blockLast(); - Awaitility.await().untilAsserted(() -> then(spanInOperation.get()).isEqualTo(context)); - then(this.currentTraceContext.get()).isEqualTo(context); + Awaitility.await().untilAsserted(() -> then(spanInOperation.get()).isEqualTo(context())); + then(this.currentTraceContext.context()).isEqualTo(context()); } - then(this.currentTraceContext.get()).isNull(); + then(this.currentTraceContext.context()).isNull(); - try (Scope ws = this.currentTraceContext.newScope(context2)) { + try (CurrentTraceContext.Scope ws = this.currentTraceContext.newScope(context2())) { Flux.just(1, 2, 3).publishOn(Schedulers.single()).log("reactor.").map(d -> d + 1).map(d -> d + 1) .map((d) -> { - spanInOperation.set(this.currentTraceContext.get()); + spanInOperation.set(this.currentTraceContext.context()); return d + 1; }).map(d -> d + 1).blockLast(); - then(this.currentTraceContext.get()).isEqualTo(context2); - then(spanInOperation.get()).isEqualTo(context2); + then(this.currentTraceContext.context()).isEqualTo(context2()); + then(spanInOperation.get()).isEqualTo(context2()); } - then(this.currentTraceContext.get()).isNull(); + then(this.currentTraceContext.context()).isNull(); } @Test public void onlyConsidersContextDuringSubscribe() { - Mono fromMono = Mono.fromCallable(this.currentTraceContext::get); + Mono fromMono = Mono.fromCallable(this.currentTraceContext::context); - try (Scope ws = this.currentTraceContext.newScope(context)) { + try (CurrentTraceContext.Scope ws = this.currentTraceContext.newScope(context())) { then(fromMono.map(context -> context).block()).isNotNull(); } } @@ -131,21 +127,21 @@ public class ScopePassingSpanSubscriberSpringBootTests { final AtomicReference spanInOperation = new AtomicReference<>(); final AtomicReference spanInZipOperation = new AtomicReference<>(); - try (Scope ws = this.currentTraceContext.newScope(context)) { - Mono.fromCallable(this.currentTraceContext::get).map(span -> span).doOnNext(spanInOperation::set) - .zipWith(Mono.fromCallable(this.currentTraceContext::get).map(span -> span) + try (CurrentTraceContext.Scope ws = this.currentTraceContext.newScope(context())) { + Mono.fromCallable(this.currentTraceContext::context).map(span -> span).doOnNext(spanInOperation::set) + .zipWith(Mono.fromCallable(this.currentTraceContext::context).map(span -> span) .doOnNext(spanInZipOperation::set)) .block(); } - then(spanInZipOperation).hasValue(context); - then(spanInOperation).hasValue(context); + then(spanInZipOperation).hasValue(context()); + then(spanInOperation).hasValue(context()); } // #646 @Test public void should_work_for_mono_just_with_flat_map() { - try (Scope ws = this.currentTraceContext.newScope(context)) { + try (CurrentTraceContext.Scope ws = this.currentTraceContext.newScope(context())) { Mono.just("value1").flatMap(request -> Mono.just("value2").then(Mono.just("foo"))).map(a -> "qwe").block(); } } @@ -155,34 +151,29 @@ public class ScopePassingSpanSubscriberSpringBootTests { public void checkTraceIdFromSubscriberContext() { final AtomicReference spanInSubscriberContext = new AtomicReference<>(); - try (Scope ws = this.currentTraceContext.newScope(context)) { - Mono.subscriberContext().map(context -> this.currentTraceContext.get()) + try (CurrentTraceContext.Scope ws = this.currentTraceContext.newScope(context())) { + Mono.subscriberContext().map(context -> this.currentTraceContext.context()) .doOnNext(spanInSubscriberContext::set).block(); } - then(spanInSubscriberContext).hasValue(context); // ok here + then(spanInSubscriberContext).hasValue(context()); // ok here } @Test public void should_pass_tracing_info_into_inner_publishers() { final AtomicReference spanInOperation = new AtomicReference<>(); - try (Scope ws = this.currentTraceContext.newScope(context)) { + try (CurrentTraceContext.Scope ws = this.currentTraceContext.newScope(context())) { Flux.range(0, 5).flatMap(it -> Mono.delay(Duration.ofMillis(1)) - .map(context -> this.currentTraceContext.get()).doOnNext(spanInOperation::set)).blockFirst(); + .map(context -> this.currentTraceContext.context()).doOnNext(spanInOperation::set)).blockFirst(); } - then(spanInOperation.get()).isEqualTo(context); + then(spanInOperation.get()).isEqualTo(context()); } @EnableAutoConfiguration @Configuration(proxyBeanMethods = false) - static class Config { - - @Bean - Sampler sampler() { - return Sampler.ALWAYS_SAMPLE; - } + static class TestConfig { } diff --git a/tests/brave/spring-cloud-sleuth-instrumentation-reactor-tests/src/test/java/org/springframework/cloud/sleuth/instrument/reactor/ScopePassingSpanSubscriberTests.java b/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/reactor/ScopePassingSpanSubscriberTests.java similarity index 71% rename from tests/brave/spring-cloud-sleuth-instrumentation-reactor-tests/src/test/java/org/springframework/cloud/sleuth/instrument/reactor/ScopePassingSpanSubscriberTests.java rename to tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/reactor/ScopePassingSpanSubscriberTests.java index 5804a9c1b..90ff81af6 100644 --- a/tests/brave/spring-cloud-sleuth-instrumentation-reactor-tests/src/test/java/org/springframework/cloud/sleuth/instrument/reactor/ScopePassingSpanSubscriberTests.java +++ b/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/reactor/ScopePassingSpanSubscriberTests.java @@ -19,11 +19,10 @@ package org.springframework.cloud.sleuth.instrument.reactor; import java.util.Objects; import java.util.function.Function; -import brave.propagation.StrictCurrentTraceContext; import org.assertj.core.presentation.StandardRepresentation; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.reactivestreams.Publisher; import org.reactivestreams.Subscriber; import org.reactivestreams.Subscription; @@ -34,22 +33,18 @@ import reactor.core.publisher.Mono; import reactor.core.scheduler.Schedulers; import reactor.util.context.Context; -import org.springframework.cloud.sleuth.api.CurrentTraceContext; -import org.springframework.cloud.sleuth.api.TraceContext; -import org.springframework.cloud.sleuth.brave.bridge.BraveCurrentTraceContext; -import org.springframework.cloud.sleuth.brave.bridge.BraveTraceContext; +import org.springframework.cloud.sleuth.CurrentTraceContext; +import org.springframework.cloud.sleuth.TraceContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.BDDAssertions.then; import static org.springframework.cloud.sleuth.instrument.reactor.ReactorSleuth.scopePassingSpanOperator; -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; /** * @author Marcin Grzejszczak */ -public class ScopePassingSpanSubscriberTests { +public abstract class ScopePassingSpanSubscriberTests { static { // AssertJ will recognise QueueSubscription implements queue and try to invoke @@ -59,15 +54,11 @@ public class ScopePassingSpanSubscriberTests { StandardRepresentation.registerFormatterForType(ScopePassingSpanSubscriber.class, Objects::toString); } - StrictCurrentTraceContext traceContext = StrictCurrentTraceContext.create(); + protected abstract CurrentTraceContext currentTraceContext(); - CurrentTraceContext currentTraceContext = BraveCurrentTraceContext.fromBrave(traceContext); + protected abstract TraceContext context(); - TraceContext context = BraveTraceContext - .fromBrave(brave.propagation.TraceContext.newBuilder().traceId(1).spanId(1).sampled(true).build()); - - TraceContext context2 = BraveTraceContext - .fromBrave(brave.propagation.TraceContext.newBuilder().traceId(1).spanId(2).sampled(true).build()); + protected abstract TraceContext context2(); Subscriber assertNotScopePassingSpanSubscriber = new CoreSubscriber() { @Override @@ -117,25 +108,26 @@ public class ScopePassingSpanSubscriberTests { AnnotationConfigApplicationContext springContext = new AnnotationConfigApplicationContext(); - @Before + @BeforeEach public void resetHooks() { // There's an assumption some other test is leaking hooks, so we clear them all to // prevent should_not_scope_scalar_subscribe from being interfered with. - Hooks.resetOnEachOperator(SLEUTH_TRACE_REACTOR_KEY); - Hooks.resetOnLastOperator(SLEUTH_TRACE_REACTOR_KEY); - Schedulers.removeExecutorServiceDecorator(SLEUTH_REACTOR_EXECUTOR_SERVICE_KEY); + Hooks.resetOnEachOperator( + "org.springframework.cloud.sleuth.autoconfig.instrument.reactor.TraceReactorAutoConfiguration.TraceReactorConfiguration"); + Hooks.resetOnLastOperator( + "org.springframework.cloud.sleuth.autoconfig.instrument.reactor.TraceReactorAutoConfiguration.TraceReactorConfiguration"); + Schedulers.removeExecutorServiceDecorator("s;euth"); } - @After + @AfterEach public void close() { springContext.close(); - traceContext.close(); } @Test public void should_propagate_current_context() { ScopePassingSpanSubscriber subscriber = new ScopePassingSpanSubscriber<>(null, Context.of("foo", "bar"), - this.currentTraceContext, null); + currentTraceContext(), null); then((String) subscriber.currentContext().get("foo")).isEqualTo("bar"); } @@ -145,9 +137,9 @@ public class ScopePassingSpanSubscriberTests { */ @Test public void should_not_redundantly_copy_context() { - Context initial = Context.of(TraceContext.class, context); + Context initial = Context.of(TraceContext.class, context()); ScopePassingSpanSubscriber subscriber = new ScopePassingSpanSubscriber<>(null, initial, - this.currentTraceContext, context); + currentTraceContext(), context()); then(initial.get(TraceContext.class)).isSameAs(subscriber.currentContext().get(TraceContext.class)); } @@ -155,30 +147,30 @@ public class ScopePassingSpanSubscriberTests { @Test public void should_set_empty_context_when_context_is_null() { ScopePassingSpanSubscriber subscriber = new ScopePassingSpanSubscriber<>(null, Context.empty(), - this.currentTraceContext, null); + currentTraceContext(), null); then(subscriber.currentContext().isEmpty()).isTrue(); } @Test public void should_put_current_span_to_context() { - try (CurrentTraceContext.Scope ws = this.currentTraceContext.newScope(context2)) { + try (CurrentTraceContext.Scope ws = currentTraceContext().newScope(context2())) { CoreSubscriber subscriber = new ScopePassingSpanSubscriber<>(new BaseSubscriber() { - }, Context.empty(), currentTraceContext, context); + }, Context.empty(), currentTraceContext(), context()); - then(subscriber.currentContext().get(TraceContext.class)).isEqualTo(context); + then(subscriber.currentContext().get(TraceContext.class)).isEqualTo(context()); } } @Test public void should_not_scope_scalar_subscribe() { - springContext.registerBean(CurrentTraceContext.class, () -> currentTraceContext); + springContext.registerBean(CurrentTraceContext.class, this::currentTraceContext); springContext.refresh(); Function, ? extends Publisher> transformer = scopePassingSpanOperator( this.springContext); - try (CurrentTraceContext.Scope ws = this.currentTraceContext.newScope(context)) { + try (CurrentTraceContext.Scope ws = currentTraceContext().newScope(context())) { transformer.apply(Mono.just(1)).subscribe(assertNotScopePassingSpanSubscriber); @@ -191,13 +183,13 @@ public class ScopePassingSpanSubscriberTests { @Test public void should_scope_scalar_hide_subscribe() { - springContext.registerBean(CurrentTraceContext.class, () -> currentTraceContext); + springContext.registerBean(CurrentTraceContext.class, this::currentTraceContext); springContext.refresh(); Function, ? extends Publisher> transformer = scopePassingSpanOperator( this.springContext); - try (CurrentTraceContext.Scope ws = this.currentTraceContext.newScope(context)) { + try (CurrentTraceContext.Scope ws = currentTraceContext().newScope(context())) { transformer.apply(Mono.just(1).hide()).subscribe(assertScopePassingSpanSubscriber); diff --git a/tests/brave/spring-cloud-sleuth-instrumentation-reactor-tests/src/test/java/org/springframework/cloud/sleuth/instrument/reactor/sample/FlatMapTests.java b/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/reactor/sample/FlatMapTests.java similarity index 87% rename from tests/brave/spring-cloud-sleuth-instrumentation-reactor-tests/src/test/java/org/springframework/cloud/sleuth/instrument/reactor/sample/FlatMapTests.java rename to tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/reactor/sample/FlatMapTests.java index 9541c402a..71c827f52 100644 --- a/tests/brave/spring-cloud-sleuth-instrumentation-reactor-tests/src/test/java/org/springframework/cloud/sleuth/instrument/reactor/sample/FlatMapTests.java +++ b/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/reactor/sample/FlatMapTests.java @@ -18,15 +18,10 @@ package org.springframework.cloud.sleuth.instrument.reactor.sample; import java.util.Arrays; import java.util.List; +import java.util.concurrent.TimeUnit; import java.util.function.Supplier; import java.util.stream.Collectors; -import brave.Span; -import brave.Tracer; -import brave.handler.MutableSpan; -import brave.handler.SpanHandler; -import brave.sampler.Sampler; -import brave.test.TestSpanHandler; import org.awaitility.Awaitility; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; @@ -42,11 +37,14 @@ import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.test.system.CapturedOutput; import org.springframework.boot.test.system.OutputCaptureExtension; -import org.springframework.cloud.sleuth.api.CurrentTraceContext; -import org.springframework.cloud.sleuth.brave.bridge.BraveSpan; -import org.springframework.cloud.sleuth.instrument.reactor.Issue866Configuration; -import org.springframework.cloud.sleuth.instrument.reactor.TraceReactorAutoConfigurationAccessorConfiguration; +import org.springframework.cloud.sleuth.CurrentTraceContext; +import org.springframework.cloud.sleuth.Span; +import org.springframework.cloud.sleuth.Tracer; +import org.springframework.cloud.sleuth.autoconfig.instrument.reactor.Issue866Configuration; +import org.springframework.cloud.sleuth.autoconfig.instrument.reactor.TraceReactorAutoConfigurationAccessorConfiguration; +import org.springframework.cloud.sleuth.exporter.FinishedSpan; import org.springframework.cloud.sleuth.instrument.web.WebFluxSleuthOperators; +import org.springframework.cloud.sleuth.test.TestSpanHandler; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -63,7 +61,7 @@ import static org.springframework.web.reactive.function.server.RouterFunctions.r // https://github.com/spring-cloud/spring-cloud-sleuth/issues/850 @ExtendWith(OutputCaptureExtension.class) -public class FlatMapTests { +public abstract class FlatMapTests { private static final Logger LOGGER = LoggerFactory.getLogger(FlatMapTests.class); @@ -82,7 +80,7 @@ public class FlatMapTests { public void should_work_with_flat_maps(CapturedOutput capture) { // given ConfigurableApplicationContext context = new SpringApplicationBuilder(FlatMapTests.TestConfiguration.class, - Issue866Configuration.class) + testConfiguration(), Issue866Configuration.class) .web(WebApplicationType.REACTIVE) .properties("server.port=0", "spring.jmx.enabled=false", "spring.application.name=TraceWebFluxTests", "security.basic.enabled=false", @@ -91,11 +89,13 @@ public class FlatMapTests { assertReactorTracing(context, capture, () -> context.getBean(TestConfiguration.class).spanInFoo); } + protected abstract Class testConfiguration(); + @Test public void should_work_with_flat_maps_with_on_last_operator_instrumentation(CapturedOutput capture) { // given ConfigurableApplicationContext context = new SpringApplicationBuilder(FlatMapTests.TestConfiguration.class, - Issue866Configuration.class) + testConfiguration(), Issue866Configuration.class) .web(WebApplicationType.REACTIVE) .properties("server.port=0", "spring.jmx.enabled=false", "spring.sleuth.reactor.decorate-on-each=false", @@ -109,7 +109,7 @@ public class FlatMapTests { public void should_work_with_flat_maps_with_on_manual_operator_instrumentation(CapturedOutput capture) { // given ConfigurableApplicationContext context = new SpringApplicationBuilder( - FlatMapTests.TestManualConfiguration.class, Issue866Configuration.class) + FlatMapTests.TestManualConfiguration.class, testConfiguration(), Issue866Configuration.class) .web(WebApplicationType.REACTIVE) .properties("server.port=0", "spring.jmx.enabled=false", "spring.sleuth.reactor.instrumentation-type=MANUAL", @@ -128,7 +128,7 @@ public class FlatMapTests { sender.port = port; spans.clear(); - Awaitility.await().untilAsserted(() -> { + Awaitility.await().atMost(5, TimeUnit.SECONDS).pollInterval(1, TimeUnit.SECONDS).untilAsserted(() -> { // when LOGGER.info("Start"); spans.clear(); @@ -161,11 +161,11 @@ public class FlatMapTests { } private void thenAllWebClientCallsHaveSameTraceId(String traceId, RequestSender sender) { - then(sender.span.context().traceIdString()).isEqualTo(traceId); + then(sender.span.context().traceId()).isEqualTo(traceId); } private void thenSpanInFooHasSameTraceId(String traceId, SpanProvider spanProvider) { - then(spanProvider.get().context().traceIdString()).isEqualTo(traceId); + then(spanProvider.get().context().traceId()).isEqualTo(traceId); } private Mono callFlatMap(int port) { @@ -176,9 +176,10 @@ public class FlatMapTests { then(response.statusCode().value()).isEqualTo(200); then(spans).isNotEmpty(); LOGGER.info("Accumulated spans: " + spans); - List traceIdOfFlatMap = spans.spans().stream().filter( - span -> span.tags().containsKey("http.path") && span.tags().get("http.path").equals("/withFlatMap")) - .map(MutableSpan::traceId).collect(Collectors.toList()); + List traceIdOfFlatMap = spans.reportedSpans().stream() + .filter(span -> span.getTags().containsKey("http.path") + && span.getTags().get("http.path").equals("/withFlatMap")) + .map(FinishedSpan::getTraceId).collect(Collectors.toList()); then(traceIdOfFlatMap).hasSize(1); return traceIdOfFlatMap.get(0); } @@ -187,7 +188,7 @@ public class FlatMapTests { @EnableAutoConfiguration static class TestConfiguration { - brave.Span spanInFoo; + Span spanInFoo; @Bean RouterFunction handlers(Tracer tracer, RequestSender requestSender) { @@ -217,16 +218,6 @@ public class FlatMapTests { return WebClient.create(); } - @Bean - SpanHandler testSpanHandler() { - return new TestSpanHandler(); - } - - @Bean - Sampler sampler() { - return Sampler.ALWAYS_SAMPLE; - } - @Bean RequestSender sender(WebClient client, Tracer tracer) { return new RequestSender(client, tracer); @@ -244,10 +235,10 @@ public class FlatMapTests { @EnableAutoConfiguration static class TestManualConfiguration { - brave.Span spanInFoo; + Span spanInFoo; @Bean - RouterFunction handlers(org.springframework.cloud.sleuth.api.Tracer tracing, + RouterFunction handlers(org.springframework.cloud.sleuth.Tracer tracing, CurrentTraceContext currentTraceContext, ManualRequestSender requestSender) { return route(GET("/noFlatMap"), request -> { ServerWebExchange exchange = request.exchange(); @@ -273,7 +264,7 @@ public class FlatMapTests { ServerWebExchange exchange = request.exchange(); WebFluxSleuthOperators.withSpanInScope(tracing, currentTraceContext, exchange, () -> { LOGGER.info("foo"); - this.spanInFoo = BraveSpan.toBrave(tracing.currentSpan()); + this.spanInFoo = tracing.currentSpan(); }); return ServerResponse.ok().body(Flux.just(1), Integer.class); }); @@ -284,16 +275,6 @@ public class FlatMapTests { return WebClient.create(); } - @Bean - SpanHandler testSpanHandler() { - return new TestSpanHandler(); - } - - @Bean - Sampler sampler() { - return Sampler.ALWAYS_SAMPLE; - } - @Bean ManualRequestSender sender(WebClient client, Tracer tracer) { return new ManualRequestSender(client, tracer); diff --git a/tests/brave/spring-cloud-sleuth-instrumentation-reactor-tests/src/test/java/org/springframework/cloud/sleuth/instrument/reactor/sample/ManualRequestSender.java b/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/reactor/sample/ManualRequestSender.java similarity index 97% rename from tests/brave/spring-cloud-sleuth-instrumentation-reactor-tests/src/test/java/org/springframework/cloud/sleuth/instrument/reactor/sample/ManualRequestSender.java rename to tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/reactor/sample/ManualRequestSender.java index 1144bbf7f..01f9d4120 100644 --- a/tests/brave/spring-cloud-sleuth-instrumentation-reactor-tests/src/test/java/org/springframework/cloud/sleuth/instrument/reactor/sample/ManualRequestSender.java +++ b/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/reactor/sample/ManualRequestSender.java @@ -16,13 +16,13 @@ package org.springframework.cloud.sleuth.instrument.reactor.sample; -import brave.Tracer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import reactor.core.publisher.SignalType; +import org.springframework.cloud.sleuth.Tracer; import org.springframework.cloud.sleuth.instrument.web.WebFluxSleuthOperators; import org.springframework.http.HttpMethod; import org.springframework.web.reactive.function.client.WebClient; diff --git a/tests/brave/spring-cloud-sleuth-instrumentation-reactor-tests/src/test/java/org/springframework/cloud/sleuth/instrument/reactor/sample/RequestSender.java b/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/reactor/sample/RequestSender.java similarity index 94% rename from tests/brave/spring-cloud-sleuth-instrumentation-reactor-tests/src/test/java/org/springframework/cloud/sleuth/instrument/reactor/sample/RequestSender.java rename to tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/reactor/sample/RequestSender.java index aba073297..d3a486fed 100644 --- a/tests/brave/spring-cloud-sleuth-instrumentation-reactor-tests/src/test/java/org/springframework/cloud/sleuth/instrument/reactor/sample/RequestSender.java +++ b/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/reactor/sample/RequestSender.java @@ -16,13 +16,13 @@ package org.springframework.cloud.sleuth.instrument.reactor.sample; -import brave.Span; -import brave.Tracer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; +import org.springframework.cloud.sleuth.Span; +import org.springframework.cloud.sleuth.Tracer; import org.springframework.http.HttpMethod; import org.springframework.web.reactive.function.client.WebClient; diff --git a/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/web/HttpServerParserTests.java b/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/web/HttpServerParserTests.java index 8e3e5596b..e7d0d3be3 100644 --- a/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/web/HttpServerParserTests.java +++ b/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/web/HttpServerParserTests.java @@ -32,10 +32,10 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration; import org.springframework.boot.web.server.LocalServerPort; -import org.springframework.cloud.sleuth.api.Span; -import org.springframework.cloud.sleuth.api.Tracer; -import org.springframework.cloud.sleuth.api.http.HttpRequestParser; -import org.springframework.cloud.sleuth.api.http.HttpResponseParser; +import org.springframework.cloud.sleuth.Span; +import org.springframework.cloud.sleuth.Tracer; +import org.springframework.cloud.sleuth.http.HttpRequestParser; +import org.springframework.cloud.sleuth.http.HttpResponseParser; import org.springframework.cloud.sleuth.test.TestSpanHandler; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/web/IgnoreAutoConfiguredSkipPatternsIntegrationTests.java b/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/web/IgnoreAutoConfiguredSkipPatternsIntegrationTests.java index 4ee76347d..4adc11f98 100644 --- a/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/web/IgnoreAutoConfiguredSkipPatternsIntegrationTests.java +++ b/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/web/IgnoreAutoConfiguredSkipPatternsIntegrationTests.java @@ -25,7 +25,7 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.web.server.LocalServerPort; -import org.springframework.cloud.sleuth.api.Tracer; +import org.springframework.cloud.sleuth.Tracer; import org.springframework.cloud.sleuth.test.TestSpanHandler; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/web/SkipEndPointsIntegrationTestsWithContextPathWithBasePath.java b/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/web/SkipEndPointsIntegrationTestsWithContextPathWithBasePath.java index 2dc7e384c..8afac2ab3 100644 --- a/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/web/SkipEndPointsIntegrationTestsWithContextPathWithBasePath.java +++ b/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/web/SkipEndPointsIntegrationTestsWithContextPathWithBasePath.java @@ -23,7 +23,7 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.web.server.LocalServerPort; -import org.springframework.cloud.sleuth.api.Tracer; +import org.springframework.cloud.sleuth.Tracer; import org.springframework.cloud.sleuth.test.TestSpanHandler; import org.springframework.context.annotation.Configuration; import org.springframework.test.context.ContextConfiguration; diff --git a/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/web/SkipEndPointsIntegrationTestsWithContextPathWithoutBasePath.java b/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/web/SkipEndPointsIntegrationTestsWithContextPathWithoutBasePath.java index 67ea27728..845138a40 100644 --- a/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/web/SkipEndPointsIntegrationTestsWithContextPathWithoutBasePath.java +++ b/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/web/SkipEndPointsIntegrationTestsWithContextPathWithoutBasePath.java @@ -23,7 +23,7 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.web.server.LocalServerPort; -import org.springframework.cloud.sleuth.api.Tracer; +import org.springframework.cloud.sleuth.Tracer; import org.springframework.cloud.sleuth.test.TestSpanHandler; import org.springframework.context.annotation.Configuration; import org.springframework.test.context.ContextConfiguration; diff --git a/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/web/SkipEndPointsIntegrationTestsWithoutContextPathWithBasePath.java b/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/web/SkipEndPointsIntegrationTestsWithoutContextPathWithBasePath.java index 9ef0dc75b..3ad7f9d88 100644 --- a/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/web/SkipEndPointsIntegrationTestsWithoutContextPathWithBasePath.java +++ b/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/web/SkipEndPointsIntegrationTestsWithoutContextPathWithBasePath.java @@ -24,7 +24,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.web.server.LocalServerPort; -import org.springframework.cloud.sleuth.api.Tracer; +import org.springframework.cloud.sleuth.Tracer; import org.springframework.cloud.sleuth.test.TestSpanHandler; import org.springframework.context.annotation.Configuration; import org.springframework.test.context.ContextConfiguration; diff --git a/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/web/SkipEndPointsIntegrationTestsWithoutContextPathWithoutBasePath.java b/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/web/SkipEndPointsIntegrationTestsWithoutContextPathWithoutBasePath.java index 6bde36a64..5161eccd4 100644 --- a/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/web/SkipEndPointsIntegrationTestsWithoutContextPathWithoutBasePath.java +++ b/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/web/SkipEndPointsIntegrationTestsWithoutContextPathWithoutBasePath.java @@ -24,7 +24,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.web.server.LocalServerPort; -import org.springframework.cloud.sleuth.api.Tracer; +import org.springframework.cloud.sleuth.Tracer; import org.springframework.cloud.sleuth.test.TestSpanHandler; import org.springframework.context.annotation.Configuration; import org.springframework.test.context.ContextConfiguration; diff --git a/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/web/TraceFilterTests.java b/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/web/TraceFilterTests.java index 1b0740528..23ccd37a0 100644 --- a/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/web/TraceFilterTests.java +++ b/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/web/TraceFilterTests.java @@ -25,10 +25,10 @@ import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -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.HttpServerHandler; +import org.springframework.cloud.sleuth.CurrentTraceContext; +import org.springframework.cloud.sleuth.Span; +import org.springframework.cloud.sleuth.Tracer; +import org.springframework.cloud.sleuth.http.HttpServerHandler; import org.springframework.cloud.sleuth.instrument.web.servlet.TracingFilter; import org.springframework.cloud.sleuth.test.TestSpanHandler; import org.springframework.cloud.sleuth.test.TestTracingAwareSupplier; diff --git a/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/HttpClientBeanPostProcessorTest.java b/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/HttpClientBeanPostProcessorTest.java index 5dbd927aa..1774cf075 100644 --- a/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/HttpClientBeanPostProcessorTest.java +++ b/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/HttpClientBeanPostProcessorTest.java @@ -31,7 +31,7 @@ import reactor.core.publisher.SynchronousSink; import reactor.core.scheduler.Schedulers; import reactor.netty.Connection; -import org.springframework.cloud.sleuth.api.TraceContext; +import org.springframework.cloud.sleuth.TraceContext; import org.springframework.cloud.sleuth.instrument.web.client.HttpClientBeanPostProcessor.PendingSpan; import org.springframework.cloud.sleuth.instrument.web.client.HttpClientBeanPostProcessor.TracingMapConnect; diff --git a/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/MultipleAsyncRestTemplateTests.java b/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/MultipleAsyncRestTemplateTests.java index 7da689f84..7c8395db4 100644 --- a/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/MultipleAsyncRestTemplateTests.java +++ b/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/MultipleAsyncRestTemplateTests.java @@ -35,8 +35,8 @@ import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.web.server.LocalServerPort; -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.instrument.async.LazyTraceExecutor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/ReactorNettyHttpClientSpringBootTests.java b/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/ReactorNettyHttpClientSpringBootTests.java index 572783b84..f7e37f9a5 100644 --- a/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/ReactorNettyHttpClientSpringBootTests.java +++ b/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/ReactorNettyHttpClientSpringBootTests.java @@ -30,10 +30,10 @@ import reactor.netty.http.server.HttpServer; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -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.exporter.FinishedSpan; +import org.springframework.cloud.sleuth.CurrentTraceContext; +import org.springframework.cloud.sleuth.Span; +import org.springframework.cloud.sleuth.TraceContext; +import org.springframework.cloud.sleuth.exporter.FinishedSpan; import org.springframework.cloud.sleuth.test.TestSpanHandler; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/TraceRequestHttpHeadersFilterTests.java b/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/TraceRequestHttpHeadersFilterTests.java index d4dede6e6..ff6ae25c0 100644 --- a/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/TraceRequestHttpHeadersFilterTests.java +++ b/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/TraceRequestHttpHeadersFilterTests.java @@ -34,7 +34,7 @@ public abstract class TraceRequestHttpHeadersFilterTests implements TestTracingA @Test public void should_override_span_tracing_headers() { - HttpHeadersFilter filter = TraceRequestHttpHeadersFilter.create(tracerTest().tracing().tracer(), + HttpHeadersFilter filter = new TraceRequestHttpHeadersFilter(tracerTest().tracing().tracer(), tracerTest().tracing().httpClientHandler(), tracerTest().tracing().propagator()); HttpHeaders httpHeaders = new HttpHeaders(); httpHeaders.set("X-Hello", "World"); @@ -58,7 +58,7 @@ public abstract class TraceRequestHttpHeadersFilterTests implements TestTracingA @Test public void should_override_span_tracing_headers_when_using_b3() { - HttpHeadersFilter filter = TraceRequestHttpHeadersFilter.create(tracerTest().tracing().tracer(), + HttpHeadersFilter filter = new TraceRequestHttpHeadersFilter(tracerTest().tracing().tracer(), tracerTest().tracing().httpClientHandler(), tracerTest().tracing().propagator()); HttpHeaders httpHeaders = new HttpHeaders(); httpHeaders.set("X-Hello", "World"); @@ -85,7 +85,7 @@ public abstract class TraceRequestHttpHeadersFilterTests implements TestTracingA @Test public void should_set_tracing_headers() { - HttpHeadersFilter filter = TraceRequestHttpHeadersFilter.create(tracerTest().tracing().tracer(), + HttpHeadersFilter filter = new TraceRequestHttpHeadersFilter(tracerTest().tracing().tracer(), tracerTest().tracing().httpClientHandler(), tracerTest().tracing().propagator()); HttpHeaders httpHeaders = new HttpHeaders(); httpHeaders.set("X-Hello", "World"); @@ -105,7 +105,7 @@ public abstract class TraceRequestHttpHeadersFilterTests implements TestTracingA // #1469 @Test public void should_reuse_headers_only_from_input_since_exchange_may_contain_already_ignored_headers() { - HttpHeadersFilter filter = TraceRequestHttpHeadersFilter.create(tracerTest().tracing().tracer(), + HttpHeadersFilter filter = new TraceRequestHttpHeadersFilter(tracerTest().tracing().tracer(), tracerTest().tracing().httpClientHandler(), tracerTest().tracing().propagator()); HttpHeaders httpHeaders = new HttpHeaders(); httpHeaders.set("X-Hello", "World"); @@ -123,7 +123,7 @@ public abstract class TraceRequestHttpHeadersFilterTests implements TestTracingA // #1352 @Test public void should_set_tracing_headers_with_multiple_values() { - HttpHeadersFilter filter = TraceRequestHttpHeadersFilter.create(tracerTest().tracing().tracer(), + HttpHeadersFilter filter = new TraceRequestHttpHeadersFilter(tracerTest().tracing().tracer(), tracerTest().tracing().httpClientHandler(), tracerTest().tracing().propagator()); HttpHeaders httpHeaders = new HttpHeaders(); httpHeaders.add("X-Hello-Request", "Request World"); diff --git a/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/TraceResponseHttpHeadersFilterTests.java b/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/TraceResponseHttpHeadersFilterTests.java index 198ab7dd1..a83dbcdb0 100644 --- a/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/TraceResponseHttpHeadersFilterTests.java +++ b/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/TraceResponseHttpHeadersFilterTests.java @@ -29,7 +29,7 @@ public abstract class TraceResponseHttpHeadersFilterTests implements TestTracing @Test public void should_not_report_span_when_no_span_was_present_in_attribute() { - HttpHeadersFilter filter = TraceResponseHttpHeadersFilter.create(tracerTest().tracing().tracer(), + HttpHeadersFilter filter = new TraceResponseHttpHeadersFilter(tracerTest().tracing().tracer(), tracerTest().tracing().httpClientHandler(), tracerTest().tracing().propagator()); HttpHeaders httpHeaders = new HttpHeaders(); httpHeaders.set("b3", "52f112af7472aff0-53e6ab6fc5dfee58"); @@ -43,7 +43,7 @@ public abstract class TraceResponseHttpHeadersFilterTests implements TestTracing @Test public void should_report_span_when_span_was_present_in_attribute() { - HttpHeadersFilter filter = TraceResponseHttpHeadersFilter.create(tracerTest().tracing().tracer(), + HttpHeadersFilter filter = new TraceResponseHttpHeadersFilter(tracerTest().tracing().tracer(), tracerTest().tracing().httpClientHandler(), tracerTest().tracing().propagator()); HttpHeaders httpHeaders = new HttpHeaders(); httpHeaders.set("b3", "52f112af7472aff0-53e6ab6fc5dfee58"); diff --git a/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/TraceRestTemplateInterceptorIntegrationTests.java b/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/TraceRestTemplateInterceptorIntegrationTests.java index fee2b7cde..b542e5175 100644 --- a/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/TraceRestTemplateInterceptorIntegrationTests.java +++ b/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/TraceRestTemplateInterceptorIntegrationTests.java @@ -28,9 +28,9 @@ import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.springframework.cloud.sleuth.api.Span; -import org.springframework.cloud.sleuth.api.Tracer; -import org.springframework.cloud.sleuth.api.exporter.FinishedSpan; +import org.springframework.cloud.sleuth.Span; +import org.springframework.cloud.sleuth.Tracer; +import org.springframework.cloud.sleuth.exporter.FinishedSpan; import org.springframework.cloud.sleuth.instrument.web.mvc.TracingClientHttpRequestInterceptor; import org.springframework.cloud.sleuth.test.TestSpanHandler; import org.springframework.cloud.sleuth.test.TestTracingAwareSupplier; diff --git a/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/TraceRestTemplateInterceptorTests.java b/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/TraceRestTemplateInterceptorTests.java index 0fdb9e643..b38a4f6d0 100644 --- a/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/TraceRestTemplateInterceptorTests.java +++ b/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/TraceRestTemplateInterceptorTests.java @@ -25,9 +25,9 @@ import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -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.Span; +import org.springframework.cloud.sleuth.Tracer; +import org.springframework.cloud.sleuth.http.HttpClientHandler; import org.springframework.cloud.sleuth.instrument.web.mvc.TracingClientHttpRequestInterceptor; import org.springframework.cloud.sleuth.test.TestSpanHandler; import org.springframework.cloud.sleuth.test.TestTracingAwareSupplier; diff --git a/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/discoveryexception/WebClientDiscoveryExceptionTests.java b/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/discoveryexception/WebClientDiscoveryExceptionTests.java index c6ae32443..a8c9889f4 100644 --- a/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/discoveryexception/WebClientDiscoveryExceptionTests.java +++ b/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/discoveryexception/WebClientDiscoveryExceptionTests.java @@ -36,9 +36,8 @@ import org.springframework.cloud.loadbalancer.annotation.LoadBalancerClient; import org.springframework.cloud.loadbalancer.core.ServiceInstanceListSupplier; import org.springframework.cloud.openfeign.EnableFeignClients; import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.cloud.sleuth.api.Span; -import org.springframework.cloud.sleuth.api.Tracer; -import org.springframework.cloud.sleuth.instrument.web.TraceWebServletAutoConfiguration; +import org.springframework.cloud.sleuth.Span; +import org.springframework.cloud.sleuth.Tracer; import org.springframework.cloud.sleuth.test.TestSpanHandler; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -53,7 +52,8 @@ import org.springframework.web.client.RestTemplate; import static org.assertj.core.api.BDDAssertions.then; @ContextConfiguration(classes = WebClientDiscoveryExceptionTests.TestConfiguration.class) -@TestPropertySource(properties = "spring.application.name=exceptionservice") +@TestPropertySource( + properties = { "spring.application.name=exceptionservice", "spring.sleuth.web.servlet.enabled=false" }) @DirtiesContext public abstract class WebClientDiscoveryExceptionTests { @@ -124,7 +124,7 @@ public abstract class WebClientDiscoveryExceptionTests { } @Configuration(proxyBeanMethods = false) - @EnableAutoConfiguration(exclude = TraceWebServletAutoConfiguration.class) + @EnableAutoConfiguration @EnableDiscoveryClient @EnableFeignClients @LoadBalancerClient("exceptionservice") diff --git a/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/exception/WebClientExceptionTests.java b/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/exception/WebClientExceptionTests.java index ed5d303d1..c75fbe8a0 100644 --- a/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/exception/WebClientExceptionTests.java +++ b/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/exception/WebClientExceptionTests.java @@ -35,8 +35,8 @@ import org.springframework.cloud.loadbalancer.annotation.LoadBalancerClient; import org.springframework.cloud.loadbalancer.core.ServiceInstanceListSupplier; import org.springframework.cloud.openfeign.EnableFeignClients; import org.springframework.cloud.openfeign.FeignClient; -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.test.TestSpanHandler; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -55,7 +55,6 @@ import static org.assertj.core.api.BDDAssertions.then; @ContextConfiguration(classes = WebClientExceptionTests.TestConfiguration.class) @TestPropertySource(properties = "spring.application.name=exceptionservice") -@DirtiesContext public class WebClientExceptionTests { private static final Log log = LogFactory.getLog(WebClientExceptionTests.class); @@ -81,6 +80,7 @@ public class WebClientExceptionTests { // issue #198 @ParameterizedTest @MethodSource("parametersForShouldCloseSpanUponException") + @DirtiesContext public void shouldCloseSpanUponException(ResponseEntityProvider provider) throws IOException { Span span = this.tracer.nextSpan().name("new trace").start(); @@ -99,6 +99,7 @@ public class WebClientExceptionTests { then(this.tracer.currentSpan()).isNull(); Awaitility.await().atMost(5, TimeUnit.SECONDS).untilAsserted(() -> { then(this.spans).isNotEmpty(); + log.info("Reported spans are not empty [" + this.spans + "]"); then(this.spans.get(0).getError()).isNotNull(); }); } diff --git a/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/feign/FeignRetriesTests.java b/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/feign/FeignRetriesTests.java index a9811cd53..1857904ec 100644 --- a/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/feign/FeignRetriesTests.java +++ b/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/feign/FeignRetriesTests.java @@ -40,9 +40,9 @@ import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.beans.factory.BeanFactory; -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.CurrentTraceContext; +import org.springframework.cloud.sleuth.Span; +import org.springframework.cloud.sleuth.http.HttpClientHandler; import org.springframework.cloud.sleuth.test.TestTracingAwareSupplier; /** diff --git a/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/feign/TracingFeignClientTests.java b/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/feign/TracingFeignClientTests.java index a8809c300..f329abc89 100644 --- a/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/feign/TracingFeignClientTests.java +++ b/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/feign/TracingFeignClientTests.java @@ -33,8 +33,8 @@ import org.mockito.invocation.InvocationOnMock; import org.mockito.junit.jupiter.MockitoExtension; import org.mockito.stubbing.Answer; -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.test.TestTracingAwareSupplier; /** diff --git a/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/integration/notsampled/WebClientNotSampledTests.java b/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/integration/notsampled/WebClientNotSampledTests.java index 3d39cd4b4..9ce33e3ea 100644 --- a/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/integration/notsampled/WebClientNotSampledTests.java +++ b/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/integration/notsampled/WebClientNotSampledTests.java @@ -35,9 +35,8 @@ import org.springframework.cloud.loadbalancer.annotation.LoadBalancerClient; import org.springframework.cloud.loadbalancer.core.ServiceInstanceListSupplier; import org.springframework.cloud.openfeign.EnableFeignClients; import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.cloud.sleuth.api.Span; -import org.springframework.cloud.sleuth.api.Tracer; -import org.springframework.cloud.sleuth.instrument.web.TraceWebServletAutoConfiguration; +import org.springframework.cloud.sleuth.Span; +import org.springframework.cloud.sleuth.Tracer; import org.springframework.cloud.sleuth.test.TestSpanHandler; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -56,8 +55,8 @@ import org.springframework.web.client.RestTemplate; import static org.assertj.core.api.BDDAssertions.then; @ContextConfiguration(classes = WebClientNotSampledTests.TestConfiguration.class) -@TestPropertySource( - properties = { "spring.application.name=fooservice", "spring.sleuth.web.client.skip-pattern=/skip.*" }) +@TestPropertySource(properties = { "spring.sleuth.web.servlet.enabled=false", "spring.application.name=fooservice", + "spring.sleuth.web.client.skip-pattern=/skip.*" }) @DirtiesContext public abstract class WebClientNotSampledTests { @@ -132,7 +131,7 @@ public abstract class WebClientNotSampledTests { } @Configuration(proxyBeanMethods = false) - @EnableAutoConfiguration(exclude = { TraceWebServletAutoConfiguration.class, JmxAutoConfiguration.class }) + @EnableAutoConfiguration(exclude = JmxAutoConfiguration.class) @EnableFeignClients @LoadBalancerClient(value = "fooservice", configuration = SimpleLoadBalancerClientConfiguration.class) public static class TestConfiguration { diff --git a/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/integration/parser/WebClientCustomParserTests.java b/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/integration/parser/WebClientCustomParserTests.java index c1a50cedd..81a0772d8 100644 --- a/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/integration/parser/WebClientCustomParserTests.java +++ b/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/integration/parser/WebClientCustomParserTests.java @@ -32,13 +32,12 @@ import org.springframework.cloud.loadbalancer.annotation.LoadBalancerClient; import org.springframework.cloud.loadbalancer.core.ServiceInstanceListSupplier; import org.springframework.cloud.openfeign.EnableFeignClients; import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.cloud.sleuth.api.Span; -import org.springframework.cloud.sleuth.api.Tracer; -import org.springframework.cloud.sleuth.api.http.HttpRequestParser; -import org.springframework.cloud.sleuth.api.http.HttpResponseParser; +import org.springframework.cloud.sleuth.Span; +import org.springframework.cloud.sleuth.Tracer; +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.TraceWebServletAutoConfiguration; import org.springframework.cloud.sleuth.test.TestSpanHandler; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -56,8 +55,8 @@ import org.springframework.web.bind.annotation.RestController; import static org.assertj.core.api.BDDAssertions.then; @ContextConfiguration(classes = WebClientCustomParserTests.TestConfiguration.class) -@TestPropertySource( - properties = { "spring.application.name=fooservice", "spring.sleuth.web.client.skip-pattern=/skip.*" }) +@TestPropertySource(properties = { "spring.sleuth.web.servlet.enabled=false", "spring.application.name=fooservice", + "spring.sleuth.web.client.skip-pattern=/skip.*" }) @DirtiesContext public abstract class WebClientCustomParserTests { @@ -103,7 +102,7 @@ public abstract class WebClientCustomParserTests { } @Configuration(proxyBeanMethods = false) - @EnableAutoConfiguration(exclude = { TraceWebServletAutoConfiguration.class, JmxAutoConfiguration.class }) + @EnableAutoConfiguration(exclude = JmxAutoConfiguration.class) @EnableFeignClients @LoadBalancerClient(value = "fooservice", configuration = SimpleLoadBalancerClientConfiguration.class) @Import(ClientParserConfiguration.class) diff --git a/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/integration/sampled/WebClientTests.java b/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/integration/sampled/WebClientTests.java index 1fd1e70b2..913f42b81 100644 --- a/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/integration/sampled/WebClientTests.java +++ b/tests/common/src/main/java/org/springframework/cloud/sleuth/instrument/web/client/integration/sampled/WebClientTests.java @@ -55,10 +55,9 @@ import org.springframework.cloud.loadbalancer.annotation.LoadBalancerClient; import org.springframework.cloud.loadbalancer.core.ServiceInstanceListSupplier; import org.springframework.cloud.openfeign.EnableFeignClients; import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.cloud.sleuth.api.Span; -import org.springframework.cloud.sleuth.api.Tracer; -import org.springframework.cloud.sleuth.api.exporter.FinishedSpan; -import org.springframework.cloud.sleuth.instrument.web.TraceWebServletAutoConfiguration; +import org.springframework.cloud.sleuth.Span; +import org.springframework.cloud.sleuth.Tracer; +import org.springframework.cloud.sleuth.exporter.FinishedSpan; import org.springframework.cloud.sleuth.test.TestSpanHandler; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -81,8 +80,8 @@ import static org.assertj.core.api.Assertions.fail; import static org.assertj.core.api.BDDAssertions.then; @ContextConfiguration(classes = WebClientTests.TestConfiguration.class) -@TestPropertySource( - properties = { "spring.application.name=fooservice", "spring.sleuth.web.client.skip-pattern=/skip.*" }) +@TestPropertySource(properties = { "spring.sleuth.web.servlet.enabled=false", "spring.application.name=fooservice", + "spring.sleuth.web.client.skip-pattern=/skip.*" }) @DirtiesContext public abstract class WebClientTests { @@ -396,7 +395,7 @@ public abstract class WebClientTests { } @Configuration(proxyBeanMethods = false) - @EnableAutoConfiguration(exclude = { TraceWebServletAutoConfiguration.class, JmxAutoConfiguration.class }) + @EnableAutoConfiguration(exclude = JmxAutoConfiguration.class) @EnableFeignClients @LoadBalancerClient(value = "fooservice", configuration = SimpleLoadBalancerClientConfiguration.class) public static class TestConfiguration { diff --git a/tests/common/src/main/java/org/springframework/cloud/sleuth/otel/OtelTestSpanHandler.java b/tests/common/src/main/java/org/springframework/cloud/sleuth/otel/OtelTestSpanHandler.java index d8775728d..a15ea44d6 100644 --- a/tests/common/src/main/java/org/springframework/cloud/sleuth/otel/OtelTestSpanHandler.java +++ b/tests/common/src/main/java/org/springframework/cloud/sleuth/otel/OtelTestSpanHandler.java @@ -29,10 +29,10 @@ import io.opentelemetry.sdk.trace.SpanProcessor; import io.opentelemetry.sdk.trace.data.SpanData; import io.opentelemetry.sdk.trace.export.SpanExporter; -import org.springframework.cloud.sleuth.api.Span; -import org.springframework.cloud.sleuth.api.exporter.FinishedSpan; -import org.springframework.cloud.sleuth.otel.bridge.OtelFinishedSpan; -import org.springframework.cloud.sleuth.otel.exporter.ArrayListSpanProcessor; +import org.springframework.cloud.sleuth.Span; +import org.springframework.cloud.sleuth.exporter.FinishedSpan; +import org.springframework.cloud.sleuth.otel.bridge.ArrayListSpanProcessor; +import org.springframework.cloud.sleuth.otel.bridge.OtelAccessor; import org.springframework.cloud.sleuth.test.TestSpanHandler; public class OtelTestSpanHandler implements TestSpanHandler, SpanProcessor, SpanExporter { @@ -45,12 +45,12 @@ public class OtelTestSpanHandler implements TestSpanHandler, SpanProcessor, Span @Override public List reportedSpans() { - return spanProcessor.spans().stream().map(OtelFinishedSpan::new).collect(Collectors.toList()); + return spanProcessor.spans().stream().map(OtelAccessor::finishedSpan).collect(Collectors.toList()); } @Override public FinishedSpan takeLocalSpan() { - return new OtelFinishedSpan(spanProcessor.takeLocalSpan()); + return OtelAccessor.finishedSpan(spanProcessor.takeLocalSpan()); } @Override @@ -121,4 +121,9 @@ public class OtelTestSpanHandler implements TestSpanHandler, SpanProcessor, Span return spanProcessor.forceFlush(); } + @Override + public String toString() { + return "OtelTestSpanHandler{" + "spanProcessor=" + this.spanProcessor + '}'; + } + } diff --git a/tests/common/src/main/java/org/springframework/cloud/sleuth/otel/OtelTestTracing.java b/tests/common/src/main/java/org/springframework/cloud/sleuth/otel/OtelTestTracing.java index 92353860a..9ed46c129 100644 --- a/tests/common/src/main/java/org/springframework/cloud/sleuth/otel/OtelTestTracing.java +++ b/tests/common/src/main/java/org/springframework/cloud/sleuth/otel/OtelTestTracing.java @@ -27,21 +27,16 @@ import io.opentelemetry.sdk.trace.TracerSdkProvider; import io.opentelemetry.sdk.trace.config.TraceConfig; import io.opentelemetry.sdk.trace.samplers.Sampler; -import org.springframework.cloud.sleuth.api.CurrentTraceContext; -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.HttpRequestParser; -import org.springframework.cloud.sleuth.api.http.HttpServerHandler; -import org.springframework.cloud.sleuth.api.propagation.Propagator; +import org.springframework.cloud.sleuth.CurrentTraceContext; +import org.springframework.cloud.sleuth.SamplerFunction; +import org.springframework.cloud.sleuth.Tracer; import org.springframework.cloud.sleuth.autoconfig.SleuthBaggageProperties; -import org.springframework.cloud.sleuth.otel.bridge.OtelBaggageManager; -import org.springframework.cloud.sleuth.otel.bridge.OtelCurrentTraceContext; -import org.springframework.cloud.sleuth.otel.bridge.OtelPropagator; -import org.springframework.cloud.sleuth.otel.bridge.OtelTracer; -import org.springframework.cloud.sleuth.otel.bridge.http.OtelHttpClientHandler; -import org.springframework.cloud.sleuth.otel.bridge.http.OtelHttpServerHandler; -import org.springframework.cloud.sleuth.otel.exporter.ArrayListSpanProcessor; +import org.springframework.cloud.sleuth.http.HttpClientHandler; +import org.springframework.cloud.sleuth.http.HttpRequestParser; +import org.springframework.cloud.sleuth.http.HttpServerHandler; +import org.springframework.cloud.sleuth.otel.bridge.ArrayListSpanProcessor; +import org.springframework.cloud.sleuth.otel.bridge.OtelAccessor; +import org.springframework.cloud.sleuth.propagation.Propagator; import org.springframework.cloud.sleuth.test.TestSpanHandler; import org.springframework.cloud.sleuth.test.TestTracingAssertions; import org.springframework.cloud.sleuth.test.TestTracingAware; @@ -63,10 +58,11 @@ public class OtelTestTracing implements TracerAware, TestTracingAware, TestTraci io.opentelemetry.api.trace.Tracer tracer = otelTracer(); - OtelCurrentTraceContext currentTraceContext = new OtelCurrentTraceContext(publisher()); + CurrentTraceContext currentTraceContext = OtelAccessor.currentTraceContext(publisher()); - OtelBaggageManager otelBaggageManager = new OtelBaggageManager(this.currentTraceContext, - new SleuthBaggageProperties(), publisher()); + // OtelBaggageManager otelBaggageManager = new + // OtelBaggageManager(this.currentTraceContext, + // new SleuthBaggageProperties(), publisher()); io.opentelemetry.api.trace.Tracer otelTracer() { TracerSdkProvider provider = TracerSdkProvider.builder().build(); @@ -84,7 +80,7 @@ public class OtelTestTracing implements TracerAware, TestTracingAware, TestTraci private void reset() { this.contextPropagators = contextPropagators(); this.tracer = otelTracer(); - this.currentTraceContext = new OtelCurrentTraceContext(publisher()); + this.currentTraceContext = OtelAccessor.currentTraceContext(publisher()); } @Override @@ -123,25 +119,25 @@ public class OtelTestTracing implements TracerAware, TestTracingAware, TestTraci @Override public Tracer tracer() { reset(); - return OtelTracer.fromOtel(this.tracer, this.otelBaggageManager); + return OtelAccessor.tracer(this.tracer, this.currentTraceContext, new SleuthBaggageProperties(), publisher()); } @Override public CurrentTraceContext currentTraceContext() { reset(); - return new OtelCurrentTraceContext(publisher()); + return OtelAccessor.currentTraceContext(publisher()); } @Override public Propagator propagator() { reset(); - return new OtelPropagator(this.contextPropagators, this.tracer); + return OtelAccessor.propagator(this.contextPropagators, this.tracer); } @Override public HttpServerHandler httpServerHandler() { reset(); - return new OtelHttpServerHandler(this.tracer, null, null, () -> Pattern.compile("")); + return OtelAccessor.httpServerHandler(this.tracer, null, null, () -> Pattern.compile("")); } @Override @@ -153,7 +149,8 @@ public class OtelTestTracing implements TracerAware, TestTracingAware, TestTraci @Override public HttpClientHandler httpClientHandler() { reset(); - return new OtelHttpClientHandler(this.tracer, this.clientRequestParser, null, SamplerFunction.alwaysSample()); + return OtelAccessor.httpClientHandler(this.tracer, this.clientRequestParser, null, + SamplerFunction.alwaysSample()); } ApplicationEventPublisher publisher() { diff --git a/tests/common/src/main/java/org/springframework/cloud/sleuth/otel/OtelTestTracingAssertions.java b/tests/common/src/main/java/org/springframework/cloud/sleuth/otel/OtelTestTracingAssertions.java index 5219dbcdb..a031ed16c 100644 --- a/tests/common/src/main/java/org/springframework/cloud/sleuth/otel/OtelTestTracingAssertions.java +++ b/tests/common/src/main/java/org/springframework/cloud/sleuth/otel/OtelTestTracingAssertions.java @@ -18,7 +18,7 @@ package org.springframework.cloud.sleuth.otel; import org.assertj.core.api.BDDAssertions; -import org.springframework.cloud.sleuth.api.exporter.FinishedSpan; +import org.springframework.cloud.sleuth.exporter.FinishedSpan; import org.springframework.cloud.sleuth.test.TestTracingAssertions; public class OtelTestTracingAssertions implements TestTracingAssertions { diff --git a/tests/common/src/main/java/org/springframework/cloud/sleuth/otel/bridge/OtelAccessor.java b/tests/common/src/main/java/org/springframework/cloud/sleuth/otel/bridge/OtelAccessor.java new file mode 100644 index 000000000..1f9565d92 --- /dev/null +++ b/tests/common/src/main/java/org/springframework/cloud/sleuth/otel/bridge/OtelAccessor.java @@ -0,0 +1,85 @@ +/* + * 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.api.trace.SpanContext; +import io.opentelemetry.context.propagation.ContextPropagators; +import io.opentelemetry.sdk.trace.data.SpanData; + +import org.springframework.cloud.sleuth.CurrentTraceContext; +import org.springframework.cloud.sleuth.SamplerFunction; +import org.springframework.cloud.sleuth.TraceContext; +import org.springframework.cloud.sleuth.Tracer; +import org.springframework.cloud.sleuth.autoconfig.SleuthBaggageProperties; +import org.springframework.cloud.sleuth.exporter.FinishedSpan; +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.SkipPatternProvider; +import org.springframework.cloud.sleuth.propagation.Propagator; +import org.springframework.context.ApplicationEventPublisher; +import org.springframework.lang.Nullable; + +public final class OtelAccessor { + + private OtelAccessor() { + throw new IllegalStateException("Can't instantiate a utility class"); + } + + public static Tracer tracer(io.opentelemetry.api.trace.Tracer tracer, CurrentTraceContext currentTraceContext, + SleuthBaggageProperties sleuthBaggageProperties, ApplicationEventPublisher publisher) { + return new OtelTracer(tracer, publisher, new OtelBaggageManager(currentTraceContext, + sleuthBaggageProperties.getRemoteFields(), sleuthBaggageProperties.getTagFields(), publisher)); + } + + public static CurrentTraceContext currentTraceContext(ApplicationEventPublisher publisher) { + return new OtelCurrentTraceContext(publisher); + } + + public static CurrentTraceContext currentTraceContext() { + return currentTraceContext(event -> { + }); + } + + public static TraceContext traceContext(SpanContext spanContext) { + return OtelTraceContext.fromOtel(spanContext); + } + + public static Propagator propagator(ContextPropagators propagators, io.opentelemetry.api.trace.Tracer tracer) { + return new OtelPropagator(propagators, tracer); + } + + public static HttpClientHandler httpClientHandler(io.opentelemetry.api.trace.Tracer tracer, + @Nullable HttpRequestParser httpClientRequestParser, @Nullable HttpResponseParser httpClientResponseParser, + SamplerFunction samplerFunction) { + return new OtelHttpClientHandler(tracer, httpClientRequestParser, httpClientResponseParser, samplerFunction); + } + + public static HttpServerHandler httpServerHandler(io.opentelemetry.api.trace.Tracer tracer, + HttpRequestParser httpServerRequestParser, HttpResponseParser httpServerResponseParser, + SkipPatternProvider skipPatternProvider) { + return new OtelHttpServerHandler(tracer, httpServerRequestParser, httpServerResponseParser, + skipPatternProvider); + } + + public static FinishedSpan finishedSpan(SpanData spanData) { + return new OtelFinishedSpan(spanData); + } + +} diff --git a/tests/common/src/main/java/org/springframework/cloud/sleuth/test/TestSpanHandler.java b/tests/common/src/main/java/org/springframework/cloud/sleuth/test/TestSpanHandler.java index d64669cc2..f0839ea4c 100644 --- a/tests/common/src/main/java/org/springframework/cloud/sleuth/test/TestSpanHandler.java +++ b/tests/common/src/main/java/org/springframework/cloud/sleuth/test/TestSpanHandler.java @@ -18,8 +18,8 @@ package org.springframework.cloud.sleuth.test; import java.util.List; -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; public interface TestSpanHandler extends Iterable { diff --git a/tests/common/src/main/java/org/springframework/cloud/sleuth/test/TestTracingAssertions.java b/tests/common/src/main/java/org/springframework/cloud/sleuth/test/TestTracingAssertions.java index 6df09b6bf..495f17f00 100644 --- a/tests/common/src/main/java/org/springframework/cloud/sleuth/test/TestTracingAssertions.java +++ b/tests/common/src/main/java/org/springframework/cloud/sleuth/test/TestTracingAssertions.java @@ -16,7 +16,7 @@ package org.springframework.cloud.sleuth.test; -import org.springframework.cloud.sleuth.api.exporter.FinishedSpan; +import org.springframework.cloud.sleuth.exporter.FinishedSpan; public interface TestTracingAssertions { diff --git a/tests/common/src/main/java/org/springframework/cloud/sleuth/test/TracerAware.java b/tests/common/src/main/java/org/springframework/cloud/sleuth/test/TracerAware.java index 3f1f7d8d9..e2a2f1cd1 100644 --- a/tests/common/src/main/java/org/springframework/cloud/sleuth/test/TracerAware.java +++ b/tests/common/src/main/java/org/springframework/cloud/sleuth/test/TracerAware.java @@ -16,12 +16,12 @@ package org.springframework.cloud.sleuth.test; -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.http.HttpRequestParser; -import org.springframework.cloud.sleuth.api.http.HttpServerHandler; -import org.springframework.cloud.sleuth.api.propagation.Propagator; +import org.springframework.cloud.sleuth.CurrentTraceContext; +import org.springframework.cloud.sleuth.Tracer; +import org.springframework.cloud.sleuth.http.HttpClientHandler; +import org.springframework.cloud.sleuth.http.HttpRequestParser; +import org.springframework.cloud.sleuth.http.HttpServerHandler; +import org.springframework.cloud.sleuth.propagation.Propagator; public interface TracerAware { diff --git a/spring-cloud-sleuth-zipkin/src/test/java/org/springframework/cloud/sleuth/zipkin2/ZipkinDiscoveryClientTests.java b/tests/common/src/main/java/org/springframework/cloud/sleuth/zipkin2/ZipkinDiscoveryClientTests.java similarity index 94% rename from spring-cloud-sleuth-zipkin/src/test/java/org/springframework/cloud/sleuth/zipkin2/ZipkinDiscoveryClientTests.java rename to tests/common/src/main/java/org/springframework/cloud/sleuth/zipkin2/ZipkinDiscoveryClientTests.java index a92c2afaf..71d4bf539 100644 --- a/spring-cloud-sleuth-zipkin/src/test/java/org/springframework/cloud/sleuth/zipkin2/ZipkinDiscoveryClientTests.java +++ b/tests/common/src/main/java/org/springframework/cloud/sleuth/zipkin2/ZipkinDiscoveryClientTests.java @@ -25,13 +25,12 @@ import org.awaitility.Awaitility; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.loadbalancer.LoadBalancerClient; import org.springframework.cloud.client.loadbalancer.LoadBalancerRequest; import org.springframework.cloud.client.loadbalancer.Request; -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.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.test.context.ContextConfiguration; @@ -59,7 +58,6 @@ public abstract class ZipkinDiscoveryClientTests { } @Configuration(proxyBeanMethods = false) - @EnableAutoConfiguration static class Config { @Bean(initMethod = "start", destroyMethod = "close") diff --git a/tests/otel/pom.xml b/tests/otel/pom.xml index 1530db10f..f80e5537a 100644 --- a/tests/otel/pom.xml +++ b/tests/otel/pom.xml @@ -48,6 +48,7 @@ spring-cloud-sleuth-instrumentation-rxjava-tests spring-cloud-sleuth-instrumentation-scheduling-tests spring-cloud-sleuth-instrumentation-webflux-tests + spring-cloud-sleuth-zipkin-tests diff --git a/tests/otel/spring-cloud-sleuth-instrumentation-annotation-tests/pom.xml b/tests/otel/spring-cloud-sleuth-instrumentation-annotation-tests/pom.xml index 0bd4a2c4a..f4acd850e 100644 --- a/tests/otel/spring-cloud-sleuth-instrumentation-annotation-tests/pom.xml +++ b/tests/otel/spring-cloud-sleuth-instrumentation-annotation-tests/pom.xml @@ -63,22 +63,28 @@ org.springframework.boot spring-boot-starter-webflux - test + + + org.springframework.cloud + spring-cloud-starter-sleuth + + + org.springframework.cloud + spring-cloud-sleuth-brave + + org.springframework.cloud spring-cloud-sleuth-otel - test org.springframework.boot spring-boot-starter-test - test org.awaitility awaitility - test diff --git a/tests/otel/spring-cloud-sleuth-instrumentation-annotation-tests/src/test/java/org/springframework/cloud/sleuth/otel/annotation/NullSpanTagAnnotationHandlerTests.java b/tests/otel/spring-cloud-sleuth-instrumentation-annotation-tests/src/test/java/org/springframework/cloud/sleuth/otel/annotation/NullSpanTagAnnotationHandlerTests.java index afe2cff1a..5dbe5cecf 100644 --- a/tests/otel/spring-cloud-sleuth-instrumentation-annotation-tests/src/test/java/org/springframework/cloud/sleuth/otel/annotation/NullSpanTagAnnotationHandlerTests.java +++ b/tests/otel/spring-cloud-sleuth-instrumentation-annotation-tests/src/test/java/org/springframework/cloud/sleuth/otel/annotation/NullSpanTagAnnotationHandlerTests.java @@ -20,7 +20,7 @@ import io.opentelemetry.sdk.trace.samplers.Sampler; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.cloud.sleuth.otel.OtelTestSpanHandler; -import org.springframework.cloud.sleuth.otel.exporter.ArrayListSpanProcessor; +import org.springframework.cloud.sleuth.otel.bridge.ArrayListSpanProcessor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.test.context.ContextConfiguration; @@ -28,7 +28,7 @@ import org.springframework.test.context.ContextConfiguration; @SpringBootTest @ContextConfiguration(classes = NullSpanTagAnnotationHandlerTests.Config.class) public class NullSpanTagAnnotationHandlerTests - extends org.springframework.cloud.sleuth.annotation.NullSpanTagAnnotationHandlerTests { + extends org.springframework.cloud.sleuth.instrument.annotation.NullSpanTagAnnotationHandlerTests { @Configuration(proxyBeanMethods = false) static class Config { diff --git a/tests/otel/spring-cloud-sleuth-instrumentation-annotation-tests/src/test/java/org/springframework/cloud/sleuth/otel/annotation/SleuthSpanCreatorAspectFluxTests.java b/tests/otel/spring-cloud-sleuth-instrumentation-annotation-tests/src/test/java/org/springframework/cloud/sleuth/otel/annotation/SleuthSpanCreatorAspectFluxTests.java index 49a846e02..99d388f39 100644 --- a/tests/otel/spring-cloud-sleuth-instrumentation-annotation-tests/src/test/java/org/springframework/cloud/sleuth/otel/annotation/SleuthSpanCreatorAspectFluxTests.java +++ b/tests/otel/spring-cloud-sleuth-instrumentation-annotation-tests/src/test/java/org/springframework/cloud/sleuth/otel/annotation/SleuthSpanCreatorAspectFluxTests.java @@ -24,10 +24,10 @@ import io.opentelemetry.api.trace.TraceState; import io.opentelemetry.sdk.trace.samplers.Sampler; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.cloud.sleuth.api.TraceContext; +import org.springframework.cloud.sleuth.TraceContext; import org.springframework.cloud.sleuth.otel.OtelTestSpanHandler; -import org.springframework.cloud.sleuth.otel.bridge.OtelTraceContext; -import org.springframework.cloud.sleuth.otel.exporter.ArrayListSpanProcessor; +import org.springframework.cloud.sleuth.otel.bridge.ArrayListSpanProcessor; +import org.springframework.cloud.sleuth.otel.bridge.OtelAccessor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.test.context.ContextConfiguration; @@ -35,11 +35,11 @@ import org.springframework.test.context.ContextConfiguration; @SpringBootTest @ContextConfiguration(classes = SleuthSpanCreatorAspectFluxTests.Config.class) public class SleuthSpanCreatorAspectFluxTests - extends org.springframework.cloud.sleuth.annotation.SleuthSpanCreatorAspectFluxTests { + extends org.springframework.cloud.sleuth.instrument.annotation.SleuthSpanCreatorAspectFluxTests { @Override public TraceContext traceContext() { - return OtelTraceContext.fromOtel(SpanContext.create(TraceId.fromLongs(1L, 0L), SpanId.fromLong(2L), + return OtelAccessor.traceContext(SpanContext.create(TraceId.fromLongs(1L, 0L), SpanId.fromLong(2L), TraceFlags.getSampled(), TraceState.builder().build())); } diff --git a/tests/otel/spring-cloud-sleuth-instrumentation-annotation-tests/src/test/java/org/springframework/cloud/sleuth/otel/annotation/SleuthSpanCreatorAspectMonoTests.java b/tests/otel/spring-cloud-sleuth-instrumentation-annotation-tests/src/test/java/org/springframework/cloud/sleuth/otel/annotation/SleuthSpanCreatorAspectMonoTests.java index 516811210..a8d73ab20 100644 --- a/tests/otel/spring-cloud-sleuth-instrumentation-annotation-tests/src/test/java/org/springframework/cloud/sleuth/otel/annotation/SleuthSpanCreatorAspectMonoTests.java +++ b/tests/otel/spring-cloud-sleuth-instrumentation-annotation-tests/src/test/java/org/springframework/cloud/sleuth/otel/annotation/SleuthSpanCreatorAspectMonoTests.java @@ -20,7 +20,7 @@ import io.opentelemetry.sdk.trace.samplers.Sampler; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.cloud.sleuth.otel.OtelTestSpanHandler; -import org.springframework.cloud.sleuth.otel.exporter.ArrayListSpanProcessor; +import org.springframework.cloud.sleuth.otel.bridge.ArrayListSpanProcessor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.test.context.ContextConfiguration; @@ -28,7 +28,7 @@ import org.springframework.test.context.ContextConfiguration; @SpringBootTest @ContextConfiguration(classes = SleuthSpanCreatorAspectMonoTests.Config.class) public class SleuthSpanCreatorAspectMonoTests - extends org.springframework.cloud.sleuth.annotation.SleuthSpanCreatorAspectMonoTests { + extends org.springframework.cloud.sleuth.instrument.annotation.SleuthSpanCreatorAspectMonoTests { @Configuration(proxyBeanMethods = false) static class Config { diff --git a/tests/otel/spring-cloud-sleuth-instrumentation-annotation-tests/src/test/java/org/springframework/cloud/sleuth/otel/annotation/SleuthSpanCreatorAspectNegativeTests.java b/tests/otel/spring-cloud-sleuth-instrumentation-annotation-tests/src/test/java/org/springframework/cloud/sleuth/otel/annotation/SleuthSpanCreatorAspectNegativeTests.java index 85e90d84a..041abf12d 100644 --- a/tests/otel/spring-cloud-sleuth-instrumentation-annotation-tests/src/test/java/org/springframework/cloud/sleuth/otel/annotation/SleuthSpanCreatorAspectNegativeTests.java +++ b/tests/otel/spring-cloud-sleuth-instrumentation-annotation-tests/src/test/java/org/springframework/cloud/sleuth/otel/annotation/SleuthSpanCreatorAspectNegativeTests.java @@ -20,7 +20,7 @@ import io.opentelemetry.sdk.trace.samplers.Sampler; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.cloud.sleuth.otel.OtelTestSpanHandler; -import org.springframework.cloud.sleuth.otel.exporter.ArrayListSpanProcessor; +import org.springframework.cloud.sleuth.otel.bridge.ArrayListSpanProcessor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.test.context.ContextConfiguration; @@ -28,7 +28,7 @@ import org.springframework.test.context.ContextConfiguration; @SpringBootTest @ContextConfiguration(classes = SleuthSpanCreatorAspectNegativeTests.Config.class) public class SleuthSpanCreatorAspectNegativeTests - extends org.springframework.cloud.sleuth.annotation.SleuthSpanCreatorAspectNegativeTests { + extends org.springframework.cloud.sleuth.instrument.annotation.SleuthSpanCreatorAspectNegativeTests { @Configuration(proxyBeanMethods = false) static class Config { diff --git a/tests/otel/spring-cloud-sleuth-instrumentation-annotation-tests/src/test/java/org/springframework/cloud/sleuth/otel/annotation/SleuthSpanCreatorAspectTests.java b/tests/otel/spring-cloud-sleuth-instrumentation-annotation-tests/src/test/java/org/springframework/cloud/sleuth/otel/annotation/SleuthSpanCreatorAspectTests.java index 02743af12..8776ed9b7 100644 --- a/tests/otel/spring-cloud-sleuth-instrumentation-annotation-tests/src/test/java/org/springframework/cloud/sleuth/otel/annotation/SleuthSpanCreatorAspectTests.java +++ b/tests/otel/spring-cloud-sleuth-instrumentation-annotation-tests/src/test/java/org/springframework/cloud/sleuth/otel/annotation/SleuthSpanCreatorAspectTests.java @@ -20,7 +20,7 @@ import io.opentelemetry.sdk.trace.samplers.Sampler; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.cloud.sleuth.otel.OtelTestSpanHandler; -import org.springframework.cloud.sleuth.otel.exporter.ArrayListSpanProcessor; +import org.springframework.cloud.sleuth.otel.bridge.ArrayListSpanProcessor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.test.context.ContextConfiguration; @@ -28,7 +28,7 @@ import org.springframework.test.context.ContextConfiguration; @SpringBootTest @ContextConfiguration(classes = SleuthSpanCreatorAspectTests.Config.class) public class SleuthSpanCreatorAspectTests - extends org.springframework.cloud.sleuth.annotation.SleuthSpanCreatorAspectTests { + extends org.springframework.cloud.sleuth.instrument.annotation.SleuthSpanCreatorAspectTests { @Configuration(proxyBeanMethods = false) static class Config { diff --git a/tests/otel/spring-cloud-sleuth-instrumentation-annotation-tests/src/test/java/org/springframework/cloud/sleuth/otel/annotation/SleuthSpanCreatorCircularDependencyTests.java b/tests/otel/spring-cloud-sleuth-instrumentation-annotation-tests/src/test/java/org/springframework/cloud/sleuth/otel/annotation/SleuthSpanCreatorCircularDependencyTests.java index 549471dfd..5cbf98283 100644 --- a/tests/otel/spring-cloud-sleuth-instrumentation-annotation-tests/src/test/java/org/springframework/cloud/sleuth/otel/annotation/SleuthSpanCreatorCircularDependencyTests.java +++ b/tests/otel/spring-cloud-sleuth-instrumentation-annotation-tests/src/test/java/org/springframework/cloud/sleuth/otel/annotation/SleuthSpanCreatorCircularDependencyTests.java @@ -20,7 +20,7 @@ import io.opentelemetry.sdk.trace.samplers.Sampler; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.cloud.sleuth.otel.OtelTestSpanHandler; -import org.springframework.cloud.sleuth.otel.exporter.ArrayListSpanProcessor; +import org.springframework.cloud.sleuth.otel.bridge.ArrayListSpanProcessor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.test.context.ContextConfiguration; @@ -28,7 +28,7 @@ import org.springframework.test.context.ContextConfiguration; @SpringBootTest @ContextConfiguration(classes = SleuthSpanCreatorCircularDependencyTests.Config.class) public class SleuthSpanCreatorCircularDependencyTests - extends org.springframework.cloud.sleuth.annotation.SleuthSpanCreatorCircularDependencyTests { + extends org.springframework.cloud.sleuth.instrument.annotation.SleuthSpanCreatorCircularDependencyTests { @Configuration(proxyBeanMethods = false) static class Config { diff --git a/tests/otel/spring-cloud-sleuth-instrumentation-annotation-tests/src/test/java/org/springframework/cloud/sleuth/otel/annotation/SpanTagAnnotationHandlerTests.java b/tests/otel/spring-cloud-sleuth-instrumentation-annotation-tests/src/test/java/org/springframework/cloud/sleuth/otel/annotation/SpanTagAnnotationHandlerTests.java index 42a4ec7c5..149e789fc 100644 --- a/tests/otel/spring-cloud-sleuth-instrumentation-annotation-tests/src/test/java/org/springframework/cloud/sleuth/otel/annotation/SpanTagAnnotationHandlerTests.java +++ b/tests/otel/spring-cloud-sleuth-instrumentation-annotation-tests/src/test/java/org/springframework/cloud/sleuth/otel/annotation/SpanTagAnnotationHandlerTests.java @@ -20,7 +20,7 @@ import io.opentelemetry.sdk.trace.samplers.Sampler; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.cloud.sleuth.otel.OtelTestSpanHandler; -import org.springframework.cloud.sleuth.otel.exporter.ArrayListSpanProcessor; +import org.springframework.cloud.sleuth.otel.bridge.ArrayListSpanProcessor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.test.context.ContextConfiguration; @@ -28,7 +28,7 @@ import org.springframework.test.context.ContextConfiguration; @SpringBootTest @ContextConfiguration(classes = SpanTagAnnotationHandlerTests.Config.class) public class SpanTagAnnotationHandlerTests - extends org.springframework.cloud.sleuth.annotation.SpanTagAnnotationHandlerTests { + extends org.springframework.cloud.sleuth.instrument.annotation.SpanTagAnnotationHandlerTests { @Configuration(proxyBeanMethods = false) static class Config { diff --git a/tests/otel/spring-cloud-sleuth-instrumentation-async-tests/pom.xml b/tests/otel/spring-cloud-sleuth-instrumentation-async-tests/pom.xml index 654abc456..a48ee3627 100644 --- a/tests/otel/spring-cloud-sleuth-instrumentation-async-tests/pom.xml +++ b/tests/otel/spring-cloud-sleuth-instrumentation-async-tests/pom.xml @@ -60,32 +60,35 @@ org.springframework.boot spring-boot-starter-web - - io.opentelemetry - opentelemetry-extension-trace-propagators - org.springframework.cloud - spring-cloud-sleuth-core + spring-cloud-sleuth-instrumentation org.springframework.boot spring-boot-starter-aop + + org.springframework.cloud + spring-cloud-starter-sleuth + + + org.springframework.cloud + spring-cloud-sleuth-brave + + + org.springframework.cloud spring-cloud-sleuth-otel - test org.springframework.boot spring-boot-starter-test - test org.awaitility awaitility - test diff --git a/tests/otel/spring-cloud-sleuth-instrumentation-async-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/async/TraceRunnableTests.java b/tests/otel/spring-cloud-sleuth-instrumentation-async-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/async/TraceRunnableTests.java index 592424e32..e489b0e85 100644 --- a/tests/otel/spring-cloud-sleuth-instrumentation-async-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/async/TraceRunnableTests.java +++ b/tests/otel/spring-cloud-sleuth-instrumentation-async-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/async/TraceRunnableTests.java @@ -18,7 +18,7 @@ package org.springframework.cloud.sleuth.otel.instrument.async; import org.assertj.core.api.BDDAssertions; -import org.springframework.cloud.sleuth.api.Span; +import org.springframework.cloud.sleuth.Span; import org.springframework.cloud.sleuth.otel.OtelTestTracing; import org.springframework.cloud.sleuth.test.TestTracingAware; diff --git a/tests/otel/spring-cloud-sleuth-instrumentation-baggage-tests/pom.xml b/tests/otel/spring-cloud-sleuth-instrumentation-baggage-tests/pom.xml index 7418faf9e..186ac86b5 100644 --- a/tests/otel/spring-cloud-sleuth-instrumentation-baggage-tests/pom.xml +++ b/tests/otel/spring-cloud-sleuth-instrumentation-baggage-tests/pom.xml @@ -56,10 +56,6 @@ spring-cloud-sleuth-tests-common ${project.version} - - io.opentelemetry - opentelemetry-extension-trace-propagators - org.springframework.boot spring-boot-starter-aop @@ -72,20 +68,27 @@ org.springframework.boot spring-boot-starter-web + + org.springframework.cloud + spring-cloud-starter-sleuth + + + org.springframework.cloud + spring-cloud-sleuth-brave + + + org.springframework.cloud spring-cloud-sleuth-otel - test org.springframework.boot spring-boot-starter-test - test org.awaitility awaitility - test diff --git a/tests/otel/spring-cloud-sleuth-instrumentation-baggage-tests/src/test/java/org/springframework/cloud/sleuth/otel/baggage/BaggageEntryTagSpanHandlerTest.java b/tests/otel/spring-cloud-sleuth-instrumentation-baggage-tests/src/test/java/org/springframework/cloud/sleuth/otel/bridge/BaggageEntryTagSpanHandlerTest.java similarity index 92% rename from tests/otel/spring-cloud-sleuth-instrumentation-baggage-tests/src/test/java/org/springframework/cloud/sleuth/otel/baggage/BaggageEntryTagSpanHandlerTest.java rename to tests/otel/spring-cloud-sleuth-instrumentation-baggage-tests/src/test/java/org/springframework/cloud/sleuth/otel/bridge/BaggageEntryTagSpanHandlerTest.java index 4408ef495..262601436 100644 --- a/tests/otel/spring-cloud-sleuth-instrumentation-baggage-tests/src/test/java/org/springframework/cloud/sleuth/otel/baggage/BaggageEntryTagSpanHandlerTest.java +++ b/tests/otel/spring-cloud-sleuth-instrumentation-baggage-tests/src/test/java/org/springframework/cloud/sleuth/otel/bridge/BaggageEntryTagSpanHandlerTest.java @@ -14,13 +14,12 @@ * limitations under the License. */ -package org.springframework.cloud.sleuth.otel.baggage; +package org.springframework.cloud.sleuth.otel.bridge; import io.opentelemetry.sdk.trace.samplers.Sampler; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.cloud.sleuth.otel.OtelTestSpanHandler; -import org.springframework.cloud.sleuth.otel.exporter.ArrayListSpanProcessor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.test.context.ContextConfiguration; diff --git a/tests/otel/spring-cloud-sleuth-instrumentation-baggage-tests/src/test/java/org/springframework/cloud/sleuth/otel/baggage/MultipleHopsIntegrationTests.java b/tests/otel/spring-cloud-sleuth-instrumentation-baggage-tests/src/test/java/org/springframework/cloud/sleuth/otel/bridge/MultipleHopsIntegrationTests.java similarity index 83% rename from tests/otel/spring-cloud-sleuth-instrumentation-baggage-tests/src/test/java/org/springframework/cloud/sleuth/otel/baggage/MultipleHopsIntegrationTests.java rename to tests/otel/spring-cloud-sleuth-instrumentation-baggage-tests/src/test/java/org/springframework/cloud/sleuth/otel/bridge/MultipleHopsIntegrationTests.java index 160f415cb..cfad2ca4a 100644 --- a/tests/otel/spring-cloud-sleuth-instrumentation-baggage-tests/src/test/java/org/springframework/cloud/sleuth/otel/baggage/MultipleHopsIntegrationTests.java +++ b/tests/otel/spring-cloud-sleuth-instrumentation-baggage-tests/src/test/java/org/springframework/cloud/sleuth/otel/bridge/MultipleHopsIntegrationTests.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.sleuth.otel.baggage; +package org.springframework.cloud.sleuth.otel.bridge; import java.util.Queue; import java.util.concurrent.LinkedBlockingQueue; @@ -22,13 +22,15 @@ import java.util.concurrent.LinkedBlockingQueue; import io.opentelemetry.sdk.trace.samplers.Sampler; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration; +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.sleuth.api.Span; -import org.springframework.cloud.sleuth.api.exporter.FinishedSpan; +import org.springframework.cloud.sleuth.Span; import org.springframework.cloud.sleuth.baggage.multiple.DemoApplication; +import org.springframework.cloud.sleuth.exporter.FinishedSpan; import org.springframework.cloud.sleuth.otel.OtelTestSpanHandler; -import org.springframework.cloud.sleuth.otel.bridge.OtelBaggageInScope; -import org.springframework.cloud.sleuth.otel.exporter.ArrayListSpanProcessor; import org.springframework.context.ApplicationListener; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -64,6 +66,8 @@ public class MultipleHopsIntegrationTests } @Configuration(proxyBeanMethods = false) + @EnableAutoConfiguration( + exclude = { MongoAutoConfiguration.class, QuartzAutoConfiguration.class, JmxAutoConfiguration.class }) static class Config { @Bean diff --git a/tests/otel/spring-cloud-sleuth-instrumentation-circuitbreaker-tests/pom.xml b/tests/otel/spring-cloud-sleuth-instrumentation-circuitbreaker-tests/pom.xml index 1afb9ceb5..da8a92749 100644 --- a/tests/otel/spring-cloud-sleuth-instrumentation-circuitbreaker-tests/pom.xml +++ b/tests/otel/spring-cloud-sleuth-instrumentation-circuitbreaker-tests/pom.xml @@ -65,23 +65,26 @@ spring-cloud-starter-circuitbreaker-resilience4j - io.opentelemetry - opentelemetry-extension-trace-propagators + org.springframework.cloud + spring-cloud-starter-sleuth + + + org.springframework.cloud + spring-cloud-sleuth-brave + + org.springframework.cloud spring-cloud-sleuth-otel - test org.springframework.boot spring-boot-starter-test - test org.awaitility awaitility - test diff --git a/tests/otel/spring-cloud-sleuth-instrumentation-circuitbreaker-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/circuitbreaker/CircuitBreakerIntegrationTests.java b/tests/otel/spring-cloud-sleuth-instrumentation-circuitbreaker-tests/src/test/java/org/springframework/cloud/sleuth/otel/bridge/CircuitBreakerIntegrationTests.java similarity index 86% rename from tests/otel/spring-cloud-sleuth-instrumentation-circuitbreaker-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/circuitbreaker/CircuitBreakerIntegrationTests.java rename to tests/otel/spring-cloud-sleuth-instrumentation-circuitbreaker-tests/src/test/java/org/springframework/cloud/sleuth/otel/bridge/CircuitBreakerIntegrationTests.java index c8bcee950..811e1b29b 100644 --- a/tests/otel/spring-cloud-sleuth-instrumentation-circuitbreaker-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/circuitbreaker/CircuitBreakerIntegrationTests.java +++ b/tests/otel/spring-cloud-sleuth-instrumentation-circuitbreaker-tests/src/test/java/org/springframework/cloud/sleuth/otel/bridge/CircuitBreakerIntegrationTests.java @@ -14,17 +14,15 @@ * limitations under the License. */ -package org.springframework.cloud.sleuth.otel.instrument.circuitbreaker; +package org.springframework.cloud.sleuth.otel.bridge; import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.sdk.trace.samplers.Sampler; import org.assertj.core.api.BDDAssertions; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.cloud.sleuth.api.exporter.FinishedSpan; +import org.springframework.cloud.sleuth.exporter.FinishedSpan; import org.springframework.cloud.sleuth.otel.OtelTestSpanHandler; -import org.springframework.cloud.sleuth.otel.bridge.OtelFinishedSpan; -import org.springframework.cloud.sleuth.otel.exporter.ArrayListSpanProcessor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.test.context.ContextConfiguration; diff --git a/tests/otel/spring-cloud-sleuth-instrumentation-circuitbreaker-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/circuitbreaker/CircuitBreakerTests.java b/tests/otel/spring-cloud-sleuth-instrumentation-circuitbreaker-tests/src/test/java/org/springframework/cloud/sleuth/otel/bridge/CircuitBreakerTests.java similarity index 87% rename from tests/otel/spring-cloud-sleuth-instrumentation-circuitbreaker-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/circuitbreaker/CircuitBreakerTests.java rename to tests/otel/spring-cloud-sleuth-instrumentation-circuitbreaker-tests/src/test/java/org/springframework/cloud/sleuth/otel/bridge/CircuitBreakerTests.java index 8295ef05b..f5a8e2b5f 100644 --- a/tests/otel/spring-cloud-sleuth-instrumentation-circuitbreaker-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/circuitbreaker/CircuitBreakerTests.java +++ b/tests/otel/spring-cloud-sleuth-instrumentation-circuitbreaker-tests/src/test/java/org/springframework/cloud/sleuth/otel/bridge/CircuitBreakerTests.java @@ -14,14 +14,13 @@ * limitations under the License. */ -package org.springframework.cloud.sleuth.otel.instrument.circuitbreaker; +package org.springframework.cloud.sleuth.otel.bridge; import io.opentelemetry.api.common.AttributeKey; import org.assertj.core.api.BDDAssertions; -import org.springframework.cloud.sleuth.api.exporter.FinishedSpan; +import org.springframework.cloud.sleuth.exporter.FinishedSpan; import org.springframework.cloud.sleuth.otel.OtelTestTracing; -import org.springframework.cloud.sleuth.otel.bridge.OtelFinishedSpan; import org.springframework.cloud.sleuth.test.TestTracingAware; public class CircuitBreakerTests diff --git a/tests/otel/spring-cloud-sleuth-instrumentation-feign-tests/pom.xml b/tests/otel/spring-cloud-sleuth-instrumentation-feign-tests/pom.xml index 2af1ccf82..0b0926f50 100644 --- a/tests/otel/spring-cloud-sleuth-instrumentation-feign-tests/pom.xml +++ b/tests/otel/spring-cloud-sleuth-instrumentation-feign-tests/pom.xml @@ -60,10 +60,6 @@ org.springframework.boot spring-boot-starter-web - - io.opentelemetry - opentelemetry-extension-trace-propagators - com.squareup.okhttp3 mockwebserver @@ -77,12 +73,21 @@ org.springframework.cloud - spring-cloud-sleuth-otel - test + spring-cloud-starter-sleuth + + + org.springframework.cloud + spring-cloud-sleuth-brave + + org.springframework.cloud - spring-cloud-sleuth-core + spring-cloud-sleuth-otel + + + org.springframework.cloud + spring-cloud-sleuth-instrumentation org.springframework.boot @@ -103,17 +108,14 @@ io.github.openfeign feign-okhttp - true org.springframework.boot spring-boot-starter-test - test org.awaitility awaitility - test diff --git a/tests/otel/spring-cloud-sleuth-instrumentation-feign-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/web/client/feign/FeignRetriesTests.java b/tests/otel/spring-cloud-sleuth-instrumentation-feign-tests/src/test/java/org/springframework/cloud/sleuth/otel/bridge/FeignRetriesTests.java similarity index 91% rename from tests/otel/spring-cloud-sleuth-instrumentation-feign-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/web/client/feign/FeignRetriesTests.java rename to tests/otel/spring-cloud-sleuth-instrumentation-feign-tests/src/test/java/org/springframework/cloud/sleuth/otel/bridge/FeignRetriesTests.java index 4821201f1..1f778e06d 100644 --- a/tests/otel/spring-cloud-sleuth-instrumentation-feign-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/web/client/feign/FeignRetriesTests.java +++ b/tests/otel/spring-cloud-sleuth-instrumentation-feign-tests/src/test/java/org/springframework/cloud/sleuth/otel/bridge/FeignRetriesTests.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.sleuth.otel.instrument.web.client.feign; +package org.springframework.cloud.sleuth.otel.bridge; import java.io.IOException; @@ -22,7 +22,6 @@ import io.opentelemetry.api.common.AttributeKey; import org.assertj.core.api.BDDAssertions; import org.springframework.cloud.sleuth.otel.OtelTestTracing; -import org.springframework.cloud.sleuth.otel.bridge.OtelFinishedSpan; import org.springframework.cloud.sleuth.test.TestTracingAware; public class FeignRetriesTests extends org.springframework.cloud.sleuth.instrument.web.client.feign.FeignRetriesTests { diff --git a/tests/otel/spring-cloud-sleuth-instrumentation-feign-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/web/client/feign/TraceFeignAspectTests.java b/tests/otel/spring-cloud-sleuth-instrumentation-feign-tests/src/test/java/org/springframework/cloud/sleuth/otel/bridge/TraceFeignAspectTests.java similarity index 93% rename from tests/otel/spring-cloud-sleuth-instrumentation-feign-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/web/client/feign/TraceFeignAspectTests.java rename to tests/otel/spring-cloud-sleuth-instrumentation-feign-tests/src/test/java/org/springframework/cloud/sleuth/otel/bridge/TraceFeignAspectTests.java index ee475d329..76fc84c8e 100644 --- a/tests/otel/spring-cloud-sleuth-instrumentation-feign-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/web/client/feign/TraceFeignAspectTests.java +++ b/tests/otel/spring-cloud-sleuth-instrumentation-feign-tests/src/test/java/org/springframework/cloud/sleuth/otel/bridge/TraceFeignAspectTests.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.sleuth.otel.instrument.web.client.feign; +package org.springframework.cloud.sleuth.otel.bridge; import org.springframework.cloud.sleuth.otel.OtelTestTracing; import org.springframework.cloud.sleuth.test.TestTracingAware; diff --git a/tests/otel/spring-cloud-sleuth-instrumentation-feign-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/web/client/feign/TracingFeignClientTests.java b/tests/otel/spring-cloud-sleuth-instrumentation-feign-tests/src/test/java/org/springframework/cloud/sleuth/otel/bridge/TracingFeignClientTests.java similarity index 91% rename from tests/otel/spring-cloud-sleuth-instrumentation-feign-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/web/client/feign/TracingFeignClientTests.java rename to tests/otel/spring-cloud-sleuth-instrumentation-feign-tests/src/test/java/org/springframework/cloud/sleuth/otel/bridge/TracingFeignClientTests.java index cab913f4b..252c4d501 100644 --- a/tests/otel/spring-cloud-sleuth-instrumentation-feign-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/web/client/feign/TracingFeignClientTests.java +++ b/tests/otel/spring-cloud-sleuth-instrumentation-feign-tests/src/test/java/org/springframework/cloud/sleuth/otel/bridge/TracingFeignClientTests.java @@ -14,13 +14,12 @@ * limitations under the License. */ -package org.springframework.cloud.sleuth.otel.instrument.web.client.feign; +package org.springframework.cloud.sleuth.otel.bridge; import io.opentelemetry.api.common.AttributeKey; import org.assertj.core.api.BDDAssertions; import org.springframework.cloud.sleuth.otel.OtelTestTracing; -import org.springframework.cloud.sleuth.otel.bridge.OtelFinishedSpan; import org.springframework.cloud.sleuth.test.TestTracingAware; public class TracingFeignClientTests diff --git a/tests/otel/spring-cloud-sleuth-instrumentation-gateway-tests/pom.xml b/tests/otel/spring-cloud-sleuth-instrumentation-gateway-tests/pom.xml index 64cdd3aa0..f7d6ece65 100644 --- a/tests/otel/spring-cloud-sleuth-instrumentation-gateway-tests/pom.xml +++ b/tests/otel/spring-cloud-sleuth-instrumentation-gateway-tests/pom.xml @@ -61,23 +61,26 @@ spring-cloud-starter-gateway - io.opentelemetry - opentelemetry-extension-trace-propagators + org.springframework.cloud + spring-cloud-starter-sleuth + + + org.springframework.cloud + spring-cloud-sleuth-brave + + org.springframework.cloud spring-cloud-sleuth-otel - test org.springframework.boot spring-boot-starter-test - test org.awaitility awaitility - test diff --git a/tests/otel/spring-cloud-sleuth-instrumentation-messaging-tests/pom.xml b/tests/otel/spring-cloud-sleuth-instrumentation-messaging-tests/pom.xml index 6d1a3b072..60fcd4525 100644 --- a/tests/otel/spring-cloud-sleuth-instrumentation-messaging-tests/pom.xml +++ b/tests/otel/spring-cloud-sleuth-instrumentation-messaging-tests/pom.xml @@ -60,22 +60,27 @@ org.springframework.boot spring-boot-starter-web - - io.opentelemetry - opentelemetry-extension-trace-propagators - org.springframework.cloud - spring-cloud-sleuth-core + spring-cloud-sleuth-instrumentation org.springframework.boot spring-boot-starter-aop + + org.springframework.cloud + spring-cloud-starter-sleuth + + + org.springframework.cloud + spring-cloud-sleuth-brave + + + org.springframework.cloud spring-cloud-sleuth-otel - test org.springframework.cloud @@ -86,13 +91,11 @@ org.springframework.cloud spring-cloud-stream test-jar - test test-binder org.springframework.boot spring-boot-starter-test - test org.junit.vintage @@ -103,18 +106,15 @@ org.awaitility awaitility - test org.springframework.integration spring-integration-core - true org.springframework.boot spring-boot-starter-websocket - true diff --git a/tests/otel/spring-cloud-sleuth-instrumentation-messaging-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/messaging/TraceWebSocketAutoConfigurationTests.java b/tests/otel/spring-cloud-sleuth-instrumentation-messaging-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/messaging/TraceWebSocketAutoConfigurationTests.java index eb2cdc238..a6fb037c2 100644 --- a/tests/otel/spring-cloud-sleuth-instrumentation-messaging-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/messaging/TraceWebSocketAutoConfigurationTests.java +++ b/tests/otel/spring-cloud-sleuth-instrumentation-messaging-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/messaging/TraceWebSocketAutoConfigurationTests.java @@ -20,7 +20,7 @@ import io.opentelemetry.sdk.trace.samplers.Sampler; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.cloud.sleuth.otel.OtelTestSpanHandler; -import org.springframework.cloud.sleuth.otel.exporter.ArrayListSpanProcessor; +import org.springframework.cloud.sleuth.otel.bridge.ArrayListSpanProcessor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.test.context.ContextConfiguration; diff --git a/tests/otel/spring-cloud-sleuth-instrumentation-mvc-tests/pom.xml b/tests/otel/spring-cloud-sleuth-instrumentation-mvc-tests/pom.xml index 98d15ee58..6c6395642 100644 --- a/tests/otel/spring-cloud-sleuth-instrumentation-mvc-tests/pom.xml +++ b/tests/otel/spring-cloud-sleuth-instrumentation-mvc-tests/pom.xml @@ -56,10 +56,6 @@ spring-cloud-sleuth-tests-common ${project.version} - - io.opentelemetry - opentelemetry-extension-trace-propagators - org.apache.httpcomponents httpclient @@ -78,7 +74,6 @@ org.springframework.boot spring-boot-starter-actuator - true org.springframework.boot @@ -86,26 +81,33 @@ org.springframework.cloud - spring-cloud-sleuth-core + spring-cloud-sleuth-instrumentation org.springframework.boot spring-boot-starter-aop + + org.springframework.cloud + spring-cloud-starter-sleuth + + + org.springframework.cloud + spring-cloud-sleuth-brave + + + org.springframework.cloud spring-cloud-sleuth-otel - test org.springframework.boot spring-boot-starter-test - test org.awaitility awaitility - test diff --git a/tests/otel/spring-cloud-sleuth-instrumentation-mvc-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/web/HttpServerParserTests.java b/tests/otel/spring-cloud-sleuth-instrumentation-mvc-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/web/HttpServerParserTests.java index bb8876954..e74adcfdb 100644 --- a/tests/otel/spring-cloud-sleuth-instrumentation-mvc-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/web/HttpServerParserTests.java +++ b/tests/otel/spring-cloud-sleuth-instrumentation-mvc-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/web/HttpServerParserTests.java @@ -20,7 +20,7 @@ import io.opentelemetry.sdk.trace.samplers.Sampler; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.cloud.sleuth.otel.OtelTestSpanHandler; -import org.springframework.cloud.sleuth.otel.exporter.ArrayListSpanProcessor; +import org.springframework.cloud.sleuth.otel.bridge.ArrayListSpanProcessor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.test.context.ContextConfiguration; diff --git a/tests/otel/spring-cloud-sleuth-instrumentation-mvc-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/web/IgnoreAutoConfiguredSkipPatternsIntegrationTests.java b/tests/otel/spring-cloud-sleuth-instrumentation-mvc-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/web/IgnoreAutoConfiguredSkipPatternsIntegrationTests.java index 32b6a6d2b..09b5ee625 100644 --- a/tests/otel/spring-cloud-sleuth-instrumentation-mvc-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/web/IgnoreAutoConfiguredSkipPatternsIntegrationTests.java +++ b/tests/otel/spring-cloud-sleuth-instrumentation-mvc-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/web/IgnoreAutoConfiguredSkipPatternsIntegrationTests.java @@ -20,7 +20,7 @@ import io.opentelemetry.sdk.trace.samplers.Sampler; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.cloud.sleuth.otel.OtelTestSpanHandler; -import org.springframework.cloud.sleuth.otel.exporter.ArrayListSpanProcessor; +import org.springframework.cloud.sleuth.otel.bridge.ArrayListSpanProcessor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.test.context.ContextConfiguration; diff --git a/tests/otel/spring-cloud-sleuth-instrumentation-mvc-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/web/SkipEndPointsIntegrationTestsWithContextPathWithBasePath.java b/tests/otel/spring-cloud-sleuth-instrumentation-mvc-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/web/SkipEndPointsIntegrationTestsWithContextPathWithBasePath.java index c5f21f715..0c82edbcc 100644 --- a/tests/otel/spring-cloud-sleuth-instrumentation-mvc-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/web/SkipEndPointsIntegrationTestsWithContextPathWithBasePath.java +++ b/tests/otel/spring-cloud-sleuth-instrumentation-mvc-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/web/SkipEndPointsIntegrationTestsWithContextPathWithBasePath.java @@ -20,7 +20,7 @@ import io.opentelemetry.sdk.trace.samplers.Sampler; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.cloud.sleuth.otel.OtelTestSpanHandler; -import org.springframework.cloud.sleuth.otel.exporter.ArrayListSpanProcessor; +import org.springframework.cloud.sleuth.otel.bridge.ArrayListSpanProcessor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.test.context.ContextConfiguration; diff --git a/tests/otel/spring-cloud-sleuth-instrumentation-mvc-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/web/SkipEndPointsIntegrationTestsWithContextPathWithoutBasePath.java b/tests/otel/spring-cloud-sleuth-instrumentation-mvc-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/web/SkipEndPointsIntegrationTestsWithContextPathWithoutBasePath.java index 9572e17d5..bd8ed7c04 100644 --- a/tests/otel/spring-cloud-sleuth-instrumentation-mvc-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/web/SkipEndPointsIntegrationTestsWithContextPathWithoutBasePath.java +++ b/tests/otel/spring-cloud-sleuth-instrumentation-mvc-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/web/SkipEndPointsIntegrationTestsWithContextPathWithoutBasePath.java @@ -20,7 +20,7 @@ import io.opentelemetry.sdk.trace.samplers.Sampler; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.cloud.sleuth.otel.OtelTestSpanHandler; -import org.springframework.cloud.sleuth.otel.exporter.ArrayListSpanProcessor; +import org.springframework.cloud.sleuth.otel.bridge.ArrayListSpanProcessor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.test.context.ContextConfiguration; diff --git a/tests/otel/spring-cloud-sleuth-instrumentation-mvc-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/web/SkipEndPointsIntegrationTestsWithoutContextPathWithBasePath.java b/tests/otel/spring-cloud-sleuth-instrumentation-mvc-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/web/SkipEndPointsIntegrationTestsWithoutContextPathWithBasePath.java index d276a4762..1f54f21b1 100644 --- a/tests/otel/spring-cloud-sleuth-instrumentation-mvc-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/web/SkipEndPointsIntegrationTestsWithoutContextPathWithBasePath.java +++ b/tests/otel/spring-cloud-sleuth-instrumentation-mvc-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/web/SkipEndPointsIntegrationTestsWithoutContextPathWithBasePath.java @@ -20,7 +20,7 @@ import io.opentelemetry.sdk.trace.samplers.Sampler; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.cloud.sleuth.otel.OtelTestSpanHandler; -import org.springframework.cloud.sleuth.otel.exporter.ArrayListSpanProcessor; +import org.springframework.cloud.sleuth.otel.bridge.ArrayListSpanProcessor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.test.context.ContextConfiguration; diff --git a/tests/otel/spring-cloud-sleuth-instrumentation-mvc-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/web/SkipEndPointsIntegrationTestsWithoutContextPathWithoutBasePath.java b/tests/otel/spring-cloud-sleuth-instrumentation-mvc-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/web/SkipEndPointsIntegrationTestsWithoutContextPathWithoutBasePath.java index 68edcf305..112b23c45 100644 --- a/tests/otel/spring-cloud-sleuth-instrumentation-mvc-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/web/SkipEndPointsIntegrationTestsWithoutContextPathWithoutBasePath.java +++ b/tests/otel/spring-cloud-sleuth-instrumentation-mvc-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/web/SkipEndPointsIntegrationTestsWithoutContextPathWithoutBasePath.java @@ -20,7 +20,7 @@ import io.opentelemetry.sdk.trace.samplers.Sampler; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.cloud.sleuth.otel.OtelTestSpanHandler; -import org.springframework.cloud.sleuth.otel.exporter.ArrayListSpanProcessor; +import org.springframework.cloud.sleuth.otel.bridge.ArrayListSpanProcessor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.test.context.ContextConfiguration; diff --git a/tests/otel/spring-cloud-sleuth-instrumentation-mvc-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/web/TraceFilterTests.java b/tests/otel/spring-cloud-sleuth-instrumentation-mvc-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/web/TraceFilterTests.java index 9edac7b4d..82de359cf 100644 --- a/tests/otel/spring-cloud-sleuth-instrumentation-mvc-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/web/TraceFilterTests.java +++ b/tests/otel/spring-cloud-sleuth-instrumentation-mvc-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/web/TraceFilterTests.java @@ -16,7 +16,7 @@ package org.springframework.cloud.sleuth.otel.instrument.web; -import org.springframework.cloud.sleuth.api.http.HttpServerHandler; +import org.springframework.cloud.sleuth.http.HttpServerHandler; import org.springframework.cloud.sleuth.otel.OtelTestTracing; import org.springframework.cloud.sleuth.test.TestTracingAware; diff --git a/tests/otel/spring-cloud-sleuth-instrumentation-mvc-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/web/client/MultipleAsyncRestTemplateTests.java b/tests/otel/spring-cloud-sleuth-instrumentation-mvc-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/web/client/MultipleAsyncRestTemplateTests.java index 667cd631b..1f7638ca2 100644 --- a/tests/otel/spring-cloud-sleuth-instrumentation-mvc-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/web/client/MultipleAsyncRestTemplateTests.java +++ b/tests/otel/spring-cloud-sleuth-instrumentation-mvc-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/web/client/MultipleAsyncRestTemplateTests.java @@ -20,7 +20,7 @@ import io.opentelemetry.sdk.trace.samplers.Sampler; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.cloud.sleuth.otel.OtelTestSpanHandler; -import org.springframework.cloud.sleuth.otel.exporter.ArrayListSpanProcessor; +import org.springframework.cloud.sleuth.otel.bridge.ArrayListSpanProcessor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.test.context.ContextConfiguration; diff --git a/tests/otel/spring-cloud-sleuth-instrumentation-mvc-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/web/client/TraceRestTemplateInterceptorTests.java b/tests/otel/spring-cloud-sleuth-instrumentation-mvc-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/web/client/TraceRestTemplateInterceptorTests.java index 1595c0ba9..d5998fce2 100644 --- a/tests/otel/spring-cloud-sleuth-instrumentation-mvc-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/web/client/TraceRestTemplateInterceptorTests.java +++ b/tests/otel/spring-cloud-sleuth-instrumentation-mvc-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/web/client/TraceRestTemplateInterceptorTests.java @@ -18,7 +18,7 @@ package org.springframework.cloud.sleuth.otel.instrument.web.client; import java.util.Map; -import org.springframework.cloud.sleuth.api.Span; +import org.springframework.cloud.sleuth.Span; import org.springframework.cloud.sleuth.otel.OtelTestTracing; import org.springframework.cloud.sleuth.test.TestTracingAware; diff --git a/tests/otel/spring-cloud-sleuth-instrumentation-quartz-tests/pom.xml b/tests/otel/spring-cloud-sleuth-instrumentation-quartz-tests/pom.xml index 0c090c4ce..145a6d7d4 100644 --- a/tests/otel/spring-cloud-sleuth-instrumentation-quartz-tests/pom.xml +++ b/tests/otel/spring-cloud-sleuth-instrumentation-quartz-tests/pom.xml @@ -55,29 +55,32 @@ org.springframework.boot spring-boot-starter-quartz - - io.opentelemetry - opentelemetry-extension-trace-propagators - org.springframework.cloud spring-cloud-sleuth-tests-common ${project.version} + + org.springframework.cloud + spring-cloud-starter-sleuth + + + org.springframework.cloud + spring-cloud-sleuth-brave + + + org.springframework.cloud spring-cloud-sleuth-otel - test org.springframework.boot spring-boot-starter-test - test org.awaitility awaitility - test diff --git a/tests/otel/spring-cloud-sleuth-instrumentation-reactor-tests/pom.xml b/tests/otel/spring-cloud-sleuth-instrumentation-reactor-tests/pom.xml index 5a7555b77..dd35772a9 100644 --- a/tests/otel/spring-cloud-sleuth-instrumentation-reactor-tests/pom.xml +++ b/tests/otel/spring-cloud-sleuth-instrumentation-reactor-tests/pom.xml @@ -51,13 +51,18 @@ + + org.springframework.cloud + spring-cloud-sleuth-tests-common + ${project.version} + org.springframework.boot spring-boot-starter-webflux org.springframework.cloud - spring-cloud-sleuth-core + spring-cloud-sleuth-instrumentation org.springframework.boot @@ -65,37 +70,37 @@ org.springframework.cloud - spring-cloud-sleuth-otel - test + spring-cloud-starter-sleuth + + + org.springframework.cloud + spring-cloud-sleuth-brave + + - io.opentelemetry - opentelemetry-extension-trace-propagators + org.springframework.cloud + spring-cloud-sleuth-otel org.springframework.boot spring-boot-starter-test - test org.awaitility awaitility - test io.projectreactor reactor-core - true io.projectreactor.netty reactor-netty-http - true org.reactivestreams reactive-streams - true diff --git a/tests/otel/spring-cloud-sleuth-instrumentation-reactor-tests/src/test/java/org/springframework/cloud/sleuth/ote/instrument/reactor/FlatMapTests.java b/tests/otel/spring-cloud-sleuth-instrumentation-reactor-tests/src/test/java/org/springframework/cloud/sleuth/ote/instrument/reactor/FlatMapTests.java new file mode 100644 index 000000000..af7aa35e5 --- /dev/null +++ b/tests/otel/spring-cloud-sleuth-instrumentation-reactor-tests/src/test/java/org/springframework/cloud/sleuth/ote/instrument/reactor/FlatMapTests.java @@ -0,0 +1,50 @@ +/* + * 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.ote.instrument.reactor; + +import io.opentelemetry.sdk.trace.samplers.Sampler; +import org.junit.jupiter.api.Disabled; + +import org.springframework.cloud.sleuth.otel.OtelTestSpanHandler; +import org.springframework.cloud.sleuth.otel.bridge.ArrayListSpanProcessor; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Disabled("TODO: [OTEL] Otel is leaving garbage in MDC via ScopePassingSpanSubscriber") +public abstract class FlatMapTests extends org.springframework.cloud.sleuth.instrument.reactor.sample.FlatMapTests { + + @Override + protected Class testConfiguration() { + return Config.class; + } + + @Configuration(proxyBeanMethods = false) + static class Config { + + @Bean + OtelTestSpanHandler testSpanHandlerSupplier() { + return new OtelTestSpanHandler(new ArrayListSpanProcessor()); + } + + @Bean + Sampler alwaysSampler() { + return Sampler.alwaysOn(); + } + + } + +} diff --git a/tests/otel/spring-cloud-sleuth-instrumentation-reactor-tests/src/test/java/org/springframework/cloud/sleuth/ote/instrument/reactor/FlowsScopePassingSpanSubscriberTests.java b/tests/otel/spring-cloud-sleuth-instrumentation-reactor-tests/src/test/java/org/springframework/cloud/sleuth/ote/instrument/reactor/FlowsScopePassingSpanSubscriberTests.java new file mode 100644 index 000000000..94a603f30 --- /dev/null +++ b/tests/otel/spring-cloud-sleuth-instrumentation-reactor-tests/src/test/java/org/springframework/cloud/sleuth/ote/instrument/reactor/FlowsScopePassingSpanSubscriberTests.java @@ -0,0 +1,50 @@ +/* + * 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.ote.instrument.reactor; + +import io.opentelemetry.api.trace.SpanContext; +import io.opentelemetry.api.trace.SpanId; +import io.opentelemetry.api.trace.TraceFlags; +import io.opentelemetry.api.trace.TraceId; +import io.opentelemetry.api.trace.TraceState; + +import org.springframework.cloud.sleuth.CurrentTraceContext; +import org.springframework.cloud.sleuth.TraceContext; +import org.springframework.cloud.sleuth.otel.bridge.OtelAccessor; + +/** + * @author Marcin Grzejszczak + */ +public class FlowsScopePassingSpanSubscriberTests + extends org.springframework.cloud.sleuth.instrument.reactor.FlowsScopePassingSpanSubscriberTests { + + CurrentTraceContext currentTraceContext = OtelAccessor.currentTraceContext(); + + TraceContext context = OtelAccessor.traceContext(SpanContext.create(TraceId.fromLongs(1L, 0L), SpanId.fromLong(1L), + TraceFlags.getSampled(), TraceState.builder().build())); + + @Override + protected CurrentTraceContext currentTraceContext() { + return this.currentTraceContext; + } + + @Override + protected TraceContext context() { + return this.context; + } + +} diff --git a/tests/otel/spring-cloud-sleuth-instrumentation-reactor-tests/src/test/java/org/springframework/cloud/sleuth/ote/instrument/reactor/ScopePassingSpanSubscriberSpringBootTests.java b/tests/otel/spring-cloud-sleuth-instrumentation-reactor-tests/src/test/java/org/springframework/cloud/sleuth/ote/instrument/reactor/ScopePassingSpanSubscriberSpringBootTests.java new file mode 100644 index 000000000..af54c626f --- /dev/null +++ b/tests/otel/spring-cloud-sleuth-instrumentation-reactor-tests/src/test/java/org/springframework/cloud/sleuth/ote/instrument/reactor/ScopePassingSpanSubscriberSpringBootTests.java @@ -0,0 +1,76 @@ +/* + * 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.ote.instrument.reactor; + +import io.opentelemetry.api.trace.SpanContext; +import io.opentelemetry.api.trace.SpanId; +import io.opentelemetry.api.trace.TraceFlags; +import io.opentelemetry.api.trace.TraceId; +import io.opentelemetry.api.trace.TraceState; +import io.opentelemetry.sdk.trace.samplers.Sampler; + +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.cloud.sleuth.TraceContext; +import org.springframework.cloud.sleuth.otel.OtelTestSpanHandler; +import org.springframework.cloud.sleuth.otel.bridge.ArrayListSpanProcessor; +import org.springframework.cloud.sleuth.otel.bridge.OtelAccessor; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * Like {@link ScopePassingSpanSubscriberTests}, except this tests wiring with spring boot + * config. + */ +@SpringBootTest(classes = ScopePassingSpanSubscriberSpringBootTests.Config.class, + webEnvironment = SpringBootTest.WebEnvironment.NONE) +public class ScopePassingSpanSubscriberSpringBootTests + extends org.springframework.cloud.sleuth.instrument.reactor.ScopePassingSpanSubscriberSpringBootTests { + + TraceContext context = OtelAccessor.traceContext(SpanContext.create(TraceId.fromLongs(1L, 0L), SpanId.fromLong(1L), + TraceFlags.getSampled(), TraceState.builder().build())); + + TraceContext context2 = OtelAccessor.traceContext(SpanContext.create(TraceId.fromLongs(1L, 0L), SpanId.fromLong(2L), + TraceFlags.getSampled(), TraceState.builder().build())); + + @Override + protected TraceContext context() { + return this.context; + } + + @Override + protected TraceContext context2() { + return this.context2; + } + + @Configuration(proxyBeanMethods = false) + @EnableAutoConfiguration + static class Config { + + @Bean + OtelTestSpanHandler testSpanHandlerSupplier() { + return new OtelTestSpanHandler(new ArrayListSpanProcessor()); + } + + @Bean + Sampler alwaysSampler() { + return Sampler.alwaysOn(); + } + + } + +} diff --git a/tests/otel/spring-cloud-sleuth-instrumentation-reactor-tests/src/test/java/org/springframework/cloud/sleuth/ote/instrument/reactor/ScopePassingSpanSubscriberTests.java b/tests/otel/spring-cloud-sleuth-instrumentation-reactor-tests/src/test/java/org/springframework/cloud/sleuth/ote/instrument/reactor/ScopePassingSpanSubscriberTests.java new file mode 100644 index 000000000..986750a60 --- /dev/null +++ b/tests/otel/spring-cloud-sleuth-instrumentation-reactor-tests/src/test/java/org/springframework/cloud/sleuth/ote/instrument/reactor/ScopePassingSpanSubscriberTests.java @@ -0,0 +1,58 @@ +/* + * 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.ote.instrument.reactor; + +import io.opentelemetry.api.trace.SpanContext; +import io.opentelemetry.api.trace.SpanId; +import io.opentelemetry.api.trace.TraceFlags; +import io.opentelemetry.api.trace.TraceId; +import io.opentelemetry.api.trace.TraceState; + +import org.springframework.cloud.sleuth.CurrentTraceContext; +import org.springframework.cloud.sleuth.TraceContext; +import org.springframework.cloud.sleuth.otel.bridge.OtelAccessor; + +/** + * @author Marcin Grzejszczak + */ +public class ScopePassingSpanSubscriberTests + extends org.springframework.cloud.sleuth.instrument.reactor.ScopePassingSpanSubscriberTests { + + CurrentTraceContext currentTraceContext = OtelAccessor.currentTraceContext(); + + TraceContext context = OtelAccessor.traceContext(SpanContext.create(TraceId.fromLongs(1L, 0L), SpanId.fromLong(1L), + TraceFlags.getSampled(), TraceState.builder().build())); + + TraceContext context2 = OtelAccessor.traceContext(SpanContext.create(TraceId.fromLongs(1L, 0L), SpanId.fromLong(2L), + TraceFlags.getSampled(), TraceState.builder().build())); + + @Override + protected CurrentTraceContext currentTraceContext() { + return this.currentTraceContext; + } + + @Override + protected TraceContext context() { + return this.context; + } + + @Override + protected TraceContext context2() { + return this.context2; + } + +} diff --git a/tests/otel/spring-cloud-sleuth-instrumentation-rxjava-tests/pom.xml b/tests/otel/spring-cloud-sleuth-instrumentation-rxjava-tests/pom.xml index d1225da14..d107c1ddb 100644 --- a/tests/otel/spring-cloud-sleuth-instrumentation-rxjava-tests/pom.xml +++ b/tests/otel/spring-cloud-sleuth-instrumentation-rxjava-tests/pom.xml @@ -53,35 +53,37 @@ org.springframework.cloud - spring-cloud-sleuth-core - - - io.opentelemetry - opentelemetry-extension-trace-propagators + spring-cloud-sleuth-instrumentation org.springframework.boot spring-boot-starter-aop + + org.springframework.cloud + spring-cloud-starter-sleuth + + + org.springframework.cloud + spring-cloud-sleuth-brave + + + org.springframework.cloud spring-cloud-sleuth-otel - test org.springframework.boot spring-boot-starter-test - test org.awaitility awaitility - test io.reactivex rxjava - true diff --git a/tests/otel/spring-cloud-sleuth-instrumentation-scheduling-tests/pom.xml b/tests/otel/spring-cloud-sleuth-instrumentation-scheduling-tests/pom.xml index ce23beca7..d796f3380 100644 --- a/tests/otel/spring-cloud-sleuth-instrumentation-scheduling-tests/pom.xml +++ b/tests/otel/spring-cloud-sleuth-instrumentation-scheduling-tests/pom.xml @@ -53,30 +53,33 @@ org.springframework.cloud - spring-cloud-sleuth-core - - - io.opentelemetry - opentelemetry-extension-trace-propagators + spring-cloud-sleuth-instrumentation org.springframework.boot spring-boot-starter-aop + + org.springframework.cloud + spring-cloud-starter-sleuth + + + org.springframework.cloud + spring-cloud-sleuth-brave + + + org.springframework.cloud spring-cloud-sleuth-otel - test org.springframework.boot spring-boot-starter-test - test org.awaitility awaitility - test diff --git a/tests/otel/spring-cloud-sleuth-instrumentation-webflux-tests/pom.xml b/tests/otel/spring-cloud-sleuth-instrumentation-webflux-tests/pom.xml index 002c39bc2..d5fd9d6d0 100644 --- a/tests/otel/spring-cloud-sleuth-instrumentation-webflux-tests/pom.xml +++ b/tests/otel/spring-cloud-sleuth-instrumentation-webflux-tests/pom.xml @@ -60,10 +60,6 @@ org.springframework.boot spring-boot-starter-actuator - - io.opentelemetry - opentelemetry-extension-trace-propagators - org.springframework.cloud spring-cloud-starter-loadbalancer @@ -72,10 +68,19 @@ org.springframework.cloud spring-cloud-starter-openfeign + + org.springframework.cloud + spring-cloud-starter-sleuth + + + org.springframework.cloud + spring-cloud-sleuth-brave + + + org.springframework.cloud spring-cloud-sleuth-otel - test org.springframework.boot @@ -87,7 +92,7 @@ org.springframework.cloud - spring-cloud-sleuth-core + spring-cloud-sleuth-instrumentation org.springframework.boot @@ -96,24 +101,20 @@ org.springframework.boot spring-boot-starter-test - test org.awaitility awaitility - test com.squareup.okhttp3 mockwebserver - test com.squareup.okhttp3 okhttp 4.8.0 - test diff --git a/tests/otel/spring-cloud-sleuth-instrumentation-webflux-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/web/baggage/Service1Controller.java b/tests/otel/spring-cloud-sleuth-instrumentation-webflux-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/web/baggage/Service1Controller.java index b441f4d1b..86ed87c4d 100644 --- a/tests/otel/spring-cloud-sleuth-instrumentation-webflux-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/web/baggage/Service1Controller.java +++ b/tests/otel/spring-cloud-sleuth-instrumentation-webflux-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/web/baggage/Service1Controller.java @@ -24,9 +24,9 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import reactor.core.publisher.Mono; -import org.springframework.cloud.sleuth.api.BaggageInScope; -import org.springframework.cloud.sleuth.api.Span; -import org.springframework.cloud.sleuth.api.Tracer; +import org.springframework.cloud.sleuth.BaggageInScope; +import org.springframework.cloud.sleuth.Span; +import org.springframework.cloud.sleuth.Tracer; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.GetMapping; diff --git a/tests/otel/spring-cloud-sleuth-instrumentation-webflux-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/web/baggage/WebFluxBaggageTests.java b/tests/otel/spring-cloud-sleuth-instrumentation-webflux-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/web/baggage/WebFluxBaggageTests.java index 4784aee37..c4b8c925c 100644 --- a/tests/otel/spring-cloud-sleuth-instrumentation-webflux-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/web/baggage/WebFluxBaggageTests.java +++ b/tests/otel/spring-cloud-sleuth-instrumentation-webflux-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/web/baggage/WebFluxBaggageTests.java @@ -33,9 +33,9 @@ import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.web.client.TestRestTemplate; import org.springframework.boot.web.server.LocalServerPort; -import org.springframework.cloud.sleuth.api.Tracer; +import org.springframework.cloud.sleuth.Tracer; import org.springframework.cloud.sleuth.otel.OtelTestSpanHandler; -import org.springframework.cloud.sleuth.otel.exporter.ArrayListSpanProcessor; +import org.springframework.cloud.sleuth.otel.bridge.ArrayListSpanProcessor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.RequestEntity; diff --git a/tests/otel/spring-cloud-sleuth-instrumentation-webflux-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/web/client/HttpClientBeanPostProcessorTest.java b/tests/otel/spring-cloud-sleuth-instrumentation-webflux-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/web/client/HttpClientBeanPostProcessorTest.java index 2d5a6fd46..b58118a26 100644 --- a/tests/otel/spring-cloud-sleuth-instrumentation-webflux-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/web/client/HttpClientBeanPostProcessorTest.java +++ b/tests/otel/spring-cloud-sleuth-instrumentation-webflux-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/web/client/HttpClientBeanPostProcessorTest.java @@ -22,15 +22,15 @@ import io.opentelemetry.api.trace.TraceFlags; import io.opentelemetry.api.trace.TraceId; import io.opentelemetry.api.trace.TraceState; -import org.springframework.cloud.sleuth.api.TraceContext; -import org.springframework.cloud.sleuth.otel.bridge.OtelTraceContext; +import org.springframework.cloud.sleuth.TraceContext; +import org.springframework.cloud.sleuth.otel.bridge.OtelAccessor; public class HttpClientBeanPostProcessorTest extends org.springframework.cloud.sleuth.instrument.web.client.HttpClientBeanPostProcessorTest { @Override public TraceContext traceContext() { - return OtelTraceContext.fromOtel(SpanContext.create(TraceId.fromLongs(1L, 0L), SpanId.fromLong(2L), + return OtelAccessor.traceContext(SpanContext.create(TraceId.fromLongs(1L, 0L), SpanId.fromLong(2L), TraceFlags.getSampled(), TraceState.builder().build())); } diff --git a/tests/otel/spring-cloud-sleuth-instrumentation-webflux-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/web/client/ReactorNettyHttpClientSpringBootTests.java b/tests/otel/spring-cloud-sleuth-instrumentation-webflux-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/web/client/ReactorNettyHttpClientSpringBootTests.java index b61273628..46373dea5 100644 --- a/tests/otel/spring-cloud-sleuth-instrumentation-webflux-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/web/client/ReactorNettyHttpClientSpringBootTests.java +++ b/tests/otel/spring-cloud-sleuth-instrumentation-webflux-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/web/client/ReactorNettyHttpClientSpringBootTests.java @@ -27,11 +27,11 @@ import io.opentelemetry.sdk.trace.samplers.Sampler; import org.assertj.core.api.Assertions; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.cloud.sleuth.api.TraceContext; -import org.springframework.cloud.sleuth.api.exporter.FinishedSpan; +import org.springframework.cloud.sleuth.TraceContext; +import org.springframework.cloud.sleuth.exporter.FinishedSpan; import org.springframework.cloud.sleuth.otel.OtelTestSpanHandler; -import org.springframework.cloud.sleuth.otel.bridge.OtelTraceContext; -import org.springframework.cloud.sleuth.otel.exporter.ArrayListSpanProcessor; +import org.springframework.cloud.sleuth.otel.bridge.ArrayListSpanProcessor; +import org.springframework.cloud.sleuth.otel.bridge.OtelAccessor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.test.context.ContextConfiguration; @@ -45,7 +45,7 @@ public class ReactorNettyHttpClientSpringBootTests @Override public TraceContext traceContext() { - return OtelTraceContext.fromOtel(SpanContext.create(TraceId.fromLongs(1L, 0L), SpanId.fromLong(2L), + return OtelAccessor.traceContext(SpanContext.create(TraceId.fromLongs(1L, 0L), SpanId.fromLong(2L), TraceFlags.getSampled(), TraceState.builder().build())); } diff --git a/tests/otel/spring-cloud-sleuth-instrumentation-webflux-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/web/client/WebClientCustomParserTests.java b/tests/otel/spring-cloud-sleuth-instrumentation-webflux-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/web/client/WebClientCustomParserTests.java index e604ae449..d6f9f81e7 100644 --- a/tests/otel/spring-cloud-sleuth-instrumentation-webflux-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/web/client/WebClientCustomParserTests.java +++ b/tests/otel/spring-cloud-sleuth-instrumentation-webflux-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/web/client/WebClientCustomParserTests.java @@ -20,7 +20,7 @@ import io.opentelemetry.sdk.trace.samplers.Sampler; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.cloud.sleuth.otel.OtelTestSpanHandler; -import org.springframework.cloud.sleuth.otel.exporter.ArrayListSpanProcessor; +import org.springframework.cloud.sleuth.otel.bridge.ArrayListSpanProcessor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.test.context.ContextConfiguration; diff --git a/tests/otel/spring-cloud-sleuth-instrumentation-webflux-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/web/client/WebClientDiscoveryExceptionTests.java b/tests/otel/spring-cloud-sleuth-instrumentation-webflux-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/web/client/WebClientDiscoveryExceptionTests.java index 9459bd272..7b94406f3 100644 --- a/tests/otel/spring-cloud-sleuth-instrumentation-webflux-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/web/client/WebClientDiscoveryExceptionTests.java +++ b/tests/otel/spring-cloud-sleuth-instrumentation-webflux-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/web/client/WebClientDiscoveryExceptionTests.java @@ -20,7 +20,7 @@ import io.opentelemetry.sdk.trace.samplers.Sampler; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.cloud.sleuth.otel.OtelTestSpanHandler; -import org.springframework.cloud.sleuth.otel.exporter.ArrayListSpanProcessor; +import org.springframework.cloud.sleuth.otel.bridge.ArrayListSpanProcessor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.test.context.ContextConfiguration; diff --git a/tests/otel/spring-cloud-sleuth-instrumentation-webflux-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/web/client/WebClientExceptionTests.java b/tests/otel/spring-cloud-sleuth-instrumentation-webflux-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/web/client/WebClientExceptionTests.java index 53027b75e..e2fefab9c 100644 --- a/tests/otel/spring-cloud-sleuth-instrumentation-webflux-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/web/client/WebClientExceptionTests.java +++ b/tests/otel/spring-cloud-sleuth-instrumentation-webflux-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/web/client/WebClientExceptionTests.java @@ -20,7 +20,7 @@ import io.opentelemetry.sdk.trace.samplers.Sampler; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.cloud.sleuth.otel.OtelTestSpanHandler; -import org.springframework.cloud.sleuth.otel.exporter.ArrayListSpanProcessor; +import org.springframework.cloud.sleuth.otel.bridge.ArrayListSpanProcessor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/tests/otel/spring-cloud-sleuth-instrumentation-webflux-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/web/client/WebClientNotSampledTests.java b/tests/otel/spring-cloud-sleuth-instrumentation-webflux-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/web/client/WebClientNotSampledTests.java index 9aaecea26..bd17e5b7b 100644 --- a/tests/otel/spring-cloud-sleuth-instrumentation-webflux-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/web/client/WebClientNotSampledTests.java +++ b/tests/otel/spring-cloud-sleuth-instrumentation-webflux-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/web/client/WebClientNotSampledTests.java @@ -22,7 +22,7 @@ import io.opentelemetry.sdk.trace.samplers.Sampler; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.cloud.sleuth.otel.OtelTestSpanHandler; -import org.springframework.cloud.sleuth.otel.exporter.ArrayListSpanProcessor; +import org.springframework.cloud.sleuth.otel.bridge.ArrayListSpanProcessor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.ResponseEntity; diff --git a/tests/otel/spring-cloud-sleuth-instrumentation-webflux-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/web/client/WebClientTests.java b/tests/otel/spring-cloud-sleuth-instrumentation-webflux-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/web/client/WebClientTests.java index 6f6904086..7e4b45a86 100644 --- a/tests/otel/spring-cloud-sleuth-instrumentation-webflux-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/web/client/WebClientTests.java +++ b/tests/otel/spring-cloud-sleuth-instrumentation-webflux-tests/src/test/java/org/springframework/cloud/sleuth/otel/instrument/web/client/WebClientTests.java @@ -20,7 +20,7 @@ import io.opentelemetry.sdk.trace.samplers.Sampler; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.cloud.sleuth.otel.OtelTestSpanHandler; -import org.springframework.cloud.sleuth.otel.exporter.ArrayListSpanProcessor; +import org.springframework.cloud.sleuth.otel.bridge.ArrayListSpanProcessor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.test.context.ContextConfiguration; diff --git a/tests/otel/spring-cloud-sleuth-zipkin-tests/pom.xml b/tests/otel/spring-cloud-sleuth-zipkin-tests/pom.xml new file mode 100644 index 000000000..d1ebe1f9b --- /dev/null +++ b/tests/otel/spring-cloud-sleuth-zipkin-tests/pom.xml @@ -0,0 +1,161 @@ + + + + + 4.0.0 + + spring-cloud-sleuth-zipkin-otel-tests + jar + Spring Cloud Sleuth OTel Zipkin Tests + Spring Cloud Sleuth OTel Zipkin Tests + + + org.springframework.cloud + spring-cloud-sleuth-otel-tests + 3.0.0-SNAPSHOT + .. + + + + true + + + + + + + maven-deploy-plugin + + true + + + + + + + + org.springframework.cloud + spring-cloud-sleuth-tests-common + ${project.version} + + + org.springframework.boot + spring-boot-starter-actuator + + + org.springframework.cloud + spring-cloud-sleuth-zipkin + + + org.springframework.cloud + spring-cloud-starter-sleuth + + + org.springframework.cloud + spring-cloud-sleuth-brave + + + + + org.springframework.cloud + spring-cloud-sleuth-otel + + + org.springframework.kafka + spring-kafka + + + org.springframework.amqp + spring-rabbit + + + io.opentelemetry + opentelemetry-exporter-zipkin + + + io.zipkin.zipkin2 + zipkin + + + io.zipkin.reporter2 + zipkin-reporter + + + io.zipkin.reporter2 + zipkin-reporter-metrics-micrometer + + + io.zipkin.reporter2 + zipkin-sender-kafka + + + + org.apache.kafka + kafka-clients + + + + + io.zipkin.reporter2 + zipkin-sender-activemq-client + + + org.apache.activemq + activemq-client + + + + + org.apache.activemq + activemq-client + + + io.zipkin.reporter2 + zipkin-sender-amqp-client + + + + com.rabbitmq + amqp-client + + + + + org.springframework.boot + spring-boot-starter-test + + + org.awaitility + awaitility + + + com.squareup.okhttp3 + mockwebserver + + + com.squareup.okhttp3 + okhttp + + 4.8.0 + + + + diff --git a/spring-cloud-sleuth-zipkin/src/test/java/org/springframework/cloud/sleuth/zipkin2/OtelDefaultEndpointLocatorConfigurationTest.java b/tests/otel/spring-cloud-sleuth-zipkin-tests/src/test/java/org/springframework/cloud/sleuth/autoconfig/zipkin2/OtelDefaultEndpointLocatorConfigurationTest.java similarity index 60% rename from spring-cloud-sleuth-zipkin/src/test/java/org/springframework/cloud/sleuth/zipkin2/OtelDefaultEndpointLocatorConfigurationTest.java rename to tests/otel/spring-cloud-sleuth-zipkin-tests/src/test/java/org/springframework/cloud/sleuth/autoconfig/zipkin2/OtelDefaultEndpointLocatorConfigurationTest.java index fccd32bed..8c970809b 100644 --- a/spring-cloud-sleuth-zipkin/src/test/java/org/springframework/cloud/sleuth/zipkin2/OtelDefaultEndpointLocatorConfigurationTest.java +++ b/tests/otel/spring-cloud-sleuth-zipkin-tests/src/test/java/org/springframework/cloud/sleuth/autoconfig/zipkin2/OtelDefaultEndpointLocatorConfigurationTest.java @@ -14,31 +14,11 @@ * limitations under the License. */ -package org.springframework.cloud.sleuth.zipkin2; +package org.springframework.cloud.sleuth.autoconfig.zipkin2; /** * @author Matcin Wielgus */ public class OtelDefaultEndpointLocatorConfigurationTest extends DefaultEndpointLocatorConfigurationTest { - @Override - protected Class emptyConfiguration() { - return OtelEmptyConfiguration.class; - } - - @Override - protected Class configurationWithRegistrationClass() { - return OtelConfigurationWithRegistration.class; - } - - @Override - protected Class configurationWithCustomLocatorClass() { - return OtelConfigurationWithCustomLocator.class; - } - - @Override - protected EndpointLocator locatorFromConfiguration() { - return OtelConfigurationWithCustomLocator.locator; - } - } diff --git a/tests/otel/spring-cloud-sleuth-zipkin-tests/src/test/java/org/springframework/cloud/sleuth/autoconfig/zipkin2/OtelZipkinAutoConfigurationTests.java b/tests/otel/spring-cloud-sleuth-zipkin-tests/src/test/java/org/springframework/cloud/sleuth/autoconfig/zipkin2/OtelZipkinAutoConfigurationTests.java new file mode 100644 index 000000000..2ba41c89a --- /dev/null +++ b/tests/otel/spring-cloud-sleuth-zipkin-tests/src/test/java/org/springframework/cloud/sleuth/autoconfig/zipkin2/OtelZipkinAutoConfigurationTests.java @@ -0,0 +1,53 @@ +/* + * 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 io.opentelemetry.sdk.trace.samplers.Sampler; + +import org.springframework.cloud.sleuth.autoconfig.otel.OtelAutoConfiguration; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +public class OtelZipkinAutoConfigurationTests + extends org.springframework.cloud.sleuth.autoconfig.zipkin2.ZipkinAutoConfigurationTests { + + @Override + protected Class tracerZipkinConfiguration() { + return ZipkinOtelConfiguration.class; + } + + @Override + protected Class tracerConfiguration() { + return OtelAutoConfiguration.class; + } + + @Override + protected Class configurationClass() { + return Config.class; + } + + @Configuration(proxyBeanMethods = false) + protected static class Config { + + @Bean + Sampler sampler() { + return Sampler.alwaysOn(); + } + + } + +} diff --git a/spring-cloud-sleuth-zipkin/src/test/java/org/springframework/cloud/sleuth/zipkin2/OtelZipkinDiscoveryClientTests.java b/tests/otel/spring-cloud-sleuth-zipkin-tests/src/test/java/org/springframework/cloud/sleuth/zipkin2/OtelZipkinDiscoveryClientTests.java similarity index 89% rename from spring-cloud-sleuth-zipkin/src/test/java/org/springframework/cloud/sleuth/zipkin2/OtelZipkinDiscoveryClientTests.java rename to tests/otel/spring-cloud-sleuth-zipkin-tests/src/test/java/org/springframework/cloud/sleuth/zipkin2/OtelZipkinDiscoveryClientTests.java index 5717d6b23..c22976a42 100644 --- a/spring-cloud-sleuth-zipkin/src/test/java/org/springframework/cloud/sleuth/zipkin2/OtelZipkinDiscoveryClientTests.java +++ b/tests/otel/spring-cloud-sleuth-zipkin-tests/src/test/java/org/springframework/cloud/sleuth/zipkin2/OtelZipkinDiscoveryClientTests.java @@ -20,15 +20,16 @@ import io.opentelemetry.sdk.trace.samplers.Sampler; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.cloud.sleuth.brave.autoconfig.TraceBraveAutoConfiguration; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.test.context.TestPropertySource; @SpringBootTest(classes = OtelZipkinDiscoveryClientTests.TestConfig.class) +@TestPropertySource(properties = "spring.sleuth.trace.mode=OTEL") public class OtelZipkinDiscoveryClientTests extends ZipkinDiscoveryClientTests { @Configuration(proxyBeanMethods = false) - @EnableAutoConfiguration(exclude = TraceBraveAutoConfiguration.class) + @EnableAutoConfiguration static class TestConfig { @Bean diff --git a/tests/otel/spring-cloud-sleuth-zipkin-tests/src/test/resources/application.yml b/tests/otel/spring-cloud-sleuth-zipkin-tests/src/test/resources/application.yml new file mode 100644 index 000000000..caf171df7 --- /dev/null +++ b/tests/otel/spring-cloud-sleuth-zipkin-tests/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 \ No newline at end of file