Removes Zipkin dependency from all tests (#1645)
Brave's SpanHandler can report natively in other formats which have different constraints than Zipkin and often extensions to the data model. This change ports all tests away from Zipkin's types so that it is more clear what's actually recorded vs what's a side-effect of Zipkin conversion. This removes `BlockingQueueSpanReporter` which was never released, also.
This commit is contained in:
@@ -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.After;
|
||||
@@ -29,8 +32,6 @@ import org.junit.runner.RunWith;
|
||||
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;
|
||||
@@ -58,11 +59,11 @@ public class MessagingApplicationTests extends AbstractIntegrationTest {
|
||||
private static String sampleAppUrl = "http://localhost:" + port;
|
||||
|
||||
@Autowired
|
||||
IntegrationTestZipkinSpanReporter integrationTestSpanCollector;
|
||||
IntegrationTestZipkinSpanHandler testSpanHandler;
|
||||
|
||||
@After
|
||||
public void cleanup() {
|
||||
this.integrationTestSpanCollector.hashedSpans.clear();
|
||||
this.testSpanHandler.spans.clear();
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -107,18 +108,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 + "]")
|
||||
@@ -126,62 +124,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()
|
||||
private Optional<MutableSpan> findLastHttpSpansParent() {
|
||||
return this.testSpanHandler.spans.stream()
|
||||
.filter(span -> "http:/".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();
|
||||
@@ -193,8 +191,8 @@ public class MessagingApplicationTests extends AbstractIntegrationTest {
|
||||
public static class IntegrationSpanCollectorConfig {
|
||||
|
||||
@Bean
|
||||
Reporter<Span> integrationTestZipkinSpanReporter() {
|
||||
return new IntegrationTestZipkinSpanReporter();
|
||||
SpanHandler testSpanHandler() {
|
||||
return new IntegrationTestZipkinSpanHandler();
|
||||
}
|
||||
|
||||
@Bean
|
||||
|
||||
Reference in New Issue
Block a user