Merge branch '2.2.x'
This commit is contained in:
@@ -33,7 +33,7 @@
|
||||
<maven.compiler.target>1.8</maven.compiler.target>
|
||||
<maven.compiler.source>1.8</maven.compiler.source>
|
||||
<spring-boot.version>2.3.0.BUILD-SNAPSHOT</spring-boot.version>
|
||||
<brave.version>5.12.1</brave.version>
|
||||
<brave.version>5.12.2</brave.version>
|
||||
<okhttp.version>3.14.6</okhttp.version>
|
||||
</properties>
|
||||
|
||||
|
||||
@@ -19,11 +19,10 @@ package org.springframework.cloud.sleuth.benchmarks.app.webflux;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import brave.sampler.Sampler;
|
||||
import brave.handler.SpanHandler;
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import reactor.core.publisher.Mono;
|
||||
import zipkin2.Span;
|
||||
import zipkin2.reporter.Reporter;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.boot.WebApplicationType;
|
||||
@@ -80,8 +79,10 @@ public class SleuthBenchmarkingSpringWebFluxApp
|
||||
}
|
||||
|
||||
@Bean
|
||||
public Reporter<Span> reporter() {
|
||||
return Reporter.NOOP;
|
||||
public SpanHandler spanHandler() {
|
||||
return new SpanHandler() {
|
||||
// intentionally anonymous to prevent logging fallback on NOOP
|
||||
};
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -20,6 +20,7 @@ import java.io.IOException;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import brave.Tracing;
|
||||
import brave.handler.SpanHandler;
|
||||
import brave.http.HttpTracing;
|
||||
import brave.httpclient.TracingHttpClientBuilder;
|
||||
import brave.propagation.CurrentTraceContext;
|
||||
@@ -45,7 +46,6 @@ import org.openjdk.jmh.runner.Runner;
|
||||
import org.openjdk.jmh.runner.RunnerException;
|
||||
import org.openjdk.jmh.runner.options.Options;
|
||||
import org.openjdk.jmh.runner.options.OptionsBuilder;
|
||||
import zipkin2.reporter.Reporter;
|
||||
|
||||
import org.springframework.boot.SpringApplication;
|
||||
import org.springframework.boot.WebApplicationType;
|
||||
@@ -61,6 +61,9 @@ import org.springframework.context.ConfigurableApplicationContext;
|
||||
@Threads(2)
|
||||
@State(Scope.Benchmark)
|
||||
public class SpringWebFluxBenchmarks {
|
||||
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();
|
||||
@@ -109,9 +112,9 @@ public class SpringWebFluxBenchmarks {
|
||||
baseUrl = "http://127.0.0.1:" + springWebFluxApp.port + "/foo";
|
||||
client = newClient();
|
||||
tracedClient = newClient(HttpTracing
|
||||
.create(Tracing.newBuilder().spanReporter(Reporter.NOOP).build()));
|
||||
.create(Tracing.newBuilder().addSpanHandler(FAKE_SPAN_HANDLER).build()));
|
||||
unsampledClient = newClient(HttpTracing.create(Tracing.newBuilder()
|
||||
.sampler(Sampler.NEVER_SAMPLE).spanReporter(Reporter.NOOP).build()));
|
||||
.sampler(Sampler.NEVER_SAMPLE).addSpanHandler(FAKE_SPAN_HANDLER).build()));
|
||||
postSetUp();
|
||||
}
|
||||
|
||||
|
||||
2
pom.xml
2
pom.xml
@@ -243,7 +243,7 @@
|
||||
<spring-cloud-stream.version>3.1.0.BUILD-SNAPSHOT</spring-cloud-stream.version>
|
||||
<spring-cloud-netflix.version>3.0.0-SNAPSHOT</spring-cloud-netflix.version>
|
||||
<spring-cloud-openfeign.version>3.0.0-SNAPSHOT</spring-cloud-openfeign.version>
|
||||
<brave.version>5.12.1</brave.version>
|
||||
<brave.version>5.12.2</brave.version>
|
||||
<spring-security-boot-autoconfigure.version>2.1.7.RELEASE</spring-security-boot-autoconfigure.version>
|
||||
<disable.nohttp.checks>false</disable.nohttp.checks>
|
||||
<okhttp.version>3.14.6</okhttp.version>
|
||||
|
||||
@@ -1,61 +0,0 @@
|
||||
/*
|
||||
* Copyright 2013-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.util;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import zipkin2.Span;
|
||||
import zipkin2.reporter.Reporter;
|
||||
|
||||
/**
|
||||
* Accumulator of closed spans.
|
||||
*
|
||||
* @author Marcin Grzejszczak
|
||||
* @since 2.0.0
|
||||
* @deprecated This type will be removed in 3.0. Use io.zipkin.brave:brave-tests instead
|
||||
*/
|
||||
@Deprecated
|
||||
public class ArrayListSpanReporter implements Reporter<Span> {
|
||||
|
||||
private final List<Span> spans = new ArrayList<>();
|
||||
|
||||
public List<Span> getSpans() {
|
||||
synchronized (this.spans) {
|
||||
return new ArrayList<>(this.spans);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "ArrayListSpanAccumulator{" + "spans=" + getSpans() + '}';
|
||||
}
|
||||
|
||||
@Override
|
||||
public void report(Span span) {
|
||||
synchronized (this.spans) {
|
||||
this.spans.add(span);
|
||||
}
|
||||
}
|
||||
|
||||
public void clear() {
|
||||
synchronized (this.spans) {
|
||||
this.spans.clear();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,74 +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.util;
|
||||
|
||||
import java.util.concurrent.LinkedBlockingQueue;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import zipkin2.Span;
|
||||
import zipkin2.reporter.Reporter;
|
||||
|
||||
/**
|
||||
* Like {@link ArrayListSpanReporter}, except appropriate for async instrumentation.
|
||||
*/
|
||||
public class BlockingQueueSpanReporter implements Reporter<Span> {
|
||||
|
||||
private final LinkedBlockingQueue<Span> spans = new LinkedBlockingQueue<>();
|
||||
|
||||
/**
|
||||
* Blocks until a span is reported or throws an {@link AssertionError}.
|
||||
* @return the first span not yet taken.
|
||||
*/
|
||||
public Span takeSpan() {
|
||||
Span result = takeSpan(3_000);
|
||||
if (result == null) {
|
||||
throw new AssertionError("Span was not reported");
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "BlockingQueueSpanReporter{spans=" + spans + '}';
|
||||
}
|
||||
|
||||
@Override
|
||||
public void report(Span span) {
|
||||
spans.add(span);
|
||||
}
|
||||
|
||||
/** Use this as a post-condition to ensure all spans are accounted for. */
|
||||
public void assertEmpty() {
|
||||
if (takeSpan(100) != null) {
|
||||
throw new AssertionError(
|
||||
"Span remaining in queue. Check for redundant reporting!");
|
||||
}
|
||||
}
|
||||
|
||||
private Span takeSpan(long timeout) {
|
||||
Span result;
|
||||
try {
|
||||
result = spans.poll(timeout, TimeUnit.MILLISECONDS);
|
||||
}
|
||||
catch (InterruptedException e) {
|
||||
Thread.currentThread().interrupt();
|
||||
throw new AssertionError(e);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -22,16 +22,15 @@ import brave.handler.MutableSpan;
|
||||
import brave.handler.SpanHandler;
|
||||
import brave.propagation.TraceContext;
|
||||
import brave.sampler.Sampler;
|
||||
import brave.test.TestSpanHandler;
|
||||
import org.assertj.core.api.BDDAssertions;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import zipkin2.reporter.Reporter;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
|
||||
import org.springframework.boot.autoconfigure.integration.IntegrationAutoConfiguration;
|
||||
import org.springframework.boot.test.context.SpringBootTest;
|
||||
import org.springframework.cloud.sleuth.util.ArrayListSpanReporter;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
|
||||
@@ -45,14 +44,14 @@ import static org.springframework.boot.test.context.SpringBootTest.WebEnvironmen
|
||||
public class SpanHandlerTests {
|
||||
|
||||
@Autowired
|
||||
ArrayListSpanReporter reporter;
|
||||
TestSpanHandler spans;
|
||||
|
||||
@Autowired
|
||||
Tracer tracer;
|
||||
|
||||
@BeforeEach
|
||||
public void setup() {
|
||||
this.reporter.clear();
|
||||
this.spans.clear();
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -61,8 +60,8 @@ public class SpanHandlerTests {
|
||||
|
||||
hello.finish();
|
||||
|
||||
BDDAssertions.then(this.reporter.getSpans()).hasSize(1);
|
||||
BDDAssertions.then(this.reporter.getSpans().get(0).name()).isEqualTo("foo bar");
|
||||
BDDAssertions.then(this.spans).hasSize(1);
|
||||
BDDAssertions.then(this.spans.get(0).name()).isEqualTo("foo bar");
|
||||
}
|
||||
|
||||
@Configuration
|
||||
@@ -75,8 +74,8 @@ public class SpanHandlerTests {
|
||||
}
|
||||
|
||||
@Bean
|
||||
Reporter<zipkin2.Span> reporter() {
|
||||
return new ArrayListSpanReporter();
|
||||
SpanHandler testSpanHandler() {
|
||||
return new TestSpanHandler();
|
||||
}
|
||||
|
||||
// tag::spanHandler[]
|
||||
|
||||
@@ -16,17 +16,18 @@
|
||||
|
||||
package org.springframework.cloud.sleuth.annotation;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
import java.util.concurrent.atomic.AtomicReference;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import brave.Span;
|
||||
import brave.Tracer;
|
||||
import brave.handler.SpanHandler;
|
||||
import brave.propagation.TraceContext;
|
||||
import brave.sampler.Sampler;
|
||||
import brave.test.TestSpanHandler;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.awaitility.Awaitility;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
@@ -34,13 +35,10 @@ import org.junit.jupiter.api.Test;
|
||||
import reactor.core.publisher.Flux;
|
||||
import reactor.core.publisher.Mono;
|
||||
import reactor.util.context.Context;
|
||||
import zipkin2.Annotation;
|
||||
import zipkin2.reporter.Reporter;
|
||||
|
||||
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.util.ArrayListSpanReporter;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
|
||||
@@ -59,7 +57,7 @@ public class SleuthSpanCreatorAspectFluxTests {
|
||||
Tracer tracer;
|
||||
|
||||
@Autowired
|
||||
ArrayListSpanReporter reporter;
|
||||
TestSpanHandler spans;
|
||||
|
||||
private static String toHexString(Long value) {
|
||||
then(value).isNotNull();
|
||||
@@ -82,7 +80,7 @@ public class SleuthSpanCreatorAspectFluxTests {
|
||||
|
||||
@BeforeEach
|
||||
public void setup() {
|
||||
this.reporter.clear();
|
||||
this.spans.clear();
|
||||
this.testBean.reset();
|
||||
}
|
||||
|
||||
@@ -93,10 +91,9 @@ public class SleuthSpanCreatorAspectFluxTests {
|
||||
verifyNoSpansUntilFluxComplete(flux);
|
||||
|
||||
Awaitility.await().untilAsserted(() -> {
|
||||
List<zipkin2.Span> spans = this.reporter.getSpans();
|
||||
then(spans).hasSize(1);
|
||||
then(spans.get(0).name()).isEqualTo("test-method");
|
||||
then(spans.get(0).duration()).isNotZero();
|
||||
then(this.spans).hasSize(1);
|
||||
then(this.spans.get(0).name()).isEqualTo("test-method");
|
||||
then(this.spans.get(0).finishTimestamp()).isNotZero();
|
||||
then(this.tracer.currentSpan()).isNull();
|
||||
});
|
||||
}
|
||||
@@ -108,10 +105,9 @@ public class SleuthSpanCreatorAspectFluxTests {
|
||||
verifyNoSpansUntilFluxComplete(flux);
|
||||
|
||||
Awaitility.await().untilAsserted(() -> {
|
||||
List<zipkin2.Span> spans = this.reporter.getSpans();
|
||||
then(spans).hasSize(1);
|
||||
then(spans.get(0).name()).isEqualTo("test-method2");
|
||||
then(spans.get(0).duration()).isNotZero();
|
||||
then(this.spans).hasSize(1);
|
||||
then(this.spans.get(0).name()).isEqualTo("test-method2");
|
||||
then(this.spans.get(0).finishTimestamp()).isNotZero();
|
||||
then(this.tracer.currentSpan()).isNull();
|
||||
});
|
||||
}
|
||||
@@ -123,10 +119,9 @@ public class SleuthSpanCreatorAspectFluxTests {
|
||||
verifyNoSpansUntilFluxComplete(flux);
|
||||
|
||||
Awaitility.await().untilAsserted(() -> {
|
||||
List<zipkin2.Span> spans = this.reporter.getSpans();
|
||||
then(spans).hasSize(1);
|
||||
then(spans.get(0).name()).isEqualTo("custom-name-on-test-method3");
|
||||
then(spans.get(0).duration()).isNotZero();
|
||||
then(this.spans).hasSize(1);
|
||||
then(this.spans.get(0).name()).isEqualTo("custom-name-on-test-method3");
|
||||
then(this.spans.get(0).finishTimestamp()).isNotZero();
|
||||
then(this.tracer.currentSpan()).isNull();
|
||||
});
|
||||
}
|
||||
@@ -138,10 +133,9 @@ public class SleuthSpanCreatorAspectFluxTests {
|
||||
verifyNoSpansUntilFluxComplete(flux);
|
||||
|
||||
Awaitility.await().untilAsserted(() -> {
|
||||
List<zipkin2.Span> spans = this.reporter.getSpans();
|
||||
then(spans).hasSize(1);
|
||||
then(spans.get(0).name()).isEqualTo("custom-name-on-test-method4");
|
||||
then(spans.get(0).duration()).isNotZero();
|
||||
then(this.spans).hasSize(1);
|
||||
then(this.spans.get(0).name()).isEqualTo("custom-name-on-test-method4");
|
||||
then(this.spans.get(0).finishTimestamp()).isNotZero();
|
||||
then(this.tracer.currentSpan()).isNull();
|
||||
});
|
||||
}
|
||||
@@ -155,11 +149,10 @@ public class SleuthSpanCreatorAspectFluxTests {
|
||||
verifyNoSpansUntilFluxComplete(flux);
|
||||
|
||||
Awaitility.await().untilAsserted(() -> {
|
||||
List<zipkin2.Span> spans = this.reporter.getSpans();
|
||||
then(spans).hasSize(1);
|
||||
then(spans.get(0).name()).isEqualTo("custom-name-on-test-method5");
|
||||
then(spans.get(0).tags()).containsEntry("testTag", "test");
|
||||
then(spans.get(0).duration()).isNotZero();
|
||||
then(this.spans).hasSize(1);
|
||||
then(this.spans.get(0).name()).isEqualTo("custom-name-on-test-method5");
|
||||
then(this.spans.get(0).tags()).containsEntry("testTag", "test");
|
||||
then(this.spans.get(0).finishTimestamp()).isNotZero();
|
||||
then(this.tracer.currentSpan()).isNull();
|
||||
});
|
||||
}
|
||||
@@ -171,11 +164,10 @@ public class SleuthSpanCreatorAspectFluxTests {
|
||||
verifyNoSpansUntilFluxComplete(flux);
|
||||
|
||||
Awaitility.await().untilAsserted(() -> {
|
||||
List<zipkin2.Span> spans = this.reporter.getSpans();
|
||||
then(spans).hasSize(1);
|
||||
then(spans.get(0).name()).isEqualTo("custom-name-on-test-method6");
|
||||
then(spans.get(0).tags()).containsEntry("testTag6", "test");
|
||||
then(spans.get(0).duration()).isNotZero();
|
||||
then(this.spans).hasSize(1);
|
||||
then(this.spans.get(0).name()).isEqualTo("custom-name-on-test-method6");
|
||||
then(this.spans.get(0).tags()).containsEntry("testTag6", "test");
|
||||
then(this.spans.get(0).finishTimestamp()).isNotZero();
|
||||
then(this.tracer.currentSpan()).isNull();
|
||||
});
|
||||
}
|
||||
@@ -187,10 +179,9 @@ public class SleuthSpanCreatorAspectFluxTests {
|
||||
verifyNoSpansUntilFluxComplete(flux);
|
||||
|
||||
Awaitility.await().untilAsserted(() -> {
|
||||
List<zipkin2.Span> spans = this.reporter.getSpans();
|
||||
then(spans).hasSize(1);
|
||||
then(spans.get(0).name()).isEqualTo("custom-name-on-test-method8");
|
||||
then(spans.get(0).duration()).isNotZero();
|
||||
then(this.spans).hasSize(1);
|
||||
then(this.spans.get(0).name()).isEqualTo("custom-name-on-test-method8");
|
||||
then(this.spans.get(0).finishTimestamp()).isNotZero();
|
||||
then(this.tracer.currentSpan()).isNull();
|
||||
});
|
||||
}
|
||||
@@ -202,12 +193,11 @@ public class SleuthSpanCreatorAspectFluxTests {
|
||||
verifyNoSpansUntilFluxComplete(flux);
|
||||
|
||||
Awaitility.await().untilAsserted(() -> {
|
||||
List<zipkin2.Span> spans = this.reporter.getSpans();
|
||||
then(spans).hasSize(1);
|
||||
then(spans.get(0).name()).isEqualTo("custom-name-on-test-method9");
|
||||
then(spans.get(0).tags()).containsEntry("class", "TestBean")
|
||||
then(this.spans).hasSize(1);
|
||||
then(this.spans.get(0).name()).isEqualTo("custom-name-on-test-method9");
|
||||
then(this.spans.get(0).tags()).containsEntry("class", "TestBean")
|
||||
.containsEntry("method", "testMethod9");
|
||||
then(spans.get(0).duration()).isNotZero();
|
||||
then(this.spans.get(0).finishTimestamp()).isNotZero();
|
||||
then(this.tracer.currentSpan()).isNull();
|
||||
});
|
||||
}
|
||||
@@ -226,14 +216,13 @@ public class SleuthSpanCreatorAspectFluxTests {
|
||||
}
|
||||
|
||||
Awaitility.await().untilAsserted(() -> {
|
||||
List<zipkin2.Span> spans = this.reporter.getSpans();
|
||||
then(spans).hasSize(1);
|
||||
then(spans.get(0).name()).isEqualTo("foo");
|
||||
then(spans.get(0).tags()).containsEntry("customTestTag10", "test");
|
||||
then(spans.get(0).annotations().stream().map(Annotation::value)
|
||||
then(spans.get(0).annotations().stream().map(Map.Entry::getValue)
|
||||
.collect(Collectors.toList())).contains("customTest.before",
|
||||
"customTest.after");
|
||||
then(spans.get(0).duration()).isNotZero();
|
||||
then(spans.get(0).finishTimestamp()).isNotZero();
|
||||
then(this.tracer.currentSpan()).isNull();
|
||||
});
|
||||
}
|
||||
@@ -244,14 +233,13 @@ public class SleuthSpanCreatorAspectFluxTests {
|
||||
verifyNoSpansUntilFluxComplete(flux);
|
||||
|
||||
Awaitility.await().untilAsserted(() -> {
|
||||
List<zipkin2.Span> spans = this.reporter.getSpans();
|
||||
then(spans).hasSize(1);
|
||||
then(spans.get(0).name()).isEqualTo("test-method10");
|
||||
then(spans.get(0).tags()).containsEntry("customTestTag10", "test");
|
||||
then(spans.get(0).annotations().stream().map(Annotation::value)
|
||||
then(this.spans).hasSize(1);
|
||||
then(this.spans.get(0).name()).isEqualTo("test-method10");
|
||||
then(this.spans.get(0).tags()).containsEntry("customTestTag10", "test");
|
||||
then(this.spans.get(0).annotations().stream().map(Map.Entry::getValue)
|
||||
.collect(Collectors.toList())).contains("customTest.before",
|
||||
"customTest.after");
|
||||
then(spans.get(0).duration()).isNotZero();
|
||||
then(this.spans.get(0).finishTimestamp()).isNotZero();
|
||||
then(this.tracer.currentSpan()).isNull();
|
||||
});
|
||||
}
|
||||
@@ -270,14 +258,13 @@ public class SleuthSpanCreatorAspectFluxTests {
|
||||
}
|
||||
|
||||
Awaitility.await().untilAsserted(() -> {
|
||||
List<zipkin2.Span> spans = this.reporter.getSpans();
|
||||
then(spans).hasSize(1);
|
||||
then(spans.get(0).name()).isEqualTo("foo");
|
||||
then(spans.get(0).tags()).containsEntry("customTestTag10", "test");
|
||||
then(spans.get(0).annotations().stream().map(Annotation::value)
|
||||
then(this.spans).hasSize(1);
|
||||
then(this.spans.get(0).name()).isEqualTo("foo");
|
||||
then(this.spans.get(0).tags()).containsEntry("customTestTag10", "test");
|
||||
then(this.spans.get(0).annotations().stream().map(Map.Entry::getValue)
|
||||
.collect(Collectors.toList())).contains("customTest.before",
|
||||
"customTest.after");
|
||||
then(spans.get(0).duration()).isNotZero();
|
||||
then(this.spans.get(0).finishTimestamp()).isNotZero();
|
||||
then(this.tracer.currentSpan()).isNull();
|
||||
});
|
||||
}
|
||||
@@ -297,16 +284,15 @@ public class SleuthSpanCreatorAspectFluxTests {
|
||||
}
|
||||
|
||||
Awaitility.await().untilAsserted(() -> {
|
||||
List<zipkin2.Span> spans = this.reporter.getSpans();
|
||||
then(spans).hasSize(1);
|
||||
then(spans.get(0).name()).isEqualTo("foo");
|
||||
then(spans.get(0).tags()).containsEntry("class", "TestBean")
|
||||
then(this.spans).hasSize(1);
|
||||
then(this.spans.get(0).name()).isEqualTo("foo");
|
||||
then(this.spans.get(0).tags()).containsEntry("class", "TestBean")
|
||||
.containsEntry("method", "testMethod11")
|
||||
.containsEntry("customTestTag11", "test");
|
||||
then(spans.get(0).annotations().stream().map(Annotation::value)
|
||||
then(this.spans.get(0).annotations().stream().map(Map.Entry::getValue)
|
||||
.collect(Collectors.toList())).contains("customTest.before",
|
||||
"customTest.after");
|
||||
then(spans.get(0).duration()).isNotZero();
|
||||
then(this.spans.get(0).finishTimestamp()).isNotZero();
|
||||
then(this.tracer.currentSpan()).isNull();
|
||||
});
|
||||
}
|
||||
@@ -316,7 +302,7 @@ public class SleuthSpanCreatorAspectFluxTests {
|
||||
try {
|
||||
Flux<String> flux = this.testBean.testMethod12("test");
|
||||
|
||||
then(this.reporter.getSpans()).isEmpty();
|
||||
then(this.spans).isEmpty();
|
||||
|
||||
flux.toIterable().iterator().next();
|
||||
}
|
||||
@@ -324,12 +310,11 @@ public class SleuthSpanCreatorAspectFluxTests {
|
||||
}
|
||||
|
||||
Awaitility.await().untilAsserted(() -> {
|
||||
List<zipkin2.Span> spans = this.reporter.getSpans();
|
||||
then(spans).hasSize(1);
|
||||
then(spans.get(0).name()).isEqualTo("test-method12");
|
||||
then(spans.get(0).tags()).containsEntry("testTag12", "test")
|
||||
then(this.spans).hasSize(1);
|
||||
then(this.spans.get(0).name()).isEqualTo("test-method12");
|
||||
then(this.spans.get(0).tags()).containsEntry("testTag12", "test")
|
||||
.containsEntry("error", "test exception 12");
|
||||
then(spans.get(0).duration()).isNotZero();
|
||||
then(this.spans.get(0).finishTimestamp()).isNotZero();
|
||||
then(this.tracer.currentSpan()).isNull();
|
||||
});
|
||||
}
|
||||
@@ -342,7 +327,7 @@ public class SleuthSpanCreatorAspectFluxTests {
|
||||
// tag::continue_span_execution[]
|
||||
Flux<String> flux = this.testBean.testMethod13();
|
||||
|
||||
then(this.reporter.getSpans()).isEmpty();
|
||||
then(this.spans).isEmpty();
|
||||
|
||||
flux.toIterable().iterator().next();
|
||||
// end::continue_span_execution[]
|
||||
@@ -354,14 +339,13 @@ public class SleuthSpanCreatorAspectFluxTests {
|
||||
}
|
||||
|
||||
Awaitility.await().untilAsserted(() -> {
|
||||
List<zipkin2.Span> spans = this.reporter.getSpans();
|
||||
then(spans).hasSize(1);
|
||||
then(spans.get(0).name()).isEqualTo("foo");
|
||||
then(spans.get(0).tags()).containsEntry("error", "test exception 13");
|
||||
then(spans.get(0).annotations().stream().map(Annotation::value)
|
||||
then(this.spans).hasSize(1);
|
||||
then(this.spans.get(0).name()).isEqualTo("foo");
|
||||
then(this.spans.get(0).tags()).containsEntry("error", "test exception 13");
|
||||
then(this.spans.get(0).annotations().stream().map(Map.Entry::getValue)
|
||||
.collect(Collectors.toList())).contains("testMethod13.before",
|
||||
"testMethod13.afterFailure", "testMethod13.after");
|
||||
then(spans.get(0).duration()).isNotZero();
|
||||
then(spans.get(0).finishTimestamp()).isNotZero();
|
||||
then(this.tracer.currentSpan()).isNull();
|
||||
});
|
||||
}
|
||||
@@ -372,8 +356,7 @@ public class SleuthSpanCreatorAspectFluxTests {
|
||||
verifyNoSpansUntilFluxComplete(flux);
|
||||
|
||||
Awaitility.await().untilAsserted(() -> {
|
||||
List<zipkin2.Span> spans = new ArrayList<>(this.reporter.getSpans());
|
||||
then(spans).isEmpty();
|
||||
then(this.spans).isEmpty();
|
||||
then(this.tracer.currentSpan()).isNull();
|
||||
});
|
||||
}
|
||||
@@ -384,10 +367,9 @@ public class SleuthSpanCreatorAspectFluxTests {
|
||||
Long newSpanId = flux.blockFirst();
|
||||
|
||||
Awaitility.await().untilAsserted(() -> {
|
||||
List<zipkin2.Span> spans = this.reporter.getSpans();
|
||||
then(spans).hasSize(1);
|
||||
then(spans.get(0).name()).isEqualTo("span-in-trace-context");
|
||||
then(spans.get(0).id()).isEqualTo(toHexString(newSpanId));
|
||||
then(this.spans).hasSize(1);
|
||||
then(this.spans.get(0).name()).isEqualTo("span-in-trace-context");
|
||||
then(this.spans.get(0).id()).isEqualTo(toHexString(newSpanId));
|
||||
then(this.tracer.currentSpan()).isNull();
|
||||
});
|
||||
}
|
||||
@@ -398,10 +380,9 @@ public class SleuthSpanCreatorAspectFluxTests {
|
||||
Long newSpanId = flux.blockFirst();
|
||||
|
||||
Awaitility.await().untilAsserted(() -> {
|
||||
List<zipkin2.Span> spans = this.reporter.getSpans();
|
||||
then(spans).hasSize(1);
|
||||
then(spans.get(0).name()).isEqualTo("span-in-subscriber-context");
|
||||
then(spans.get(0).id()).isEqualTo(toHexString(newSpanId));
|
||||
then(this.spans).hasSize(1);
|
||||
then(this.spans.get(0).name()).isEqualTo("span-in-subscriber-context");
|
||||
then(this.spans.get(0).id()).isEqualTo(toHexString(newSpanId));
|
||||
then(this.tracer.currentSpan()).isNull();
|
||||
});
|
||||
}
|
||||
@@ -409,12 +390,12 @@ public class SleuthSpanCreatorAspectFluxTests {
|
||||
private void verifyNoSpansUntilFluxComplete(Flux<String> flux) {
|
||||
Iterator<String> iterator = flux.toIterable().iterator();
|
||||
|
||||
then(this.reporter.getSpans()).isEmpty();
|
||||
then(this.spans).isEmpty();
|
||||
this.testBean.proceed();
|
||||
|
||||
String result1 = iterator.next();
|
||||
then(result1).isEqualTo(TEST_STRING1);
|
||||
then(this.reporter.getSpans()).isEmpty();
|
||||
then(this.spans).isEmpty();
|
||||
|
||||
this.testBean.proceed();
|
||||
String result2 = iterator.next();
|
||||
@@ -623,8 +604,8 @@ public class SleuthSpanCreatorAspectFluxTests {
|
||||
}
|
||||
|
||||
@Bean
|
||||
Reporter<zipkin2.Span> spanReporter() {
|
||||
return new ArrayListSpanReporter();
|
||||
SpanHandler testSpanHandler() {
|
||||
return new TestSpanHandler();
|
||||
}
|
||||
|
||||
@Bean
|
||||
|
||||
@@ -16,8 +16,6 @@
|
||||
|
||||
package org.springframework.cloud.sleuth.annotation;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.stream.Collector;
|
||||
@@ -27,18 +25,18 @@ import javax.annotation.concurrent.NotThreadSafe;
|
||||
|
||||
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.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import reactor.core.publisher.Mono;
|
||||
import zipkin2.Annotation;
|
||||
import zipkin2.reporter.Reporter;
|
||||
|
||||
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.util.ArrayListSpanReporter;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.test.annotation.DirtiesContext;
|
||||
@@ -63,7 +61,7 @@ public class SleuthSpanCreatorAspectMonoTests {
|
||||
Tracer tracer;
|
||||
|
||||
@Autowired
|
||||
ArrayListSpanReporter reporter;
|
||||
TestSpanHandler spans;
|
||||
|
||||
protected static String id(Tracer tracer) {
|
||||
if (tracer.currentSpan() == null) {
|
||||
@@ -74,22 +72,21 @@ public class SleuthSpanCreatorAspectMonoTests {
|
||||
|
||||
@BeforeEach
|
||||
public void setup() {
|
||||
this.reporter.clear();
|
||||
this.spans.clear();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void shouldCreateSpanWhenAnnotationOnInterfaceMethod() {
|
||||
Mono<String> mono = this.testBean.testMethod();
|
||||
|
||||
then(this.reporter.getSpans()).isEmpty();
|
||||
then(this.spans).isEmpty();
|
||||
|
||||
mono.block();
|
||||
|
||||
Awaitility.await().untilAsserted(() -> {
|
||||
List<zipkin2.Span> spans = this.reporter.getSpans();
|
||||
then(spans).hasSize(1);
|
||||
then(spans.get(0).name()).isEqualTo("test-method");
|
||||
then(spans.get(0).duration()).isNotZero();
|
||||
then(this.spans).hasSize(1);
|
||||
then(this.spans.get(0).name()).isEqualTo("test-method");
|
||||
then(this.spans.get(0).finishTimestamp()).isNotZero();
|
||||
then(this.tracer.currentSpan()).isNull();
|
||||
});
|
||||
}
|
||||
@@ -98,15 +95,14 @@ public class SleuthSpanCreatorAspectMonoTests {
|
||||
public void shouldCreateSpanWhenAnnotationOnClassMethod() {
|
||||
Mono<String> mono = this.testBean.testMethod2();
|
||||
|
||||
then(this.reporter.getSpans()).isEmpty();
|
||||
then(this.spans).isEmpty();
|
||||
|
||||
mono.block();
|
||||
|
||||
Awaitility.await().untilAsserted(() -> {
|
||||
List<zipkin2.Span> spans = this.reporter.getSpans();
|
||||
then(spans).hasSize(1);
|
||||
then(spans.get(0).name()).isEqualTo("test-method2");
|
||||
then(spans.get(0).duration()).isNotZero();
|
||||
then(this.spans).hasSize(1);
|
||||
then(this.spans.get(0).name()).isEqualTo("test-method2");
|
||||
then(this.spans.get(0).finishTimestamp()).isNotZero();
|
||||
then(this.tracer.currentSpan()).isNull();
|
||||
});
|
||||
}
|
||||
@@ -115,16 +111,15 @@ public class SleuthSpanCreatorAspectMonoTests {
|
||||
public void shouldCreateSpanWithCustomNameWhenAnnotationOnClassMethod() {
|
||||
Mono<String> mono = this.testBean.testMethod3();
|
||||
|
||||
then(this.reporter.getSpans()).isEmpty();
|
||||
then(this.spans).isEmpty();
|
||||
|
||||
String result = mono.block();
|
||||
|
||||
Awaitility.await().untilAsserted(() -> {
|
||||
then(result).isEqualTo(TEST_STRING);
|
||||
List<zipkin2.Span> spans = this.reporter.getSpans();
|
||||
then(spans).hasSize(1);
|
||||
then(spans.get(0).name()).isEqualTo("custom-name-on-test-method3");
|
||||
then(spans.get(0).duration()).isNotZero();
|
||||
then(this.spans).hasSize(1);
|
||||
then(this.spans.get(0).name()).isEqualTo("custom-name-on-test-method3");
|
||||
then(this.spans.get(0).finishTimestamp()).isNotZero();
|
||||
then(this.tracer.currentSpan()).isNull();
|
||||
});
|
||||
}
|
||||
@@ -133,15 +128,14 @@ public class SleuthSpanCreatorAspectMonoTests {
|
||||
public void shouldCreateSpanWithCustomNameWhenAnnotationOnInterfaceMethod() {
|
||||
Mono<String> mono = this.testBean.testMethod4();
|
||||
|
||||
then(this.reporter.getSpans()).isEmpty();
|
||||
then(this.spans).isEmpty();
|
||||
|
||||
mono.block();
|
||||
|
||||
Awaitility.await().untilAsserted(() -> {
|
||||
List<zipkin2.Span> spans = this.reporter.getSpans();
|
||||
then(spans).hasSize(1);
|
||||
then(spans.get(0).name()).isEqualTo("custom-name-on-test-method4");
|
||||
then(spans.get(0).duration()).isNotZero();
|
||||
then(this.spans).hasSize(1);
|
||||
then(this.spans.get(0).name()).isEqualTo("custom-name-on-test-method4");
|
||||
then(this.spans.get(0).finishTimestamp()).isNotZero();
|
||||
then(this.tracer.currentSpan()).isNull();
|
||||
});
|
||||
}
|
||||
@@ -152,16 +146,15 @@ public class SleuthSpanCreatorAspectMonoTests {
|
||||
Mono<String> mono = this.testBean.testMethod5("test");
|
||||
|
||||
// end::execution[]
|
||||
then(this.reporter.getSpans()).isEmpty();
|
||||
then(this.spans).isEmpty();
|
||||
|
||||
mono.block();
|
||||
|
||||
Awaitility.await().untilAsserted(() -> {
|
||||
List<zipkin2.Span> spans = this.reporter.getSpans();
|
||||
then(spans).hasSize(1);
|
||||
then(spans.get(0).name()).isEqualTo("custom-name-on-test-method5");
|
||||
then(spans.get(0).tags()).containsEntry("testTag", "test");
|
||||
then(spans.get(0).duration()).isNotZero();
|
||||
then(this.spans).hasSize(1);
|
||||
then(this.spans.get(0).name()).isEqualTo("custom-name-on-test-method5");
|
||||
then(this.spans.get(0).tags()).containsEntry("testTag", "test");
|
||||
then(this.spans.get(0).finishTimestamp()).isNotZero();
|
||||
then(this.tracer.currentSpan()).isNull();
|
||||
});
|
||||
}
|
||||
@@ -170,16 +163,15 @@ public class SleuthSpanCreatorAspectMonoTests {
|
||||
public void shouldCreateSpanWithTagWhenAnnotationOnClassMethod() {
|
||||
Mono<String> mono = this.testBean.testMethod6("test");
|
||||
|
||||
then(this.reporter.getSpans()).isEmpty();
|
||||
then(this.spans).isEmpty();
|
||||
|
||||
mono.block();
|
||||
|
||||
Awaitility.await().untilAsserted(() -> {
|
||||
List<zipkin2.Span> spans = this.reporter.getSpans();
|
||||
then(spans).hasSize(1);
|
||||
then(spans.get(0).name()).isEqualTo("custom-name-on-test-method6");
|
||||
then(spans.get(0).tags()).containsEntry("testTag6", "test");
|
||||
then(spans.get(0).duration()).isNotZero();
|
||||
then(this.spans).hasSize(1);
|
||||
then(this.spans.get(0).name()).isEqualTo("custom-name-on-test-method6");
|
||||
then(this.spans.get(0).tags()).containsEntry("testTag6", "test");
|
||||
then(this.spans.get(0).finishTimestamp()).isNotZero();
|
||||
then(this.tracer.currentSpan()).isNull();
|
||||
});
|
||||
}
|
||||
@@ -188,15 +180,14 @@ public class SleuthSpanCreatorAspectMonoTests {
|
||||
public void shouldCreateSpanWithLogWhenAnnotationOnInterfaceMethod() {
|
||||
Mono<String> mono = this.testBean.testMethod8("test");
|
||||
|
||||
then(this.reporter.getSpans()).isEmpty();
|
||||
then(this.spans).isEmpty();
|
||||
|
||||
mono.block();
|
||||
|
||||
Awaitility.await().untilAsserted(() -> {
|
||||
List<zipkin2.Span> spans = this.reporter.getSpans();
|
||||
then(spans).hasSize(1);
|
||||
then(spans.get(0).name()).isEqualTo("custom-name-on-test-method8");
|
||||
then(spans.get(0).duration()).isNotZero();
|
||||
then(this.spans).hasSize(1);
|
||||
then(this.spans.get(0).name()).isEqualTo("custom-name-on-test-method8");
|
||||
then(this.spans.get(0).finishTimestamp()).isNotZero();
|
||||
then(this.tracer.currentSpan()).isNull();
|
||||
});
|
||||
}
|
||||
@@ -205,17 +196,16 @@ public class SleuthSpanCreatorAspectMonoTests {
|
||||
public void shouldCreateSpanWithLogWhenAnnotationOnClassMethod() {
|
||||
Mono<String> mono = this.testBean.testMethod9("test");
|
||||
|
||||
then(this.reporter.getSpans()).isEmpty();
|
||||
then(this.spans).isEmpty();
|
||||
|
||||
mono.block();
|
||||
|
||||
Awaitility.await().untilAsserted(() -> {
|
||||
List<zipkin2.Span> spans = this.reporter.getSpans();
|
||||
then(spans).hasSize(1);
|
||||
then(spans.get(0).name()).isEqualTo("custom-name-on-test-method9");
|
||||
then(spans.get(0).tags()).containsEntry("class", "TestBean")
|
||||
then(this.spans).hasSize(1);
|
||||
then(this.spans.get(0).name()).isEqualTo("custom-name-on-test-method9");
|
||||
then(this.spans.get(0).tags()).containsEntry("class", "TestBean")
|
||||
.containsEntry("method", "testMethod9");
|
||||
then(spans.get(0).duration()).isNotZero();
|
||||
then(this.spans.get(0).finishTimestamp()).isNotZero();
|
||||
then(this.tracer.currentSpan()).isNull();
|
||||
});
|
||||
}
|
||||
@@ -227,7 +217,7 @@ public class SleuthSpanCreatorAspectMonoTests {
|
||||
try (Tracer.SpanInScope ws = this.tracer.withSpanInScope(span.start())) {
|
||||
Mono<String> mono = this.testBean.testMethod10("test");
|
||||
|
||||
then(this.reporter.getSpans()).isEmpty();
|
||||
then(this.spans).isEmpty();
|
||||
|
||||
mono.block();
|
||||
}
|
||||
@@ -236,14 +226,13 @@ public class SleuthSpanCreatorAspectMonoTests {
|
||||
}
|
||||
|
||||
Awaitility.await().untilAsserted(() -> {
|
||||
List<zipkin2.Span> spans = this.reporter.getSpans();
|
||||
then(spans).hasSize(1);
|
||||
then(spans.get(0).name()).isEqualTo("foo");
|
||||
then(spans.get(0).tags()).containsEntry("customTestTag10", "test");
|
||||
then(spans.get(0).annotations().stream().map(Annotation::value)
|
||||
then(this.spans).hasSize(1);
|
||||
then(this.spans.get(0).name()).isEqualTo("foo");
|
||||
then(this.spans.get(0).tags()).containsEntry("customTestTag10", "test");
|
||||
then(this.spans.get(0).annotations().stream().map(Map.Entry::getValue)
|
||||
.collect(Collectors.toList())).contains("customTest.before",
|
||||
"customTest.after");
|
||||
then(spans.get(0).duration()).isNotZero();
|
||||
then(this.spans.get(0).finishTimestamp()).isNotZero();
|
||||
then(this.tracer.currentSpan()).isNull();
|
||||
});
|
||||
}
|
||||
@@ -253,14 +242,13 @@ public class SleuthSpanCreatorAspectMonoTests {
|
||||
this.testBean.testMethod10("test").block();
|
||||
|
||||
Awaitility.await().untilAsserted(() -> {
|
||||
List<zipkin2.Span> spans = this.reporter.getSpans();
|
||||
then(spans).hasSize(1);
|
||||
then(spans.get(0).name()).isEqualTo("test-method10");
|
||||
then(spans.get(0).tags()).containsEntry("customTestTag10", "test");
|
||||
then(spans.get(0).annotations().stream().map(Annotation::value)
|
||||
then(this.spans).hasSize(1);
|
||||
then(this.spans.get(0).name()).isEqualTo("test-method10");
|
||||
then(this.spans.get(0).tags()).containsEntry("customTestTag10", "test");
|
||||
then(this.spans.get(0).annotations().stream().map(Map.Entry::getValue)
|
||||
.collect(Collectors.toList())).contains("customTest.before",
|
||||
"customTest.after");
|
||||
then(spans.get(0).duration()).isNotZero();
|
||||
then(this.spans.get(0).finishTimestamp()).isNotZero();
|
||||
then(this.tracer.currentSpan()).isNull();
|
||||
});
|
||||
}
|
||||
@@ -272,7 +260,7 @@ public class SleuthSpanCreatorAspectMonoTests {
|
||||
try (Tracer.SpanInScope ws = this.tracer.withSpanInScope(span.start())) {
|
||||
Mono<String> mono = this.testBean.testMethod10_v2("test");
|
||||
|
||||
then(this.reporter.getSpans()).isEmpty();
|
||||
then(this.spans).isEmpty();
|
||||
|
||||
mono.block();
|
||||
}
|
||||
@@ -281,14 +269,13 @@ public class SleuthSpanCreatorAspectMonoTests {
|
||||
}
|
||||
|
||||
Awaitility.await().untilAsserted(() -> {
|
||||
List<zipkin2.Span> spans = this.reporter.getSpans();
|
||||
then(spans).hasSize(1);
|
||||
then(spans.get(0).name()).isEqualTo("foo");
|
||||
then(spans.get(0).tags()).containsEntry("customTestTag10", "test");
|
||||
then(spans.get(0).annotations().stream().map(Annotation::value)
|
||||
then(this.spans).hasSize(1);
|
||||
then(this.spans.get(0).name()).isEqualTo("foo");
|
||||
then(this.spans.get(0).tags()).containsEntry("customTestTag10", "test");
|
||||
then(this.spans.get(0).annotations().stream().map(Map.Entry::getValue)
|
||||
.collect(Collectors.toList())).contains("customTest.before",
|
||||
"customTest.after");
|
||||
then(spans.get(0).duration()).isNotZero();
|
||||
then(this.spans.get(0).finishTimestamp()).isNotZero();
|
||||
then(this.tracer.currentSpan()).isNull();
|
||||
});
|
||||
}
|
||||
@@ -301,7 +288,7 @@ public class SleuthSpanCreatorAspectMonoTests {
|
||||
// tag::continue_span_execution[]
|
||||
Mono<String> mono = this.testBean.testMethod11("test");
|
||||
// end::continue_span_execution[]
|
||||
then(this.reporter.getSpans()).isEmpty();
|
||||
then(this.spans).isEmpty();
|
||||
|
||||
mono.block();
|
||||
}
|
||||
@@ -310,16 +297,15 @@ public class SleuthSpanCreatorAspectMonoTests {
|
||||
}
|
||||
|
||||
Awaitility.await().untilAsserted(() -> {
|
||||
List<zipkin2.Span> spans = this.reporter.getSpans();
|
||||
then(spans).hasSize(1);
|
||||
then(spans.get(0).name()).isEqualTo("foo");
|
||||
then(spans.get(0).tags()).containsEntry("class", "TestBean")
|
||||
then(this.spans).hasSize(1);
|
||||
then(this.spans.get(0).name()).isEqualTo("foo");
|
||||
then(this.spans.get(0).tags()).containsEntry("class", "TestBean")
|
||||
.containsEntry("method", "testMethod11")
|
||||
.containsEntry("customTestTag11", "test");
|
||||
then(spans.get(0).annotations().stream().map(Annotation::value)
|
||||
then(this.spans.get(0).annotations().stream().map(Map.Entry::getValue)
|
||||
.collect(Collectors.toList())).contains("customTest.before",
|
||||
"customTest.after");
|
||||
then(spans.get(0).duration()).isNotZero();
|
||||
then(this.spans.get(0).finishTimestamp()).isNotZero();
|
||||
then(this.tracer.currentSpan()).isNull();
|
||||
});
|
||||
}
|
||||
@@ -329,7 +315,7 @@ public class SleuthSpanCreatorAspectMonoTests {
|
||||
try {
|
||||
Mono<String> mono = this.testBean.testMethod12("test");
|
||||
|
||||
then(this.reporter.getSpans()).isEmpty();
|
||||
then(this.spans).isEmpty();
|
||||
|
||||
mono.block();
|
||||
}
|
||||
@@ -337,12 +323,11 @@ public class SleuthSpanCreatorAspectMonoTests {
|
||||
}
|
||||
|
||||
Awaitility.await().untilAsserted(() -> {
|
||||
List<zipkin2.Span> spans = this.reporter.getSpans();
|
||||
then(spans).hasSize(1);
|
||||
then(spans.get(0).name()).isEqualTo("test-method12");
|
||||
then(spans.get(0).tags()).containsEntry("testTag12", "test")
|
||||
then(this.spans).hasSize(1);
|
||||
then(this.spans.get(0).name()).isEqualTo("test-method12");
|
||||
then(this.spans.get(0).tags()).containsEntry("testTag12", "test")
|
||||
.containsEntry("error", "test exception 12");
|
||||
then(spans.get(0).duration()).isNotZero();
|
||||
then(this.spans.get(0).finishTimestamp()).isNotZero();
|
||||
then(this.tracer.currentSpan()).isNull();
|
||||
});
|
||||
}
|
||||
@@ -355,7 +340,7 @@ public class SleuthSpanCreatorAspectMonoTests {
|
||||
// tag::continue_span_execution[]
|
||||
Mono<String> mono = this.testBean.testMethod13();
|
||||
|
||||
then(this.reporter.getSpans()).isEmpty();
|
||||
then(this.spans).isEmpty();
|
||||
|
||||
mono.block();
|
||||
// end::continue_span_execution[]
|
||||
@@ -367,14 +352,13 @@ public class SleuthSpanCreatorAspectMonoTests {
|
||||
}
|
||||
|
||||
Awaitility.await().untilAsserted(() -> {
|
||||
List<zipkin2.Span> spans = this.reporter.getSpans();
|
||||
then(spans).hasSize(1);
|
||||
then(spans.get(0).name()).isEqualTo("foo");
|
||||
then(spans.get(0).tags()).containsEntry("error", "test exception 13");
|
||||
then(spans.get(0).annotations().stream().map(Annotation::value)
|
||||
then(this.spans).hasSize(1);
|
||||
then(this.spans.get(0).name()).isEqualTo("foo");
|
||||
then(this.spans.get(0).tags()).containsEntry("error", "test exception 13");
|
||||
then(this.spans.get(0).annotations().stream().map(Map.Entry::getValue)
|
||||
.collect(Collectors.toList())).contains("testMethod13.before",
|
||||
"testMethod13.afterFailure", "testMethod13.after");
|
||||
then(spans.get(0).duration()).isNotZero();
|
||||
then(this.spans.get(0).finishTimestamp()).isNotZero();
|
||||
then(this.tracer.currentSpan()).isNull();
|
||||
});
|
||||
}
|
||||
@@ -385,8 +369,7 @@ public class SleuthSpanCreatorAspectMonoTests {
|
||||
mono.block();
|
||||
|
||||
Awaitility.await().untilAsserted(() -> {
|
||||
List<zipkin2.Span> spans = new ArrayList<>(this.reporter.getSpans());
|
||||
then(spans).isEmpty();
|
||||
then(this.spans).isEmpty();
|
||||
then(this.tracer.currentSpan()).isNull();
|
||||
});
|
||||
}
|
||||
@@ -395,15 +378,14 @@ public class SleuthSpanCreatorAspectMonoTests {
|
||||
public void shouldReturnNewSpanFromTraceContext() {
|
||||
Mono<String> mono = this.testBean.newSpanInTraceContext();
|
||||
|
||||
then(this.reporter.getSpans()).isEmpty();
|
||||
then(this.spans).isEmpty();
|
||||
|
||||
String newSpanId = mono.block();
|
||||
|
||||
Awaitility.await().untilAsserted(() -> {
|
||||
List<zipkin2.Span> spans = this.reporter.getSpans();
|
||||
then(spans).hasSize(1);
|
||||
then(spans.get(0).name()).isEqualTo("span-in-trace-context");
|
||||
then(spans.get(0).id()).isEqualTo(newSpanId);
|
||||
then(this.spans).hasSize(1);
|
||||
then(this.spans.get(0).name()).isEqualTo("span-in-trace-context");
|
||||
then(this.spans.get(0).id()).isEqualTo(newSpanId);
|
||||
then(this.tracer.currentSpan()).isNull();
|
||||
});
|
||||
}
|
||||
@@ -413,7 +395,7 @@ public class SleuthSpanCreatorAspectMonoTests {
|
||||
Mono<Pair<Pair<String, String>, String>> mono = this.testBeanOuter
|
||||
.outerNewSpanInTraceContext();
|
||||
|
||||
then(this.reporter.getSpans()).isEmpty();
|
||||
then(this.spans).isEmpty();
|
||||
|
||||
Pair<Pair<String, String>, String> pair = mono.block();
|
||||
String outerSpanIdBefore = pair.getFirst().getFirst();
|
||||
@@ -422,14 +404,13 @@ public class SleuthSpanCreatorAspectMonoTests {
|
||||
then(outerSpanIdBefore).isNotEqualTo(innerSpanId);
|
||||
|
||||
Awaitility.await().untilAsserted(() -> {
|
||||
List<zipkin2.Span> spans = this.reporter.getSpans();
|
||||
zipkin2.Span outerSpan = spans.stream()
|
||||
MutableSpan outerSpan = spans.spans().stream()
|
||||
.filter(span -> span.name().equals("outer-span-in-trace-context"))
|
||||
.findFirst().orElseThrow(() -> new AssertionError(
|
||||
"No span with name [outer-span-in-trace-context] found"));
|
||||
then(outerSpan.name()).isEqualTo("outer-span-in-trace-context");
|
||||
then(outerSpan.id()).isEqualTo(outerSpanIdBefore);
|
||||
zipkin2.Span innerSpan = spans.stream()
|
||||
MutableSpan innerSpan = spans.spans().stream()
|
||||
.filter(span -> span.name().equals("span-in-trace-context"))
|
||||
.findFirst().orElseThrow(() -> new AssertionError(
|
||||
"No span with name [span-in-trace-context] found"));
|
||||
@@ -443,15 +424,14 @@ public class SleuthSpanCreatorAspectMonoTests {
|
||||
public void shouldReturnNewSpanFromSubscriberContext() {
|
||||
Mono<String> mono = this.testBean.newSpanInSubscriberContext();
|
||||
|
||||
then(this.reporter.getSpans()).isEmpty();
|
||||
then(this.spans).isEmpty();
|
||||
|
||||
String newSpanId = mono.block();
|
||||
|
||||
Awaitility.await().untilAsserted(() -> {
|
||||
List<zipkin2.Span> spans = this.reporter.getSpans();
|
||||
then(spans).hasSize(1);
|
||||
then(spans.get(0).name()).isEqualTo("span-in-subscriber-context");
|
||||
then(spans.get(0).id()).isEqualTo(newSpanId);
|
||||
then(this.spans).hasSize(1);
|
||||
then(this.spans.get(0).name()).isEqualTo("span-in-subscriber-context");
|
||||
then(this.spans.get(0).id()).isEqualTo(newSpanId);
|
||||
then(this.tracer.currentSpan()).isNull();
|
||||
});
|
||||
}
|
||||
@@ -461,7 +441,7 @@ public class SleuthSpanCreatorAspectMonoTests {
|
||||
Mono<Pair<Pair<String, String>, String>> mono = this.testBeanOuter
|
||||
.outerNewSpanInSubscriberContext();
|
||||
|
||||
then(this.reporter.getSpans()).isEmpty();
|
||||
then(this.spans).isEmpty();
|
||||
|
||||
Pair<Pair<String, String>, String> pair = mono.block();
|
||||
String outerSpanIdBefore = pair.getFirst().getFirst();
|
||||
@@ -470,14 +450,13 @@ public class SleuthSpanCreatorAspectMonoTests {
|
||||
then(outerSpanIdBefore).isNotEqualTo(innerSpanId);
|
||||
|
||||
Awaitility.await().untilAsserted(() -> {
|
||||
List<zipkin2.Span> spans = this.reporter.getSpans();
|
||||
zipkin2.Span outerSpan = spans.stream().filter(
|
||||
MutableSpan outerSpan = spans.spans().stream().filter(
|
||||
span -> span.name().equals("outer-span-in-subscriber-context"))
|
||||
.findFirst().orElseThrow(() -> new AssertionError(
|
||||
"No span with name [outer-span-in-subscriber-context] found"));
|
||||
then(outerSpan.name()).isEqualTo("outer-span-in-subscriber-context");
|
||||
then(outerSpan.id()).isEqualTo(outerSpanIdBefore);
|
||||
zipkin2.Span innerSpan = spans.stream()
|
||||
MutableSpan innerSpan = spans.spans().stream()
|
||||
.filter(span -> span.name().equals("span-in-subscriber-context"))
|
||||
.findFirst().orElseThrow(() -> new AssertionError(
|
||||
"No span with name [span-in-subscriber-context] found"));
|
||||
@@ -694,8 +673,8 @@ public class SleuthSpanCreatorAspectMonoTests {
|
||||
}
|
||||
|
||||
@Bean
|
||||
Reporter<zipkin2.Span> spanReporter() {
|
||||
return new ArrayListSpanReporter();
|
||||
SpanHandler testSpanHandler() {
|
||||
return new TestSpanHandler();
|
||||
}
|
||||
|
||||
@Bean
|
||||
|
||||
@@ -16,18 +16,15 @@
|
||||
|
||||
package org.springframework.cloud.sleuth.annotation;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import brave.handler.SpanHandler;
|
||||
import brave.sampler.Sampler;
|
||||
import brave.test.TestSpanHandler;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import zipkin2.Span;
|
||||
import zipkin2.reporter.Reporter;
|
||||
|
||||
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.util.ArrayListSpanReporter;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
|
||||
@@ -43,27 +40,26 @@ public class SleuthSpanCreatorAspectNegativeTests {
|
||||
TestBeanInterface annotatedTestBean;
|
||||
|
||||
@Autowired
|
||||
ArrayListSpanReporter reporter;
|
||||
TestSpanHandler spans;
|
||||
|
||||
@BeforeEach
|
||||
public void setup() {
|
||||
this.reporter.clear();
|
||||
this.spans.clear();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void shouldNotCallAdviceForNotAnnotatedBean() {
|
||||
this.testBean.testMethod();
|
||||
|
||||
then(this.reporter.getSpans()).isEmpty();
|
||||
then(this.spans).isEmpty();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void shouldCallAdviceForAnnotatedBean() throws Throwable {
|
||||
this.annotatedTestBean.testMethod();
|
||||
|
||||
List<Span> spans = this.reporter.getSpans();
|
||||
then(spans).hasSize(1);
|
||||
then(spans.get(0).name()).isEqualTo("test-method");
|
||||
then(this.spans).hasSize(1);
|
||||
then(this.spans.get(0).name()).isEqualTo("test-method");
|
||||
}
|
||||
|
||||
protected interface NotAnnotatedTestBeanInterface {
|
||||
@@ -142,8 +138,8 @@ public class SleuthSpanCreatorAspectNegativeTests {
|
||||
protected static class TestConfiguration {
|
||||
|
||||
@Bean
|
||||
Reporter<Span> spanReporter() {
|
||||
return new ArrayListSpanReporter();
|
||||
SpanHandler testSpanHandler() {
|
||||
return new TestSpanHandler();
|
||||
}
|
||||
|
||||
@Bean
|
||||
|
||||
@@ -16,21 +16,20 @@
|
||||
|
||||
package org.springframework.cloud.sleuth.annotation;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import brave.Span;
|
||||
import brave.Tracer;
|
||||
import brave.handler.SpanHandler;
|
||||
import brave.sampler.Sampler;
|
||||
import brave.test.TestSpanHandler;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import zipkin2.Annotation;
|
||||
import zipkin2.reporter.Reporter;
|
||||
|
||||
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.util.ArrayListSpanReporter;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.test.annotation.DirtiesContext;
|
||||
@@ -50,21 +49,20 @@ public class SleuthSpanCreatorAspectTests {
|
||||
Tracer tracer;
|
||||
|
||||
@Autowired
|
||||
ArrayListSpanReporter reporter;
|
||||
TestSpanHandler spans;
|
||||
|
||||
@BeforeEach
|
||||
public void setup() {
|
||||
this.reporter.clear();
|
||||
this.spans.clear();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void shouldCreateSpanWhenAnnotationOnInterfaceMethod() {
|
||||
this.testBean.testMethod();
|
||||
|
||||
List<zipkin2.Span> spans = this.reporter.getSpans();
|
||||
then(spans).hasSize(1);
|
||||
then(spans.get(0).name()).isEqualTo("test-method");
|
||||
then(spans.get(0).duration()).isNotZero();
|
||||
then(this.spans).hasSize(1);
|
||||
then(this.spans.get(0).name()).isEqualTo("test-method");
|
||||
then(this.spans.get(0).finishTimestamp()).isNotZero();
|
||||
then(this.tracer.currentSpan()).isNull();
|
||||
}
|
||||
|
||||
@@ -72,10 +70,9 @@ public class SleuthSpanCreatorAspectTests {
|
||||
public void shouldCreateSpanWhenAnnotationOnClassMethod() {
|
||||
this.testBean.testMethod2();
|
||||
|
||||
List<zipkin2.Span> spans = this.reporter.getSpans();
|
||||
then(spans).hasSize(1);
|
||||
then(spans.get(0).name()).isEqualTo("test-method2");
|
||||
then(spans.get(0).duration()).isNotZero();
|
||||
then(this.spans).hasSize(1);
|
||||
then(this.spans.get(0).name()).isEqualTo("test-method2");
|
||||
then(this.spans.get(0).finishTimestamp()).isNotZero();
|
||||
then(this.tracer.currentSpan()).isNull();
|
||||
}
|
||||
|
||||
@@ -83,10 +80,9 @@ public class SleuthSpanCreatorAspectTests {
|
||||
public void shouldCreateSpanWithCustomNameWhenAnnotationOnClassMethod() {
|
||||
this.testBean.testMethod3();
|
||||
|
||||
List<zipkin2.Span> spans = this.reporter.getSpans();
|
||||
then(spans).hasSize(1);
|
||||
then(spans.get(0).name()).isEqualTo("custom-name-on-test-method3");
|
||||
then(spans.get(0).duration()).isNotZero();
|
||||
then(this.spans).hasSize(1);
|
||||
then(this.spans.get(0).name()).isEqualTo("custom-name-on-test-method3");
|
||||
then(this.spans.get(0).finishTimestamp()).isNotZero();
|
||||
then(this.tracer.currentSpan()).isNull();
|
||||
}
|
||||
|
||||
@@ -94,10 +90,9 @@ public class SleuthSpanCreatorAspectTests {
|
||||
public void shouldCreateSpanWithCustomNameWhenAnnotationOnInterfaceMethod() {
|
||||
this.testBean.testMethod4();
|
||||
|
||||
List<zipkin2.Span> spans = this.reporter.getSpans();
|
||||
then(spans).hasSize(1);
|
||||
then(spans.get(0).name()).isEqualTo("custom-name-on-test-method4");
|
||||
then(spans.get(0).duration()).isNotZero();
|
||||
then(this.spans).hasSize(1);
|
||||
then(this.spans.get(0).name()).isEqualTo("custom-name-on-test-method4");
|
||||
then(this.spans.get(0).finishTimestamp()).isNotZero();
|
||||
then(this.tracer.currentSpan()).isNull();
|
||||
}
|
||||
|
||||
@@ -107,11 +102,10 @@ public class SleuthSpanCreatorAspectTests {
|
||||
this.testBean.testMethod5("test");
|
||||
// end::execution[]
|
||||
|
||||
List<zipkin2.Span> spans = this.reporter.getSpans();
|
||||
then(spans).hasSize(1);
|
||||
then(spans.get(0).name()).isEqualTo("custom-name-on-test-method5");
|
||||
then(spans.get(0).tags()).containsEntry("testTag", "test");
|
||||
then(spans.get(0).duration()).isNotZero();
|
||||
then(this.spans).hasSize(1);
|
||||
then(this.spans.get(0).name()).isEqualTo("custom-name-on-test-method5");
|
||||
then(this.spans.get(0).tags()).containsEntry("testTag", "test");
|
||||
then(this.spans.get(0).finishTimestamp()).isNotZero();
|
||||
then(this.tracer.currentSpan()).isNull();
|
||||
}
|
||||
|
||||
@@ -119,11 +113,10 @@ public class SleuthSpanCreatorAspectTests {
|
||||
public void shouldCreateSpanWithTagWhenAnnotationOnClassMethod() {
|
||||
this.testBean.testMethod6("test");
|
||||
|
||||
List<zipkin2.Span> spans = this.reporter.getSpans();
|
||||
then(spans).hasSize(1);
|
||||
then(spans.get(0).name()).isEqualTo("custom-name-on-test-method6");
|
||||
then(spans.get(0).tags()).containsEntry("testTag6", "test");
|
||||
then(spans.get(0).duration()).isNotZero();
|
||||
then(this.spans).hasSize(1);
|
||||
then(this.spans.get(0).name()).isEqualTo("custom-name-on-test-method6");
|
||||
then(this.spans.get(0).tags()).containsEntry("testTag6", "test");
|
||||
then(this.spans.get(0).finishTimestamp()).isNotZero();
|
||||
then(this.tracer.currentSpan()).isNull();
|
||||
}
|
||||
|
||||
@@ -131,10 +124,9 @@ public class SleuthSpanCreatorAspectTests {
|
||||
public void shouldCreateSpanWithLogWhenAnnotationOnInterfaceMethod() {
|
||||
this.testBean.testMethod8("test");
|
||||
|
||||
List<zipkin2.Span> spans = this.reporter.getSpans();
|
||||
then(spans).hasSize(1);
|
||||
then(spans.get(0).name()).isEqualTo("custom-name-on-test-method8");
|
||||
then(spans.get(0).duration()).isNotZero();
|
||||
then(this.spans).hasSize(1);
|
||||
then(this.spans.get(0).name()).isEqualTo("custom-name-on-test-method8");
|
||||
then(this.spans.get(0).finishTimestamp()).isNotZero();
|
||||
then(this.tracer.currentSpan()).isNull();
|
||||
}
|
||||
|
||||
@@ -142,12 +134,11 @@ public class SleuthSpanCreatorAspectTests {
|
||||
public void shouldCreateSpanWithLogWhenAnnotationOnClassMethod() {
|
||||
this.testBean.testMethod9("test");
|
||||
|
||||
List<zipkin2.Span> spans = this.reporter.getSpans();
|
||||
then(spans).hasSize(1);
|
||||
then(spans.get(0).name()).isEqualTo("custom-name-on-test-method9");
|
||||
then(spans.get(0).tags()).containsEntry("class", "TestBean")
|
||||
then(this.spans).hasSize(1);
|
||||
then(this.spans.get(0).name()).isEqualTo("custom-name-on-test-method9");
|
||||
then(this.spans.get(0).tags()).containsEntry("class", "TestBean")
|
||||
.containsEntry("method", "testMethod9");
|
||||
then(spans.get(0).duration()).isNotZero();
|
||||
then(this.spans.get(0).finishTimestamp()).isNotZero();
|
||||
then(this.tracer.currentSpan()).isNull();
|
||||
}
|
||||
|
||||
@@ -162,14 +153,13 @@ public class SleuthSpanCreatorAspectTests {
|
||||
span.finish();
|
||||
}
|
||||
|
||||
List<zipkin2.Span> spans = this.reporter.getSpans();
|
||||
then(spans).hasSize(1);
|
||||
then(spans.get(0).name()).isEqualTo("foo");
|
||||
then(spans.get(0).tags()).containsEntry("customTestTag10", "test");
|
||||
then(spans.get(0).annotations().stream().map(Annotation::value)
|
||||
then(this.spans).hasSize(1);
|
||||
then(this.spans.get(0).name()).isEqualTo("foo");
|
||||
then(this.spans.get(0).tags()).containsEntry("customTestTag10", "test");
|
||||
then(this.spans.get(0).annotations().stream().map(Map.Entry::getValue)
|
||||
.collect(Collectors.toList())).contains("customTest.before",
|
||||
"customTest.after");
|
||||
then(spans.get(0).duration()).isNotZero();
|
||||
then(this.spans.get(0).finishTimestamp()).isNotZero();
|
||||
then(this.tracer.currentSpan()).isNull();
|
||||
}
|
||||
|
||||
@@ -177,14 +167,13 @@ public class SleuthSpanCreatorAspectTests {
|
||||
public void shouldStartAndCloseSpanOnContinueSpanIfSpanNotSet() {
|
||||
this.testBean.testMethod10("test");
|
||||
|
||||
List<zipkin2.Span> spans = this.reporter.getSpans();
|
||||
then(spans).hasSize(1);
|
||||
then(spans.get(0).name()).isEqualTo("test-method10");
|
||||
then(spans.get(0).tags()).containsEntry("customTestTag10", "test");
|
||||
then(spans.get(0).annotations().stream().map(Annotation::value)
|
||||
then(this.spans).hasSize(1);
|
||||
then(this.spans.get(0).name()).isEqualTo("test-method10");
|
||||
then(this.spans.get(0).tags()).containsEntry("customTestTag10", "test");
|
||||
then(this.spans.get(0).annotations().stream().map(Map.Entry::getValue)
|
||||
.collect(Collectors.toList())).contains("customTest.before",
|
||||
"customTest.after");
|
||||
then(spans.get(0).duration()).isNotZero();
|
||||
then(this.spans.get(0).finishTimestamp()).isNotZero();
|
||||
then(this.tracer.currentSpan()).isNull();
|
||||
}
|
||||
|
||||
@@ -199,14 +188,13 @@ public class SleuthSpanCreatorAspectTests {
|
||||
span.finish();
|
||||
}
|
||||
|
||||
List<zipkin2.Span> spans = this.reporter.getSpans();
|
||||
then(spans).hasSize(1);
|
||||
then(spans.get(0).name()).isEqualTo("foo");
|
||||
then(spans.get(0).tags()).containsEntry("customTestTag10", "test");
|
||||
then(spans.get(0).annotations().stream().map(Annotation::value)
|
||||
then(this.spans).hasSize(1);
|
||||
then(this.spans.get(0).name()).isEqualTo("foo");
|
||||
then(this.spans.get(0).tags()).containsEntry("customTestTag10", "test");
|
||||
then(this.spans.get(0).annotations().stream().map(Map.Entry::getValue)
|
||||
.collect(Collectors.toList())).contains("customTest.before",
|
||||
"customTest.after");
|
||||
then(spans.get(0).duration()).isNotZero();
|
||||
then(this.spans.get(0).finishTimestamp()).isNotZero();
|
||||
then(this.tracer.currentSpan()).isNull();
|
||||
}
|
||||
|
||||
@@ -223,16 +211,15 @@ public class SleuthSpanCreatorAspectTests {
|
||||
span.finish();
|
||||
}
|
||||
|
||||
List<zipkin2.Span> spans = this.reporter.getSpans();
|
||||
then(spans).hasSize(1);
|
||||
then(spans.get(0).name()).isEqualTo("foo");
|
||||
then(spans.get(0).tags()).containsEntry("class", "TestBean")
|
||||
then(this.spans).hasSize(1);
|
||||
then(this.spans.get(0).name()).isEqualTo("foo");
|
||||
then(this.spans.get(0).tags()).containsEntry("class", "TestBean")
|
||||
.containsEntry("method", "testMethod11")
|
||||
.containsEntry("customTestTag11", "test");
|
||||
then(spans.get(0).annotations().stream().map(Annotation::value)
|
||||
then(this.spans.get(0).annotations().stream().map(Map.Entry::getValue)
|
||||
.collect(Collectors.toList())).contains("customTest.before",
|
||||
"customTest.after");
|
||||
then(spans.get(0).duration()).isNotZero();
|
||||
then(this.spans.get(0).finishTimestamp()).isNotZero();
|
||||
then(this.tracer.currentSpan()).isNull();
|
||||
}
|
||||
|
||||
@@ -244,12 +231,11 @@ public class SleuthSpanCreatorAspectTests {
|
||||
catch (RuntimeException ignored) {
|
||||
}
|
||||
|
||||
List<zipkin2.Span> spans = this.reporter.getSpans();
|
||||
then(spans).hasSize(1);
|
||||
then(spans.get(0).name()).isEqualTo("test-method12");
|
||||
then(spans.get(0).tags()).containsEntry("testTag12", "test")
|
||||
then(this.spans).hasSize(1);
|
||||
then(this.spans.get(0).name()).isEqualTo("test-method12");
|
||||
then(this.spans.get(0).tags()).containsEntry("testTag12", "test")
|
||||
.containsEntry("error", "test exception 12");
|
||||
then(spans.get(0).duration()).isNotZero();
|
||||
then(this.spans.get(0).finishTimestamp()).isNotZero();
|
||||
then(this.tracer.currentSpan()).isNull();
|
||||
}
|
||||
|
||||
@@ -268,14 +254,13 @@ public class SleuthSpanCreatorAspectTests {
|
||||
span.finish();
|
||||
}
|
||||
|
||||
List<zipkin2.Span> spans = this.reporter.getSpans();
|
||||
then(spans).hasSize(1);
|
||||
then(spans.get(0).name()).isEqualTo("foo");
|
||||
then(spans.get(0).tags()).containsEntry("error", "test exception 13");
|
||||
then(spans.get(0).annotations().stream().map(Annotation::value)
|
||||
then(this.spans).hasSize(1);
|
||||
then(this.spans.get(0).name()).isEqualTo("foo");
|
||||
then(this.spans.get(0).tags()).containsEntry("error", "test exception 13");
|
||||
then(this.spans.get(0).annotations().stream().map(Map.Entry::getValue)
|
||||
.collect(Collectors.toList())).contains("testMethod13.before",
|
||||
"testMethod13.afterFailure", "testMethod13.after");
|
||||
then(spans.get(0).duration()).isNotZero();
|
||||
then(this.spans.get(0).finishTimestamp()).isNotZero();
|
||||
then(this.tracer.currentSpan()).isNull();
|
||||
}
|
||||
|
||||
@@ -283,8 +268,7 @@ public class SleuthSpanCreatorAspectTests {
|
||||
public void shouldNotCreateSpanWhenNotAnnotated() {
|
||||
this.testBean.testMethod7();
|
||||
|
||||
List<zipkin2.Span> spans = this.reporter.getSpans();
|
||||
then(spans).isEmpty();
|
||||
then(this.spans).isEmpty();
|
||||
then(this.tracer.currentSpan()).isNull();
|
||||
}
|
||||
|
||||
@@ -424,8 +408,8 @@ public class SleuthSpanCreatorAspectTests {
|
||||
}
|
||||
|
||||
@Bean
|
||||
Reporter<zipkin2.Span> spanReporter() {
|
||||
return new ArrayListSpanReporter();
|
||||
SpanHandler testSpanHandler() {
|
||||
return new TestSpanHandler();
|
||||
}
|
||||
|
||||
@Bean
|
||||
|
||||
@@ -16,14 +16,13 @@
|
||||
|
||||
package org.springframework.cloud.sleuth.annotation;
|
||||
|
||||
import brave.handler.SpanHandler;
|
||||
import brave.test.TestSpanHandler;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import zipkin2.Span;
|
||||
import zipkin2.reporter.Reporter;
|
||||
|
||||
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.util.ArrayListSpanReporter;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
|
||||
@@ -62,8 +61,8 @@ public class SleuthSpanCreatorCircularDependencyTests {
|
||||
protected static class TestConfiguration {
|
||||
|
||||
@Bean
|
||||
Reporter<Span> spanReporter() {
|
||||
return new ArrayListSpanReporter();
|
||||
SpanHandler testSpanHandler() {
|
||||
return new TestSpanHandler();
|
||||
}
|
||||
|
||||
@Bean
|
||||
|
||||
@@ -16,20 +16,18 @@
|
||||
|
||||
package org.springframework.cloud.sleuth.baggage;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import brave.ScopedSpan;
|
||||
import brave.Tracer;
|
||||
import brave.baggage.BaggageField;
|
||||
import brave.handler.SpanHandler;
|
||||
import brave.propagation.TraceContext;
|
||||
import brave.test.TestSpanHandler;
|
||||
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.test.context.SpringBootTest;
|
||||
import org.springframework.cloud.sleuth.util.ArrayListSpanReporter;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.test.context.ActiveProfiles;
|
||||
@@ -53,13 +51,13 @@ public class BaggageTagSpanHandlerTest {
|
||||
private Tracer tracer;
|
||||
|
||||
@Autowired
|
||||
private ArrayListSpanReporter arrayListSpanReporter;
|
||||
private TestSpanHandler spans;
|
||||
|
||||
private ScopedSpan span;
|
||||
|
||||
@BeforeEach
|
||||
public void setUp() {
|
||||
this.arrayListSpanReporter.clear();
|
||||
this.spans.clear();
|
||||
this.span = this.tracer.startScopedSpan("my-scoped-span");
|
||||
TraceContext context = this.span.context();
|
||||
COUNTRY_CODE.updateValue(context, "FO");
|
||||
@@ -70,11 +68,10 @@ public class BaggageTagSpanHandlerTest {
|
||||
public void shouldReportWithBaggageInTags() {
|
||||
this.span.finish();
|
||||
|
||||
List<zipkin2.Span> spans = this.arrayListSpanReporter.getSpans();
|
||||
assertThat(spans).hasSize(1);
|
||||
Map<String, String> tags = spans.get(0).tags();
|
||||
assertThat(tags).hasSize(1); // REQUEST_ID is not in the tag-fields
|
||||
assertThat(tags).containsEntry(COUNTRY_CODE.name(), "FO");
|
||||
assertThat(this.spans).hasSize(1);
|
||||
assertThat(this.spans.get(0).tags()).hasSize(1) // REQUEST_ID is not in the
|
||||
// tag-fields
|
||||
.containsEntry(COUNTRY_CODE.name(), "FO");
|
||||
}
|
||||
|
||||
@EnableAutoConfiguration
|
||||
@@ -82,8 +79,8 @@ public class BaggageTagSpanHandlerTest {
|
||||
static class Config {
|
||||
|
||||
@Bean
|
||||
ArrayListSpanReporter spanReporter() {
|
||||
return new ArrayListSpanReporter();
|
||||
public SpanHandler testSpanHandler() {
|
||||
return new TestSpanHandler();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -16,7 +16,6 @@
|
||||
|
||||
package org.springframework.cloud.sleuth.documentation;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
import java.util.concurrent.Callable;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
@@ -27,8 +26,10 @@ import java.util.concurrent.Future;
|
||||
import brave.Span;
|
||||
import brave.Tracer;
|
||||
import brave.Tracing;
|
||||
import brave.handler.MutableSpan;
|
||||
import brave.propagation.StrictCurrentTraceContext;
|
||||
import brave.sampler.Sampler;
|
||||
import brave.test.TestSpanHandler;
|
||||
import org.assertj.core.api.BDDAssertions;
|
||||
import org.junit.jupiter.api.AfterEach;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
@@ -39,7 +40,6 @@ import org.springframework.cloud.sleuth.SpanNamer;
|
||||
import org.springframework.cloud.sleuth.instrument.async.TraceCallable;
|
||||
import org.springframework.cloud.sleuth.instrument.async.TraceRunnable;
|
||||
import org.springframework.cloud.sleuth.internal.DefaultSpanNamer;
|
||||
import org.springframework.cloud.sleuth.util.ArrayListSpanReporter;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
|
||||
@@ -53,18 +53,18 @@ import static org.assertj.core.api.BDDAssertions.then;
|
||||
*/
|
||||
public class SpringCloudSleuthDocTests {
|
||||
|
||||
ArrayListSpanReporter reporter = new ArrayListSpanReporter();
|
||||
TestSpanHandler spans = new TestSpanHandler();
|
||||
|
||||
StrictCurrentTraceContext currentTraceContext = StrictCurrentTraceContext.create();
|
||||
|
||||
Tracing tracing = Tracing.newBuilder().currentTraceContext(this.currentTraceContext)
|
||||
.sampler(Sampler.ALWAYS_SAMPLE).spanReporter(this.reporter).build();
|
||||
.sampler(Sampler.ALWAYS_SAMPLE).addSpanHandler(this.spans).build();
|
||||
|
||||
Tracer tracer = this.tracing.tracer();
|
||||
|
||||
@BeforeEach
|
||||
public void setup() {
|
||||
this.reporter.clear();
|
||||
this.spans.clear();
|
||||
}
|
||||
|
||||
@AfterEach
|
||||
@@ -87,9 +87,8 @@ public class SpringCloudSleuthDocTests {
|
||||
future.get();
|
||||
// end::span_name_annotated_runnable_execution[]
|
||||
|
||||
List<zipkin2.Span> spans = this.reporter.getSpans();
|
||||
then(spans).hasSize(1);
|
||||
then(spans.get(0).name()).isEqualTo("calculatetax");
|
||||
then(this.spans).hasSize(1);
|
||||
then(this.spans.get(0).name()).isEqualTo("calculateTax");
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -115,9 +114,8 @@ public class SpringCloudSleuthDocTests {
|
||||
future.get();
|
||||
// end::span_name_to_string_runnable_execution[]
|
||||
|
||||
List<zipkin2.Span> spans = this.reporter.getSpans();
|
||||
then(spans).hasSize(1);
|
||||
then(spans.get(0).name()).isEqualTo("calculatetax");
|
||||
then(this.spans).hasSize(1);
|
||||
then(this.spans.get(0).name()).isEqualTo("calculateTax");
|
||||
executorService.shutdown();
|
||||
}
|
||||
|
||||
@@ -144,11 +142,10 @@ public class SpringCloudSleuthDocTests {
|
||||
}
|
||||
// end::manual_span_creation[]
|
||||
|
||||
List<zipkin2.Span> spans = this.reporter.getSpans();
|
||||
then(spans).hasSize(1);
|
||||
then(spans.get(0).name()).isEqualTo("calculatetax");
|
||||
then(spans.get(0).tags()).containsEntry("taxValue", "10");
|
||||
then(spans.get(0).annotations()).hasSize(1);
|
||||
then(this.spans).hasSize(1);
|
||||
then(this.spans.get(0).name()).isEqualTo("calculateTax");
|
||||
then(this.spans.get(0).tags()).containsEntry("taxValue", "10");
|
||||
then(this.spans.get(0).annotations()).hasSize(1);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -182,9 +179,8 @@ public class SpringCloudSleuthDocTests {
|
||||
newSpan.finish();
|
||||
}
|
||||
|
||||
List<zipkin2.Span> spans = this.reporter.getSpans();
|
||||
BDDAssertions.then(spans).hasSize(1);
|
||||
BDDAssertions.then(spans.get(0).name()).isEqualTo("calculatetax");
|
||||
BDDAssertions.then(spans.get(0).name()).isEqualTo("calculateTax");
|
||||
BDDAssertions.then(spans.get(0).tags()).containsEntry("taxValue", "10");
|
||||
BDDAssertions.then(spans.get(0).annotations()).hasSize(1);
|
||||
executorService.shutdown();
|
||||
@@ -222,9 +218,8 @@ public class SpringCloudSleuthDocTests {
|
||||
// end::manual_span_joining[]
|
||||
}).get();
|
||||
|
||||
List<zipkin2.Span> spans = this.reporter.getSpans();
|
||||
Optional<zipkin2.Span> calculateTax = spans.stream()
|
||||
.filter(span -> span.name().equals("calculatecommission")).findFirst();
|
||||
Optional<MutableSpan> calculateTax = spans.spans().stream()
|
||||
.filter(span -> span.name().equals("calculateCommission")).findFirst();
|
||||
BDDAssertions.then(calculateTax).isPresent();
|
||||
BDDAssertions.then(calculateTax.get().tags()).containsEntry("commissionValue",
|
||||
"10");
|
||||
|
||||
@@ -18,6 +18,7 @@ package org.springframework.cloud.sleuth.instrument.async;
|
||||
|
||||
import brave.Tracing;
|
||||
import brave.propagation.StrictCurrentTraceContext;
|
||||
import brave.test.TestSpanHandler;
|
||||
import org.aspectj.lang.ProceedingJoinPoint;
|
||||
import org.aspectj.lang.reflect.MethodSignature;
|
||||
import org.assertj.core.api.BDDAssertions;
|
||||
@@ -28,7 +29,6 @@ import org.mockito.BDDMockito;
|
||||
import org.mockito.Mockito;
|
||||
|
||||
import org.springframework.cloud.sleuth.internal.DefaultSpanNamer;
|
||||
import org.springframework.cloud.sleuth.util.ArrayListSpanReporter;
|
||||
|
||||
/**
|
||||
* @author Marcin Grzejszczak
|
||||
@@ -37,10 +37,10 @@ public class TraceAsyncAspectTest {
|
||||
|
||||
StrictCurrentTraceContext currentTraceContext = StrictCurrentTraceContext.create();
|
||||
|
||||
ArrayListSpanReporter reporter = new ArrayListSpanReporter();
|
||||
TestSpanHandler spans = new TestSpanHandler();
|
||||
|
||||
Tracing tracing = Tracing.newBuilder().currentTraceContext(this.currentTraceContext)
|
||||
.spanReporter(this.reporter).build();
|
||||
.addSpanHandler(this.spans).build();
|
||||
|
||||
ProceedingJoinPoint point = Mockito.mock(ProceedingJoinPoint.class);
|
||||
|
||||
@@ -73,9 +73,9 @@ public class TraceAsyncAspectTest {
|
||||
|
||||
asyncAspect.traceBackgroundThread(this.point);
|
||||
|
||||
BDDAssertions.then(this.reporter.getSpans()).hasSize(1);
|
||||
BDDAssertions.then(this.reporter.getSpans().get(0).name()).isEqualTo("foo-bar");
|
||||
BDDAssertions.then(this.reporter.getSpans().get(0).timestamp()).isPositive();
|
||||
BDDAssertions.then(this.spans).hasSize(1);
|
||||
BDDAssertions.then(this.spans.get(0).name()).isEqualTo("foo-bar");
|
||||
BDDAssertions.then(this.spans.get(0).finishTimestamp()).isPositive();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -24,6 +24,7 @@ import brave.Span;
|
||||
import brave.Tracer;
|
||||
import brave.Tracing;
|
||||
import brave.propagation.StrictCurrentTraceContext;
|
||||
import brave.test.TestSpanHandler;
|
||||
import org.junit.jupiter.api.AfterEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.junit.jupiter.api.extension.ExtendWith;
|
||||
@@ -31,7 +32,6 @@ import org.mockito.junit.jupiter.MockitoExtension;
|
||||
|
||||
import org.springframework.cloud.sleuth.SpanName;
|
||||
import org.springframework.cloud.sleuth.internal.DefaultSpanNamer;
|
||||
import org.springframework.cloud.sleuth.util.ArrayListSpanReporter;
|
||||
|
||||
import static org.assertj.core.api.BDDAssertions.then;
|
||||
|
||||
@@ -42,10 +42,10 @@ public class TraceCallableTests {
|
||||
|
||||
StrictCurrentTraceContext currentTraceContext = StrictCurrentTraceContext.create();
|
||||
|
||||
ArrayListSpanReporter reporter = new ArrayListSpanReporter();
|
||||
TestSpanHandler spans = new TestSpanHandler();
|
||||
|
||||
Tracing tracing = Tracing.newBuilder().currentTraceContext(this.currentTraceContext)
|
||||
.spanReporter(this.reporter).build();
|
||||
.addSpanHandler(this.spans).build();
|
||||
|
||||
Tracer tracer = this.tracing.tracer();
|
||||
|
||||
@@ -53,7 +53,7 @@ public class TraceCallableTests {
|
||||
public void clean() {
|
||||
this.executor.shutdown();
|
||||
this.tracing.close();
|
||||
this.reporter.clear();
|
||||
this.spans.clear();
|
||||
this.currentTraceContext.close();
|
||||
}
|
||||
|
||||
@@ -98,9 +98,8 @@ public class TraceCallableTests {
|
||||
public void should_take_name_of_span_from_span_name_annotation() throws Exception {
|
||||
whenATraceKeepingCallableGetsSubmitted();
|
||||
|
||||
then(this.reporter.getSpans()).hasSize(1);
|
||||
then(this.reporter.getSpans().get(0).name())
|
||||
.isEqualTo("some-callable-name-from-annotation");
|
||||
then(this.spans).hasSize(1);
|
||||
then(this.spans.get(0).name()).isEqualTo("some-callable-name-from-annotation");
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -108,9 +107,8 @@ public class TraceCallableTests {
|
||||
throws Exception {
|
||||
whenCallableGetsSubmitted(thatRetrievesTraceFromThreadLocal());
|
||||
|
||||
then(this.reporter.getSpans()).hasSize(1);
|
||||
then(this.reporter.getSpans().get(0).name())
|
||||
.isEqualTo("some-callable-name-from-to-string");
|
||||
then(this.spans).hasSize(1);
|
||||
then(this.spans.get(0).name()).isEqualTo("some-callable-name-from-to-string");
|
||||
}
|
||||
|
||||
private Callable<Span> thatRetrievesTraceFromThreadLocal() {
|
||||
|
||||
@@ -24,6 +24,7 @@ import brave.Span;
|
||||
import brave.Tracer;
|
||||
import brave.Tracing;
|
||||
import brave.propagation.StrictCurrentTraceContext;
|
||||
import brave.test.TestSpanHandler;
|
||||
import org.junit.jupiter.api.AfterEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.junit.jupiter.api.extension.ExtendWith;
|
||||
@@ -31,7 +32,6 @@ import org.mockito.junit.jupiter.MockitoExtension;
|
||||
|
||||
import org.springframework.cloud.sleuth.SpanName;
|
||||
import org.springframework.cloud.sleuth.internal.DefaultSpanNamer;
|
||||
import org.springframework.cloud.sleuth.util.ArrayListSpanReporter;
|
||||
|
||||
import static org.assertj.core.api.BDDAssertions.then;
|
||||
|
||||
@@ -42,10 +42,10 @@ public class TraceRunnableTests {
|
||||
|
||||
StrictCurrentTraceContext currentTraceContext = StrictCurrentTraceContext.create();
|
||||
|
||||
ArrayListSpanReporter reporter = new ArrayListSpanReporter();
|
||||
TestSpanHandler spans = new TestSpanHandler();
|
||||
|
||||
Tracing tracing = Tracing.newBuilder().currentTraceContext(this.currentTraceContext)
|
||||
.spanReporter(this.reporter).build();
|
||||
.addSpanHandler(this.spans).build();
|
||||
|
||||
Tracer tracer = this.tracing.tracer();
|
||||
|
||||
@@ -53,7 +53,7 @@ public class TraceRunnableTests {
|
||||
public void clean() {
|
||||
this.executor.shutdown();
|
||||
this.tracing.close();
|
||||
this.reporter.clear();
|
||||
this.spans.clear();
|
||||
this.currentTraceContext.close();
|
||||
}
|
||||
|
||||
@@ -102,9 +102,8 @@ public class TraceRunnableTests {
|
||||
|
||||
whenRunnableGetsSubmitted(traceKeepingRunnable);
|
||||
|
||||
then(this.reporter.getSpans()).hasSize(1);
|
||||
then(this.reporter.getSpans().get(0).name())
|
||||
.isEqualTo("some-runnable-name-from-annotation");
|
||||
then(this.spans).hasSize(1);
|
||||
then(this.spans.get(0).name()).isEqualTo("some-runnable-name-from-annotation");
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -115,9 +114,8 @@ public class TraceRunnableTests {
|
||||
|
||||
whenRunnableGetsSubmitted(runnable);
|
||||
|
||||
then(this.reporter.getSpans()).hasSize(1);
|
||||
then(this.reporter.getSpans().get(0).name())
|
||||
.isEqualTo("some-runnable-name-from-to-string");
|
||||
then(this.spans).hasSize(1);
|
||||
then(this.spans.get(0).name()).isEqualTo("some-runnable-name-from-to-string");
|
||||
}
|
||||
|
||||
private TraceKeepingRunnable runnableThatRetrievesTraceFromThreadLocal() {
|
||||
|
||||
@@ -33,6 +33,7 @@ import brave.Tracer;
|
||||
import brave.Tracing;
|
||||
import brave.propagation.StrictCurrentTraceContext;
|
||||
import brave.propagation.TraceContext;
|
||||
import brave.test.TestSpanHandler;
|
||||
import org.assertj.core.api.BDDAssertions;
|
||||
import org.junit.jupiter.api.AfterEach;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
@@ -47,7 +48,6 @@ import org.mockito.junit.jupiter.MockitoExtension;
|
||||
import org.springframework.beans.factory.BeanFactory;
|
||||
import org.springframework.cloud.sleuth.SpanNamer;
|
||||
import org.springframework.cloud.sleuth.internal.DefaultSpanNamer;
|
||||
import org.springframework.cloud.sleuth.util.ArrayListSpanReporter;
|
||||
|
||||
import static java.util.stream.Collectors.toList;
|
||||
import static org.assertj.core.api.BDDAssertions.then;
|
||||
@@ -66,10 +66,10 @@ public class TraceableExecutorServiceTests {
|
||||
|
||||
StrictCurrentTraceContext currentTraceContext = StrictCurrentTraceContext.create();
|
||||
|
||||
ArrayListSpanReporter reporter = new ArrayListSpanReporter();
|
||||
TestSpanHandler spans = new TestSpanHandler();
|
||||
|
||||
Tracing tracing = Tracing.newBuilder().currentTraceContext(this.currentTraceContext)
|
||||
.spanReporter(this.reporter).build();
|
||||
.addSpanHandler(this.spans).build();
|
||||
|
||||
Tracer tracer = this.tracing.tracer();
|
||||
|
||||
@@ -79,7 +79,7 @@ public class TraceableExecutorServiceTests {
|
||||
public void setup() {
|
||||
this.traceManagerableExecutorService = new TraceableExecutorService(
|
||||
beanFactory(true), this.executorService);
|
||||
this.reporter.clear();
|
||||
this.spans.clear();
|
||||
this.spanVerifyingRunnable.clear();
|
||||
}
|
||||
|
||||
|
||||
@@ -21,7 +21,10 @@ import java.util.concurrent.atomic.AtomicReference;
|
||||
import brave.ScopedSpan;
|
||||
import brave.Span;
|
||||
import brave.Tracer;
|
||||
import brave.handler.MutableSpan;
|
||||
import brave.handler.SpanHandler;
|
||||
import brave.sampler.Sampler;
|
||||
import brave.test.TestSpanHandler;
|
||||
import org.assertj.core.api.BDDAssertions;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
@@ -31,7 +34,6 @@ import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
|
||||
import org.springframework.boot.test.context.SpringBootTest;
|
||||
import org.springframework.cloud.circuitbreaker.resilience4j.Resilience4JCircuitBreakerFactory;
|
||||
import org.springframework.cloud.client.circuitbreaker.CircuitBreakerFactory;
|
||||
import org.springframework.cloud.sleuth.util.ArrayListSpanReporter;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
|
||||
@@ -41,7 +43,7 @@ import static org.assertj.core.api.BDDAssertions.then;
|
||||
public class CircuitBreakerIntegrationTests {
|
||||
|
||||
@Autowired
|
||||
ArrayListSpanReporter reporter;
|
||||
TestSpanHandler spans;
|
||||
|
||||
@Autowired
|
||||
Tracer tracer;
|
||||
@@ -51,7 +53,7 @@ public class CircuitBreakerIntegrationTests {
|
||||
|
||||
@BeforeEach
|
||||
public void setup() {
|
||||
this.reporter.clear();
|
||||
this.spans.clear();
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -91,7 +93,7 @@ public class CircuitBreakerIntegrationTests {
|
||||
throw new IllegalStateException("boom2");
|
||||
})).isInstanceOf(IllegalStateException.class).hasMessageContaining("boom2");
|
||||
|
||||
then(this.reporter.getSpans()).hasSize(2);
|
||||
then(this.spans).hasSize(2);
|
||||
then(scopedSpan.context().traceIdString())
|
||||
.isEqualTo(first.get().context().traceIdString());
|
||||
then(scopedSpan.context().traceIdString())
|
||||
@@ -99,12 +101,12 @@ public class CircuitBreakerIntegrationTests {
|
||||
then(first.get().context().spanIdString())
|
||||
.isNotEqualTo(second.get().context().spanIdString());
|
||||
|
||||
zipkin2.Span reportedSpan = this.reporter.getSpans().get(0);
|
||||
then(reportedSpan.name()).contains("circuitbreakerintegrationtests");
|
||||
MutableSpan reportedSpan = this.spans.get(0);
|
||||
then(reportedSpan.name()).contains("CircuitBreakerIntegrationTests");
|
||||
then(reportedSpan.tags().get("error")).contains("boom");
|
||||
|
||||
reportedSpan = this.reporter.getSpans().get(1);
|
||||
then(reportedSpan.name()).contains("circuitbreakerintegrationtests");
|
||||
reportedSpan = this.spans.get(1);
|
||||
then(reportedSpan.name()).contains("CircuitBreakerIntegrationTests");
|
||||
then(reportedSpan.tags().get("error")).contains("boom2");
|
||||
}
|
||||
finally {
|
||||
@@ -117,8 +119,8 @@ public class CircuitBreakerIntegrationTests {
|
||||
static class Config {
|
||||
|
||||
@Bean
|
||||
ArrayListSpanReporter arrayListSpanReporter() {
|
||||
return new ArrayListSpanReporter();
|
||||
SpanHandler testSpanHandler() {
|
||||
return new TestSpanHandler();
|
||||
}
|
||||
|
||||
@Bean
|
||||
|
||||
@@ -22,15 +22,16 @@ import brave.ScopedSpan;
|
||||
import brave.Span;
|
||||
import brave.Tracer;
|
||||
import brave.Tracing;
|
||||
import brave.handler.MutableSpan;
|
||||
import brave.propagation.StrictCurrentTraceContext;
|
||||
import brave.sampler.Sampler;
|
||||
import brave.test.TestSpanHandler;
|
||||
import org.assertj.core.api.BDDAssertions;
|
||||
import org.junit.jupiter.api.AfterEach;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import org.springframework.cloud.circuitbreaker.resilience4j.Resilience4JCircuitBreakerFactory;
|
||||
import org.springframework.cloud.sleuth.util.ArrayListSpanReporter;
|
||||
|
||||
import static org.assertj.core.api.BDDAssertions.then;
|
||||
|
||||
@@ -38,16 +39,16 @@ public class CircuitBreakerTests {
|
||||
|
||||
StrictCurrentTraceContext currentTraceContext = StrictCurrentTraceContext.create();
|
||||
|
||||
ArrayListSpanReporter reporter = new ArrayListSpanReporter();
|
||||
TestSpanHandler spans = new TestSpanHandler();
|
||||
|
||||
Tracing tracing = Tracing.newBuilder().currentTraceContext(this.currentTraceContext)
|
||||
.spanReporter(this.reporter).sampler(Sampler.ALWAYS_SAMPLE).build();
|
||||
.addSpanHandler(this.spans).sampler(Sampler.ALWAYS_SAMPLE).build();
|
||||
|
||||
Tracer tracer = this.tracing.tracer();
|
||||
|
||||
@BeforeEach
|
||||
public void setup() {
|
||||
this.reporter.clear();
|
||||
this.spans.clear();
|
||||
}
|
||||
|
||||
@AfterEach
|
||||
@@ -96,7 +97,7 @@ public class CircuitBreakerTests {
|
||||
}))).isInstanceOf(IllegalStateException.class)
|
||||
.hasMessageContaining("boom2");
|
||||
|
||||
then(this.reporter.getSpans()).hasSize(2);
|
||||
then(this.spans).hasSize(2);
|
||||
then(scopedSpan.context().traceIdString())
|
||||
.isEqualTo(first.get().context().traceIdString());
|
||||
then(scopedSpan.context().traceIdString())
|
||||
@@ -104,8 +105,8 @@ public class CircuitBreakerTests {
|
||||
then(first.get().context().spanIdString())
|
||||
.isNotEqualTo(second.get().context().spanIdString());
|
||||
|
||||
zipkin2.Span reportedSpan = this.reporter.getSpans().get(1);
|
||||
then(reportedSpan.name()).contains("circuitbreakertests");
|
||||
MutableSpan reportedSpan = this.spans.get(1);
|
||||
then(reportedSpan.name()).contains("CircuitBreakerTests");
|
||||
then(reportedSpan.tags().get("error")).contains("boom2");
|
||||
}
|
||||
finally {
|
||||
|
||||
@@ -16,18 +16,19 @@
|
||||
|
||||
package org.springframework.cloud.sleuth.instrument.messaging;
|
||||
|
||||
import brave.handler.SpanHandler;
|
||||
import brave.messaging.MessagingRequest;
|
||||
import brave.messaging.MessagingRuleSampler;
|
||||
import brave.sampler.Matchers;
|
||||
import brave.sampler.RateLimitingSampler;
|
||||
import brave.sampler.Sampler;
|
||||
import brave.sampler.SamplerFunction;
|
||||
import brave.test.TestSpanHandler;
|
||||
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.util.ArrayListSpanReporter;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
|
||||
@@ -52,8 +53,8 @@ public class TraceMessagingAutoConfigurationIntegrationTests {
|
||||
public static class Config {
|
||||
|
||||
@Bean
|
||||
ArrayListSpanReporter reporter() {
|
||||
return new ArrayListSpanReporter();
|
||||
SpanHandler testSpanHandler() {
|
||||
return new TestSpanHandler();
|
||||
}
|
||||
|
||||
// tag::custom_messaging_consumer_sampler[]
|
||||
|
||||
@@ -21,13 +21,15 @@ import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import brave.Span;
|
||||
import brave.Tracing;
|
||||
import brave.handler.MutableSpan;
|
||||
import brave.propagation.B3Propagation;
|
||||
import brave.propagation.StrictCurrentTraceContext;
|
||||
import brave.propagation.TraceContext;
|
||||
import brave.test.TestSpanHandler;
|
||||
import org.junit.jupiter.api.AfterEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import zipkin2.Span;
|
||||
|
||||
import org.springframework.amqp.support.AmqpHeaders;
|
||||
import org.springframework.integration.channel.DirectChannel;
|
||||
@@ -55,14 +57,14 @@ public class TracingChannelInterceptorTest {
|
||||
|
||||
StrictCurrentTraceContext currentTraceContext = StrictCurrentTraceContext.create();
|
||||
|
||||
List<Span> spans = new ArrayList<>();
|
||||
TestSpanHandler spans = new TestSpanHandler();
|
||||
|
||||
Tracing tracing = Tracing.newBuilder().currentTraceContext(this.currentTraceContext)
|
||||
// SINGLE_NO_PARENT more appropriate for messaging, but we check parent
|
||||
// hereTraceMessageHeaders
|
||||
.propagationFactory(
|
||||
B3Propagation.newFactoryBuilder().injectFormat(SINGLE).build())
|
||||
.spanReporter(this.spans::add).build();
|
||||
.addSpanHandler(this.spans).build();
|
||||
|
||||
ChannelInterceptor interceptor = TracingChannelInterceptor.create(tracing);
|
||||
|
||||
@@ -100,7 +102,7 @@ public class TracingChannelInterceptorTest {
|
||||
this.channel.send(MessageBuilder.withPayload("foo").build());
|
||||
|
||||
assertThat(this.channel.receive().getHeaders()).containsKey("b3");
|
||||
assertThat(this.spans).hasSize(1).flatExtracting(Span::kind)
|
||||
assertThat(this.spans).hasSize(1).extracting(MutableSpan::kind)
|
||||
.containsExactly(Span.Kind.PRODUCER);
|
||||
}
|
||||
|
||||
@@ -112,7 +114,7 @@ public class TracingChannelInterceptorTest {
|
||||
|
||||
assertThat(this.message).isNotNull();
|
||||
assertThat(this.message.getHeaders()).containsKeys("b3", "nativeHeaders");
|
||||
assertThat(this.spans).flatExtracting(Span::kind).contains(Span.Kind.CONSUMER,
|
||||
assertThat(this.spans).extracting(MutableSpan::kind).contains(Span.Kind.CONSUMER,
|
||||
Span.Kind.PRODUCER);
|
||||
}
|
||||
|
||||
@@ -174,7 +176,7 @@ public class TracingChannelInterceptorTest {
|
||||
|
||||
assertThat(this.channel.receive().getHeaders()).containsKeys("b3",
|
||||
"nativeHeaders");
|
||||
assertThat(this.spans).hasSize(1).flatExtracting(Span::kind)
|
||||
assertThat(this.spans).hasSize(1).extracting(MutableSpan::kind)
|
||||
.containsExactly(Span.Kind.CONSUMER);
|
||||
}
|
||||
|
||||
@@ -199,7 +201,7 @@ public class TracingChannelInterceptorTest {
|
||||
|
||||
assertThat(messages.get(0).getHeaders()).doesNotContainKeys("b3",
|
||||
"nativeHeaders");
|
||||
assertThat(this.spans).flatExtracting(Span::kind)
|
||||
assertThat(this.spans).extracting(MutableSpan::kind)
|
||||
.containsExactly(Span.Kind.CONSUMER, null);
|
||||
}
|
||||
|
||||
@@ -240,7 +242,7 @@ public class TracingChannelInterceptorTest {
|
||||
this.channel.send(MessageBuilder.withPayload("foo").build());
|
||||
this.channel.receive();
|
||||
|
||||
assertThat(this.spans).flatExtracting(Span::kind)
|
||||
assertThat(this.spans).extracting(MutableSpan::kind)
|
||||
.containsExactlyInAnyOrder(Span.Kind.CONSUMER, Span.Kind.PRODUCER);
|
||||
}
|
||||
|
||||
@@ -253,7 +255,7 @@ public class TracingChannelInterceptorTest {
|
||||
|
||||
channel.send(MessageBuilder.withPayload("foo").build());
|
||||
|
||||
assertThat(this.spans).flatExtracting(Span::kind)
|
||||
assertThat(this.spans).extracting(MutableSpan::kind)
|
||||
.containsExactly(Span.Kind.CONSUMER, null, Span.Kind.PRODUCER);
|
||||
}
|
||||
|
||||
@@ -339,7 +341,8 @@ public class TracingChannelInterceptorTest {
|
||||
headers.put(KafkaHeaders.MESSAGE_KEY, "hello");
|
||||
channel.send(MessageBuilder.createMessage("foo", new MessageHeaders(headers)));
|
||||
|
||||
assertThat(this.spans).flatExtracting(Span::remoteServiceName).contains("kafka");
|
||||
assertThat(this.spans).extracting(MutableSpan::remoteServiceName)
|
||||
.contains("kafka");
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -353,7 +356,7 @@ public class TracingChannelInterceptorTest {
|
||||
headers.put(AmqpHeaders.RECEIVED_ROUTING_KEY, "hello");
|
||||
channel.send(MessageBuilder.createMessage("foo", new MessageHeaders(headers)));
|
||||
|
||||
assertThat(this.spans).flatExtracting(Span::remoteServiceName)
|
||||
assertThat(this.spans).extracting(MutableSpan::remoteServiceName)
|
||||
.contains("rabbitmq");
|
||||
}
|
||||
|
||||
@@ -367,7 +370,7 @@ public class TracingChannelInterceptorTest {
|
||||
Map<String, Object> headers = new HashMap<>();
|
||||
channel.send(MessageBuilder.createMessage("foo", new MessageHeaders(headers)));
|
||||
|
||||
assertThat(this.spans).flatExtracting(Span::remoteServiceName)
|
||||
assertThat(this.spans).extracting(MutableSpan::remoteServiceName)
|
||||
.containsOnly("broker", null);
|
||||
}
|
||||
|
||||
|
||||
@@ -28,7 +28,10 @@ import brave.Tracer.SpanInScope;
|
||||
import brave.baggage.BaggageField;
|
||||
import brave.baggage.BaggagePropagationConfig;
|
||||
import brave.baggage.BaggagePropagationConfig.SingleBaggageField;
|
||||
import brave.handler.MutableSpan;
|
||||
import brave.handler.SpanHandler;
|
||||
import brave.sampler.Sampler;
|
||||
import brave.test.TestSpanHandler;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
@@ -37,7 +40,6 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
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.util.ArrayListSpanReporter;
|
||||
import org.springframework.context.ApplicationListener;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
@@ -69,7 +71,7 @@ public class MultipleHopsIntegrationTests {
|
||||
Tracer tracer;
|
||||
|
||||
@Autowired
|
||||
ArrayListSpanReporter reporter;
|
||||
TestSpanHandler spans;
|
||||
|
||||
@Autowired
|
||||
RestTemplate restTemplate;
|
||||
@@ -82,7 +84,7 @@ public class MultipleHopsIntegrationTests {
|
||||
|
||||
@BeforeEach
|
||||
public void setup() {
|
||||
this.reporter.clear();
|
||||
this.spans.clear();
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -91,16 +93,15 @@ public class MultipleHopsIntegrationTests {
|
||||
"http://localhost:" + this.config.port + "/greeting", String.class);
|
||||
|
||||
await().atMost(5, SECONDS).untilAsserted(() -> {
|
||||
then(this.reporter.getSpans()).hasSize(14);
|
||||
then(this.spans).hasSize(14);
|
||||
});
|
||||
then(this.reporter.getSpans().stream().map(zipkin2.Span::name).collect(toList()))
|
||||
.containsAll(asList("get /greeting", "send"));
|
||||
then(this.reporter.getSpans().stream().map(zipkin2.Span::kind)
|
||||
then(this.spans).extracting(MutableSpan::name)
|
||||
.containsAll(asList("GET /greeting", "send"));
|
||||
then(this.spans).extracting(MutableSpan::kind)
|
||||
// no server kind due to test constraints
|
||||
.collect(toList()))
|
||||
.containsAll(asList(zipkin2.Span.Kind.CONSUMER,
|
||||
zipkin2.Span.Kind.PRODUCER, zipkin2.Span.Kind.SERVER));
|
||||
then(this.reporter.getSpans().stream().map(span -> span.tags().get("channel"))
|
||||
.containsAll(
|
||||
asList(Span.Kind.CONSUMER, Span.Kind.PRODUCER, Span.Kind.SERVER));
|
||||
then(this.spans.spans().stream().map(span -> span.tags().get("channel"))
|
||||
.filter(Objects::nonNull).distinct().collect(toList())).hasSize(3)
|
||||
.containsAll(asList("words", "counts", "greetings"));
|
||||
}
|
||||
@@ -131,10 +132,10 @@ public class MultipleHopsIntegrationTests {
|
||||
}
|
||||
|
||||
await().atMost(5, SECONDS).untilAsserted(() -> {
|
||||
then(this.reporter.getSpans()).isNotEmpty();
|
||||
then(this.spans).isNotEmpty();
|
||||
});
|
||||
|
||||
List<zipkin2.Span> withBagTags = this.reporter.getSpans().stream()
|
||||
List<MutableSpan> withBagTags = this.spans.spans().stream()
|
||||
.filter(s -> s.tags().containsKey(BUSINESS_PROCESS.name()))
|
||||
.collect(toList());
|
||||
|
||||
@@ -177,8 +178,8 @@ public class MultipleHopsIntegrationTests {
|
||||
}
|
||||
|
||||
@Bean
|
||||
ArrayListSpanReporter arrayListSpanAccumulator() {
|
||||
return new ArrayListSpanReporter();
|
||||
SpanHandler testSpanHandler() {
|
||||
return new TestSpanHandler();
|
||||
}
|
||||
|
||||
@Bean
|
||||
|
||||
@@ -22,22 +22,22 @@ import java.util.Map;
|
||||
import brave.Span;
|
||||
import brave.Tracer.SpanInScope;
|
||||
import brave.Tracing;
|
||||
import brave.handler.SpanHandler;
|
||||
import brave.opentracing.BraveSpan;
|
||||
import brave.opentracing.BraveSpanContext;
|
||||
import brave.opentracing.BraveTracer;
|
||||
import brave.propagation.TraceContext;
|
||||
import brave.sampler.Sampler;
|
||||
import brave.test.TestSpanHandler;
|
||||
import io.opentracing.Scope;
|
||||
import io.opentracing.propagation.Format;
|
||||
import io.opentracing.propagation.TextMapAdapter;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import zipkin2.Annotation;
|
||||
|
||||
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.util.ArrayListSpanReporter;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
|
||||
@@ -57,10 +57,10 @@ import static org.springframework.boot.test.context.SpringBootTest.WebEnvironmen
|
||||
*/
|
||||
@SpringBootTest(webEnvironment = NONE,
|
||||
properties = "spring.sleuth.baggage.remote-fields=country-code")
|
||||
public class BraveTracerTest {
|
||||
public class OpenTracingTest {
|
||||
|
||||
@Autowired
|
||||
ArrayListSpanReporter spans;
|
||||
TestSpanHandler spans;
|
||||
|
||||
@Autowired
|
||||
Tracing brave;
|
||||
@@ -144,13 +144,12 @@ public class BraveTracerTest {
|
||||
}
|
||||
|
||||
void checkSpanReportedToZipkin() {
|
||||
assertThat(this.spans.getSpans()).first().satisfies(s -> {
|
||||
assertThat(this.spans).first().satisfies(s -> {
|
||||
assertThat(s.name()).isEqualTo("encode");
|
||||
assertThat(s.timestamp()).isEqualTo(1L);
|
||||
assertThat(s.annotations())
|
||||
.containsExactly(Annotation.create(2L, "pump fake"));
|
||||
assertThat(s.startTimestamp()).isEqualTo(1L);
|
||||
assertThat(s.annotations()).containsExactly(entry(2L, "pump fake"));
|
||||
assertThat(s.tags()).containsExactly(entry("lc", "codec"));
|
||||
assertThat(s.duration()).isEqualTo(2L);
|
||||
assertThat(s.finishTimestamp()).isEqualTo(3L);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -251,14 +250,14 @@ public class BraveTracerTest {
|
||||
public void ignoresErrorFalseTag_beforeStart() {
|
||||
this.opentracing.buildSpan("encode").withTag("error", false).start().finish();
|
||||
|
||||
assertThat(this.spans.getSpans().get(0).tags()).isEmpty();
|
||||
assertThat(this.spans.get(0).tags()).isEmpty();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void ignoresErrorFalseTag_afterStart() {
|
||||
this.opentracing.buildSpan("encode").start().setTag("error", false).finish();
|
||||
|
||||
assertThat(this.spans.getSpans().get(0).tags()).isEmpty();
|
||||
assertThat(this.spans.get(0).tags()).isEmpty();
|
||||
}
|
||||
|
||||
@BeforeEach
|
||||
@@ -276,8 +275,8 @@ public class BraveTracerTest {
|
||||
}
|
||||
|
||||
@Bean
|
||||
ArrayListSpanReporter reporter() {
|
||||
return new ArrayListSpanReporter();
|
||||
SpanHandler testSpanHandler() {
|
||||
return new TestSpanHandler();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -16,16 +16,17 @@
|
||||
|
||||
package org.springframework.cloud.sleuth.instrument.quartz;
|
||||
|
||||
import java.util.ArrayDeque;
|
||||
import java.util.HashMap;
|
||||
import java.util.Properties;
|
||||
import java.util.Queue;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
|
||||
import brave.Tracer.SpanInScope;
|
||||
import brave.Tracing;
|
||||
import brave.handler.MutableSpan;
|
||||
import brave.propagation.Propagation.Setter;
|
||||
import brave.propagation.StrictCurrentTraceContext;
|
||||
import brave.test.IntegrationTestSpanHandler;
|
||||
import org.junit.Rule;
|
||||
import org.junit.jupiter.api.AfterEach;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
@@ -45,7 +46,6 @@ import org.quartz.impl.StdSchedulerFactory;
|
||||
import org.quartz.listeners.JobListenerSupport;
|
||||
import org.quartz.listeners.TriggerListenerSupport;
|
||||
import org.quartz.utils.StringKeyDirtyFlagMap;
|
||||
import zipkin2.Span;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.quartz.JobBuilder.newJob;
|
||||
@@ -59,6 +59,9 @@ import static org.springframework.cloud.sleuth.instrument.quartz.TracingJobListe
|
||||
*/
|
||||
public class TracingJobListenerTest {
|
||||
|
||||
@Rule
|
||||
public IntegrationTestSpanHandler spanHandler = new IntegrationTestSpanHandler();
|
||||
|
||||
private static final JobKey SUCCESSFUL_JOB_KEY = new JobKey("SuccessfulJob");
|
||||
|
||||
private static final JobKey EXCEPTIONAL_JOB_KEY = new JobKey("ExceptionalJob");
|
||||
@@ -74,9 +77,7 @@ public class TracingJobListenerTest {
|
||||
private StrictCurrentTraceContext currentTraceContext = StrictCurrentTraceContext
|
||||
.create();
|
||||
|
||||
private Queue<Span> spans = new ArrayDeque<>();
|
||||
|
||||
private Tracing tracing = Tracing.newBuilder().spanReporter(spans::add)
|
||||
private Tracing tracing = Tracing.newBuilder().addSpanHandler(spanHandler)
|
||||
.currentTraceContext(currentTraceContext).build();
|
||||
|
||||
@BeforeEach
|
||||
@@ -124,7 +125,7 @@ public class TracingJobListenerTest {
|
||||
runJob(trigger);
|
||||
|
||||
// expect
|
||||
takeSpan();
|
||||
spanHandler.takeLocalSpan();
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -138,7 +139,7 @@ public class TracingJobListenerTest {
|
||||
runJob(trigger);
|
||||
|
||||
// expect
|
||||
Span span = takeSpan();
|
||||
MutableSpan span = spanHandler.takeLocalSpan();
|
||||
assertThat(span.name()).isEqualToIgnoringCase(SUCCESSFUL_JOB_KEY.toString());
|
||||
assertThat(span.tags().get(TRIGGER_TAG_KEY))
|
||||
.isEqualToIgnoringCase(TRIGGER_KEY.toString());
|
||||
@@ -153,7 +154,7 @@ public class TracingJobListenerTest {
|
||||
runJob(trigger);
|
||||
|
||||
// expect
|
||||
takeSpan();
|
||||
spanHandler.takeLocalSpan();
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -166,7 +167,7 @@ public class TracingJobListenerTest {
|
||||
runJob(trigger);
|
||||
|
||||
// expect
|
||||
takeSpan();
|
||||
spanHandler.takeLocalSpan();
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -179,15 +180,13 @@ public class TracingJobListenerTest {
|
||||
// when
|
||||
runJob(trigger);
|
||||
|
||||
// expect
|
||||
requireNoSpan();
|
||||
// expect no span
|
||||
}
|
||||
|
||||
@Test
|
||||
public void should_have_parent_and_child_span_when_trigger_contains_span_info()
|
||||
throws Exception {
|
||||
// given
|
||||
brave.Span span = tracing.tracer().nextSpan();
|
||||
JobDataMap data = new JobDataMap();
|
||||
addSpanToJobData(data);
|
||||
Trigger trigger = newTrigger().forJob(SUCCESSFUL_JOB_KEY).usingJobData(data)
|
||||
@@ -197,8 +196,8 @@ public class TracingJobListenerTest {
|
||||
runJob(trigger);
|
||||
|
||||
// expect
|
||||
Span parent = takeSpan();
|
||||
Span child = takeSpan();
|
||||
MutableSpan parent = spanHandler.takeLocalSpan();
|
||||
MutableSpan child = spanHandler.takeLocalSpan();
|
||||
assertThat(parent.parentId()).isNull();
|
||||
assertThat(child.parentId()).isEqualTo(parent.id());
|
||||
}
|
||||
@@ -216,8 +215,8 @@ public class TracingJobListenerTest {
|
||||
runJob(trigger);
|
||||
|
||||
// expect
|
||||
Span parent = takeSpan();
|
||||
Span child = takeSpan();
|
||||
MutableSpan parent = spanHandler.takeLocalSpan();
|
||||
MutableSpan child = spanHandler.takeLocalSpan();
|
||||
assertThat(parent.parentId()).isNull();
|
||||
assertThat(child.parentId()).isEqualTo(parent.id());
|
||||
}
|
||||
@@ -239,7 +238,7 @@ public class TracingJobListenerTest {
|
||||
}
|
||||
|
||||
void addSpanToJobData(JobDataMap data) {
|
||||
brave.Span span = tracing.tracer().nextSpan();
|
||||
brave.Span span = tracing.tracer().nextSpan().start();
|
||||
try (SpanInScope spanInScope = tracing.tracer().withSpanInScope(span)) {
|
||||
tracing.propagation()
|
||||
.injector((Setter<JobDataMap, String>) StringKeyDirtyFlagMap::put)
|
||||
@@ -250,19 +249,6 @@ public class TracingJobListenerTest {
|
||||
}
|
||||
}
|
||||
|
||||
Span takeSpan() throws InterruptedException {
|
||||
Span result = spans.poll();
|
||||
assertThat(result).withFailMessage("Span was not reported, but was expected")
|
||||
.isNotNull();
|
||||
return result;
|
||||
}
|
||||
|
||||
void requireNoSpan() throws InterruptedException {
|
||||
Span result = spans.poll();
|
||||
assertThat(result).withFailMessage("Span was reported, but was not expected")
|
||||
.isNull();
|
||||
}
|
||||
|
||||
public static class CompleteableTriggerListener extends CompletableFuture
|
||||
implements TriggerListener, JobListener {
|
||||
|
||||
|
||||
@@ -16,18 +16,19 @@
|
||||
|
||||
package org.springframework.cloud.sleuth.instrument.rpc;
|
||||
|
||||
import brave.handler.SpanHandler;
|
||||
import brave.rpc.RpcRequest;
|
||||
import brave.rpc.RpcRuleSampler;
|
||||
import brave.sampler.Matcher;
|
||||
import brave.sampler.RateLimitingSampler;
|
||||
import brave.sampler.Sampler;
|
||||
import brave.sampler.SamplerFunction;
|
||||
import brave.test.TestSpanHandler;
|
||||
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.util.ArrayListSpanReporter;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
|
||||
@@ -54,8 +55,8 @@ public class TraceRpcAutoConfigurationIntegrationTests {
|
||||
public static class Config {
|
||||
|
||||
@Bean
|
||||
ArrayListSpanReporter reporter() {
|
||||
return new ArrayListSpanReporter();
|
||||
SpanHandler testSpanHandler() {
|
||||
return new TestSpanHandler();
|
||||
}
|
||||
|
||||
// tag::custom_rpc_server_sampler[]
|
||||
|
||||
@@ -17,7 +17,9 @@
|
||||
package org.springframework.cloud.sleuth.instrument.web;
|
||||
|
||||
import brave.Tracer;
|
||||
import brave.handler.SpanHandler;
|
||||
import brave.sampler.Sampler;
|
||||
import brave.test.TestSpanHandler;
|
||||
import org.junit.jupiter.api.AfterEach;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
@@ -28,7 +30,6 @@ import org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration;
|
||||
import org.springframework.boot.test.context.SpringBootTest;
|
||||
import org.springframework.boot.web.server.LocalServerPort;
|
||||
import org.springframework.cloud.sleuth.DisableSecurity;
|
||||
import org.springframework.cloud.sleuth.util.ArrayListSpanReporter;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
@@ -45,7 +46,7 @@ import static org.assertj.core.api.BDDAssertions.then;
|
||||
public class IgnoreAutoConfiguredSkipPatternsIntegrationTests {
|
||||
|
||||
@Autowired
|
||||
ArrayListSpanReporter accumulator;
|
||||
TestSpanHandler spans;
|
||||
|
||||
@Autowired
|
||||
Tracer tracer;
|
||||
@@ -56,7 +57,7 @@ public class IgnoreAutoConfiguredSkipPatternsIntegrationTests {
|
||||
@BeforeEach
|
||||
@AfterEach
|
||||
public void clearSpans() {
|
||||
this.accumulator.clear();
|
||||
this.spans.clear();
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -66,7 +67,7 @@ public class IgnoreAutoConfiguredSkipPatternsIntegrationTests {
|
||||
String.class);
|
||||
|
||||
then(this.tracer.currentSpan()).isNull();
|
||||
then(this.accumulator.getSpans()).hasSize(1);
|
||||
then(this.spans).hasSize(1);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -76,7 +77,7 @@ public class IgnoreAutoConfiguredSkipPatternsIntegrationTests {
|
||||
String.class);
|
||||
|
||||
then(this.tracer.currentSpan()).isNull();
|
||||
then(this.accumulator.getSpans()).hasSize(1);
|
||||
then(this.spans).hasSize(1);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -86,7 +87,7 @@ public class IgnoreAutoConfiguredSkipPatternsIntegrationTests {
|
||||
String.class);
|
||||
|
||||
then(this.tracer.currentSpan()).isNull();
|
||||
then(this.accumulator.getSpans()).hasSize(0);
|
||||
then(this.spans).hasSize(0);
|
||||
}
|
||||
|
||||
@EnableAutoConfiguration(exclude = RabbitAutoConfiguration.class)
|
||||
@@ -104,8 +105,8 @@ public class IgnoreAutoConfiguredSkipPatternsIntegrationTests {
|
||||
}
|
||||
|
||||
@Bean
|
||||
ArrayListSpanReporter reporter() {
|
||||
return new ArrayListSpanReporter();
|
||||
SpanHandler testSpanHandler() {
|
||||
return new TestSpanHandler();
|
||||
}
|
||||
|
||||
@Bean
|
||||
|
||||
@@ -17,7 +17,9 @@
|
||||
package org.springframework.cloud.sleuth.instrument.web;
|
||||
|
||||
import brave.Tracer;
|
||||
import brave.handler.SpanHandler;
|
||||
import brave.sampler.Sampler;
|
||||
import brave.test.TestSpanHandler;
|
||||
import org.junit.jupiter.api.AfterEach;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
@@ -28,7 +30,6 @@ import org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration;
|
||||
import org.springframework.boot.test.context.SpringBootTest;
|
||||
import org.springframework.boot.web.server.LocalServerPort;
|
||||
import org.springframework.cloud.sleuth.DisableSecurity;
|
||||
import org.springframework.cloud.sleuth.util.ArrayListSpanReporter;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
@@ -45,7 +46,7 @@ import static org.assertj.core.api.BDDAssertions.then;
|
||||
public class SkipEndPointsIntegrationTestsWithContextPathWithBasePath {
|
||||
|
||||
@Autowired
|
||||
ArrayListSpanReporter accumulator;
|
||||
TestSpanHandler spans;
|
||||
|
||||
@Autowired
|
||||
Tracer tracer;
|
||||
@@ -56,7 +57,7 @@ public class SkipEndPointsIntegrationTestsWithContextPathWithBasePath {
|
||||
@BeforeEach
|
||||
@AfterEach
|
||||
public void clearSpans() {
|
||||
this.accumulator.clear();
|
||||
this.spans.clear();
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -66,7 +67,7 @@ public class SkipEndPointsIntegrationTestsWithContextPathWithBasePath {
|
||||
String.class);
|
||||
|
||||
then(this.tracer.currentSpan()).isNull();
|
||||
then(this.accumulator.getSpans()).hasSize(0);
|
||||
then(this.spans).hasSize(0);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -76,7 +77,7 @@ public class SkipEndPointsIntegrationTestsWithContextPathWithBasePath {
|
||||
String.class);
|
||||
|
||||
then(this.tracer.currentSpan()).isNull();
|
||||
then(this.accumulator.getSpans()).hasSize(1);
|
||||
then(this.spans).hasSize(1);
|
||||
}
|
||||
|
||||
@EnableAutoConfiguration(exclude = RabbitAutoConfiguration.class)
|
||||
@@ -90,8 +91,8 @@ public class SkipEndPointsIntegrationTestsWithContextPathWithBasePath {
|
||||
}
|
||||
|
||||
@Bean
|
||||
ArrayListSpanReporter reporter() {
|
||||
return new ArrayListSpanReporter();
|
||||
SpanHandler testSpanHandler() {
|
||||
return new TestSpanHandler();
|
||||
}
|
||||
|
||||
@Bean
|
||||
|
||||
@@ -17,7 +17,9 @@
|
||||
package org.springframework.cloud.sleuth.instrument.web;
|
||||
|
||||
import brave.Tracer;
|
||||
import brave.handler.SpanHandler;
|
||||
import brave.sampler.Sampler;
|
||||
import brave.test.TestSpanHandler;
|
||||
import org.junit.jupiter.api.AfterEach;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
@@ -28,7 +30,6 @@ import org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration;
|
||||
import org.springframework.boot.test.context.SpringBootTest;
|
||||
import org.springframework.boot.web.server.LocalServerPort;
|
||||
import org.springframework.cloud.sleuth.DisableSecurity;
|
||||
import org.springframework.cloud.sleuth.util.ArrayListSpanReporter;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
@@ -49,7 +50,7 @@ public class SkipEndPointsIntegrationTestsWithContextPathWithoutBasePath {
|
||||
int port;
|
||||
|
||||
@Autowired
|
||||
private ArrayListSpanReporter spanReporter;
|
||||
private TestSpanHandler spans;
|
||||
|
||||
@Autowired
|
||||
private Tracer tracer;
|
||||
@@ -57,7 +58,7 @@ public class SkipEndPointsIntegrationTestsWithContextPathWithoutBasePath {
|
||||
@BeforeEach
|
||||
@AfterEach
|
||||
public void clearSpans() {
|
||||
this.spanReporter.clear();
|
||||
this.spans.clear();
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -67,7 +68,7 @@ public class SkipEndPointsIntegrationTestsWithContextPathWithoutBasePath {
|
||||
String.class);
|
||||
|
||||
then(this.tracer.currentSpan()).isNull();
|
||||
then(this.spanReporter.getSpans()).hasSize(1);
|
||||
then(this.spans).hasSize(1);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -77,7 +78,7 @@ public class SkipEndPointsIntegrationTestsWithContextPathWithoutBasePath {
|
||||
String.class);
|
||||
|
||||
then(this.tracer.currentSpan()).isNull();
|
||||
then(this.spanReporter.getSpans()).hasSize(1);
|
||||
then(this.spans).hasSize(1);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -86,7 +87,7 @@ public class SkipEndPointsIntegrationTestsWithContextPathWithoutBasePath {
|
||||
"http://localhost:" + this.port + "/context-path/health", String.class);
|
||||
|
||||
then(this.tracer.currentSpan()).isNull();
|
||||
then(this.spanReporter.getSpans()).hasSize(0);
|
||||
then(this.spans).hasSize(0);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -96,7 +97,7 @@ public class SkipEndPointsIntegrationTestsWithContextPathWithoutBasePath {
|
||||
String.class);
|
||||
|
||||
then(this.tracer.currentSpan()).isNull();
|
||||
then(this.spanReporter.getSpans()).hasSize(0);
|
||||
then(this.spans).hasSize(0);
|
||||
}
|
||||
|
||||
@EnableAutoConfiguration(exclude = RabbitAutoConfiguration.class)
|
||||
@@ -118,8 +119,8 @@ public class SkipEndPointsIntegrationTestsWithContextPathWithoutBasePath {
|
||||
}
|
||||
|
||||
@Bean
|
||||
ArrayListSpanReporter reporter() {
|
||||
return new ArrayListSpanReporter();
|
||||
SpanHandler testSpanHandler() {
|
||||
return new TestSpanHandler();
|
||||
}
|
||||
|
||||
@Bean
|
||||
|
||||
@@ -17,7 +17,9 @@
|
||||
package org.springframework.cloud.sleuth.instrument.web;
|
||||
|
||||
import brave.Tracer;
|
||||
import brave.handler.SpanHandler;
|
||||
import brave.sampler.Sampler;
|
||||
import brave.test.TestSpanHandler;
|
||||
import org.junit.jupiter.api.AfterEach;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
@@ -28,7 +30,6 @@ import org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration;
|
||||
import org.springframework.boot.test.context.SpringBootTest;
|
||||
import org.springframework.boot.web.server.LocalServerPort;
|
||||
import org.springframework.cloud.sleuth.DisableSecurity;
|
||||
import org.springframework.cloud.sleuth.util.ArrayListSpanReporter;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
@@ -47,7 +48,7 @@ public class SkipEndPointsIntegrationTestsWithoutContextPathWithBasePath {
|
||||
int port;
|
||||
|
||||
@Autowired
|
||||
private ArrayListSpanReporter spanReporter;
|
||||
private TestSpanHandler spans;
|
||||
|
||||
@Autowired
|
||||
private Tracer tracer;
|
||||
@@ -55,7 +56,7 @@ public class SkipEndPointsIntegrationTestsWithoutContextPathWithBasePath {
|
||||
@BeforeEach
|
||||
@AfterEach
|
||||
public void clearSpans() {
|
||||
this.spanReporter.clear();
|
||||
this.spans.clear();
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -64,7 +65,7 @@ public class SkipEndPointsIntegrationTestsWithoutContextPathWithBasePath {
|
||||
String.class);
|
||||
|
||||
then(this.tracer.currentSpan()).isNull();
|
||||
then(this.spanReporter.getSpans()).hasSize(1);
|
||||
then(this.spans).hasSize(1);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -73,7 +74,7 @@ public class SkipEndPointsIntegrationTestsWithoutContextPathWithBasePath {
|
||||
String.class);
|
||||
|
||||
then(this.tracer.currentSpan()).isNull();
|
||||
then(this.spanReporter.getSpans()).hasSize(1);
|
||||
then(this.spans).hasSize(1);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -82,7 +83,7 @@ public class SkipEndPointsIntegrationTestsWithoutContextPathWithBasePath {
|
||||
"http://localhost:" + this.port + "/actuator/health", String.class);
|
||||
|
||||
then(this.tracer.currentSpan()).isNull();
|
||||
then(this.spanReporter.getSpans()).hasSize(0);
|
||||
then(this.spans).hasSize(0);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -91,7 +92,7 @@ public class SkipEndPointsIntegrationTestsWithoutContextPathWithBasePath {
|
||||
"http://localhost:" + this.port + "/actuator/metrics?xyz", String.class);
|
||||
|
||||
then(this.tracer.currentSpan()).isNull();
|
||||
then(this.spanReporter.getSpans()).hasSize(0);
|
||||
then(this.spans).hasSize(0);
|
||||
}
|
||||
|
||||
@EnableAutoConfiguration(exclude = RabbitAutoConfiguration.class)
|
||||
@@ -113,8 +114,8 @@ public class SkipEndPointsIntegrationTestsWithoutContextPathWithBasePath {
|
||||
}
|
||||
|
||||
@Bean
|
||||
ArrayListSpanReporter reporter() {
|
||||
return new ArrayListSpanReporter();
|
||||
SpanHandler testSpanHandler() {
|
||||
return new TestSpanHandler();
|
||||
}
|
||||
|
||||
@Bean
|
||||
|
||||
@@ -17,7 +17,9 @@
|
||||
package org.springframework.cloud.sleuth.instrument.web;
|
||||
|
||||
import brave.Tracer;
|
||||
import brave.handler.SpanHandler;
|
||||
import brave.sampler.Sampler;
|
||||
import brave.test.TestSpanHandler;
|
||||
import org.junit.jupiter.api.AfterEach;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
@@ -28,7 +30,6 @@ import org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration;
|
||||
import org.springframework.boot.test.context.SpringBootTest;
|
||||
import org.springframework.boot.web.server.LocalServerPort;
|
||||
import org.springframework.cloud.sleuth.DisableSecurity;
|
||||
import org.springframework.cloud.sleuth.util.ArrayListSpanReporter;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
@@ -48,7 +49,7 @@ public class SkipEndPointsIntegrationTestsWithoutContextPathWithoutBasePath {
|
||||
int port;
|
||||
|
||||
@Autowired
|
||||
private ArrayListSpanReporter spanReporter;
|
||||
private TestSpanHandler spans;
|
||||
|
||||
@Autowired
|
||||
private Tracer tracer;
|
||||
@@ -56,7 +57,7 @@ public class SkipEndPointsIntegrationTestsWithoutContextPathWithoutBasePath {
|
||||
@BeforeEach
|
||||
@AfterEach
|
||||
public void clearSpans() {
|
||||
this.spanReporter.clear();
|
||||
this.spans.clear();
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -65,7 +66,7 @@ public class SkipEndPointsIntegrationTestsWithoutContextPathWithoutBasePath {
|
||||
String.class);
|
||||
|
||||
then(this.tracer.currentSpan()).isNull();
|
||||
then(this.spanReporter.getSpans()).hasSize(1);
|
||||
then(this.spans).hasSize(1);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -74,7 +75,7 @@ public class SkipEndPointsIntegrationTestsWithoutContextPathWithoutBasePath {
|
||||
String.class);
|
||||
|
||||
then(this.tracer.currentSpan()).isNull();
|
||||
then(this.spanReporter.getSpans()).hasSize(1);
|
||||
then(this.spans).hasSize(1);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -83,7 +84,7 @@ public class SkipEndPointsIntegrationTestsWithoutContextPathWithoutBasePath {
|
||||
String.class);
|
||||
|
||||
then(this.tracer.currentSpan()).isNull();
|
||||
then(this.spanReporter.getSpans()).hasSize(0);
|
||||
then(this.spans).hasSize(0);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -92,7 +93,7 @@ public class SkipEndPointsIntegrationTestsWithoutContextPathWithoutBasePath {
|
||||
String.class);
|
||||
|
||||
then(this.tracer.currentSpan()).isNull();
|
||||
then(this.spanReporter.getSpans()).hasSize(0);
|
||||
then(this.spans).hasSize(0);
|
||||
}
|
||||
|
||||
@EnableAutoConfiguration(exclude = RabbitAutoConfiguration.class)
|
||||
@@ -114,8 +115,8 @@ public class SkipEndPointsIntegrationTestsWithoutContextPathWithoutBasePath {
|
||||
}
|
||||
|
||||
@Bean
|
||||
ArrayListSpanReporter reporter() {
|
||||
return new ArrayListSpanReporter();
|
||||
SpanHandler testSpanHandler() {
|
||||
return new TestSpanHandler();
|
||||
}
|
||||
|
||||
@Bean
|
||||
|
||||
@@ -31,11 +31,11 @@ import brave.propagation.StrictScopeDecorator;
|
||||
import brave.propagation.ThreadLocalCurrentTraceContext;
|
||||
import brave.sampler.Sampler;
|
||||
import brave.servlet.TracingFilter;
|
||||
import brave.test.TestSpanHandler;
|
||||
import org.junit.jupiter.api.AfterEach;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import org.springframework.cloud.sleuth.util.ArrayListSpanReporter;
|
||||
import org.springframework.http.HttpMethod;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.http.MediaType;
|
||||
@@ -54,12 +54,12 @@ import static org.springframework.test.web.servlet.request.MockMvcRequestBuilder
|
||||
*/
|
||||
public class TraceFilterTests {
|
||||
|
||||
ArrayListSpanReporter reporter = new ArrayListSpanReporter();
|
||||
TestSpanHandler spans = new TestSpanHandler();
|
||||
|
||||
Tracing tracing = Tracing.newBuilder()
|
||||
.currentTraceContext(ThreadLocalCurrentTraceContext.newBuilder()
|
||||
.addScopeDecorator(StrictScopeDecorator.create()).build())
|
||||
.spanReporter(this.reporter).build();
|
||||
.addSpanHandler(this.spans).build();
|
||||
|
||||
Tracer tracer = this.tracing.tracer();
|
||||
|
||||
@@ -102,14 +102,14 @@ public class TraceFilterTests {
|
||||
neverSampleFilter().doFilter(this.request, this.response, this.filterChain);
|
||||
|
||||
then(Tracing.current().tracer().currentSpan()).isNull();
|
||||
then(this.reporter.getSpans()).isEmpty();
|
||||
then(this.spans).isEmpty();
|
||||
}
|
||||
|
||||
private Filter neverSampleFilter() {
|
||||
Tracing tracing = Tracing.newBuilder()
|
||||
.currentTraceContext(ThreadLocalCurrentTraceContext.newBuilder()
|
||||
.addScopeDecorator(StrictScopeDecorator.create()).build())
|
||||
.spanReporter(this.reporter).sampler(Sampler.NEVER_SAMPLE)
|
||||
.addSpanHandler(this.spans).sampler(Sampler.NEVER_SAMPLE)
|
||||
.supportsJoin(false).build();
|
||||
HttpTracing httpTracing = HttpTracing.newBuilder(tracing)
|
||||
.clientParser(new HttpClientParser()).serverParser(new HttpServerParser())
|
||||
@@ -123,8 +123,8 @@ public class TraceFilterTests {
|
||||
public void startsNewTrace() throws Exception {
|
||||
this.filter.doFilter(this.request, this.response, this.filterChain);
|
||||
|
||||
then(this.reporter.getSpans()).hasSize(1);
|
||||
then(this.reporter.getSpans().get(0).tags()).containsEntry("http.path", "/")
|
||||
then(this.spans).hasSize(1);
|
||||
then(this.spans.get(0).tags()).containsEntry("http.path", "/")
|
||||
.containsEntry("http.method", HttpMethod.GET.toString());
|
||||
// we don't check for status_code anymore cause Brave doesn't support it oob
|
||||
// .containsEntry("http.status_code", "200")
|
||||
@@ -137,9 +137,8 @@ public class TraceFilterTests {
|
||||
this.filter.doFilter(this.request, this.response, this.filterChain);
|
||||
|
||||
then(Tracing.current().tracer().currentSpan()).isNull();
|
||||
then(this.reporter.getSpans()).hasSize(1);
|
||||
then(this.reporter.getSpans().get(0).tags())
|
||||
.doesNotContainKey("http.status_code");
|
||||
then(this.spans).hasSize(1);
|
||||
then(this.spans.get(0).tags()).doesNotContainKey("http.status_code");
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -151,9 +150,9 @@ public class TraceFilterTests {
|
||||
this.filter.doFilter(this.request, this.response, this.filterChain);
|
||||
|
||||
then(Tracing.current().tracer().currentSpan()).isNull();
|
||||
then(this.reporter.getSpans()).hasSize(1);
|
||||
then(this.reporter.getSpans().get(0).id()).isEqualTo("0000000000000003");
|
||||
then(this.reporter.getSpans().get(0).tags()).containsEntry("http.path", "/")
|
||||
then(this.spans).hasSize(1);
|
||||
then(this.spans.get(0).id()).isEqualTo("0000000000000003");
|
||||
then(this.spans.get(0).tags()).containsEntry("http.path", "/")
|
||||
.containsEntry("http.method", HttpMethod.GET.toString());
|
||||
}
|
||||
|
||||
@@ -189,7 +188,7 @@ public class TraceFilterTests {
|
||||
this.filter.doFilter(this.request, this.response, this.filterChain);
|
||||
|
||||
then(Tracing.current().tracer().currentSpan()).isNull();
|
||||
then(this.reporter.getSpans()).hasSize(1);
|
||||
then(this.spans).hasSize(1);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -218,7 +217,7 @@ public class TraceFilterTests {
|
||||
Tracing tracing = Tracing.newBuilder()
|
||||
.currentTraceContext(ThreadLocalCurrentTraceContext.newBuilder()
|
||||
.addScopeDecorator(StrictScopeDecorator.create()).build())
|
||||
.spanReporter(this.reporter).supportsJoin(false).build();
|
||||
.addSpanHandler(this.spans).supportsJoin(false).build();
|
||||
HttpTracing httpTracing = HttpTracing.create(tracing);
|
||||
this.request = builder().header("b3", "0000000000000014-000000000000000a")
|
||||
.buildRequest(new MockServletContext());
|
||||
@@ -227,8 +226,8 @@ public class TraceFilterTests {
|
||||
this.filterChain);
|
||||
|
||||
then(Tracing.current().tracer().currentSpan()).isNull();
|
||||
then(this.reporter.getSpans()).hasSize(1);
|
||||
then(this.reporter.getSpans().get(0).parentId()).isEqualTo("000000000000000a");
|
||||
then(this.spans).hasSize(1);
|
||||
then(this.spans.get(0).parentId()).isEqualTo("000000000000000a");
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -253,8 +252,8 @@ public class TraceFilterTests {
|
||||
|
||||
then(Tracing.current().tracer().currentSpan()).isNull();
|
||||
verifyParentSpanHttpTags();
|
||||
then(this.reporter.getSpans()).hasSize(1);
|
||||
then(this.reporter.getSpans().get(0).tags()).containsEntry("error", "Planned");
|
||||
then(this.spans).hasSize(1);
|
||||
then(this.spans.get(0).tags()).containsEntry("error", "Planned");
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -277,7 +276,7 @@ public class TraceFilterTests {
|
||||
this.filter.doFilter(this.request, this.response, this.filterChain);
|
||||
|
||||
then(Tracing.current().tracer().currentSpan()).isNull();
|
||||
then(this.reporter.getSpans()).hasSize(1);
|
||||
then(this.spans).hasSize(1);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -289,7 +288,7 @@ public class TraceFilterTests {
|
||||
this.filter.doFilter(this.request, this.response, this.filterChain);
|
||||
|
||||
then(Tracing.current().tracer().currentSpan()).isNull();
|
||||
then(this.reporter.getSpans()).hasSize(1);
|
||||
then(this.spans).hasSize(1);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -300,7 +299,7 @@ public class TraceFilterTests {
|
||||
this.filter.doFilter(this.request, this.response, this.filterChain);
|
||||
|
||||
then(Tracing.current().tracer().currentSpan()).isNull();
|
||||
then(this.reporter.getSpans()).isNotEmpty();
|
||||
then(this.spans).isNotEmpty();
|
||||
then(this.response.getStatus()).isEqualTo(HttpStatus.OK.value());
|
||||
}
|
||||
|
||||
@@ -312,7 +311,7 @@ public class TraceFilterTests {
|
||||
this.filter.doFilter(this.request, this.response, this.filterChain);
|
||||
|
||||
then(Tracing.current().tracer().currentSpan()).isNull();
|
||||
then(this.reporter.getSpans()).isNotEmpty();
|
||||
then(this.spans).isNotEmpty();
|
||||
then(this.response.getStatus()).isEqualTo(HttpStatus.OK.value());
|
||||
}
|
||||
|
||||
@@ -323,7 +322,7 @@ public class TraceFilterTests {
|
||||
neverSampleFilter().doFilter(this.request, this.response, this.filterChain);
|
||||
|
||||
then(Tracing.current().tracer().currentSpan()).isNull();
|
||||
then(this.reporter.getSpans()).isNotEmpty();
|
||||
then(this.spans).isNotEmpty();
|
||||
}
|
||||
|
||||
@SuppressWarnings("Duplicates")
|
||||
@@ -335,7 +334,7 @@ public class TraceFilterTests {
|
||||
neverSampleFilter().doFilter(this.request, this.response, this.filterChain);
|
||||
|
||||
then(Tracing.current().tracer().currentSpan()).isNull();
|
||||
then(this.reporter.getSpans()).isEmpty();
|
||||
then(this.spans).isEmpty();
|
||||
}
|
||||
|
||||
// #668
|
||||
@@ -348,8 +347,8 @@ public class TraceFilterTests {
|
||||
this.filter.doFilter(this.request, this.response, this.filterChain);
|
||||
|
||||
then(Tracing.current().tracer().currentSpan()).isNull();
|
||||
then(this.reporter.getSpans()).hasSize(1);
|
||||
then(this.reporter.getSpans().get(0).tags()).containsEntry("http.path", "/")
|
||||
then(this.spans).hasSize(1);
|
||||
then(this.spans.get(0).tags()).containsEntry("http.path", "/")
|
||||
.containsEntry("http.method", HttpMethod.GET.toString());
|
||||
// we don't check for status_code anymore cause Brave doesn't support it oob
|
||||
// .containsEntry("http.status_code", "295")
|
||||
@@ -362,13 +361,13 @@ public class TraceFilterTests {
|
||||
neverSampleFilter().doFilter(this.request, this.response, this.filterChain);
|
||||
|
||||
then(Tracing.current().tracer().currentSpan()).isNull();
|
||||
then(this.reporter.getSpans()).hasSize(1);
|
||||
then(this.reporter.getSpans().get(0).name()).isEqualTo("get");
|
||||
then(this.spans).hasSize(1);
|
||||
then(this.spans.get(0).name()).isEqualTo("GET");
|
||||
}
|
||||
|
||||
public void verifyParentSpanHttpTags() {
|
||||
then(this.reporter.getSpans().size()).isGreaterThan(0);
|
||||
then(this.reporter.getSpans().get(0).tags()).containsEntry("http.path", "/")
|
||||
then(this.spans).isNotEmpty();
|
||||
then(this.spans.get(0).tags()).containsEntry("http.path", "/")
|
||||
.containsEntry("http.method", HttpMethod.GET.toString());
|
||||
}
|
||||
|
||||
|
||||
@@ -18,23 +18,23 @@ package org.springframework.cloud.sleuth.instrument.web;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import brave.Span;
|
||||
import brave.Tracer;
|
||||
import brave.Tracing;
|
||||
import brave.http.HttpClientParser;
|
||||
import brave.http.HttpRequestParser;
|
||||
import brave.http.HttpTags;
|
||||
import brave.http.HttpTracing;
|
||||
import brave.propagation.StrictCurrentTraceContext;
|
||||
import brave.sampler.Sampler;
|
||||
import brave.spring.web.TracingClientHttpRequestInterceptor;
|
||||
import brave.test.TestSpanHandler;
|
||||
import org.junit.jupiter.api.AfterEach;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import org.springframework.cloud.sleuth.util.ArrayListSpanReporter;
|
||||
import org.springframework.cloud.sleuth.util.SpanUtil;
|
||||
import org.springframework.http.HttpHeaders;
|
||||
import org.springframework.http.client.ClientHttpRequestInterceptor;
|
||||
import org.springframework.test.web.client.MockMvcClientHttpRequestFactory;
|
||||
@@ -56,10 +56,10 @@ public class TraceRestTemplateInterceptorTests {
|
||||
|
||||
StrictCurrentTraceContext currentTraceContext = StrictCurrentTraceContext.create();
|
||||
|
||||
ArrayListSpanReporter reporter = new ArrayListSpanReporter();
|
||||
TestSpanHandler spans = new TestSpanHandler();
|
||||
|
||||
Tracing tracing = Tracing.newBuilder().currentTraceContext(this.currentTraceContext)
|
||||
.spanReporter(this.reporter).build();
|
||||
.addSpanHandler(this.spans).build();
|
||||
|
||||
Tracer tracer = this.tracing.tracer();
|
||||
|
||||
@@ -111,19 +111,19 @@ public class TraceRestTemplateInterceptorTests {
|
||||
}
|
||||
|
||||
// Default inject format for client spans is B3 multi
|
||||
then(headers.get("X-B3-TraceId"))
|
||||
.isEqualTo(SpanUtil.idToHex(span.context().traceId()));
|
||||
then(headers.get("X-B3-SpanId"))
|
||||
.isNotEqualTo(SpanUtil.idToHex(span.context().spanId()));
|
||||
then(headers.get("X-B3-ParentSpanId"))
|
||||
.isEqualTo(SpanUtil.idToHex(span.context().spanId()));
|
||||
then(headers.get("X-B3-TraceId")).isEqualTo(span.context().traceIdString());
|
||||
then(headers.get("X-B3-SpanId")).isNotEqualTo(span.context().spanIdString());
|
||||
then(headers.get("X-B3-ParentSpanId")).isEqualTo(span.context().spanIdString());
|
||||
}
|
||||
|
||||
// Issue #290
|
||||
@Test
|
||||
public void requestHeadersAddedWhenTracing() {
|
||||
setInterceptors(HttpTracing.newBuilder(this.tracing)
|
||||
.clientParser(new HttpClientParser()).build());
|
||||
.clientRequestParser((request, context, span) -> {
|
||||
HttpTags.URL.tag(request, context, span);
|
||||
HttpRequestParser.DEFAULT.parse(request, context, span);
|
||||
}).build());
|
||||
Span span = this.tracer.nextSpan().name("new trace");
|
||||
|
||||
try (Tracer.SpanInScope ws = this.tracer.withSpanInScope(span.start())) {
|
||||
@@ -133,17 +133,16 @@ public class TraceRestTemplateInterceptorTests {
|
||||
span.finish();
|
||||
}
|
||||
|
||||
List<zipkin2.Span> spans = this.reporter.getSpans();
|
||||
then(spans).isNotEmpty();
|
||||
then(spans.get(0).tags()).containsEntry("http.path", "/foo")
|
||||
.containsEntry("http.method", "GET");
|
||||
then(this.spans).isNotEmpty();
|
||||
then(this.spans.get(0).tags()).containsEntry("http.url", "/foo?a=b")
|
||||
.containsEntry("http.path", "/foo").containsEntry("http.method", "GET");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void notSampledHeaderAddedWhenNotSampled() {
|
||||
this.tracing.close();
|
||||
this.tracing = Tracing.newBuilder().currentTraceContext(this.currentTraceContext)
|
||||
.spanReporter(this.reporter).sampler(Sampler.NEVER_SAMPLE).build();
|
||||
.addSpanHandler(this.spans).sampler(Sampler.NEVER_SAMPLE).build();
|
||||
this.template.setInterceptors(Arrays.<ClientHttpRequestInterceptor>asList(
|
||||
TracingClientHttpRequestInterceptor.create(HttpTracing.create(tracing))));
|
||||
|
||||
@@ -157,7 +156,7 @@ public class TraceRestTemplateInterceptorTests {
|
||||
span.finish();
|
||||
}
|
||||
|
||||
then(this.reporter.getSpans()).isEmpty();
|
||||
then(this.spans).isEmpty();
|
||||
}
|
||||
|
||||
// issue #198
|
||||
@@ -195,8 +194,7 @@ public class TraceRestTemplateInterceptorTests {
|
||||
span.finish();
|
||||
}
|
||||
|
||||
List<zipkin2.Span> spans = this.reporter.getSpans();
|
||||
then(spans).hasSize(2);
|
||||
then(this.spans).hasSize(2);
|
||||
}
|
||||
|
||||
@RestController
|
||||
|
||||
@@ -16,17 +16,17 @@
|
||||
|
||||
package org.springframework.cloud.sleuth.instrument.web.client;
|
||||
|
||||
import java.util.concurrent.BlockingQueue;
|
||||
import java.util.concurrent.LinkedBlockingQueue;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import brave.handler.MutableSpan;
|
||||
import brave.handler.SpanHandler;
|
||||
import brave.propagation.B3SinglePropagation;
|
||||
import brave.propagation.CurrentTraceContext;
|
||||
import brave.propagation.CurrentTraceContext.Scope;
|
||||
import brave.propagation.Propagation;
|
||||
import brave.propagation.TraceContext;
|
||||
import brave.sampler.Sampler;
|
||||
import brave.test.IntegrationTestSpanHandler;
|
||||
import io.netty.handler.codec.http.HttpResponseStatus;
|
||||
import org.junit.ClassRule;
|
||||
import org.junit.jupiter.api.AfterEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import reactor.core.publisher.Flux;
|
||||
@@ -36,8 +36,6 @@ import reactor.netty.http.client.HttpClient;
|
||||
import reactor.netty.http.client.HttpClientResponse;
|
||||
import reactor.netty.http.client.PrematureCloseException;
|
||||
import reactor.netty.http.server.HttpServer;
|
||||
import zipkin2.Span;
|
||||
import zipkin2.reporter.Reporter;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
|
||||
@@ -46,6 +44,7 @@ import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.web.reactive.function.client.WebClient;
|
||||
|
||||
import static brave.Span.Kind.CLIENT;
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.assertj.core.api.Assertions.assertThatThrownBy;
|
||||
|
||||
@@ -62,14 +61,14 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy;
|
||||
webEnvironment = SpringBootTest.WebEnvironment.NONE)
|
||||
public class ReactorNettyHttpClientSpringBootTests {
|
||||
|
||||
@ClassRule
|
||||
public static IntegrationTestSpanHandler spanHandler = new IntegrationTestSpanHandler();
|
||||
|
||||
DisposableServer disposableServer;
|
||||
|
||||
@Autowired
|
||||
HttpClient httpClient;
|
||||
|
||||
@Autowired
|
||||
BlockingQueue<Span> spans;
|
||||
|
||||
@Autowired
|
||||
CurrentTraceContext currentTraceContext;
|
||||
|
||||
@@ -81,7 +80,6 @@ public class ReactorNettyHttpClientSpringBootTests {
|
||||
if (disposableServer != null) {
|
||||
disposableServer.disposeNow();
|
||||
}
|
||||
this.spans.clear();
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -94,12 +92,10 @@ public class ReactorNettyHttpClientSpringBootTests {
|
||||
|
||||
assertThat(response.status()).isEqualTo(HttpResponseStatus.OK);
|
||||
|
||||
Span clientSpan = takeClientSpan();
|
||||
MutableSpan clientSpan = spanHandler.takeRemoteSpan(CLIENT);
|
||||
|
||||
assertThat(clientSpan.remoteEndpoint()).satisfiesAnyOf(
|
||||
ep -> assertThat(ep.ipv4()).isNotNull(),
|
||||
ep -> assertThat(ep.ipv6()).isNotNull());
|
||||
assertThat(clientSpan.remoteEndpoint().portAsInt()).isNotZero();
|
||||
assertThat(clientSpan.remoteIp()).isNotNull();
|
||||
assertThat(clientSpan.remotePort()).isNotZero();
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -116,7 +112,7 @@ public class ReactorNettyHttpClientSpringBootTests {
|
||||
.uri("/").responseContent().aggregate().asString().block();
|
||||
}
|
||||
|
||||
Span clientSpan = takeClientSpan();
|
||||
MutableSpan clientSpan = spanHandler.takeRemoteSpan(CLIENT);
|
||||
|
||||
assertThat(b3SingleHeaderReadByServer).isEqualTo(context.traceIdString() + "-"
|
||||
+ clientSpan.id() + "-1-" + context.spanIdString());
|
||||
@@ -135,14 +131,14 @@ public class ReactorNettyHttpClientSpringBootTests {
|
||||
|
||||
String b3SingleHeaderReadByServer = request.block();
|
||||
|
||||
Span clientSpan = takeClientSpan();
|
||||
MutableSpan clientSpan = spanHandler.takeRemoteSpan(CLIENT);
|
||||
|
||||
assertThat(b3SingleHeaderReadByServer)
|
||||
.isEqualTo(clientSpan.traceId() + "-" + clientSpan.id() + "-1");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void shouldTagOnRequestError() throws InterruptedException {
|
||||
public void shouldRecordRequestError() {
|
||||
disposableServer = HttpServer.create().port(0).handle((req, resp) -> {
|
||||
throw new RuntimeException("test");
|
||||
}).bindNow();
|
||||
@@ -153,17 +149,7 @@ public class ReactorNettyHttpClientSpringBootTests {
|
||||
assertThatThrownBy(request::block)
|
||||
.hasCauseInstanceOf(PrematureCloseException.class);
|
||||
|
||||
Span clientSpan = takeClientSpan();
|
||||
|
||||
assertThat(clientSpan.tags()).containsKey("error");
|
||||
}
|
||||
|
||||
/** Call this to block until a span was reported */
|
||||
Span takeClientSpan() throws InterruptedException {
|
||||
Span result = spans.poll(1, TimeUnit.SECONDS);
|
||||
assertThat(result).withFailMessage("Span was not reported").isNotNull();
|
||||
assertThat(result.kind()).isEqualTo(Span.Kind.CLIENT);
|
||||
return result;
|
||||
spanHandler.takeRemoteSpanWithError(CLIENT);
|
||||
}
|
||||
|
||||
@Configuration
|
||||
@@ -180,17 +166,9 @@ public class ReactorNettyHttpClientSpringBootTests {
|
||||
return Sampler.ALWAYS_SAMPLE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Use a blocking queue as it is simpler than wrapping everything in awaitility
|
||||
*/
|
||||
@Bean
|
||||
BlockingQueue<Span> spans() {
|
||||
return new LinkedBlockingQueue<>();
|
||||
}
|
||||
|
||||
@Bean
|
||||
Reporter<zipkin2.Span> spanReporter(BlockingQueue<Span> spans) {
|
||||
return spans::add;
|
||||
SpanHandler testSpanHandler() {
|
||||
return spanHandler;
|
||||
}
|
||||
|
||||
@Bean
|
||||
|
||||
@@ -22,12 +22,12 @@ import java.util.Collections;
|
||||
import brave.Tracing;
|
||||
import brave.http.HttpTracing;
|
||||
import brave.propagation.StrictCurrentTraceContext;
|
||||
import brave.test.TestSpanHandler;
|
||||
import org.assertj.core.api.BDDAssertions;
|
||||
import org.junit.jupiter.api.AfterEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import org.springframework.cloud.gateway.filter.headers.HttpHeadersFilter;
|
||||
import org.springframework.cloud.sleuth.util.ArrayListSpanReporter;
|
||||
import org.springframework.http.HttpHeaders;
|
||||
import org.springframework.mock.http.server.reactive.MockServerHttpRequest;
|
||||
import org.springframework.mock.web.server.MockServerWebExchange;
|
||||
@@ -37,10 +37,10 @@ public class TraceRequestHttpHeadersFilterTests {
|
||||
|
||||
StrictCurrentTraceContext currentTraceContext = StrictCurrentTraceContext.create();
|
||||
|
||||
ArrayListSpanReporter reporter = new ArrayListSpanReporter();
|
||||
TestSpanHandler spans = new TestSpanHandler();
|
||||
|
||||
Tracing tracing = Tracing.newBuilder().currentTraceContext(this.currentTraceContext)
|
||||
.spanReporter(this.reporter).build();
|
||||
.addSpanHandler(this.spans).build();
|
||||
|
||||
HttpTracing httpTracing = HttpTracing.newBuilder(this.tracing).build();
|
||||
|
||||
|
||||
@@ -19,12 +19,12 @@ package org.springframework.cloud.sleuth.instrument.web.client;
|
||||
import brave.Tracing;
|
||||
import brave.http.HttpTracing;
|
||||
import brave.propagation.StrictCurrentTraceContext;
|
||||
import brave.test.TestSpanHandler;
|
||||
import org.assertj.core.api.BDDAssertions;
|
||||
import org.junit.jupiter.api.AfterEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import org.springframework.cloud.gateway.filter.headers.HttpHeadersFilter;
|
||||
import org.springframework.cloud.sleuth.util.ArrayListSpanReporter;
|
||||
import org.springframework.http.HttpHeaders;
|
||||
import org.springframework.mock.http.server.reactive.MockServerHttpRequest;
|
||||
import org.springframework.mock.web.server.MockServerWebExchange;
|
||||
@@ -33,10 +33,10 @@ public class TraceResponseHttpHeadersFilterTests {
|
||||
|
||||
StrictCurrentTraceContext currentTraceContext = StrictCurrentTraceContext.create();
|
||||
|
||||
ArrayListSpanReporter reporter = new ArrayListSpanReporter();
|
||||
TestSpanHandler spans = new TestSpanHandler();
|
||||
|
||||
Tracing tracing = Tracing.newBuilder().currentTraceContext(this.currentTraceContext)
|
||||
.spanReporter(this.reporter).build();
|
||||
.addSpanHandler(this.spans).build();
|
||||
|
||||
HttpTracing httpTracing = HttpTracing.newBuilder(this.tracing).build();
|
||||
|
||||
@@ -58,7 +58,7 @@ public class TraceResponseHttpHeadersFilterTests {
|
||||
|
||||
filter.filter(httpHeaders, exchange);
|
||||
|
||||
BDDAssertions.then(this.reporter.getSpans()).isEmpty();
|
||||
BDDAssertions.then(this.spans).isEmpty();
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -75,7 +75,7 @@ public class TraceResponseHttpHeadersFilterTests {
|
||||
|
||||
filter.filter(httpHeaders, exchange);
|
||||
|
||||
BDDAssertions.then(this.reporter.getSpans()).isNotEmpty();
|
||||
BDDAssertions.then(this.spans).isNotEmpty();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -23,9 +23,11 @@ import java.util.Map;
|
||||
import brave.Span;
|
||||
import brave.Tracer;
|
||||
import brave.Tracing;
|
||||
import brave.handler.MutableSpan;
|
||||
import brave.http.HttpTracing;
|
||||
import brave.propagation.StrictCurrentTraceContext;
|
||||
import brave.spring.web.TracingClientHttpRequestInterceptor;
|
||||
import brave.test.TestSpanHandler;
|
||||
import okhttp3.mockwebserver.MockResponse;
|
||||
import okhttp3.mockwebserver.MockWebServer;
|
||||
import okhttp3.mockwebserver.SocketPolicy;
|
||||
@@ -34,7 +36,6 @@ import org.junit.jupiter.api.AfterEach;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import org.springframework.cloud.sleuth.util.ArrayListSpanReporter;
|
||||
import org.springframework.http.client.ClientHttpRequestFactory;
|
||||
import org.springframework.http.client.ClientHttpRequestInterceptor;
|
||||
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
|
||||
@@ -61,10 +62,10 @@ public class TraceRestTemplateInterceptorIntegrationTests {
|
||||
|
||||
StrictCurrentTraceContext currentTraceContext = StrictCurrentTraceContext.create();
|
||||
|
||||
ArrayListSpanReporter reporter = new ArrayListSpanReporter();
|
||||
TestSpanHandler spans = new TestSpanHandler();
|
||||
|
||||
Tracing tracing = Tracing.newBuilder().currentTraceContext(this.currentTraceContext)
|
||||
.spanReporter(this.reporter).build();
|
||||
.addSpanHandler(this.spans).build();
|
||||
|
||||
Tracer tracer = this.tracing.tracer();
|
||||
|
||||
@@ -104,10 +105,10 @@ public class TraceRestTemplateInterceptorIntegrationTests {
|
||||
}
|
||||
|
||||
// 1 span "new race", 1 span "rest template"
|
||||
BDDAssertions.then(this.reporter.getSpans()).hasSize(2);
|
||||
zipkin2.Span span1 = this.reporter.getSpans().get(0);
|
||||
BDDAssertions.then(span1.tags()).containsEntry("error", "Read timed out");
|
||||
BDDAssertions.then(span1.kind().ordinal()).isEqualTo(Span.Kind.CLIENT.ordinal());
|
||||
BDDAssertions.then(this.spans).hasSize(2);
|
||||
MutableSpan span1 = this.spans.get(0);
|
||||
BDDAssertions.then(span1.error()).hasMessage("Read timed out");
|
||||
BDDAssertions.then(span1.kind()).isEqualTo(Span.Kind.CLIENT);
|
||||
}
|
||||
|
||||
private ClientHttpRequestFactory clientHttpRequestFactory() {
|
||||
|
||||
@@ -24,12 +24,13 @@ import java.util.Map;
|
||||
|
||||
import brave.Span;
|
||||
import brave.Tracer;
|
||||
import brave.handler.SpanHandler;
|
||||
import brave.sampler.Sampler;
|
||||
import brave.test.TestSpanHandler;
|
||||
import org.assertj.core.api.Assertions;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import reactor.core.publisher.Flux;
|
||||
import zipkin2.reporter.Reporter;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
|
||||
@@ -42,7 +43,6 @@ import org.springframework.cloud.loadbalancer.core.ServiceInstanceListSupplier;
|
||||
import org.springframework.cloud.netflix.eureka.EurekaClientAutoConfiguration;
|
||||
import org.springframework.cloud.openfeign.EnableFeignClients;
|
||||
import org.springframework.cloud.openfeign.FeignClient;
|
||||
import org.springframework.cloud.sleuth.util.ArrayListSpanReporter;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
@@ -72,11 +72,11 @@ public class WebClientDiscoveryExceptionTests {
|
||||
Tracer tracer;
|
||||
|
||||
@Autowired
|
||||
ArrayListSpanReporter reporter;
|
||||
TestSpanHandler spans;
|
||||
|
||||
@BeforeEach
|
||||
public void close() {
|
||||
this.reporter.clear();
|
||||
this.spans.clear();
|
||||
}
|
||||
|
||||
// issue #240
|
||||
@@ -94,8 +94,9 @@ public class WebClientDiscoveryExceptionTests {
|
||||
span.finish();
|
||||
}
|
||||
|
||||
List<zipkin2.Span> spans = this.reporter.getSpans();
|
||||
then(spans.stream().filter(span1 -> span1.kind() == zipkin2.Span.Kind.CLIENT)
|
||||
// hystrix commands should finish at this point
|
||||
Thread.sleep(200);
|
||||
then(this.spans.spans().stream().filter(span1 -> span1.kind() == Span.Kind.CLIENT)
|
||||
.findFirst().get().tags()).containsKey("error");
|
||||
}
|
||||
|
||||
@@ -148,8 +149,8 @@ public class WebClientDiscoveryExceptionTests {
|
||||
}
|
||||
|
||||
@Bean
|
||||
Reporter<zipkin2.Span> mySpanReporter() {
|
||||
return new ArrayListSpanReporter();
|
||||
SpanHandler testSpanHandler() {
|
||||
return new TestSpanHandler();
|
||||
}
|
||||
|
||||
@Bean
|
||||
|
||||
@@ -23,7 +23,9 @@ import java.util.stream.Stream;
|
||||
import brave.Span;
|
||||
import brave.Tracer;
|
||||
import brave.Tracing;
|
||||
import brave.handler.SpanHandler;
|
||||
import brave.sampler.Sampler;
|
||||
import brave.test.TestSpanHandler;
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
@@ -38,7 +40,6 @@ 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.util.ArrayListSpanReporter;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.core.env.Environment;
|
||||
@@ -69,11 +70,11 @@ public class WebClientExceptionTests {
|
||||
Tracing tracer;
|
||||
|
||||
@Autowired
|
||||
ArrayListSpanReporter reporter;
|
||||
TestSpanHandler spans;
|
||||
|
||||
@BeforeEach
|
||||
public void open() {
|
||||
this.reporter.clear();
|
||||
this.spans.clear();
|
||||
}
|
||||
|
||||
// issue #198
|
||||
@@ -96,8 +97,8 @@ public class WebClientExceptionTests {
|
||||
}
|
||||
|
||||
then(this.tracer.tracer().currentSpan()).isNull();
|
||||
then(this.reporter.getSpans()).isNotEmpty();
|
||||
then(this.reporter.getSpans().get(0).tags()).containsKey("error");
|
||||
then(this.spans).isNotEmpty();
|
||||
then(this.spans.get(0).tags()).containsKey("error");
|
||||
}
|
||||
|
||||
static Stream<Object> parametersForShouldCloseSpanUponException() {
|
||||
@@ -145,8 +146,8 @@ public class WebClientExceptionTests {
|
||||
}
|
||||
|
||||
@Bean
|
||||
ArrayListSpanReporter accumulator() {
|
||||
return new ArrayListSpanReporter();
|
||||
SpanHandler testSpanHandler() {
|
||||
return new TestSpanHandler();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -21,9 +21,11 @@ import java.nio.charset.Charset;
|
||||
import java.util.HashMap;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
|
||||
import brave.Span;
|
||||
import brave.Tracing;
|
||||
import brave.http.HttpTracing;
|
||||
import brave.propagation.StrictCurrentTraceContext;
|
||||
import brave.test.TestSpanHandler;
|
||||
import feign.Client;
|
||||
import feign.Feign;
|
||||
import feign.FeignException;
|
||||
@@ -39,10 +41,8 @@ import org.junit.jupiter.api.extension.ExtendWith;
|
||||
import org.mockito.BDDMockito;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.junit.jupiter.MockitoExtension;
|
||||
import zipkin2.Span;
|
||||
|
||||
import org.springframework.beans.factory.BeanFactory;
|
||||
import org.springframework.cloud.sleuth.util.ArrayListSpanReporter;
|
||||
|
||||
import static org.assertj.core.api.Assertions.failBecauseExceptionWasNotThrown;
|
||||
import static org.assertj.core.api.BDDAssertions.then;
|
||||
@@ -70,10 +70,10 @@ public class FeignRetriesTests {
|
||||
|
||||
StrictCurrentTraceContext currentTraceContext = StrictCurrentTraceContext.create();
|
||||
|
||||
ArrayListSpanReporter reporter = new ArrayListSpanReporter();
|
||||
TestSpanHandler spans = new TestSpanHandler();
|
||||
|
||||
Tracing tracing = Tracing.newBuilder().currentTraceContext(this.currentTraceContext)
|
||||
.spanReporter(this.reporter).build();
|
||||
.addSpanHandler(this.spans).build();
|
||||
|
||||
HttpTracing httpTracing = HttpTracing.newBuilder(this.tracing).build();
|
||||
|
||||
@@ -138,10 +138,8 @@ public class FeignRetriesTests {
|
||||
then(api.decodedPost()).isEqualTo("OK");
|
||||
// request interception should take place only twice (1st request & 2nd retry)
|
||||
then(atomicInteger.get()).isEqualTo(2);
|
||||
then(this.reporter.getSpans().get(0).tags()).containsEntry("error",
|
||||
"IOException");
|
||||
then(this.reporter.getSpans().get(1).kind().ordinal())
|
||||
.isEqualTo(Span.Kind.CLIENT.ordinal());
|
||||
then(this.spans.get(0).error()).isInstanceOf(IOException.class);
|
||||
then(this.spans.get(1).kind()).isEqualTo(Span.Kind.CLIENT);
|
||||
}
|
||||
|
||||
interface TestInterface {
|
||||
|
||||
@@ -17,15 +17,14 @@
|
||||
package org.springframework.cloud.sleuth.instrument.web.client.feign;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
|
||||
import brave.Span;
|
||||
import brave.Tracer;
|
||||
import brave.Tracing;
|
||||
import brave.http.HttpTracing;
|
||||
import brave.propagation.StrictCurrentTraceContext;
|
||||
import brave.test.TestSpanHandler;
|
||||
import feign.Client;
|
||||
import feign.Request;
|
||||
import feign.RequestTemplate;
|
||||
@@ -59,10 +58,10 @@ public class TracingFeignClientTests {
|
||||
|
||||
StrictCurrentTraceContext currentTraceContext = StrictCurrentTraceContext.create();
|
||||
|
||||
List<zipkin2.Span> spans = new ArrayList<>();
|
||||
TestSpanHandler spans = new TestSpanHandler();
|
||||
|
||||
Tracing tracing = Tracing.newBuilder().currentTraceContext(currentTraceContext)
|
||||
.spanReporter(spans::add).build();
|
||||
.addSpanHandler(spans).build();
|
||||
|
||||
Tracer tracer = this.tracing.tracer();
|
||||
|
||||
@@ -95,15 +94,15 @@ public class TracingFeignClientTests {
|
||||
span.finish();
|
||||
}
|
||||
|
||||
then(spans.get(0)).extracting("kind.ordinal")
|
||||
.isEqualTo(Span.Kind.CLIENT.ordinal());
|
||||
then(spans.get(0).kind()).isEqualTo(Span.Kind.CLIENT);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void should_log_error_when_exception_thrown() throws IOException {
|
||||
RuntimeException error = new RuntimeException("exception has occurred");
|
||||
Span span = this.tracer.nextSpan().name("foo");
|
||||
BDDMockito.given(this.client.execute(BDDMockito.any(), BDDMockito.any()))
|
||||
.willThrow(new RuntimeException("exception has occurred"));
|
||||
.willThrow(error);
|
||||
|
||||
try (Tracer.SpanInScope ws = this.tracer.withSpanInScope(span.start())) {
|
||||
this.traceFeignClient.execute(this.request, this.options);
|
||||
@@ -115,9 +114,8 @@ public class TracingFeignClientTests {
|
||||
span.finish();
|
||||
}
|
||||
|
||||
then(this.spans.get(0)).extracting("kind.ordinal")
|
||||
.isEqualTo(Span.Kind.CLIENT.ordinal());
|
||||
then(this.spans.get(0).tags()).containsEntry("error", "exception has occurred");
|
||||
then(this.spans.get(0).kind()).isEqualTo(Span.Kind.CLIENT);
|
||||
then(this.spans.get(0).error()).isSameAs(error);
|
||||
}
|
||||
|
||||
@Test
|
||||
|
||||
@@ -16,7 +16,6 @@
|
||||
|
||||
package org.springframework.cloud.sleuth.instrument.web.client.integration;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
@@ -33,11 +32,14 @@ import brave.Span;
|
||||
import brave.Tracer;
|
||||
import brave.Tracing;
|
||||
import brave.baggage.BaggagePropagation;
|
||||
import brave.handler.MutableSpan;
|
||||
import brave.handler.SpanHandler;
|
||||
import brave.propagation.B3Propagation;
|
||||
import brave.propagation.B3SingleFormat;
|
||||
import brave.propagation.SamplingFlags;
|
||||
import brave.propagation.TraceContextOrSamplingFlags;
|
||||
import brave.sampler.Sampler;
|
||||
import brave.test.TestSpanHandler;
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import org.apache.http.HttpResponse;
|
||||
@@ -55,8 +57,6 @@ import org.junit.jupiter.params.ParameterizedTest;
|
||||
import org.junit.jupiter.params.provider.MethodSource;
|
||||
import org.reactivestreams.Subscription;
|
||||
import reactor.core.publisher.BaseSubscriber;
|
||||
import zipkin2.Annotation;
|
||||
import zipkin2.reporter.Reporter;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
@@ -75,7 +75,6 @@ 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.util.ArrayListSpanReporter;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.core.env.Environment;
|
||||
@@ -126,7 +125,7 @@ public class WebClientTests {
|
||||
HttpAsyncClientBuilder httpAsyncClientBuilder; // #845
|
||||
|
||||
@Autowired
|
||||
ArrayListSpanReporter reporter;
|
||||
TestSpanHandler spans;
|
||||
|
||||
@Autowired
|
||||
Tracer tracer;
|
||||
@@ -149,7 +148,7 @@ public class WebClientTests {
|
||||
@AfterEach
|
||||
@BeforeEach
|
||||
public void close() {
|
||||
this.reporter.clear();
|
||||
this.spans.clear();
|
||||
this.testErrorController.clear();
|
||||
this.fooController.clear();
|
||||
}
|
||||
@@ -163,10 +162,9 @@ public class WebClientTests {
|
||||
|
||||
Awaitility.await().atMost(2, TimeUnit.SECONDS).untilAsserted(() -> {
|
||||
then(getHeader(response, "b3")).isNull();
|
||||
List<zipkin2.Span> spans = this.reporter.getSpans();
|
||||
then(spans).isNotEmpty();
|
||||
Optional<zipkin2.Span> noTraceSpan = new ArrayList<>(spans).stream()
|
||||
.filter(span -> "get".equals(span.name()) && !span.tags().isEmpty()
|
||||
then(this.spans).isNotEmpty();
|
||||
Optional<MutableSpan> noTraceSpan = this.spans.spans().stream()
|
||||
.filter(span -> "GET".equals(span.name()) && !span.tags().isEmpty()
|
||||
&& span.tags().containsKey("http.path"))
|
||||
.findFirst();
|
||||
then(noTraceSpan.isPresent()).isTrue();
|
||||
@@ -224,7 +222,7 @@ public class WebClientTests {
|
||||
span.finish();
|
||||
}
|
||||
|
||||
then(this.reporter.getSpans()).isEmpty();
|
||||
then(this.spans).isEmpty();
|
||||
then(this.tracer.currentSpan()).isNull();
|
||||
}
|
||||
|
||||
@@ -254,7 +252,7 @@ public class WebClientTests {
|
||||
}
|
||||
|
||||
then(this.tracer.currentSpan()).isNull();
|
||||
then(this.reporter.getSpans()).isNotEmpty();
|
||||
then(this.spans).isNotEmpty();
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -272,9 +270,9 @@ public class WebClientTests {
|
||||
}
|
||||
|
||||
then(this.tracer.currentSpan()).isNull();
|
||||
then(this.reporter.getSpans()).isNotEmpty().extracting("traceId", String.class)
|
||||
then(this.spans).isNotEmpty().extracting("traceId", String.class)
|
||||
.containsOnly(span.context().traceIdString());
|
||||
then(this.reporter.getSpans()).extracting("kind.name").contains("CLIENT");
|
||||
then(this.spans).extracting("kind.name").contains("CLIENT");
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -311,9 +309,9 @@ public class WebClientTests {
|
||||
}
|
||||
|
||||
then(this.tracer.currentSpan()).isNull();
|
||||
then(this.reporter.getSpans()).isNotEmpty().extracting("traceId", String.class)
|
||||
then(this.spans).isNotEmpty().extracting("traceId", String.class)
|
||||
.containsOnly(span.context().traceIdString());
|
||||
then(this.reporter.getSpans()).extracting("kind.name").contains("CLIENT");
|
||||
then(this.spans).extracting("kind.name").contains("CLIENT");
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -329,8 +327,7 @@ public class WebClientTests {
|
||||
span.finish();
|
||||
}
|
||||
then(this.tracer.currentSpan()).isNull();
|
||||
then(this.reporter.getSpans()).isNotEmpty().extracting("kind.name")
|
||||
.contains("CLIENT");
|
||||
then(this.spans).isNotEmpty().extracting("kind.name").contains("CLIENT");
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -350,8 +347,7 @@ public class WebClientTests {
|
||||
}
|
||||
|
||||
then(this.tracer.currentSpan()).isNull();
|
||||
then(this.reporter.getSpans()).isNotEmpty().extracting("kind.name")
|
||||
.contains("CLIENT");
|
||||
then(this.spans).isNotEmpty().extracting("kind.name").contains("CLIENT");
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -369,18 +365,18 @@ public class WebClientTests {
|
||||
}
|
||||
});
|
||||
|
||||
then(this.reporter.getSpans()).isEmpty();
|
||||
then(this.spans).isEmpty();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void shouldRespectSkipPattern() {
|
||||
this.webClient.get().uri("http://localhost:" + this.port + "/skip").retrieve()
|
||||
.bodyToMono(String.class).block();
|
||||
then(this.reporter.getSpans()).isEmpty();
|
||||
then(this.spans).isEmpty();
|
||||
|
||||
this.webClient.get().uri("http://localhost:" + this.port + "/doNotSkip")
|
||||
.retrieve().bodyToMono(String.class).block();
|
||||
then(this.reporter.getSpans()).isNotEmpty();
|
||||
then(this.spans).isNotEmpty();
|
||||
}
|
||||
|
||||
static Stream parametersForShouldAttachTraceIdWhenCallingAnotherService() {
|
||||
@@ -404,7 +400,7 @@ public class WebClientTests {
|
||||
}
|
||||
|
||||
then(this.tracer.currentSpan()).isNull();
|
||||
then(this.reporter.getSpans()).isNotEmpty();
|
||||
then(this.spans).isNotEmpty();
|
||||
}
|
||||
|
||||
static Stream parametersForShouldAttachTraceIdWhenUsingFeignClientWithoutResponseBody() {
|
||||
@@ -425,22 +421,20 @@ public class WebClientTests {
|
||||
}
|
||||
|
||||
then(this.tracer.currentSpan()).isNull();
|
||||
Optional<zipkin2.Span> storedSpan = this.reporter.getSpans().stream()
|
||||
Optional<MutableSpan> storedSpan = this.spans.spans().stream()
|
||||
.filter(span -> "404".equals(span.tags().get("http.status_code")))
|
||||
.findFirst();
|
||||
then(storedSpan.isPresent()).isTrue();
|
||||
List<zipkin2.Span> spans = this.reporter.getSpans();
|
||||
spans.stream().forEach(span -> {
|
||||
this.spans.spans().stream().forEach(span -> {
|
||||
int initialSize = span.annotations().size();
|
||||
int distinctSize = span.annotations().stream().map(Annotation::value)
|
||||
int distinctSize = span.annotations().stream().map(Map.Entry::getValue)
|
||||
.distinct().collect(Collectors.toList()).size();
|
||||
log.info("logs " + span.annotations());
|
||||
then(initialSize).as("there are no duplicate log entries")
|
||||
.isEqualTo(distinctSize);
|
||||
});
|
||||
|
||||
then(this.reporter.getSpans()).isNotEmpty().extracting("kind.name")
|
||||
.contains("CLIENT");
|
||||
then(this.spans).isNotEmpty().extracting("kind.name").contains("CLIENT");
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -466,7 +460,7 @@ public class WebClientTests {
|
||||
}
|
||||
then(this.tracer.currentSpan()).isNull();
|
||||
then(this.customizer.isExecuted()).isTrue();
|
||||
then(this.reporter.getSpans()).extracting("kind.name").contains("CLIENT");
|
||||
then(this.spans).extracting("kind.name").contains("CLIENT");
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -563,8 +557,8 @@ public class WebClientTests {
|
||||
}
|
||||
|
||||
@Bean
|
||||
Reporter<zipkin2.Span> spanReporter() {
|
||||
return new ArrayListSpanReporter();
|
||||
SpanHandler testSpanHandler() {
|
||||
return new TestSpanHandler();
|
||||
}
|
||||
|
||||
@Bean
|
||||
|
||||
@@ -140,7 +140,7 @@ public class SamplerAutoConfigurationTests {
|
||||
static class WithSpanHandler {
|
||||
|
||||
@Bean
|
||||
SpanHandler spanHandler() {
|
||||
SpanHandler testSpanHandler() {
|
||||
return new SpanHandler() {
|
||||
@Override
|
||||
public boolean end(TraceContext context, MutableSpan span, Cause cause) {
|
||||
|
||||
@@ -1,55 +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.util;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
import zipkin2.Span;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.assertj.core.api.Assertions.assertThatThrownBy;
|
||||
|
||||
public class BlockingQueueSpanReporterTests {
|
||||
|
||||
Span span1 = Span.newBuilder().traceId("1").id("1").build();
|
||||
|
||||
Span span2 = Span.newBuilder().traceId("1").id("2").build();
|
||||
|
||||
BlockingQueueSpanReporter reporter = new BlockingQueueSpanReporter();
|
||||
|
||||
@Test
|
||||
void takeSpan_fifo_order() {
|
||||
reporter.report(span1);
|
||||
reporter.report(span2);
|
||||
|
||||
assertThat(reporter.takeSpan()).isSameAs(span1);
|
||||
assertThat(reporter.takeSpan()).isSameAs(span2);
|
||||
}
|
||||
|
||||
@Test
|
||||
void assertEmpty() {
|
||||
reporter.assertEmpty();
|
||||
}
|
||||
|
||||
@Test
|
||||
void assertEmpty_fails_when_not_empty() {
|
||||
reporter.report(span1);
|
||||
|
||||
assertThatThrownBy(reporter::assertEmpty).isInstanceOf(AssertionError.class)
|
||||
.hasMessage("Span remaining in queue. Check for redundant reporting!");
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,56 +0,0 @@
|
||||
/*
|
||||
* Copyright 2013-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.util;
|
||||
|
||||
/**
|
||||
* @author Marcin Grzejszczak
|
||||
* @since
|
||||
*/
|
||||
public final class SpanUtil {
|
||||
|
||||
private SpanUtil() {
|
||||
throw new IllegalStateException("Can't instantiate a utility class");
|
||||
}
|
||||
|
||||
static final char[] HEX_DIGITS = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
|
||||
'a', 'b', 'c', 'd', 'e', 'f' };
|
||||
|
||||
// Represents given long id as 16-character lower-hex string
|
||||
public static String idToHex(long id) {
|
||||
char[] data = new char[16];
|
||||
writeHexLong(data, 0, id);
|
||||
return new String(data);
|
||||
}
|
||||
|
||||
// Inspired by {@code okio.Buffer.writeLong}
|
||||
static void writeHexLong(char[] data, int pos, long v) {
|
||||
writeHexByte(data, pos + 0, (byte) ((v >>> 56L) & 0xff));
|
||||
writeHexByte(data, pos + 2, (byte) ((v >>> 48L) & 0xff));
|
||||
writeHexByte(data, pos + 4, (byte) ((v >>> 40L) & 0xff));
|
||||
writeHexByte(data, pos + 6, (byte) ((v >>> 32L) & 0xff));
|
||||
writeHexByte(data, pos + 8, (byte) ((v >>> 24L) & 0xff));
|
||||
writeHexByte(data, pos + 10, (byte) ((v >>> 16L) & 0xff));
|
||||
writeHexByte(data, pos + 12, (byte) ((v >>> 8L) & 0xff));
|
||||
writeHexByte(data, pos + 14, (byte) (v & 0xff));
|
||||
}
|
||||
|
||||
static void writeHexByte(char[] data, int pos, byte b) {
|
||||
data[pos + 0] = HEX_DIGITS[(b >> 4) & 0xf];
|
||||
data[pos + 1] = HEX_DIGITS[b & 0xf];
|
||||
}
|
||||
|
||||
}
|
||||
@@ -31,8 +31,8 @@
|
||||
<name>spring-cloud-sleuth-dependencies</name>
|
||||
<description>Spring Cloud Sleuth Dependencies</description>
|
||||
<properties>
|
||||
<brave.version>5.12.1</brave.version>
|
||||
<brave.opentracing.version>0.37.1</brave.opentracing.version>
|
||||
<brave.version>5.12.2</brave.version>
|
||||
<brave.opentracing.version>0.37.2</brave.opentracing.version>
|
||||
<grpc.spring.boot.version>3.4.1</grpc.spring.boot.version>
|
||||
</properties>
|
||||
<dependencyManagement>
|
||||
|
||||
@@ -16,10 +16,11 @@
|
||||
|
||||
package sample;
|
||||
|
||||
import brave.handler.MutableSpan;
|
||||
import brave.handler.SpanHandler;
|
||||
import brave.propagation.TraceContext;
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import zipkin2.Span;
|
||||
import zipkin2.reporter.Reporter;
|
||||
|
||||
import org.springframework.boot.SpringApplication;
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
@@ -43,11 +44,12 @@ public class SampleFeignApplication {
|
||||
// Use this for debugging (or if there is no Zipkin server running on port 9411)
|
||||
@Bean
|
||||
@ConditionalOnProperty(value = "sample.zipkin.enabled", havingValue = "false")
|
||||
public Reporter<Span> spanReporter() {
|
||||
return new Reporter<Span>() {
|
||||
public SpanHandler spanHandler() {
|
||||
return new SpanHandler() {
|
||||
@Override
|
||||
public void report(Span span) {
|
||||
public boolean end(TraceContext context, MutableSpan span, Cause cause) {
|
||||
logger.info(span);
|
||||
return true;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@@ -96,6 +96,11 @@
|
||||
<artifactId>spring-boot-starter-test</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>io.zipkin.brave</groupId>
|
||||
<artifactId>brave-tests</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.assertj</groupId>
|
||||
<artifactId>assertj-core</artifactId>
|
||||
|
||||
@@ -20,26 +20,28 @@ import java.util.Collections;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
|
||||
import brave.handler.MutableSpan;
|
||||
import brave.handler.SpanHandler;
|
||||
import brave.propagation.TraceContext;
|
||||
import org.apache.commons.logging.Log;
|
||||
import zipkin2.Span;
|
||||
import zipkin2.reporter.Reporter;
|
||||
|
||||
/**
|
||||
* Span Collector that logs spans and adds Spans to a list.
|
||||
*
|
||||
* @author Marcin Grzejszczak
|
||||
*/
|
||||
public class IntegrationTestZipkinSpanReporter implements Reporter<Span> {
|
||||
public class IntegrationTestZipkinSpanHandler extends SpanHandler {
|
||||
|
||||
private static final Log log = org.apache.commons.logging.LogFactory
|
||||
.getLog(IntegrationTestZipkinSpanReporter.class);
|
||||
.getLog(IntegrationTestZipkinSpanHandler.class);
|
||||
|
||||
public List<Span> hashedSpans = Collections.synchronizedList(new LinkedList<>());
|
||||
public List<MutableSpan> spans = Collections.synchronizedList(new LinkedList<>());
|
||||
|
||||
@Override
|
||||
public void report(Span span) {
|
||||
public boolean end(TraceContext context, MutableSpan span, Cause cause) {
|
||||
log.debug(span);
|
||||
this.hashedSpans.add(span);
|
||||
this.spans.add(span);
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -21,6 +21,9 @@ import java.util.Optional;
|
||||
import java.util.Random;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import brave.Span;
|
||||
import brave.handler.MutableSpan;
|
||||
import brave.handler.SpanHandler;
|
||||
import brave.sampler.Sampler;
|
||||
import integration.MessagingApplicationTests.IntegrationSpanCollectorConfig;
|
||||
import org.junit.jupiter.api.AfterEach;
|
||||
@@ -28,8 +31,6 @@ import org.junit.jupiter.api.Test;
|
||||
import sample.SampleMessagingApplication;
|
||||
import tools.AbstractIntegrationTest;
|
||||
import tools.SpanUtil;
|
||||
import zipkin2.Span;
|
||||
import zipkin2.reporter.Reporter;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.test.context.SpringBootTest;
|
||||
@@ -54,11 +55,11 @@ public class MessagingApplicationTests extends AbstractIntegrationTest {
|
||||
private static String sampleAppUrl = "http://localhost:" + port;
|
||||
|
||||
@Autowired
|
||||
IntegrationTestZipkinSpanReporter integrationTestSpanCollector;
|
||||
IntegrationTestZipkinSpanHandler testSpanHandler;
|
||||
|
||||
@AfterEach
|
||||
public void cleanup() {
|
||||
this.integrationTestSpanCollector.hashedSpans.clear();
|
||||
this.testSpanHandler.spans.clear();
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -103,18 +104,15 @@ public class MessagingApplicationTests extends AbstractIntegrationTest {
|
||||
}
|
||||
|
||||
private void thenThereIsAtLeastOneTagWithKey(String key) {
|
||||
then(this.integrationTestSpanCollector.hashedSpans.stream().map(Span::tags)
|
||||
then(this.testSpanHandler.spans.stream().map(MutableSpan::tags)
|
||||
.flatMap(m -> m.keySet().stream()).anyMatch(b -> b.equals(key))).isTrue();
|
||||
}
|
||||
|
||||
private void thenAllSpansHaveTraceIdEqualTo(long traceId) {
|
||||
String traceIdHex = Long.toHexString(traceId);
|
||||
log.info(
|
||||
"Stored spans: [\n"
|
||||
+ this.integrationTestSpanCollector.hashedSpans.stream()
|
||||
.map(Span::toString).collect(Collectors.joining("\n"))
|
||||
+ "\n]");
|
||||
then(this.integrationTestSpanCollector.hashedSpans.stream()
|
||||
log.info("Stored spans: [\n" + this.testSpanHandler.spans.stream()
|
||||
.map(MutableSpan::toString).collect(Collectors.joining("\n")) + "\n]");
|
||||
then(this.testSpanHandler.spans.stream()
|
||||
.filter(span -> !span.traceId().equals(SpanUtil.idToHex(traceId)))
|
||||
.collect(Collectors.toList()))
|
||||
.describedAs("All spans have same trace id [" + traceIdHex + "]")
|
||||
@@ -122,62 +120,62 @@ public class MessagingApplicationTests extends AbstractIntegrationTest {
|
||||
}
|
||||
|
||||
private void thenTheSpansHaveProperParentStructure() {
|
||||
Optional<Span> firstHttpSpan = findFirstHttpRequestSpan();
|
||||
List<Span> eventSpans = findAllEventRelatedSpans();
|
||||
Optional<Span> eventSentSpan = findSpanWithKind(Span.Kind.SERVER);
|
||||
Optional<Span> producerSpan = findSpanWithKind(Span.Kind.PRODUCER);
|
||||
Optional<Span> lastHttpSpansParent = findLastHttpSpansParent();
|
||||
Optional<MutableSpan> firstHttpSpan = findFirstHttpRequestSpan();
|
||||
List<MutableSpan> eventSpans = findAllEventRelatedSpans();
|
||||
Optional<MutableSpan> eventSentSpan = findSpanWithKind(Span.Kind.SERVER);
|
||||
Optional<MutableSpan> producerSpan = findSpanWithKind(Span.Kind.PRODUCER);
|
||||
Optional<MutableSpan> lastHttpSpansParent = findLastHttpSpansParent();
|
||||
// "http:/parent/" -> "message:messages" -> "http:/foo" (CS + CR) -> "http:/foo"
|
||||
// (SS)
|
||||
thenAllSpansArePresent(firstHttpSpan, eventSpans, lastHttpSpansParent,
|
||||
eventSentSpan, producerSpan);
|
||||
then(this.integrationTestSpanCollector.hashedSpans).as("There were 6 spans")
|
||||
.hasSize(6);
|
||||
then(this.testSpanHandler.spans).as("There were 6 spans").hasSize(6);
|
||||
log.info("Checking the parent child structure");
|
||||
List<Optional<Span>> parentChild = this.integrationTestSpanCollector.hashedSpans
|
||||
.stream().filter(span -> span.parentId() != null)
|
||||
.map(span -> this.integrationTestSpanCollector.hashedSpans.stream()
|
||||
List<Optional<MutableSpan>> parentChild = this.testSpanHandler.spans.stream()
|
||||
.filter(span -> span.parentId() != null)
|
||||
.map(span -> this.testSpanHandler.spans.stream()
|
||||
.filter(span1 -> span1.id().equals(span.parentId())).findAny())
|
||||
.collect(Collectors.toList());
|
||||
log.info("List of parents and children " + parentChild);
|
||||
then(parentChild.stream().allMatch(Optional::isPresent)).isTrue();
|
||||
}
|
||||
|
||||
private Optional<Span> findLastHttpSpansParent() {
|
||||
return this.integrationTestSpanCollector.hashedSpans.stream()
|
||||
.filter(span -> "get /".equals(span.name()) && span.kind() != null)
|
||||
private Optional<MutableSpan> findLastHttpSpansParent() {
|
||||
return this.testSpanHandler.spans.stream()
|
||||
.filter(span -> "GET /".equals(span.name()) && span.kind() != null)
|
||||
.findFirst();
|
||||
}
|
||||
|
||||
private Optional<Span> findSpanWithKind(Span.Kind kind) {
|
||||
return this.integrationTestSpanCollector.hashedSpans.stream()
|
||||
private Optional<MutableSpan> findSpanWithKind(Span.Kind kind) {
|
||||
return this.testSpanHandler.spans.stream()
|
||||
.filter(span -> kind.equals(span.kind())).findFirst();
|
||||
}
|
||||
|
||||
private List<Span> findAllEventRelatedSpans() {
|
||||
return this.integrationTestSpanCollector.hashedSpans.stream()
|
||||
private List<MutableSpan> findAllEventRelatedSpans() {
|
||||
return this.testSpanHandler.spans.stream()
|
||||
.filter(span -> "send".equals(span.name()) && span.parentId() != null)
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
private Optional<Span> findFirstHttpRequestSpan() {
|
||||
return this.integrationTestSpanCollector.hashedSpans.stream()
|
||||
private Optional<MutableSpan> findFirstHttpRequestSpan() {
|
||||
return this.testSpanHandler.spans.stream()
|
||||
// home is the name of the method
|
||||
.filter(span -> span.tags().values().stream().anyMatch("home"::equals))
|
||||
.findFirst();
|
||||
}
|
||||
|
||||
private void thenAllSpansArePresent(Optional<Span> firstHttpSpan,
|
||||
List<Span> eventSpans, Optional<Span> lastHttpSpan,
|
||||
Optional<Span> eventSentSpan, Optional<Span> eventReceivedSpan) {
|
||||
private void thenAllSpansArePresent(Optional<MutableSpan> firstHttpSpan,
|
||||
List<MutableSpan> eventSpans, Optional<MutableSpan> lastHttpSpan,
|
||||
Optional<MutableSpan> eventSentSpan,
|
||||
Optional<MutableSpan> eventReceivedSpan) {
|
||||
log.info("Found following spans");
|
||||
log.info("First http span " + firstHttpSpan);
|
||||
log.info("Event spans " + eventSpans);
|
||||
log.info("Event sent span " + eventSentSpan);
|
||||
log.info("Event received span " + eventReceivedSpan);
|
||||
log.info("Last http span " + lastHttpSpan);
|
||||
log.info("All found spans \n" + this.integrationTestSpanCollector.hashedSpans
|
||||
.stream().map(Span::toString).collect(Collectors.joining("\n")));
|
||||
log.info("All found spans \n" + this.testSpanHandler.spans.stream()
|
||||
.map(MutableSpan::toString).collect(Collectors.joining("\n")));
|
||||
then(firstHttpSpan.isPresent()).isTrue();
|
||||
then(eventSpans).isNotEmpty();
|
||||
then(eventSentSpan.isPresent()).isTrue();
|
||||
@@ -189,8 +187,8 @@ public class MessagingApplicationTests extends AbstractIntegrationTest {
|
||||
public static class IntegrationSpanCollectorConfig {
|
||||
|
||||
@Bean
|
||||
Reporter<Span> integrationTestZipkinSpanReporter() {
|
||||
return new IntegrationTestZipkinSpanReporter();
|
||||
SpanHandler testSpanHandler() {
|
||||
return new IntegrationTestZipkinSpanHandler();
|
||||
}
|
||||
|
||||
@Bean
|
||||
|
||||
@@ -16,8 +16,9 @@
|
||||
|
||||
package sample;
|
||||
|
||||
import zipkin2.Span;
|
||||
import zipkin2.reporter.Reporter;
|
||||
import brave.handler.MutableSpan;
|
||||
import brave.handler.SpanHandler;
|
||||
import brave.propagation.TraceContext;
|
||||
|
||||
import org.springframework.boot.SpringApplication;
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
@@ -45,8 +46,14 @@ public class SampleZipkinApplication {
|
||||
// Use this for debugging (or if there is no Zipkin server running on port 9411)
|
||||
@Bean
|
||||
@ConditionalOnProperty(value = "sample.zipkin.enabled", havingValue = "false")
|
||||
public Reporter<Span> spanReporter() {
|
||||
return Reporter.CONSOLE;
|
||||
public SpanHandler spanHandler() {
|
||||
return new SpanHandler() {
|
||||
@Override
|
||||
public boolean end(TraceContext context, MutableSpan span, Cause cause) {
|
||||
System.out.println(span.toString());
|
||||
return true;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -60,13 +60,13 @@
|
||||
<artifactId>spring-cloud-starter-sleuth</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>io.zipkin.brave</groupId>
|
||||
<artifactId>brave-tests</artifactId>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-test</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-test</artifactId>
|
||||
<groupId>io.zipkin.brave</groupId>
|
||||
<artifactId>brave-tests</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
|
||||
@@ -33,11 +33,13 @@ import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.scheduling.annotation.Async;
|
||||
import org.springframework.scheduling.annotation.EnableAsync;
|
||||
import org.springframework.test.annotation.DirtiesContext;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE,
|
||||
classes = { TraceAsyncIntegrationTests.TraceAsyncITestConfiguration.class })
|
||||
@DirtiesContext // flakey otherwise
|
||||
public class TraceAsyncIntegrationTests {
|
||||
|
||||
@ClassRule
|
||||
@@ -54,54 +56,36 @@ public class TraceAsyncIntegrationTests {
|
||||
|
||||
@Test
|
||||
public void should_set_span_on_an_async_annotated_method() {
|
||||
asyncLogic.invokeAsync();
|
||||
try (Scope ws = currentTraceContext.maybeScope(context)) {
|
||||
asyncLogic.invokeAsync();
|
||||
|
||||
assertSpan_invokeAsync(takeDesirableSpan());
|
||||
MutableSpan span = takeDesirableSpan();
|
||||
assertThat(span.name()).isEqualTo("invoke-async");
|
||||
assertThat(span.containsAnnotation("@Async")).isTrue();
|
||||
assertThat(span.tags()).containsEntry("class", "AsyncLogic")
|
||||
.containsEntry("method", "invokeAsync");
|
||||
|
||||
// continues the trace
|
||||
assertThat(span.traceId()).isEqualTo(context.traceIdString());
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void should_set_span_with_custom_method_on_an_async_annotated_method() {
|
||||
asyncLogic.invokeAsync_customName();
|
||||
|
||||
assertSpan_invokeAsync_customName(takeDesirableSpan());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void should_continue_a_span_on_an_async_annotated_method() {
|
||||
try (Scope ws = currentTraceContext.maybeScope(context)) {
|
||||
asyncLogic.invokeAsync();
|
||||
|
||||
MutableSpan span = assertSpan_invokeAsync(takeDesirableSpan());
|
||||
assertThat(span.traceId()).isEqualTo(context.traceIdString());
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void should_continue_a_span_with_custom_method_on_an_async_annotated_method() {
|
||||
try (Scope ws = currentTraceContext.maybeScope(context)) {
|
||||
asyncLogic.invokeAsync_customName();
|
||||
|
||||
MutableSpan span = assertSpan_invokeAsync_customName(takeDesirableSpan());
|
||||
MutableSpan span = takeDesirableSpan();
|
||||
assertThat(span.name()).isEqualTo("foo");
|
||||
assertThat(span.containsAnnotation("@Async")).isTrue();
|
||||
assertThat(span.tags()).containsEntry("class", "AsyncLogic")
|
||||
.containsEntry("method", "invokeAsync_customName");
|
||||
|
||||
// continues the trace
|
||||
assertThat(span.traceId()).isEqualTo(context.traceIdString());
|
||||
}
|
||||
}
|
||||
|
||||
static MutableSpan assertSpan_invokeAsync_customName(MutableSpan span) {
|
||||
assertThat(span.name()).isEqualTo("foo");
|
||||
assertThat(span.containsAnnotation("@Async")).isTrue();
|
||||
assertThat(span.tags()).containsEntry("class", "AsyncLogic")
|
||||
.containsEntry("method", "invokeAsync_customName");
|
||||
return span;
|
||||
}
|
||||
|
||||
static MutableSpan assertSpan_invokeAsync(MutableSpan span) {
|
||||
assertThat(span.name()).isEqualTo("invoke-async");
|
||||
assertThat(span.containsAnnotation("@Async")).isTrue();
|
||||
assertThat(span.tags()).containsEntry("class", "AsyncLogic")
|
||||
.containsEntry("method", "invokeAsync");
|
||||
return span;
|
||||
}
|
||||
|
||||
// Sleuth adds spans named "async" with no tags when an executor is used.
|
||||
// We don't want that one.
|
||||
MutableSpan takeDesirableSpan() {
|
||||
@@ -121,7 +105,7 @@ public class TraceAsyncIntegrationTests {
|
||||
}
|
||||
|
||||
@Bean
|
||||
SpanHandler spanHandler() {
|
||||
SpanHandler testSpanHandler() {
|
||||
return spans;
|
||||
}
|
||||
|
||||
|
||||
@@ -81,6 +81,11 @@
|
||||
<artifactId>spring-boot-starter-test</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>io.zipkin.brave</groupId>
|
||||
<artifactId>brave-tests</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.awaitility</groupId>
|
||||
<artifactId>awaitility</artifactId>
|
||||
|
||||
@@ -19,19 +19,18 @@ package org.springframework.cloud.sleuth.instrument.feign.issues.issue1125;
|
||||
import java.io.IOException;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
|
||||
import brave.handler.SpanHandler;
|
||||
import brave.http.HttpRequest;
|
||||
import brave.sampler.Sampler;
|
||||
import brave.sampler.SamplerFunction;
|
||||
import brave.test.TestSpanHandler;
|
||||
import feign.Client;
|
||||
import feign.Request;
|
||||
import feign.RequestTemplate;
|
||||
import feign.Response;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import zipkin2.Span;
|
||||
import zipkin2.reporter.Reporter;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
|
||||
@@ -41,7 +40,6 @@ import org.springframework.cloud.openfeign.EnableFeignClients;
|
||||
import org.springframework.cloud.openfeign.FeignClient;
|
||||
import org.springframework.cloud.openfeign.loadbalancer.FeignBlockingLoadBalancerClient;
|
||||
import org.springframework.cloud.sleuth.instrument.web.HttpClientSampler;
|
||||
import org.springframework.cloud.sleuth.util.ArrayListSpanReporter;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.test.annotation.DirtiesContext;
|
||||
@@ -60,14 +58,14 @@ public class ManuallyCreatedLoadBalancerFeignClientTests {
|
||||
AnnotatedFeignClient annotatedFeignClient;
|
||||
|
||||
@Autowired
|
||||
ArrayListSpanReporter reporter;
|
||||
TestSpanHandler spans;
|
||||
|
||||
@Autowired
|
||||
MyBlockingClient myClient;
|
||||
|
||||
@BeforeEach
|
||||
public void open() {
|
||||
this.reporter.clear();
|
||||
this.spans.clear();
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -76,10 +74,9 @@ public class ManuallyCreatedLoadBalancerFeignClientTests {
|
||||
|
||||
// then(this.myClient.wasCalled()).isTrue();
|
||||
then(response).isEqualTo("foo");
|
||||
List<Span> spans = this.reporter.getSpans();
|
||||
// retries
|
||||
then(spans).hasSize(1);
|
||||
then(spans.get(0).tags().get("http.path")).isEqualTo("/test");
|
||||
then(this.spans).hasSize(1);
|
||||
then(this.spans.get(0).tags().get("http.path")).isEqualTo("/test");
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -91,10 +88,9 @@ public class ManuallyCreatedLoadBalancerFeignClientTests {
|
||||
@Test
|
||||
public void span_captured() {
|
||||
this.annotatedFeignClient.get();
|
||||
List<Span> spans = this.reporter.getSpans();
|
||||
// retries
|
||||
then(spans).hasSize(1);
|
||||
then(spans.get(0).tags().get("http.path")).isEqualTo("/test");
|
||||
then(this.spans).hasSize(1);
|
||||
then(this.spans.get(0).tags().get("http.path")).isEqualTo("/test");
|
||||
}
|
||||
|
||||
}
|
||||
@@ -115,8 +111,8 @@ class Application {
|
||||
}
|
||||
|
||||
@Bean
|
||||
public Reporter<Span> spanReporter() {
|
||||
return new ArrayListSpanReporter();
|
||||
public SpanHandler testSpanHandler() {
|
||||
return new TestSpanHandler();
|
||||
}
|
||||
|
||||
@Bean(name = HttpClientSampler.NAME)
|
||||
|
||||
@@ -18,11 +18,12 @@ package org.springframework.cloud.sleuth.instrument.feign.issues.issue1125delega
|
||||
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
|
||||
import brave.handler.SpanHandler;
|
||||
import brave.http.HttpRequest;
|
||||
import brave.sampler.Sampler;
|
||||
import brave.sampler.SamplerFunction;
|
||||
import brave.test.TestSpanHandler;
|
||||
import feign.Client;
|
||||
import feign.Contract;
|
||||
import feign.Feign;
|
||||
@@ -34,8 +35,6 @@ import feign.codec.Decoder;
|
||||
import feign.codec.Encoder;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import zipkin2.Span;
|
||||
import zipkin2.reporter.Reporter;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
|
||||
@@ -43,7 +42,6 @@ import org.springframework.boot.test.context.SpringBootTest;
|
||||
import org.springframework.cloud.openfeign.FeignClient;
|
||||
import org.springframework.cloud.openfeign.FeignClientsConfiguration;
|
||||
import org.springframework.cloud.sleuth.instrument.web.HttpClientSampler;
|
||||
import org.springframework.cloud.sleuth.util.ArrayListSpanReporter;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.context.annotation.Import;
|
||||
@@ -66,14 +64,14 @@ public class ManuallyCreatedDelegateLoadBalancerFeignClientTests {
|
||||
AnnotatedFeignClient annotatedFeignClient;
|
||||
|
||||
@Autowired
|
||||
ArrayListSpanReporter reporter;
|
||||
TestSpanHandler spans;
|
||||
|
||||
@Autowired
|
||||
MyDelegateClient myClient;
|
||||
|
||||
@BeforeEach
|
||||
public void open() {
|
||||
this.reporter.clear();
|
||||
this.spans.clear();
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -83,10 +81,9 @@ public class ManuallyCreatedDelegateLoadBalancerFeignClientTests {
|
||||
// then(this.myClient.wasCalled()).isTrue();
|
||||
then(this.myDelegateClient.wasCalled()).isTrue();
|
||||
then(response).isEqualTo("foo");
|
||||
List<Span> spans = this.reporter.getSpans();
|
||||
// retries
|
||||
then(spans).hasSize(1);
|
||||
then(spans.get(0).tags().get("http.path")).isEqualTo("/test");
|
||||
then(this.spans).hasSize(1);
|
||||
then(this.spans.get(0).tags().get("http.path")).isEqualTo("/test");
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -99,10 +96,9 @@ public class ManuallyCreatedDelegateLoadBalancerFeignClientTests {
|
||||
@Test
|
||||
public void span_captured() {
|
||||
this.annotatedFeignClient.get();
|
||||
List<Span> spans = this.reporter.getSpans();
|
||||
// retries
|
||||
then(spans).hasSize(1);
|
||||
then(spans.get(0).tags().get("http.path")).isEqualTo("/test");
|
||||
then(this.spans).hasSize(1);
|
||||
then(this.spans.get(0).tags().get("http.path")).isEqualTo("/test");
|
||||
}
|
||||
|
||||
}
|
||||
@@ -131,8 +127,8 @@ class Application {
|
||||
}
|
||||
|
||||
@Bean
|
||||
public Reporter<Span> spanReporter() {
|
||||
return new ArrayListSpanReporter();
|
||||
public SpanHandler testSpanHandler() {
|
||||
return new TestSpanHandler();
|
||||
}
|
||||
|
||||
@Bean(name = HttpClientSampler.NAME)
|
||||
|
||||
@@ -18,14 +18,15 @@ package org.springframework.cloud.sleuth.instrument.feign.issues.issue362;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import brave.Tracing;
|
||||
import brave.handler.SpanHandler;
|
||||
import brave.sampler.Sampler;
|
||||
import brave.test.TestSpanHandler;
|
||||
import feign.Client;
|
||||
import feign.Logger;
|
||||
import feign.Request;
|
||||
@@ -35,15 +36,12 @@ import feign.Retryer;
|
||||
import feign.codec.ErrorDecoder;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import zipkin2.Span;
|
||||
import zipkin2.reporter.Reporter;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
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.util.ArrayListSpanReporter;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.http.HttpStatus;
|
||||
@@ -87,12 +85,12 @@ public class Issue362Tests {
|
||||
Tracing tracer;
|
||||
|
||||
@Autowired
|
||||
ArrayListSpanReporter reporter;
|
||||
TestSpanHandler spans;
|
||||
|
||||
@BeforeEach
|
||||
public void setup() {
|
||||
this.feignComponentAsserter.executedComponents.clear();
|
||||
this.reporter.clear();
|
||||
this.spans.clear();
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -105,9 +103,8 @@ public class Issue362Tests {
|
||||
then(response.getBody()).isEqualTo("I'm OK");
|
||||
then(this.feignComponentAsserter.executedComponents).containsEntry(Client.class,
|
||||
true);
|
||||
List<Span> spans = this.reporter.getSpans();
|
||||
then(spans).hasSize(1);
|
||||
then(spans.get(0).tags()).containsEntry("http.path", "/service/ok");
|
||||
then(this.spans).hasSize(1);
|
||||
then(this.spans.get(0).tags()).containsEntry("http.path", "/service/ok");
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -124,10 +121,9 @@ public class Issue362Tests {
|
||||
then(this.feignComponentAsserter.executedComponents)
|
||||
.containsEntry(ErrorDecoder.class, true)
|
||||
.containsEntry(Client.class, true);
|
||||
List<Span> spans = this.reporter.getSpans();
|
||||
// retries
|
||||
then(spans).hasSize(5);
|
||||
then(spans.stream().map(span -> span.tags().get("http.status_code"))
|
||||
then(this.spans).hasSize(5);
|
||||
then(this.spans.spans().stream().map(span -> span.tags().get("http.status_code"))
|
||||
.collect(Collectors.toList())).containsOnly("409");
|
||||
}
|
||||
|
||||
@@ -167,8 +163,8 @@ class Application {
|
||||
}
|
||||
|
||||
@Bean
|
||||
public Reporter<Span> spanReporter() {
|
||||
return new ArrayListSpanReporter();
|
||||
public SpanHandler testSpanHandler() {
|
||||
return new TestSpanHandler();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -16,16 +16,15 @@
|
||||
|
||||
package org.springframework.cloud.sleuth.instrument.feign.issues.issue393;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import brave.Tracing;
|
||||
import brave.handler.SpanHandler;
|
||||
import brave.sampler.Sampler;
|
||||
import brave.test.TestSpanHandler;
|
||||
import feign.okhttp.OkHttpClient;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import zipkin2.Span;
|
||||
import zipkin2.reporter.Reporter;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
|
||||
@@ -33,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.util.ArrayListSpanReporter;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
@@ -67,14 +65,14 @@ public class Issue393Tests {
|
||||
RestTemplate template = new RestTemplate();
|
||||
|
||||
@Autowired
|
||||
ArrayListSpanReporter reporter;
|
||||
Tracing tracer;
|
||||
|
||||
@Autowired
|
||||
Tracing tracer;
|
||||
TestSpanHandler spans;
|
||||
|
||||
@BeforeEach
|
||||
public void open() {
|
||||
this.reporter.clear();
|
||||
this.spans.clear();
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -84,10 +82,9 @@ public class Issue393Tests {
|
||||
ResponseEntity<String> response = this.template.getForEntity(url, String.class);
|
||||
|
||||
then(response.getBody()).isEqualTo("mikesarver foo");
|
||||
List<Span> spans = this.reporter.getSpans();
|
||||
// retries
|
||||
then(spans).hasSize(2);
|
||||
then(spans.stream().map(span -> span.tags().get("http.path"))
|
||||
then(this.spans).hasSize(2);
|
||||
then(this.spans.spans().stream().map(span -> span.tags().get("http.path"))
|
||||
.collect(Collectors.toList())).containsOnly("/name/mikesarver");
|
||||
}
|
||||
|
||||
@@ -124,8 +121,8 @@ class Application {
|
||||
}
|
||||
|
||||
@Bean
|
||||
public Reporter<Span> spanReporter() {
|
||||
return new ArrayListSpanReporter();
|
||||
public SpanHandler testSpanHandler() {
|
||||
return new TestSpanHandler();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -18,19 +18,18 @@ package org.springframework.cloud.sleuth.instrument.feign.issues.issue502;
|
||||
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
|
||||
import brave.handler.SpanHandler;
|
||||
import brave.http.HttpRequest;
|
||||
import brave.sampler.Sampler;
|
||||
import brave.sampler.SamplerFunction;
|
||||
import brave.test.TestSpanHandler;
|
||||
import feign.Client;
|
||||
import feign.Request;
|
||||
import feign.RequestTemplate;
|
||||
import feign.Response;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import zipkin2.Span;
|
||||
import zipkin2.reporter.Reporter;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
|
||||
@@ -38,7 +37,6 @@ 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.HttpClientSampler;
|
||||
import org.springframework.cloud.sleuth.util.ArrayListSpanReporter;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
@@ -68,11 +66,11 @@ public class Issue502Tests {
|
||||
MyNameRemote myNameRemote;
|
||||
|
||||
@Autowired
|
||||
ArrayListSpanReporter reporter;
|
||||
TestSpanHandler spans;
|
||||
|
||||
@BeforeEach
|
||||
public void open() {
|
||||
this.reporter.clear();
|
||||
this.spans.clear();
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -81,10 +79,9 @@ public class Issue502Tests {
|
||||
|
||||
then(this.myClient.wasCalled()).isTrue();
|
||||
then(response).isEqualTo("foo");
|
||||
List<Span> spans = this.reporter.getSpans();
|
||||
// retries
|
||||
then(spans).hasSize(1);
|
||||
then(spans.get(0).tags().get("http.path")).isEqualTo("");
|
||||
then(this.spans).hasSize(1);
|
||||
then(this.spans.get(0).tags().get("http.path")).isEqualTo("");
|
||||
}
|
||||
|
||||
}
|
||||
@@ -105,8 +102,8 @@ class Application {
|
||||
}
|
||||
|
||||
@Bean
|
||||
public Reporter<Span> spanReporter() {
|
||||
return new ArrayListSpanReporter();
|
||||
public SpanHandler testSpanHandler() {
|
||||
return new TestSpanHandler();
|
||||
}
|
||||
|
||||
@Bean(name = HttpClientSampler.NAME)
|
||||
|
||||
@@ -64,6 +64,11 @@
|
||||
<artifactId>spring-boot-starter-test</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>io.zipkin.brave</groupId>
|
||||
<artifactId>brave-tests</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.awaitility</groupId>
|
||||
<artifactId>awaitility</artifactId>
|
||||
|
||||
@@ -19,7 +19,10 @@ package org.springframework.cloud.sleuth.instrument.grpc;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import brave.Span.Kind;
|
||||
import brave.handler.SpanHandler;
|
||||
import brave.sampler.Sampler;
|
||||
import brave.test.TestSpanHandler;
|
||||
import io.grpc.ClientInterceptor;
|
||||
import io.grpc.ManagedChannel;
|
||||
import io.grpc.ServerBuilder;
|
||||
@@ -31,8 +34,6 @@ import org.lognet.springboot.grpc.GRpcServerBuilderConfigurer;
|
||||
import org.lognet.springboot.grpc.GRpcService;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import zipkin2.Span;
|
||||
import zipkin2.reporter.Reporter;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
|
||||
@@ -42,7 +43,6 @@ import org.springframework.cloud.sleuth.instrument.grpc.stubs.HelloRequest;
|
||||
import org.springframework.cloud.sleuth.instrument.grpc.stubs.HelloServiceGrpc;
|
||||
import org.springframework.cloud.sleuth.instrument.grpc.stubs.HelloServiceGrpc.HelloServiceBlockingStub;
|
||||
import org.springframework.cloud.sleuth.instrument.grpc.stubs.HelloServiceGrpc.HelloServiceImplBase;
|
||||
import org.springframework.cloud.sleuth.util.ArrayListSpanReporter;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.context.annotation.Import;
|
||||
@@ -71,16 +71,16 @@ public class GrpcTracingIntegrationTests {
|
||||
SpringAwareManagedChannelBuilder clientManagedChannelBuilder;
|
||||
|
||||
@Autowired
|
||||
ArrayListSpanReporter reporter;
|
||||
TestSpanHandler spans;
|
||||
|
||||
@BeforeEach
|
||||
public void beforeTest() {
|
||||
this.reporter.clear();
|
||||
this.spans.clear();
|
||||
}
|
||||
|
||||
@AfterEach
|
||||
public void afterTest() {
|
||||
this.reporter.clear();
|
||||
this.spans.clear();
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -93,10 +93,9 @@ public class GrpcTracingIntegrationTests {
|
||||
|
||||
assertThat(client.sayHello("Testy McTest Face"))
|
||||
.isEqualTo("Hello Testy McTest Face");
|
||||
List<Span> spans = this.reporter.getSpans();
|
||||
assertThat(spans).hasSize(2);
|
||||
assertThat(spans.get(0).kind()).isEqualTo(Span.Kind.SERVER);
|
||||
assertThat(spans.get(1).kind()).isEqualTo(Span.Kind.CLIENT);
|
||||
assertThat(this.spans).hasSize(2);
|
||||
assertThat(this.spans.get(0).kind()).isEqualTo(Kind.SERVER);
|
||||
assertThat(this.spans.get(1).kind()).isEqualTo(Kind.CLIENT);
|
||||
|
||||
// ManagedChannel does not implement Closeable...
|
||||
inProcessManagedChannel.shutdownNow();
|
||||
@@ -139,9 +138,8 @@ public class GrpcTracingIntegrationTests {
|
||||
}
|
||||
|
||||
@Bean
|
||||
Reporter<zipkin2.Span> reporter() {
|
||||
return new ArrayListSpanReporter();
|
||||
|
||||
SpanHandler testSpanHandler() {
|
||||
return new TestSpanHandler();
|
||||
}
|
||||
|
||||
@Bean
|
||||
|
||||
@@ -64,6 +64,11 @@
|
||||
<artifactId>spring-boot-starter-test</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>io.zipkin.brave</groupId>
|
||||
<artifactId>brave-tests</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.awaitility</groupId>
|
||||
<artifactId>awaitility</artifactId>
|
||||
|
||||
@@ -83,6 +83,11 @@ https://www.w3.org/2001/XMLSchema-instance ">
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>io.zipkin.brave</groupId>
|
||||
<artifactId>brave-tests</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.awaitility</groupId>
|
||||
<artifactId>awaitility</artifactId>
|
||||
|
||||
@@ -16,8 +16,6 @@
|
||||
|
||||
package org.springframework.cloud.sleuth.instrument.messaging;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Executors;
|
||||
|
||||
@@ -26,7 +24,9 @@ import javax.annotation.PreDestroy;
|
||||
import brave.Span;
|
||||
import brave.Tracer;
|
||||
import brave.Tracing;
|
||||
import brave.handler.SpanHandler;
|
||||
import brave.propagation.StrictCurrentTraceContext;
|
||||
import brave.test.TestSpanHandler;
|
||||
import org.junit.jupiter.api.AfterEach;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
@@ -72,6 +72,9 @@ public class ITTracingChannelInterceptorTests implements MessageHandler {
|
||||
@Autowired
|
||||
Tracer tracer;
|
||||
|
||||
@Autowired
|
||||
TestSpanHandler spans;
|
||||
|
||||
Message<?> message;
|
||||
|
||||
Span currentSpan;
|
||||
@@ -140,8 +143,8 @@ public class ITTracingChannelInterceptorTests implements MessageHandler {
|
||||
ExecutorService service = Executors.newSingleThreadExecutor();
|
||||
|
||||
@Bean
|
||||
List<zipkin2.Span> spans() {
|
||||
return new ArrayList<>();
|
||||
SpanHandler testSpanHandler() {
|
||||
return new TestSpanHandler();
|
||||
}
|
||||
|
||||
@Bean
|
||||
@@ -152,7 +155,7 @@ public class ITTracingChannelInterceptorTests implements MessageHandler {
|
||||
@Bean
|
||||
Tracing tracing() {
|
||||
return Tracing.newBuilder().currentTraceContext(currentTraceContext())
|
||||
.spanReporter(spans()::add).build();
|
||||
.addSpanHandler(testSpanHandler()).build();
|
||||
}
|
||||
|
||||
@Bean
|
||||
|
||||
@@ -18,10 +18,6 @@ package org.springframework.cloud.sleuth.instrument.messaging;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.BlockingQueue;
|
||||
import java.util.concurrent.Callable;
|
||||
import java.util.concurrent.LinkedBlockingQueue;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import javax.jms.Connection;
|
||||
import javax.jms.ConnectionFactory;
|
||||
@@ -33,15 +29,18 @@ import javax.jms.XAConnection;
|
||||
import javax.jms.XAConnectionFactory;
|
||||
import javax.resource.spi.ResourceAdapter;
|
||||
|
||||
import brave.Span.Kind;
|
||||
import brave.Tracing;
|
||||
import brave.handler.MutableSpan;
|
||||
import brave.propagation.CurrentTraceContext;
|
||||
import brave.propagation.TraceContext;
|
||||
import brave.test.IntegrationTestSpanHandler;
|
||||
import org.apache.activemq.ra.ActiveMQActivationSpec;
|
||||
import org.apache.activemq.ra.ActiveMQResourceAdapter;
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import org.junit.ClassRule;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import zipkin2.Span;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.autoconfigure.AutoConfigurations;
|
||||
@@ -73,16 +72,15 @@ import static org.assertj.core.api.Assertions.assertThat;
|
||||
*/
|
||||
public class JmsTracingConfigurationTest {
|
||||
|
||||
@ClassRule
|
||||
public static IntegrationTestSpanHandler spanHandler = new IntegrationTestSpanHandler();
|
||||
|
||||
final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
|
||||
.withConfiguration(AutoConfigurations.of(JmsTestTracingConfiguration.class,
|
||||
AnnotationJmsListenerConfiguration.class, XAConfiguration.class,
|
||||
SimpleJmsListenerConfiguration.class,
|
||||
JcaJmsListenerConfiguration.class));
|
||||
|
||||
static void clearSpans(AssertableApplicationContext ctx) throws JMSException {
|
||||
ctx.getBean(JmsTestTracingConfiguration.class).clearSpan();
|
||||
}
|
||||
|
||||
static void checkConnection(AssertableApplicationContext ctx) throws JMSException {
|
||||
// Not using try-with-resources as that doesn't exist in JMS 1.1
|
||||
Connection con = ctx.getBean(ConnectionFactory.class).createConnection();
|
||||
@@ -135,7 +133,6 @@ public class JmsTracingConfigurationTest {
|
||||
@Test
|
||||
public void tracesXAConnectionFactories() {
|
||||
this.contextRunner.withUserConfiguration(XAConfiguration.class).run(ctx -> {
|
||||
clearSpans(ctx);
|
||||
checkConnection(ctx);
|
||||
checkXAConnection(ctx);
|
||||
});
|
||||
@@ -144,7 +141,6 @@ public class JmsTracingConfigurationTest {
|
||||
@Test
|
||||
public void tracesTopicConnectionFactories() {
|
||||
this.contextRunner.withUserConfiguration(XAConfiguration.class).run(ctx -> {
|
||||
clearSpans(ctx);
|
||||
checkConnection(ctx);
|
||||
checkTopicConnection(ctx);
|
||||
});
|
||||
@@ -154,17 +150,37 @@ public class JmsTracingConfigurationTest {
|
||||
public void tracesListener_jmsMessageListener() {
|
||||
this.contextRunner.withUserConfiguration(SimpleJmsListenerConfiguration.class)
|
||||
.run(ctx -> {
|
||||
clearSpans(ctx);
|
||||
ctx.getBean(JmsTemplate.class).convertAndSend("myQueue", "foo");
|
||||
|
||||
Callable<Span> takeSpan = ctx.getBean("takeSpan", Callable.class);
|
||||
List<Span> trace = Arrays.asList(takeSpan.call(), takeSpan.call(),
|
||||
takeSpan.call());
|
||||
MutableSpan producer = spanHandler.takeRemoteSpan(Kind.PRODUCER);
|
||||
MutableSpan consumer = spanHandler.takeRemoteSpan(Kind.CONSUMER);
|
||||
MutableSpan listener = spanHandler.takeLocalSpan();
|
||||
|
||||
List<MutableSpan> trace = Arrays.asList(producer, consumer, listener);
|
||||
|
||||
assertThat(trace).allSatisfy(s -> assertThat(s.traceId())
|
||||
.isEqualTo(trace.get(0).traceId()));
|
||||
assertThat(trace).isNotNull().extracting(Span::name).contains("send",
|
||||
"receive", "on-message");
|
||||
assertThat(trace).isNotNull().extracting(MutableSpan::name)
|
||||
.contains("send", "receive", "on-message");
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
public void tracesListener_annotationMessageListener() {
|
||||
this.contextRunner.withUserConfiguration(AnnotationJmsListenerConfiguration.class)
|
||||
.run(ctx -> {
|
||||
ctx.getBean(JmsTemplate.class).convertAndSend("myQueue", "foo");
|
||||
|
||||
MutableSpan producer = spanHandler.takeRemoteSpan(Kind.PRODUCER);
|
||||
MutableSpan consumer = spanHandler.takeRemoteSpan(Kind.CONSUMER);
|
||||
MutableSpan listener = spanHandler.takeLocalSpan();
|
||||
|
||||
List<MutableSpan> trace = Arrays.asList(producer, consumer, listener);
|
||||
|
||||
assertThat(trace).allSatisfy(s -> assertThat(s.traceId())
|
||||
.isEqualTo(trace.get(0).traceId()));
|
||||
assertThat(trace).isNotNull().extracting(MutableSpan::name)
|
||||
.containsExactlyInAnyOrder("send", "receive", "on-message");
|
||||
});
|
||||
}
|
||||
|
||||
@@ -172,16 +188,17 @@ public class JmsTracingConfigurationTest {
|
||||
public void tracesListener_jcaMessageListener() {
|
||||
this.contextRunner.withUserConfiguration(JcaJmsListenerConfiguration.class)
|
||||
.run(ctx -> {
|
||||
clearSpans(ctx);
|
||||
ctx.getBean(JmsTemplate.class).convertAndSend("myQueue", "foo");
|
||||
|
||||
Callable<Span> takeSpan = ctx.getBean("takeSpan", Callable.class);
|
||||
List<Span> trace = Arrays.asList(takeSpan.call(), takeSpan.call(),
|
||||
takeSpan.call());
|
||||
MutableSpan producer = spanHandler.takeRemoteSpan(Kind.PRODUCER);
|
||||
MutableSpan consumer = spanHandler.takeRemoteSpan(Kind.CONSUMER);
|
||||
MutableSpan listener = spanHandler.takeLocalSpan();
|
||||
|
||||
List<MutableSpan> trace = Arrays.asList(producer, consumer, listener);
|
||||
|
||||
assertThat(trace).allSatisfy(s -> assertThat(s.traceId())
|
||||
.isEqualTo(trace.get(0).traceId()));
|
||||
assertThat(trace).isNotNull().extracting(Span::name)
|
||||
assertThat(trace).isNotNull().extracting(MutableSpan::name)
|
||||
.containsExactlyInAnyOrder("send", "receive", "on-message");
|
||||
});
|
||||
}
|
||||
@@ -289,41 +306,16 @@ public class JmsTracingConfigurationTest {
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@Configuration
|
||||
@EnableAutoConfiguration(exclude = KafkaAutoConfiguration.class)
|
||||
static class JmsTestTracingConfiguration {
|
||||
|
||||
@Configuration
|
||||
@EnableAutoConfiguration(exclude = KafkaAutoConfiguration.class)
|
||||
class JmsTestTracingConfiguration {
|
||||
@Bean
|
||||
Tracing tracing(CurrentTraceContext currentTraceContext) {
|
||||
return Tracing.newBuilder().addSpanHandler(spanHandler)
|
||||
.currentTraceContext(currentTraceContext).build();
|
||||
}
|
||||
|
||||
/**
|
||||
* When testing servers or asynchronous clients, spans are reported on a worker
|
||||
* thread. In order to read them on the main thread, we use a concurrent queue. As
|
||||
* some implementations report after a response is sent, we use a blocking queue to
|
||||
* prevent race conditions in tests.
|
||||
*/
|
||||
BlockingQueue<Span> spans = new LinkedBlockingQueue<>();
|
||||
|
||||
void clearSpan() {
|
||||
this.spans.clear();
|
||||
}
|
||||
|
||||
/**
|
||||
* Call this to block until a span was reported.
|
||||
* @return span from queue
|
||||
*/
|
||||
@Bean
|
||||
Callable<Span> takeSpan() {
|
||||
return () -> {
|
||||
Span result = this.spans.poll(3, TimeUnit.SECONDS);
|
||||
assertThat(result).withFailMessage("Span was not reported").isNotNull();
|
||||
return result;
|
||||
};
|
||||
}
|
||||
|
||||
@Bean
|
||||
Tracing tracing(CurrentTraceContext currentTraceContext) {
|
||||
return Tracing.newBuilder().spanReporter(spans::add)
|
||||
.currentTraceContext(currentTraceContext).build();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -19,9 +19,11 @@ package org.springframework.cloud.sleuth.instrument.messaging;
|
||||
import brave.Span;
|
||||
import brave.Tracer;
|
||||
import brave.Tracing;
|
||||
import brave.handler.SpanHandler;
|
||||
import brave.propagation.B3SingleFormat;
|
||||
import brave.propagation.TraceContext;
|
||||
import brave.sampler.Sampler;
|
||||
import brave.test.TestSpanHandler;
|
||||
import org.junit.jupiter.api.AfterEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
@@ -29,8 +31,6 @@ import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.beans.factory.annotation.Qualifier;
|
||||
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
|
||||
import org.springframework.boot.test.context.SpringBootTest;
|
||||
import org.springframework.cloud.sleuth.instrument.util.SpanUtil;
|
||||
import org.springframework.cloud.sleuth.util.ArrayListSpanReporter;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.integration.channel.QueueChannel;
|
||||
@@ -56,17 +56,17 @@ public class TraceContextPropagationChannelInterceptorTests {
|
||||
private Tracing tracing;
|
||||
|
||||
@Autowired
|
||||
private ArrayListSpanReporter reporter;
|
||||
private TestSpanHandler spans;
|
||||
|
||||
@AfterEach
|
||||
public void close() {
|
||||
this.reporter.clear();
|
||||
this.spans.clear();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSpanPropagation() {
|
||||
Span span = this.tracing.tracer().nextSpan().name("http:testSendMessage").start();
|
||||
String expectedSpanId = SpanUtil.idToHex(span.context().spanId());
|
||||
String expectedSpanId = span.context().spanIdString();
|
||||
|
||||
try (Tracer.SpanInScope ws = this.tracing.tracer().withSpanInScope(span)) {
|
||||
this.channel.send(MessageBuilder.withPayload("hi").build());
|
||||
@@ -105,8 +105,8 @@ public class TraceContextPropagationChannelInterceptorTests {
|
||||
}
|
||||
|
||||
@Bean
|
||||
ArrayListSpanReporter reporter() {
|
||||
return new ArrayListSpanReporter();
|
||||
SpanHandler testSpanHandler() {
|
||||
return new TestSpanHandler();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
package org.springframework.cloud.sleuth.instrument.messaging;
|
||||
|
||||
import brave.Tracer;
|
||||
import brave.handler.SpanHandler;
|
||||
import brave.kafka.clients.KafkaTracing;
|
||||
import brave.messaging.MessagingRequest;
|
||||
import brave.messaging.MessagingTracing;
|
||||
@@ -24,6 +25,7 @@ import brave.sampler.Sampler;
|
||||
import brave.sampler.SamplerFunction;
|
||||
import brave.sampler.SamplerFunctions;
|
||||
import brave.spring.rabbit.SpringRabbitTracing;
|
||||
import brave.test.TestSpanHandler;
|
||||
import org.apache.kafka.clients.consumer.Consumer;
|
||||
import org.apache.kafka.clients.consumer.ConsumerRecord;
|
||||
import org.apache.kafka.clients.producer.Producer;
|
||||
@@ -40,7 +42,6 @@ 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.util.ArrayListSpanReporter;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.kafka.annotation.KafkaListener;
|
||||
@@ -61,7 +62,7 @@ public class TraceMessagingAutoConfigurationTests {
|
||||
RabbitTemplate rabbitTemplate;
|
||||
|
||||
@Autowired
|
||||
ArrayListSpanReporter reporter;
|
||||
TestSpanHandler spans;
|
||||
|
||||
@Autowired
|
||||
TestSleuthRabbitBeanPostProcessor postProcessor;
|
||||
@@ -159,8 +160,8 @@ public class TraceMessagingAutoConfigurationTests {
|
||||
}
|
||||
|
||||
@Bean
|
||||
ArrayListSpanReporter reporter() {
|
||||
return new ArrayListSpanReporter();
|
||||
SpanHandler testSpanHandler() {
|
||||
return new TestSpanHandler();
|
||||
}
|
||||
|
||||
@Bean
|
||||
|
||||
@@ -19,9 +19,11 @@ package org.springframework.cloud.sleuth.instrument.messaging;
|
||||
import brave.Span;
|
||||
import brave.Tracer;
|
||||
import brave.Tracing;
|
||||
import brave.handler.SpanHandler;
|
||||
import brave.propagation.B3SingleFormat;
|
||||
import brave.propagation.TraceContext;
|
||||
import brave.sampler.Sampler;
|
||||
import brave.test.TestSpanHandler;
|
||||
import org.junit.jupiter.api.AfterEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
@@ -29,8 +31,6 @@ import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
|
||||
import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
|
||||
import org.springframework.boot.test.context.SpringBootTest;
|
||||
import org.springframework.cloud.sleuth.instrument.util.SpanUtil;
|
||||
import org.springframework.cloud.sleuth.util.ArrayListSpanReporter;
|
||||
import org.springframework.cloud.stream.binder.test.OutputDestination;
|
||||
import org.springframework.cloud.stream.binder.test.TestChannelBinderConfiguration;
|
||||
import org.springframework.cloud.stream.function.StreamBridge;
|
||||
@@ -59,17 +59,17 @@ public class TraceStreamChannelInterceptorTests {
|
||||
private StreamBridge streamBridge;
|
||||
|
||||
@Autowired
|
||||
private ArrayListSpanReporter reporter;
|
||||
private TestSpanHandler spans;
|
||||
|
||||
@AfterEach
|
||||
public void close() {
|
||||
this.reporter.clear();
|
||||
this.spans.clear();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSpanPropagationViaBridge() {
|
||||
Span span = this.tracing.tracer().nextSpan().name("http:testSendMessage").start();
|
||||
String expectedSpanId = SpanUtil.idToHex(span.context().spanId());
|
||||
String expectedSpanId = span.context().spanIdString();
|
||||
|
||||
try (Tracer.SpanInScope ws = this.tracing.tracer().withSpanInScope(span)) {
|
||||
this.streamBridge.send("testSupplier-out-0", "hi");
|
||||
@@ -104,8 +104,8 @@ public class TraceStreamChannelInterceptorTests {
|
||||
}
|
||||
|
||||
@Bean
|
||||
ArrayListSpanReporter reporter() {
|
||||
return new ArrayListSpanReporter();
|
||||
SpanHandler testSpanHandler() {
|
||||
return new TestSpanHandler();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -16,13 +16,14 @@
|
||||
|
||||
package org.springframework.cloud.sleuth.instrument.messaging.issues.issue_943;
|
||||
|
||||
import brave.handler.SpanHandler;
|
||||
import brave.sampler.Sampler;
|
||||
import brave.test.TestSpanHandler;
|
||||
|
||||
import org.springframework.boot.SpringApplication;
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
|
||||
import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;
|
||||
import org.springframework.cloud.sleuth.util.ArrayListSpanReporter;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.ImportResource;
|
||||
import org.springframework.integration.config.EnableIntegration;
|
||||
@@ -51,8 +52,8 @@ public class HelloSpringIntegration {
|
||||
}
|
||||
|
||||
@Bean
|
||||
ArrayListSpanReporter accumulator() {
|
||||
return new ArrayListSpanReporter();
|
||||
SpanHandler testSpanHandler() {
|
||||
return new TestSpanHandler();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -20,10 +20,10 @@ import java.util.stream.Collectors;
|
||||
|
||||
import brave.Span;
|
||||
import brave.Tracer;
|
||||
import brave.test.TestSpanHandler;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import org.springframework.boot.SpringApplication;
|
||||
import org.springframework.cloud.sleuth.util.ArrayListSpanReporter;
|
||||
import org.springframework.context.ConfigurableApplicationContext;
|
||||
import org.springframework.web.client.RestTemplate;
|
||||
|
||||
@@ -59,12 +59,11 @@ public class Issue943Tests {
|
||||
}
|
||||
|
||||
// then
|
||||
ArrayListSpanReporter accumulator = applicationContext
|
||||
.getBean(ArrayListSpanReporter.class);
|
||||
TestSpanHandler spans = applicationContext.getBean(TestSpanHandler.class);
|
||||
then(object).contains("Hellow World Message 1 Persist into DB")
|
||||
.contains("Hellow World Message 2 Persist into DB")
|
||||
.contains("Hellow World Message 3 Persist into DB");
|
||||
then(accumulator.getSpans().stream().filter(
|
||||
then(spans.spans().stream().filter(
|
||||
span -> span.traceId().equals(newSpan.context().traceIdString()))
|
||||
.map(span -> span.tags().getOrDefault("channel",
|
||||
span.tags().get("http.path")))
|
||||
|
||||
@@ -69,6 +69,11 @@
|
||||
<artifactId>spring-boot-starter-test</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>io.zipkin.brave</groupId>
|
||||
<artifactId>brave-tests</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.awaitility</groupId>
|
||||
<artifactId>awaitility</artifactId>
|
||||
|
||||
@@ -21,7 +21,10 @@ import java.util.concurrent.atomic.AtomicReference;
|
||||
|
||||
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.AfterEach;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
@@ -31,7 +34,6 @@ 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.SpanName;
|
||||
import org.springframework.cloud.sleuth.util.ArrayListSpanReporter;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.core.task.SimpleAsyncTaskExecutor;
|
||||
@@ -52,11 +54,11 @@ public class TraceAsyncIntegrationTests {
|
||||
Tracer tracer;
|
||||
|
||||
@Autowired
|
||||
ArrayListSpanReporter reporter;
|
||||
TestSpanHandler spans;
|
||||
|
||||
@BeforeEach
|
||||
public void cleanup() {
|
||||
this.reporter.clear();
|
||||
this.spans.clear();
|
||||
this.classPerformingAsyncLogic.clear();
|
||||
}
|
||||
|
||||
@@ -118,11 +120,11 @@ public class TraceAsyncIntegrationTests {
|
||||
Awaitility.await().atMost(5, SECONDS).untilAsserted(() -> {
|
||||
then(TraceAsyncIntegrationTests.this.classPerformingAsyncLogic.getSpan()
|
||||
.context().traceId()).isEqualTo(span.context().traceId());
|
||||
then(this.reporter.getSpans()).hasSize(2);
|
||||
then(this.spans).hasSize(2);
|
||||
// HTTP
|
||||
then(this.reporter.getSpans().get(0).name()).isEqualTo("http:existing");
|
||||
then(this.spans.get(0).name()).isEqualTo("http:existing");
|
||||
// ASYNC
|
||||
then(this.reporter.getSpans().get(1).tags())
|
||||
then(this.spans.get(1).tags())
|
||||
.containsEntry("class", "ClassPerformingAsyncLogic")
|
||||
.containsEntry("method", "invokeAsynchronousLogic");
|
||||
});
|
||||
@@ -130,8 +132,8 @@ public class TraceAsyncIntegrationTests {
|
||||
|
||||
private void thenANewAsyncSpanGetsCreated() {
|
||||
Awaitility.await().atMost(5, SECONDS).untilAsserted(() -> {
|
||||
then(this.reporter.getSpans()).hasSize(1);
|
||||
zipkin2.Span storedSpan = this.reporter.getSpans().get(0);
|
||||
then(this.spans).hasSize(1);
|
||||
MutableSpan storedSpan = this.spans.get(0);
|
||||
then(storedSpan.name()).isEqualTo("invoke-asynchronous-logic");
|
||||
then(storedSpan.tags()).containsEntry("class", "ClassPerformingAsyncLogic")
|
||||
.containsEntry("method", "invokeAsynchronousLogic");
|
||||
@@ -143,11 +145,11 @@ public class TraceAsyncIntegrationTests {
|
||||
Awaitility.await().atMost(5, SECONDS).untilAsserted(() -> {
|
||||
then(TraceAsyncIntegrationTests.this.classPerformingAsyncLogic.getSpan()
|
||||
.context().traceId()).isEqualTo(span.context().traceId());
|
||||
then(this.reporter.getSpans()).hasSize(2);
|
||||
then(this.spans).hasSize(2);
|
||||
// HTTP
|
||||
then(this.reporter.getSpans().get(0).name()).isEqualTo("http:existing");
|
||||
then(this.spans.get(0).name()).isEqualTo("http:existing");
|
||||
// ASYNC
|
||||
then(this.reporter.getSpans().get(1).tags())
|
||||
then(this.spans.get(1).tags())
|
||||
.containsEntry("class", "ClassPerformingAsyncLogic")
|
||||
.containsEntry("method", "customNameInvokeAsynchronousLogic");
|
||||
});
|
||||
@@ -155,8 +157,8 @@ public class TraceAsyncIntegrationTests {
|
||||
|
||||
private void thenAsyncSpanHasCustomName() {
|
||||
Awaitility.await().atMost(5, SECONDS).untilAsserted(() -> {
|
||||
then(this.reporter.getSpans()).hasSize(1);
|
||||
zipkin2.Span storedSpan = this.reporter.getSpans().get(0);
|
||||
then(this.spans).hasSize(1);
|
||||
MutableSpan storedSpan = this.spans.get(0);
|
||||
then(storedSpan.name()).isEqualTo("foo");
|
||||
then(storedSpan.tags()).containsEntry("class", "ClassPerformingAsyncLogic")
|
||||
.containsEntry("method", "customNameInvokeAsynchronousLogic");
|
||||
@@ -165,7 +167,7 @@ public class TraceAsyncIntegrationTests {
|
||||
|
||||
@AfterEach
|
||||
public void cleanTrace() {
|
||||
this.reporter.clear();
|
||||
this.spans.clear();
|
||||
}
|
||||
|
||||
@EnableAutoConfiguration
|
||||
@@ -184,8 +186,8 @@ public class TraceAsyncIntegrationTests {
|
||||
}
|
||||
|
||||
@Bean
|
||||
ArrayListSpanReporter reporter() {
|
||||
return new ArrayListSpanReporter();
|
||||
SpanHandler testSpanHandler() {
|
||||
return new TestSpanHandler();
|
||||
}
|
||||
|
||||
@Bean
|
||||
|
||||
@@ -30,8 +30,11 @@ import javax.servlet.http.HttpServletResponse;
|
||||
|
||||
import brave.Span;
|
||||
import brave.Tracer;
|
||||
import brave.handler.MutableSpan;
|
||||
import brave.handler.SpanHandler;
|
||||
import brave.sampler.Sampler;
|
||||
import brave.servlet.TracingFilter;
|
||||
import brave.test.TestSpanHandler;
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import org.junit.jupiter.api.AfterEach;
|
||||
@@ -43,7 +46,6 @@ 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.util.ArrayListSpanReporter;
|
||||
import org.springframework.cloud.sleuth.util.SpanUtil;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
@@ -78,7 +80,7 @@ public class TraceFilterIntegrationTests extends AbstractMvcIntegrationTest {
|
||||
MyFilter myFilter;
|
||||
|
||||
@Autowired
|
||||
ArrayListSpanReporter reporter;
|
||||
TestSpanHandler spans;
|
||||
|
||||
@Autowired
|
||||
Tracer tracer;
|
||||
@@ -86,15 +88,15 @@ public class TraceFilterIntegrationTests extends AbstractMvcIntegrationTest {
|
||||
@BeforeEach
|
||||
@AfterEach
|
||||
public void clearSpans() {
|
||||
this.reporter.clear();
|
||||
this.spans.clear();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void should_create_a_trace() throws Exception {
|
||||
whenSentPingWithoutTracingData();
|
||||
|
||||
then(this.reporter.getSpans()).hasSize(1);
|
||||
zipkin2.Span span = this.reporter.getSpans().get(0);
|
||||
then(this.spans).hasSize(1);
|
||||
MutableSpan span = this.spans.get(0);
|
||||
then(span.tags()).containsKey(TraceWebFilter.MVC_CONTROLLER_CLASS_KEY)
|
||||
.containsKey(TraceWebFilter.MVC_CONTROLLER_METHOD_KEY);
|
||||
then(this.tracer.currentSpan()).isNull();
|
||||
@@ -108,7 +110,7 @@ public class TraceFilterIntegrationTests extends AbstractMvcIntegrationTest {
|
||||
// https://github.com/spring-cloud/spring-cloud-sleuth/issues/327
|
||||
// we don't want to respond with any tracing data
|
||||
then(notSampledHeaderIsPresent(mvcResult)).isEqualTo(false);
|
||||
then(this.reporter.getSpans()).isEmpty();
|
||||
then(this.spans).isEmpty();
|
||||
then(this.tracer.currentSpan()).isNull();
|
||||
}
|
||||
|
||||
@@ -119,7 +121,7 @@ public class TraceFilterIntegrationTests extends AbstractMvcIntegrationTest {
|
||||
|
||||
whenSentPingWithTraceId(expectedTraceId);
|
||||
|
||||
then(this.reporter.getSpans()).hasSize(1);
|
||||
then(this.spans).hasSize(1);
|
||||
then(this.tracer.currentSpan()).isNull();
|
||||
|
||||
}
|
||||
@@ -131,7 +133,7 @@ public class TraceFilterIntegrationTests extends AbstractMvcIntegrationTest {
|
||||
whenSentPingWithTraceId(expectedTraceId);
|
||||
|
||||
then(MDC.getCopyOfContextMap()).isEmpty();
|
||||
then(this.reporter.getSpans()).hasSize(1);
|
||||
then(this.spans).hasSize(1);
|
||||
then(this.tracer.currentSpan()).isNull();
|
||||
}
|
||||
|
||||
@@ -155,7 +157,7 @@ public class TraceFilterIntegrationTests extends AbstractMvcIntegrationTest {
|
||||
this.mockMvc.perform(asyncDispatch(mvcResult)).andExpect(status().isOk())
|
||||
.andReturn();
|
||||
|
||||
Optional<zipkin2.Span> taggedSpan = this.reporter.getSpans().stream()
|
||||
Optional<MutableSpan> taggedSpan = this.spans.spans().stream()
|
||||
.filter(span -> span.tags().containsKey("tag")).findFirst();
|
||||
then(taggedSpan.isPresent()).isTrue();
|
||||
then(taggedSpan.get().tags()).containsEntry("tag", "value")
|
||||
@@ -172,8 +174,8 @@ public class TraceFilterIntegrationTests extends AbstractMvcIntegrationTest {
|
||||
whenSentToNonExistentEndpointWithTraceId(expectedTraceId);
|
||||
|
||||
// it's a span with the same ids
|
||||
then(this.reporter.getSpans()).hasSize(1);
|
||||
zipkin2.Span serverSpan = this.reporter.getSpans().get(0);
|
||||
then(this.spans).hasSize(1);
|
||||
MutableSpan serverSpan = this.spans.get(0);
|
||||
then(serverSpan.tags()).containsEntry("custom", "tag")
|
||||
.containsEntry("http.status_code", "404");
|
||||
then(this.tracer.currentSpan()).isNull();
|
||||
@@ -194,8 +196,8 @@ public class TraceFilterIntegrationTests extends AbstractMvcIntegrationTest {
|
||||
|
||||
// we need to dump the span cause it's not in TracingFilter since TF
|
||||
// has also error dispatch and the ErrorController would report the span
|
||||
then(this.reporter.getSpans()).hasSize(1);
|
||||
then(this.reporter.getSpans().get(0).tags()).containsEntry("error",
|
||||
then(this.spans).hasSize(1);
|
||||
then(this.spans.get(0).tags()).containsEntry("error",
|
||||
"Request processing failed; nested exception is java.lang.RuntimeException");
|
||||
}
|
||||
|
||||
@@ -207,9 +209,8 @@ public class TraceFilterIntegrationTests extends AbstractMvcIntegrationTest {
|
||||
whenSentRequestWithTraceIdAndNoSpanId(expectedTraceId);
|
||||
whenSentRequestWithTraceIdAndNoSpanId(expectedTraceId);
|
||||
|
||||
then(this.reporter.getSpans().stream()
|
||||
.filter(span -> span.id().equals(span.traceId())).findAny().isPresent())
|
||||
.as("a root span exists").isTrue();
|
||||
then(this.spans.spans().stream().filter(span -> span.id().equals(span.traceId()))
|
||||
.findAny().isPresent()).as("a root span exists").isTrue();
|
||||
then(this.tracer.currentSpan()).isNull();
|
||||
}
|
||||
|
||||
@@ -222,8 +223,8 @@ public class TraceFilterIntegrationTests extends AbstractMvcIntegrationTest {
|
||||
|
||||
then(mvcResult.getResponse().getHeader("ZIPKIN-TRACE-ID"))
|
||||
.isEqualTo(SpanUtil.idToHex(expectedTraceId));
|
||||
then(this.reporter.getSpans()).hasSize(1);
|
||||
then(this.reporter.getSpans().get(0).tags()).containsEntry("custom", "tag");
|
||||
then(this.spans).hasSize(1);
|
||||
then(this.spans.get(0).tags()).containsEntry("custom", "tag");
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -310,8 +311,8 @@ public class TraceFilterIntegrationTests extends AbstractMvcIntegrationTest {
|
||||
private static final Log log = LogFactory.getLog(Config.class);
|
||||
|
||||
@Bean
|
||||
public ArrayListSpanReporter testSpanReporter() {
|
||||
return new ArrayListSpanReporter();
|
||||
SpanHandler testSpanHandler() {
|
||||
return new TestSpanHandler();
|
||||
}
|
||||
|
||||
@Bean
|
||||
|
||||
@@ -30,7 +30,9 @@ import javax.servlet.ServletResponse;
|
||||
|
||||
import brave.Span;
|
||||
import brave.Tracing;
|
||||
import brave.handler.SpanHandler;
|
||||
import brave.sampler.Sampler;
|
||||
import brave.test.TestSpanHandler;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
@@ -38,7 +40,6 @@ import org.springframework.beans.factory.annotation.Qualifier;
|
||||
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
|
||||
import org.springframework.boot.test.context.SpringBootTest;
|
||||
import org.springframework.boot.web.servlet.FilterRegistrationBean;
|
||||
import org.springframework.cloud.sleuth.util.ArrayListSpanReporter;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.core.env.Environment;
|
||||
@@ -69,7 +70,7 @@ public class TraceFilterWebIntegrationMultipleFiltersTests {
|
||||
MyFilter myFilter;
|
||||
|
||||
@Autowired
|
||||
ArrayListSpanReporter reporter;
|
||||
TestSpanHandler spans;
|
||||
|
||||
// issue #550
|
||||
@Autowired
|
||||
@@ -93,7 +94,7 @@ public class TraceFilterWebIntegrationMultipleFiltersTests {
|
||||
|
||||
then(this.tracer.tracer().currentSpan()).isNull();
|
||||
then(this.myFilter.getSpan().get()).isNotNull();
|
||||
then(this.reporter.getSpans()).isNotEmpty();
|
||||
then(this.spans).isNotEmpty();
|
||||
}
|
||||
|
||||
private int port() {
|
||||
@@ -152,8 +153,8 @@ public class TraceFilterWebIntegrationMultipleFiltersTests {
|
||||
}
|
||||
|
||||
@Bean
|
||||
ArrayListSpanReporter reporter() {
|
||||
return new ArrayListSpanReporter();
|
||||
SpanHandler testSpanHandler() {
|
||||
return new TestSpanHandler();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -32,22 +32,21 @@ import brave.propagation.CurrentTraceContext.Scope;
|
||||
import brave.propagation.TraceContext;
|
||||
import brave.sampler.Sampler;
|
||||
import brave.sampler.SamplerFunction;
|
||||
import brave.test.IntegrationTestSpanHandler;
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import org.assertj.core.api.BDDAssertions;
|
||||
import org.junit.jupiter.api.AfterEach;
|
||||
import org.junit.ClassRule;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.junit.jupiter.api.extension.ExtendWith;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import zipkin2.Span;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
|
||||
import org.springframework.boot.test.context.SpringBootTest;
|
||||
import org.springframework.boot.test.system.CapturedOutput;
|
||||
import org.springframework.boot.test.system.OutputCaptureExtension;
|
||||
import org.springframework.cloud.sleuth.util.BlockingQueueSpanReporter;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.core.env.Environment;
|
||||
@@ -71,15 +70,15 @@ import static org.assertj.core.api.BDDAssertions.then;
|
||||
@ExtendWith(OutputCaptureExtension.class)
|
||||
public class TraceFilterWebIntegrationTests {
|
||||
|
||||
@ClassRule
|
||||
public static IntegrationTestSpanHandler spanHandler = new IntegrationTestSpanHandler();
|
||||
|
||||
private static final Logger log = LoggerFactory
|
||||
.getLogger(TraceFilterWebIntegrationTests.class);
|
||||
|
||||
@Autowired
|
||||
CurrentTraceContext currentTraceContext;
|
||||
|
||||
@Autowired
|
||||
BlockingQueueSpanReporter reporter;
|
||||
|
||||
@Autowired
|
||||
@HttpServerSampler
|
||||
SamplerFunction<HttpRequest> sampler;
|
||||
@@ -87,18 +86,13 @@ public class TraceFilterWebIntegrationTests {
|
||||
@Autowired
|
||||
Environment environment;
|
||||
|
||||
@AfterEach
|
||||
public void cleanup() {
|
||||
this.reporter.assertEmpty();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void should_tag_url() {
|
||||
new RestTemplate().getForObject("http://localhost:" + port() + "/good",
|
||||
String.class);
|
||||
|
||||
then(this.currentTraceContext.get()).isNull();
|
||||
then(this.reporter.takeSpan().tags()).containsKey("http.url");
|
||||
then(spanHandler.takeRemoteSpan(Kind.SERVER).tags()).containsKey("http.url");
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -113,11 +107,11 @@ public class TraceFilterWebIntegrationTests {
|
||||
}
|
||||
|
||||
then(this.currentTraceContext.get()).isNull();
|
||||
Span fromFirstTraceFilterFlow = this.reporter.takeSpan();
|
||||
MutableSpan fromFirstTraceFilterFlow = spanHandler.takeRemoteSpanWithErrorTag(
|
||||
Kind.SERVER,
|
||||
"Request processing failed; nested exception is java.lang.RuntimeException: Throwing exception");
|
||||
then(fromFirstTraceFilterFlow.tags()).containsEntry("http.method", "GET")
|
||||
.containsEntry("mvc.controller.class", "ExceptionThrowingController")
|
||||
.containsEntry("error",
|
||||
"Request processing failed; nested exception is java.lang.RuntimeException: Throwing exception");
|
||||
.containsEntry("mvc.controller.class", "BasicErrorController");
|
||||
// Trace IDs in logs: issue#714
|
||||
String hex = fromFirstTraceFilterFlow.traceId();
|
||||
thenLogsForExceptionLoggingFilterContainTracingInformation(capture, hex);
|
||||
@@ -144,8 +138,7 @@ public class TraceFilterWebIntegrationTests {
|
||||
}
|
||||
|
||||
then(this.currentTraceContext.get()).isNull();
|
||||
Span span = this.reporter.takeSpan();
|
||||
then(span.kind().ordinal()).isEqualTo(Span.Kind.SERVER.ordinal());
|
||||
MutableSpan span = spanHandler.takeRemoteSpanWithErrorTag(Kind.SERVER, "400");
|
||||
then(span.tags()).containsEntry("http.status_code", "400");
|
||||
then(span.tags()).containsEntry("http.path", "/test_bad_request");
|
||||
}
|
||||
@@ -177,8 +170,8 @@ public class TraceFilterWebIntegrationTests {
|
||||
}
|
||||
|
||||
@Bean
|
||||
BlockingQueueSpanReporter reporter() {
|
||||
return new BlockingQueueSpanReporter();
|
||||
SpanHandler testSpanHandler() {
|
||||
return spanHandler;
|
||||
}
|
||||
|
||||
@Bean
|
||||
|
||||
@@ -21,20 +21,22 @@ import java.util.concurrent.Callable;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import brave.Span;
|
||||
import brave.Tracing;
|
||||
import brave.handler.MutableSpan;
|
||||
import brave.handler.SpanHandler;
|
||||
import brave.propagation.CurrentTraceContext;
|
||||
import brave.sampler.Sampler;
|
||||
import brave.spring.web.TracingAsyncClientHttpRequestInterceptor;
|
||||
import brave.test.TestSpanHandler;
|
||||
import org.awaitility.Awaitility;
|
||||
import org.junit.jupiter.api.AfterEach;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import zipkin2.Span;
|
||||
|
||||
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.util.ArrayListSpanReporter;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Import;
|
||||
import org.springframework.core.env.Environment;
|
||||
@@ -80,7 +82,7 @@ public class RestTemplateTraceAspectIntegrationTests {
|
||||
Tracing tracer;
|
||||
|
||||
@Autowired
|
||||
ArrayListSpanReporter reporter;
|
||||
TestSpanHandler spans;
|
||||
|
||||
@Autowired
|
||||
RestTemplate restTemplate;
|
||||
@@ -91,7 +93,7 @@ public class RestTemplateTraceAspectIntegrationTests {
|
||||
public void init() {
|
||||
this.mockMvc = MockMvcBuilders.webAppContextSetup(this.context).build();
|
||||
this.controller.reset();
|
||||
this.reporter.clear();
|
||||
this.spans.clear();
|
||||
}
|
||||
|
||||
@BeforeEach
|
||||
@@ -143,7 +145,7 @@ public class RestTemplateTraceAspectIntegrationTests {
|
||||
whenARequestIsSentToASyncEndpointThatShouldBeFilteredOut();
|
||||
|
||||
then(this.currentTraceContext.get()).isNull();
|
||||
then(this.reporter.getSpans()).isEmpty();
|
||||
then(this.spans).isEmpty();
|
||||
}
|
||||
|
||||
private void whenARequestIsSentToAnAsyncRestTemplateEndpoint() throws Exception {
|
||||
@@ -170,7 +172,7 @@ public class RestTemplateTraceAspectIntegrationTests {
|
||||
// Brave was never designed to run tests of server and client in one test
|
||||
// that's why we have to pick only CLIENT side
|
||||
private void thenClientKindIsReported() {
|
||||
assertThat(this.reporter.getSpans().stream().map(Span::kind)
|
||||
assertThat(this.spans.spans().stream().map(MutableSpan::kind)
|
||||
.collect(Collectors.toList())).contains(Span.Kind.CLIENT);
|
||||
}
|
||||
|
||||
@@ -209,8 +211,8 @@ public class RestTemplateTraceAspectIntegrationTests {
|
||||
}
|
||||
|
||||
@Bean
|
||||
ArrayListSpanReporter reporter() {
|
||||
return new ArrayListSpanReporter();
|
||||
SpanHandler testSpanHandler() {
|
||||
return new TestSpanHandler();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -20,19 +20,21 @@ import java.util.ArrayList;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import brave.Span;
|
||||
import brave.Tracer;
|
||||
import brave.Tracing;
|
||||
import brave.handler.MutableSpan;
|
||||
import brave.handler.SpanHandler;
|
||||
import brave.sampler.Sampler;
|
||||
import brave.test.TestSpanHandler;
|
||||
import org.assertj.core.api.BDDAssertions;
|
||||
import org.awaitility.Awaitility;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import zipkin2.Span;
|
||||
|
||||
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.util.ArrayListSpanReporter;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.core.env.Environment;
|
||||
@@ -61,14 +63,14 @@ public class TraceWebAsyncClientAutoConfigurationTests {
|
||||
Environment environment;
|
||||
|
||||
@Autowired
|
||||
ArrayListSpanReporter accumulator;
|
||||
TestSpanHandler spans;
|
||||
|
||||
@Autowired
|
||||
Tracing tracer;
|
||||
|
||||
@BeforeEach
|
||||
public void setup() {
|
||||
this.accumulator.clear();
|
||||
this.spans.clear();
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -89,17 +91,17 @@ public class TraceWebAsyncClientAutoConfigurationTests {
|
||||
}
|
||||
|
||||
Awaitility.await().untilAsserted(() -> {
|
||||
then(this.accumulator.getSpans().stream()
|
||||
then(this.spans.spans().stream()
|
||||
.filter(span -> Span.Kind.CLIENT == span.kind()).findFirst().get())
|
||||
.matches(span -> span.duration() >= TimeUnit.MILLISECONDS
|
||||
.toMicros(100));
|
||||
.matches(span -> span.finishTimestamp()
|
||||
- span.startTimestamp() >= TimeUnit.MILLISECONDS
|
||||
.toMicros(100));
|
||||
then(this.tracer.tracer().currentSpan()).isNull();
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
public void should_close_span_upon_failure_callback()
|
||||
throws ExecutionException, InterruptedException {
|
||||
public void should_close_span_upon_failure_callback() {
|
||||
ListenableFuture<ResponseEntity<String>> future;
|
||||
try {
|
||||
future = this.asyncRestTemplate.getForEntity(
|
||||
@@ -111,10 +113,10 @@ public class TraceWebAsyncClientAutoConfigurationTests {
|
||||
}
|
||||
|
||||
Awaitility.await().untilAsserted(() -> {
|
||||
Span reportedRpcSpan = new ArrayList<>(this.accumulator.getSpans()).stream()
|
||||
MutableSpan reportedRpcSpan = new ArrayList<>(this.spans.spans()).stream()
|
||||
.filter(span -> Span.Kind.CLIENT == span.kind()).findFirst().get();
|
||||
then(reportedRpcSpan).matches(
|
||||
span -> span.duration() >= TimeUnit.MILLISECONDS.toMicros(100));
|
||||
then(reportedRpcSpan).matches(span -> span.finishTimestamp()
|
||||
- span.startTimestamp() >= TimeUnit.MILLISECONDS.toMicros(100));
|
||||
then(reportedRpcSpan.tags()).containsKey("error");
|
||||
then(this.tracer.tracer().currentSpan()).isNull();
|
||||
});
|
||||
@@ -132,8 +134,8 @@ public class TraceWebAsyncClientAutoConfigurationTests {
|
||||
public static class TestConfiguration {
|
||||
|
||||
@Bean
|
||||
ArrayListSpanReporter reporter() {
|
||||
return new ArrayListSpanReporter();
|
||||
SpanHandler testSpanHandler() {
|
||||
return new TestSpanHandler();
|
||||
}
|
||||
|
||||
@Bean
|
||||
|
||||
@@ -22,8 +22,10 @@ import javax.servlet.http.HttpServletRequest;
|
||||
|
||||
import brave.Span;
|
||||
import brave.Tracing;
|
||||
import brave.handler.SpanHandler;
|
||||
import brave.propagation.CurrentTraceContext;
|
||||
import brave.sampler.Sampler;
|
||||
import brave.test.TestSpanHandler;
|
||||
import com.fasterxml.jackson.annotation.JsonInclude;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.slf4j.Logger;
|
||||
@@ -34,7 +36,6 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
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.util.ArrayListSpanReporter;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
@@ -58,7 +59,7 @@ public class Issue585Tests {
|
||||
CurrentTraceContext currentTraceContext;
|
||||
|
||||
@Autowired
|
||||
ArrayListSpanReporter reporter;
|
||||
TestSpanHandler spans;
|
||||
|
||||
@LocalServerPort
|
||||
int port;
|
||||
@@ -71,7 +72,7 @@ public class Issue585Tests {
|
||||
|
||||
then(this.currentTraceContext.get()).isNull();
|
||||
then(entity.getStatusCode().value()).isEqualTo(500);
|
||||
then(this.reporter.getSpans().get(0).tags()).containsEntry("custom", "tag")
|
||||
then(this.spans.get(0).tags()).containsEntry("custom", "tag")
|
||||
.containsKeys("error");
|
||||
}
|
||||
|
||||
@@ -81,8 +82,8 @@ public class Issue585Tests {
|
||||
class TestConfig {
|
||||
|
||||
@Bean
|
||||
ArrayListSpanReporter testSpanReporter() {
|
||||
return new ArrayListSpanReporter();
|
||||
SpanHandler testSpanHandler() {
|
||||
return new TestSpanHandler();
|
||||
}
|
||||
|
||||
@Bean
|
||||
|
||||
@@ -16,10 +16,11 @@
|
||||
|
||||
package org.springframework.cloud.sleuth.instrument.web.view;
|
||||
|
||||
import brave.handler.SpanHandler;
|
||||
import brave.sampler.Sampler;
|
||||
import brave.test.TestSpanHandler;
|
||||
|
||||
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
|
||||
import org.springframework.cloud.sleuth.util.ArrayListSpanReporter;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
|
||||
@@ -35,8 +36,8 @@ public class Issue469 extends WebMvcConfigurerAdapter {
|
||||
}
|
||||
|
||||
@Bean
|
||||
ArrayListSpanReporter reporter() {
|
||||
return new ArrayListSpanReporter();
|
||||
SpanHandler testSpanHandler() {
|
||||
return new TestSpanHandler();
|
||||
}
|
||||
|
||||
@Bean
|
||||
|
||||
@@ -16,11 +16,11 @@
|
||||
|
||||
package org.springframework.cloud.sleuth.instrument.web.view;
|
||||
|
||||
import brave.test.TestSpanHandler;
|
||||
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.util.ArrayListSpanReporter;
|
||||
import org.springframework.core.env.Environment;
|
||||
import org.springframework.test.context.TestPropertySource;
|
||||
import org.springframework.web.client.RestTemplate;
|
||||
@@ -34,7 +34,7 @@ import static org.assertj.core.api.BDDAssertions.then;
|
||||
public class Issue469Tests {
|
||||
|
||||
@Autowired
|
||||
ArrayListSpanReporter reporter;
|
||||
TestSpanHandler spans;
|
||||
|
||||
@Autowired
|
||||
Environment environment;
|
||||
@@ -42,8 +42,7 @@ public class Issue469Tests {
|
||||
RestTemplate restTemplate = new RestTemplate();
|
||||
|
||||
@Test
|
||||
public void should_not_result_in_tracing_exceptions_when_using_view_controllers()
|
||||
throws Exception {
|
||||
public void should_not_result_in_tracing_exceptions_when_using_view_controllers() {
|
||||
try {
|
||||
this.restTemplate.getForObject("http://localhost:" + port() + "/welcome",
|
||||
String.class);
|
||||
@@ -53,7 +52,7 @@ public class Issue469Tests {
|
||||
then(e).hasMessageContaining("404");
|
||||
}
|
||||
|
||||
then(this.reporter.getSpans()).isNotEmpty();
|
||||
then(this.spans).isNotEmpty();
|
||||
}
|
||||
|
||||
private int port() {
|
||||
|
||||
@@ -75,6 +75,11 @@
|
||||
<artifactId>spring-boot-starter-test</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>io.zipkin.brave</groupId>
|
||||
<artifactId>brave-tests</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.awaitility</groupId>
|
||||
<artifactId>awaitility</artifactId>
|
||||
|
||||
@@ -21,7 +21,10 @@ import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
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;
|
||||
@@ -31,7 +34,6 @@ import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import reactor.core.publisher.Flux;
|
||||
import reactor.core.publisher.Mono;
|
||||
import zipkin2.Span;
|
||||
|
||||
import org.springframework.boot.WebApplicationType;
|
||||
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
|
||||
@@ -41,7 +43,6 @@ import org.springframework.boot.test.system.OutputCaptureExtension;
|
||||
import org.springframework.cloud.context.refresh.ContextRefresher;
|
||||
import org.springframework.cloud.sleuth.instrument.reactor.Issue866Configuration;
|
||||
import org.springframework.cloud.sleuth.instrument.reactor.TraceReactorAutoConfigurationAccessorConfiguration;
|
||||
import org.springframework.cloud.sleuth.util.ArrayListSpanReporter;
|
||||
import org.springframework.context.ConfigurableApplicationContext;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
@@ -114,30 +115,30 @@ public class FlatMapTests {
|
||||
|
||||
private void assertReactorTracing(ConfigurableApplicationContext context,
|
||||
CapturedOutput capture) {
|
||||
ArrayListSpanReporter accumulator = context.getBean(ArrayListSpanReporter.class);
|
||||
TestSpanHandler spans = context.getBean(TestSpanHandler.class);
|
||||
int port = context.getBean(Environment.class).getProperty("local.server.port",
|
||||
Integer.class);
|
||||
RequestSender sender = context.getBean(RequestSender.class);
|
||||
TestConfiguration config = context.getBean(TestConfiguration.class);
|
||||
FactoryUser factoryUser = context.getBean(FactoryUser.class);
|
||||
sender.port = port;
|
||||
accumulator.clear();
|
||||
spans.clear();
|
||||
|
||||
Awaitility.await().untilAsserted(() -> {
|
||||
// when
|
||||
LOGGER.info("Start");
|
||||
accumulator.clear();
|
||||
String firstTraceId = flatMapTraceId(accumulator, callFlatMap(port).block());
|
||||
spans.clear();
|
||||
String firstTraceId = flatMapTraceId(spans, callFlatMap(port).block());
|
||||
// then
|
||||
LOGGER.info("Checking first trace id");
|
||||
thenAllWebClientCallsHaveSameTraceId(firstTraceId, sender);
|
||||
thenSpanInFooHasSameTraceId(firstTraceId, config);
|
||||
accumulator.clear();
|
||||
spans.clear();
|
||||
LOGGER.info("All web client calls have same trace id");
|
||||
|
||||
// when
|
||||
LOGGER.info("Second trace start");
|
||||
String secondTraceId = flatMapTraceId(accumulator, callFlatMap(port).block());
|
||||
String secondTraceId = flatMapTraceId(spans, callFlatMap(port).block());
|
||||
// then
|
||||
then(firstTraceId).as("Id will not be reused between calls")
|
||||
.isNotEqualTo(secondTraceId);
|
||||
@@ -174,15 +175,14 @@ public class FlatMapTests {
|
||||
.exchange();
|
||||
}
|
||||
|
||||
private String flatMapTraceId(ArrayListSpanReporter accumulator,
|
||||
ClientResponse response) {
|
||||
private String flatMapTraceId(TestSpanHandler spans, ClientResponse response) {
|
||||
then(response.statusCode().value()).isEqualTo(200);
|
||||
then(accumulator.getSpans()).isNotEmpty();
|
||||
LOGGER.info("Accumulated spans: " + accumulator.getSpans());
|
||||
List<String> traceIdOfFlatMap = accumulator.getSpans().stream()
|
||||
then(spans).isNotEmpty();
|
||||
LOGGER.info("Accumulated spans: " + spans);
|
||||
List<String> traceIdOfFlatMap = spans.spans().stream()
|
||||
.filter(span -> span.tags().containsKey("http.path")
|
||||
&& span.tags().get("http.path").equals("/withFlatMap"))
|
||||
.map(Span::traceId).collect(Collectors.toList());
|
||||
.map(MutableSpan::traceId).collect(Collectors.toList());
|
||||
then(traceIdOfFlatMap).hasSize(1);
|
||||
return traceIdOfFlatMap.get(0);
|
||||
}
|
||||
@@ -224,8 +224,8 @@ public class FlatMapTests {
|
||||
}
|
||||
|
||||
@Bean
|
||||
ArrayListSpanReporter reporter() {
|
||||
return new ArrayListSpanReporter();
|
||||
SpanHandler testSpanHandler() {
|
||||
return new TestSpanHandler();
|
||||
}
|
||||
|
||||
@Bean
|
||||
|
||||
@@ -24,7 +24,6 @@ import reactor.core.CoreSubscriber;
|
||||
import reactor.core.publisher.Mono;
|
||||
import reactor.core.publisher.Operators;
|
||||
import reactor.util.context.Context;
|
||||
import zipkin2.Callback;
|
||||
|
||||
/**
|
||||
* {@link #subscribe} is made for reactor-netty and WebFlux client requests used in tests.
|
||||
@@ -32,8 +31,8 @@ import zipkin2.Callback;
|
||||
* signalling, or missing signals.
|
||||
*
|
||||
* <p>
|
||||
* The implementation forwards signals to the supplied {@link Callback}, enforcing
|
||||
* assumptions about a non-empty, {@link Mono} subscription.
|
||||
* The implementation forwards signals to the supplied {@linkplain BiConsumer callback},
|
||||
* enforcing assumptions about a non-empty, {@link Mono} subscription.
|
||||
*/
|
||||
final class TestHttpCallbackSubscriber implements CoreSubscriber<Integer> {
|
||||
|
||||
|
||||
@@ -64,6 +64,11 @@
|
||||
<artifactId>spring-boot-starter-test</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>io.zipkin.brave</groupId>
|
||||
<artifactId>brave-tests</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.awaitility</groupId>
|
||||
<artifactId>awaitility</artifactId>
|
||||
|
||||
@@ -16,18 +16,19 @@
|
||||
|
||||
package org.springframework.cloud.sleuth.instrument.rpc;
|
||||
|
||||
import brave.handler.SpanHandler;
|
||||
import brave.rpc.RpcRequest;
|
||||
import brave.rpc.RpcRuleSampler;
|
||||
import brave.sampler.Matcher;
|
||||
import brave.sampler.RateLimitingSampler;
|
||||
import brave.sampler.Sampler;
|
||||
import brave.sampler.SamplerFunction;
|
||||
import brave.test.TestSpanHandler;
|
||||
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.util.ArrayListSpanReporter;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
|
||||
@@ -54,8 +55,8 @@ public class TraceRpcAutoConfigurationIntegrationTests {
|
||||
public static class Config {
|
||||
|
||||
@Bean
|
||||
ArrayListSpanReporter reporter() {
|
||||
return new ArrayListSpanReporter();
|
||||
SpanHandler testSpanHandler() {
|
||||
return new TestSpanHandler();
|
||||
}
|
||||
|
||||
// tag::custom_rpc_server_sampler[]
|
||||
|
||||
@@ -60,6 +60,11 @@
|
||||
<artifactId>spring-boot-starter-test</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>io.zipkin.brave</groupId>
|
||||
<artifactId>brave-tests</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.awaitility</groupId>
|
||||
<artifactId>awaitility</artifactId>
|
||||
|
||||
@@ -29,6 +29,7 @@ import java.util.concurrent.ThreadFactory;
|
||||
import brave.Tracer;
|
||||
import brave.Tracing;
|
||||
import brave.propagation.StrictCurrentTraceContext;
|
||||
import brave.test.TestSpanHandler;
|
||||
import org.junit.jupiter.api.AfterEach;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
@@ -38,8 +39,6 @@ import rx.plugins.RxJavaObservableExecutionHook;
|
||||
import rx.plugins.RxJavaPlugins;
|
||||
import rx.plugins.RxJavaSchedulersHook;
|
||||
|
||||
import org.springframework.cloud.sleuth.util.ArrayListSpanReporter;
|
||||
|
||||
import static org.assertj.core.api.BDDAssertions.then;
|
||||
|
||||
/**
|
||||
@@ -53,17 +52,17 @@ public class SleuthRxJavaSchedulersHookTests {
|
||||
|
||||
StrictCurrentTraceContext currentTraceContext = StrictCurrentTraceContext.create();
|
||||
|
||||
ArrayListSpanReporter reporter = new ArrayListSpanReporter();
|
||||
TestSpanHandler spans = new TestSpanHandler();
|
||||
|
||||
Tracing tracing = Tracing.newBuilder().currentTraceContext(this.currentTraceContext)
|
||||
.spanReporter(this.reporter).build();
|
||||
.addSpanHandler(this.spans).build();
|
||||
|
||||
Tracer tracer = this.tracing.tracer();
|
||||
|
||||
@AfterEach
|
||||
public void clean() {
|
||||
this.tracing.close();
|
||||
this.reporter.clear();
|
||||
this.spans.clear();
|
||||
this.currentTraceContext.close();
|
||||
}
|
||||
|
||||
@@ -101,7 +100,7 @@ public class SleuthRxJavaSchedulersHookTests {
|
||||
|
||||
then(action).isInstanceOf(SleuthRxJavaSchedulersHook.TraceAction.class);
|
||||
then(caller.toString()).isEqualTo("called_from_schedulers_hook");
|
||||
then(this.reporter.getSpans()).isNotEmpty();
|
||||
then(this.spans).isNotEmpty();
|
||||
then(this.tracer.currentSpan()).isNull();
|
||||
}
|
||||
|
||||
@@ -122,7 +121,7 @@ public class SleuthRxJavaSchedulersHookTests {
|
||||
|
||||
hello.get();
|
||||
|
||||
then(this.reporter.getSpans()).isEmpty();
|
||||
then(this.spans).isEmpty();
|
||||
then(this.tracer.currentSpan()).isNull();
|
||||
}
|
||||
|
||||
|
||||
@@ -18,7 +18,9 @@ package org.springframework.cloud.sleuth.instrument.rxjava;
|
||||
|
||||
import brave.Span;
|
||||
import brave.Tracer;
|
||||
import brave.handler.SpanHandler;
|
||||
import brave.sampler.Sampler;
|
||||
import brave.test.TestSpanHandler;
|
||||
import org.junit.jupiter.api.AfterAll;
|
||||
import org.junit.jupiter.api.BeforeAll;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
@@ -31,7 +33,6 @@ import rx.schedulers.Schedulers;
|
||||
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.util.ArrayListSpanReporter;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.test.annotation.DirtiesContext;
|
||||
@@ -45,7 +46,7 @@ import static org.awaitility.Awaitility.await;
|
||||
public class SleuthRxJavaTests {
|
||||
|
||||
@Autowired
|
||||
ArrayListSpanReporter reporter;
|
||||
TestSpanHandler spans;
|
||||
|
||||
@Autowired
|
||||
Tracer tracer;
|
||||
@@ -60,7 +61,7 @@ public class SleuthRxJavaTests {
|
||||
|
||||
@BeforeEach
|
||||
public void clean() {
|
||||
this.reporter.clear();
|
||||
this.spans.clear();
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -73,11 +74,9 @@ public class SleuthRxJavaTests {
|
||||
|
||||
then(this.caller.toString()).isEqualTo("actual_action");
|
||||
then(this.tracer.currentSpan()).isNull();
|
||||
await().atMost(5, SECONDS)
|
||||
.untilAsserted(() -> then(this.reporter.getSpans()).hasSize(1));
|
||||
then(this.reporter.getSpans()).hasSize(1);
|
||||
zipkin2.Span span = this.reporter.getSpans().get(0);
|
||||
then(span.name()).isEqualTo("rxjava");
|
||||
await().atMost(5, SECONDS).untilAsserted(() -> then(this.spans).hasSize(1));
|
||||
then(this.spans).hasSize(1);
|
||||
then(this.spans.get(0).name()).isEqualTo("rxjava");
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -97,9 +96,8 @@ public class SleuthRxJavaTests {
|
||||
then(this.caller.toString()).isEqualTo("actual_action");
|
||||
then(this.tracer.currentSpan()).isNull();
|
||||
// making sure here that no new spans were created or reported as closed
|
||||
then(this.reporter.getSpans()).hasSize(1);
|
||||
zipkin2.Span span = this.reporter.getSpans().get(0);
|
||||
then(span.name()).isEqualTo("current_span");
|
||||
then(this.spans).hasSize(1);
|
||||
then(this.spans.get(0).name()).isEqualTo("current_span");
|
||||
}
|
||||
|
||||
@Configuration
|
||||
@@ -112,8 +110,8 @@ public class SleuthRxJavaTests {
|
||||
}
|
||||
|
||||
@Bean
|
||||
ArrayListSpanReporter spanReporter() {
|
||||
return new ArrayListSpanReporter();
|
||||
SpanHandler testSpanHandler() {
|
||||
return new TestSpanHandler();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -60,6 +60,11 @@
|
||||
<artifactId>spring-boot-starter-test</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>io.zipkin.brave</groupId>
|
||||
<artifactId>brave-tests</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.awaitility</groupId>
|
||||
<artifactId>awaitility</artifactId>
|
||||
|
||||
@@ -21,17 +21,18 @@ import java.util.concurrent.atomic.AtomicBoolean;
|
||||
|
||||
import brave.Span;
|
||||
import brave.Tracing;
|
||||
import brave.handler.MutableSpan;
|
||||
import brave.handler.SpanHandler;
|
||||
import brave.sampler.Sampler;
|
||||
import brave.test.TestSpanHandler;
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import zipkin2.reporter.Reporter;
|
||||
|
||||
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.util.ArrayListSpanReporter;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.scheduling.annotation.EnableScheduling;
|
||||
@@ -56,13 +57,13 @@ public class TracingOnScheduledTests {
|
||||
TestBeanWithScheduledMethodThatThrowsAnException throwsAnException;
|
||||
|
||||
@Autowired
|
||||
ArrayListSpanReporter reporter;
|
||||
TestSpanHandler spans;
|
||||
|
||||
@BeforeEach
|
||||
public void setup() {
|
||||
this.beanWithScheduledMethod.clear();
|
||||
this.beanWithScheduledMethodToBeIgnored.clear();
|
||||
this.reporter.clear();
|
||||
this.spans.clear();
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -104,28 +105,28 @@ public class TracingOnScheduledTests {
|
||||
Span storedSpan = TracingOnScheduledTests.this.beanWithScheduledMethod.getSpan();
|
||||
then(storedSpan).isNotNull();
|
||||
then(storedSpan.context().traceId()).isNotNull();
|
||||
zipkin2.Span foundSpan = this.reporter.getSpans().stream()
|
||||
MutableSpan foundSpan = spans.spans().stream()
|
||||
.filter(span -> !span.tags().containsKey("error")
|
||||
&& span.tags().containsValue("TestBeanWithScheduledMethod"))
|
||||
.findFirst().orElseThrow(() -> new AssertionError("Span is missing"));
|
||||
then(foundSpan.tags()).contains(
|
||||
new AbstractMap.SimpleEntry<>("class", "TestBeanWithScheduledMethod"),
|
||||
new AbstractMap.SimpleEntry<>("method", "scheduledMethod"));
|
||||
then(foundSpan.durationAsLong()).isGreaterThan(0L);
|
||||
then(foundSpan.finishTimestamp()).isGreaterThan(0L);
|
||||
}
|
||||
|
||||
private void spanIsSetOnAScheduledMethodWithErrorTag() {
|
||||
Span storedSpan = TracingOnScheduledTests.this.beanWithScheduledMethod.getSpan();
|
||||
then(storedSpan).isNotNull();
|
||||
then(storedSpan.context().traceId()).isNotNull();
|
||||
zipkin2.Span foundSpan = this.reporter.getSpans().stream()
|
||||
MutableSpan foundSpan = spans.spans().stream()
|
||||
.filter(span -> span.tags().containsKey("error")).findFirst()
|
||||
.orElseThrow(() -> new AssertionError("Span is missing"));
|
||||
then(foundSpan.tags()).contains(
|
||||
new AbstractMap.SimpleEntry<>("class",
|
||||
"TestBeanWithScheduledMethodThatThrowsAnException"),
|
||||
new AbstractMap.SimpleEntry<>("method", "scheduledMethod"));
|
||||
then(foundSpan.durationAsLong()).isGreaterThan(0L);
|
||||
then(foundSpan.finishTimestamp()).isGreaterThan(0L);
|
||||
then(foundSpan.tags().get("error")).isNotEmpty();
|
||||
}
|
||||
|
||||
@@ -142,8 +143,8 @@ public class TracingOnScheduledTests {
|
||||
class ScheduledTestConfiguration {
|
||||
|
||||
@Bean
|
||||
Reporter<zipkin2.Span> testRepoter() {
|
||||
return new ArrayListSpanReporter();
|
||||
SpanHandler testSpanHandler() {
|
||||
return new TestSpanHandler();
|
||||
}
|
||||
|
||||
@Bean
|
||||
|
||||
@@ -69,6 +69,11 @@
|
||||
<artifactId>spring-boot-starter-test</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>io.zipkin.brave</groupId>
|
||||
<artifactId>brave-tests</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.awaitility</groupId>
|
||||
<artifactId>awaitility</artifactId>
|
||||
|
||||
@@ -18,7 +18,9 @@ package org.springframework.cloud.sleuth.instrument.web;
|
||||
|
||||
import brave.ScopedSpan;
|
||||
import brave.Tracer;
|
||||
import brave.handler.SpanHandler;
|
||||
import brave.sampler.Sampler;
|
||||
import brave.test.TestSpanHandler;
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import org.assertj.core.api.BDDAssertions;
|
||||
@@ -30,7 +32,6 @@ import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
|
||||
import org.springframework.boot.test.context.SpringBootTest;
|
||||
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
|
||||
import org.springframework.boot.web.server.LocalServerPort;
|
||||
import org.springframework.cloud.sleuth.util.ArrayListSpanReporter;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.util.MultiValueMap;
|
||||
@@ -85,8 +86,8 @@ public class GH1102Tests {
|
||||
}
|
||||
|
||||
@Bean
|
||||
ArrayListSpanReporter reporter() {
|
||||
return new ArrayListSpanReporter();
|
||||
SpanHandler testSpanHandler() {
|
||||
return new TestSpanHandler();
|
||||
}
|
||||
|
||||
@Bean
|
||||
|
||||
@@ -16,12 +16,11 @@
|
||||
|
||||
package org.springframework.cloud.sleuth.instrument.web;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import brave.Span;
|
||||
import brave.Tracer;
|
||||
import brave.handler.SpanHandler;
|
||||
import brave.sampler.Sampler;
|
||||
import brave.test.TestSpanHandler;
|
||||
import org.awaitility.Awaitility;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.slf4j.Logger;
|
||||
@@ -33,7 +32,6 @@ import reactor.core.publisher.Mono;
|
||||
import org.springframework.boot.WebApplicationType;
|
||||
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
|
||||
import org.springframework.boot.builder.SpringApplicationBuilder;
|
||||
import org.springframework.cloud.sleuth.util.ArrayListSpanReporter;
|
||||
import org.springframework.context.ConfigurableApplicationContext;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
@@ -65,75 +63,69 @@ public class TraceWebFluxTests {
|
||||
"security.basic.enabled=false",
|
||||
"management.security.enabled=false")
|
||||
.run();
|
||||
ArrayListSpanReporter accumulator = context.getBean(ArrayListSpanReporter.class);
|
||||
TestSpanHandler spans = context.getBean(TestSpanHandler.class);
|
||||
int port = context.getBean(Environment.class).getProperty("local.server.port",
|
||||
Integer.class);
|
||||
Controller2 controller2 = context.getBean(Controller2.class);
|
||||
clean(accumulator, controller2);
|
||||
clean(spans, controller2);
|
||||
|
||||
// when
|
||||
ClientResponse response = whenRequestIsSent(port, "/api/c2/10");
|
||||
// then
|
||||
thenSpanWasReportedWithTags(accumulator, response);
|
||||
clean(accumulator, controller2);
|
||||
thenSpanWasReportedWithTags(spans, response);
|
||||
clean(spans, controller2);
|
||||
|
||||
// when
|
||||
response = whenRequestIsSent(port, "/api/fn/20");
|
||||
// then
|
||||
thenFunctionalSpanWasReportedWithTags(accumulator, response);
|
||||
accumulator.clear();
|
||||
thenFunctionalSpanWasReportedWithTags(spans, response);
|
||||
spans.clear();
|
||||
|
||||
// when
|
||||
ClientResponse nonSampledResponse = whenNonSampledRequestIsSent(port);
|
||||
// then
|
||||
thenNoSpanWasReported(accumulator, nonSampledResponse, controller2);
|
||||
accumulator.clear();
|
||||
thenNoSpanWasReported(spans, nonSampledResponse, controller2);
|
||||
spans.clear();
|
||||
|
||||
// when
|
||||
ClientResponse skippedPatternResponse = whenRequestIsSentToSkippedPattern(port);
|
||||
// then
|
||||
thenNoSpanWasReported(accumulator, skippedPatternResponse, controller2);
|
||||
thenNoSpanWasReported(spans, skippedPatternResponse, controller2);
|
||||
|
||||
// cleanup
|
||||
context.close();
|
||||
}
|
||||
|
||||
private void clean(ArrayListSpanReporter accumulator, Controller2 controller2) {
|
||||
accumulator.clear();
|
||||
private void clean(TestSpanHandler spans, Controller2 controller2) {
|
||||
spans.clear();
|
||||
controller2.span = null;
|
||||
}
|
||||
|
||||
private void thenSpanWasReportedWithTags(ArrayListSpanReporter accumulator,
|
||||
private void thenSpanWasReportedWithTags(TestSpanHandler spans,
|
||||
ClientResponse response) {
|
||||
Awaitility.await()
|
||||
.untilAsserted(() -> then(response.statusCode().value()).isEqualTo(200));
|
||||
List<zipkin2.Span> spans = accumulator.getSpans().stream()
|
||||
.filter(span -> "get /api/c2/{id}".equals(span.name()))
|
||||
.collect(Collectors.toList());
|
||||
then(spans).hasSize(1);
|
||||
then(spans.get(0).name()).isEqualTo("get /api/c2/{id}");
|
||||
then(spans.get(0).name()).isEqualTo("GET /api/c2/{id}");
|
||||
then(spans.get(0).tags()).containsEntry("mvc.controller.method", "successful")
|
||||
.containsEntry("mvc.controller.class", "Controller2");
|
||||
}
|
||||
|
||||
private void thenFunctionalSpanWasReportedWithTags(ArrayListSpanReporter accumulator,
|
||||
private void thenFunctionalSpanWasReportedWithTags(TestSpanHandler spans,
|
||||
ClientResponse response) {
|
||||
Awaitility.await()
|
||||
.untilAsserted(() -> then(response.statusCode().value()).isEqualTo(200));
|
||||
List<zipkin2.Span> spans = accumulator.getSpans().stream()
|
||||
.filter(span -> "get /api/fn/{id}".equals(span.name()))
|
||||
.collect(Collectors.toList());
|
||||
then(spans).hasSize(1);
|
||||
then(spans.get(0).name()).isEqualTo("get /api/fn/{id}");
|
||||
then(spans.get(0).name()).isEqualTo("GET /api/fn/{id}");
|
||||
then(spans.get(0).tags()).hasEntrySatisfying("mvc.controller.class",
|
||||
value -> then(value).startsWith("TraceWebFluxTests$Config$$Lambda$"));
|
||||
}
|
||||
|
||||
private void thenNoSpanWasReported(ArrayListSpanReporter accumulator,
|
||||
ClientResponse response, Controller2 controller2) {
|
||||
private void thenNoSpanWasReported(TestSpanHandler spans, ClientResponse response,
|
||||
Controller2 controller2) {
|
||||
Awaitility.await().untilAsserted(() -> {
|
||||
then(response.statusCode().value()).isEqualTo(200);
|
||||
then(accumulator.getSpans()).isEmpty();
|
||||
then(spans).isEmpty();
|
||||
});
|
||||
then(controller2.span).isNotNull();
|
||||
then(controller2.span.context().traceIdString()).isEqualTo(EXPECTED_TRACE_ID);
|
||||
@@ -176,15 +168,8 @@ public class TraceWebFluxTests {
|
||||
}
|
||||
|
||||
@Bean
|
||||
ArrayListSpanReporter spanReporter() {
|
||||
return new ArrayListSpanReporter() {
|
||||
@Override
|
||||
public List<zipkin2.Span> getSpans() {
|
||||
List<zipkin2.Span> spans = super.getSpans();
|
||||
log.info("Reported the following spans: \n\n" + spans);
|
||||
return spans;
|
||||
}
|
||||
};
|
||||
SpanHandler testSpanHandler() {
|
||||
return new TestSpanHandler();
|
||||
}
|
||||
|
||||
@Bean
|
||||
|
||||
Reference in New Issue
Block a user