From d662a4bf9032769881137958dd789eac46ac4ab6 Mon Sep 17 00:00:00 2001 From: Adrian Cole Date: Fri, 18 Mar 2016 17:41:20 +0800 Subject: [PATCH] Updates to zipkin 0.9 Notably, this removes the "zipkin-web" dependency, as the UI is now collocated on zipkin-server. Other notable changes are Cassandra and Kafka support, as well removing the Brave dependency. --- spring-cloud-sleuth-dependencies/pom.xml | 8 +-- spring-cloud-sleuth-samples/pom.xml | 4 +- .../docker-compose.yml | 22 ++---- ...ator.java => ConvertToZipkinSpanList.java} | 67 ++++--------------- .../zipkin/stream/ZipkinMessageListener.java | 18 ++--- ...java => ConvertToZipkinSpanListTests.java} | 41 ++---------- .../stream/ZipkinMessageListenerTests.java | 8 +-- spring-cloud-sleuth-zipkin/docker-compose.yml | 22 ++---- 8 files changed, 47 insertions(+), 143 deletions(-) rename spring-cloud-sleuth-zipkin-stream/src/main/java/org/springframework/cloud/sleuth/zipkin/stream/{SamplingZipkinSpanIterator.java => ConvertToZipkinSpanList.java} (74%) rename spring-cloud-sleuth-zipkin-stream/src/test/java/org/springframework/cloud/sleuth/zipkin/stream/{SamplingZipkinSpanIteratorTests.java => ConvertToZipkinSpanListTests.java} (70%) diff --git a/spring-cloud-sleuth-dependencies/pom.xml b/spring-cloud-sleuth-dependencies/pom.xml index 6fc572c37..b54f4a2bf 100644 --- a/spring-cloud-sleuth-dependencies/pom.xml +++ b/spring-cloud-sleuth-dependencies/pom.xml @@ -14,10 +14,9 @@ spring-cloud-sleuth-dependencies Spring Cloud Sleuth Dependencies - 3.4.0 1.1.0.BUILD-SNAPSHOT 1.8.4 - 0.7.0 + 0.9.1 @@ -58,11 +57,6 @@ spring-cloud-starter-sleuth ${project.version} - - com.github.kristofa - brave-core - ${brave.version} - org.aspectj aspectjrt diff --git a/spring-cloud-sleuth-samples/pom.xml b/spring-cloud-sleuth-samples/pom.xml index 7ea2f6d0d..49ade4bae 100644 --- a/spring-cloud-sleuth-samples/pom.xml +++ b/spring-cloud-sleuth-samples/pom.xml @@ -62,12 +62,12 @@ io.zipkin.java zipkin - 0.7.0 + 0.9.1 io.zipkin.java zipkin-server - 0.7.0 + 0.9.1 diff --git a/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-zipkin/docker-compose.yml b/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-zipkin/docker-compose.yml index 1cd2aebee..d27933a10 100644 --- a/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-zipkin/docker-compose.yml +++ b/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-zipkin/docker-compose.yml @@ -1,27 +1,15 @@ mysql: - image: openzipkin/zipkin-mysql:1.36.0 + image: openzipkin/zipkin-mysql:1.38.0 ports: - 3306:3306 query: - image: openzipkin/zipkin-java:0.7.0 + image: openzipkin/zipkin-java:0.9.1 environment: - # Remove TRANSPORT_TYPE to disable tracing - - TRANSPORT_TYPE=http - STORAGE_TYPE=mysql - # - JAVA_OPTS=your jvm params here - expose: - - 9411 ports: + # Historical port used for the Zipkin HTTP Api - 9411:9411 + # Zipkin UI used to be on a separate process listening on port 8080 + - 8080:9411 links: - mysql:storage -web: - image: openzipkin/zipkin-web:1.36.0 - environment: - # Remove TRANSPORT_TYPE to disable tracing - - TRANSPORT_TYPE=http - ports: - - 8080:8080 - - 9990:9990 - links: - - query diff --git a/spring-cloud-sleuth-zipkin-stream/src/main/java/org/springframework/cloud/sleuth/zipkin/stream/SamplingZipkinSpanIterator.java b/spring-cloud-sleuth-zipkin-stream/src/main/java/org/springframework/cloud/sleuth/zipkin/stream/ConvertToZipkinSpanList.java similarity index 74% rename from spring-cloud-sleuth-zipkin-stream/src/main/java/org/springframework/cloud/sleuth/zipkin/stream/SamplingZipkinSpanIterator.java rename to spring-cloud-sleuth-zipkin-stream/src/main/java/org/springframework/cloud/sleuth/zipkin/stream/ConvertToZipkinSpanList.java index 99e5c7e3c..4bbeb29f1 100644 --- a/spring-cloud-sleuth-zipkin-stream/src/main/java/org/springframework/cloud/sleuth/zipkin/stream/SamplingZipkinSpanIterator.java +++ b/spring-cloud-sleuth-zipkin-stream/src/main/java/org/springframework/cloud/sleuth/zipkin/stream/ConvertToZipkinSpanList.java @@ -15,10 +15,9 @@ */ package org.springframework.cloud.sleuth.zipkin.stream; +import java.util.ArrayList; import java.util.Arrays; -import java.util.Iterator; import java.util.List; -import java.util.NoSuchElementException; import org.apache.commons.logging.Log; import org.springframework.cloud.sleuth.Span; @@ -30,7 +29,6 @@ import org.springframework.util.StringUtils; import zipkin.BinaryAnnotation; import zipkin.Constants; import zipkin.Endpoint; -import zipkin.Sampler; import zipkin.Span.Builder; /** @@ -40,62 +38,26 @@ import zipkin.Span.Builder; * * @since 1.0.0 */ -final class SamplingZipkinSpanIterator implements Iterator { +final class ConvertToZipkinSpanList { private static final List ZIPKIN_START_EVENTS = Arrays.asList( Constants.CLIENT_RECV, Constants.SERVER_RECV ); private static final Log log = org.apache.commons.logging.LogFactory - .getLog(SamplingZipkinSpanIterator.class); + .getLog(ConvertToZipkinSpanList.class); - private final Sampler sampler; - private final Iterator delegate; - private final Host host; - private zipkin.Span peeked; - - SamplingZipkinSpanIterator(Sampler sampler, Spans input) { - this.sampler = sampler; - this.delegate = input.getSpans().iterator(); - this.host = input.getHost(); - } - - @Override - public boolean hasNext() { - while (this.peeked == null && this.delegate.hasNext()) { - this.peeked = convertAndSample(this.delegate.next(), this.host); - } - return this.peeked != null; - } - - @Override - public zipkin.Span next() { - // implicitly peeks - if (!hasNext()) - throw new NoSuchElementException(); - zipkin.Span result = this.peeked; - this.peeked = null; - return result; - } - - @Override - public void remove() { - throw new UnsupportedOperationException("remove"); - } - - /** - * returns a converted span or null if it is invalid or unsampled. - */ - zipkin.Span convertAndSample(Span input, Host host) { - if (!input.getName().equals("message:" + SleuthSink.INPUT)) { - zipkin.Span result = SamplingZipkinSpanIterator.convert(input, host); - if (this.sampler.isSampled(result.traceId)) { - return result; + static List convert(Spans input) { + Host host = input.getHost(); + List result = new ArrayList<>(input.getSpans().size()); + for (Span span : input.getSpans()) { + if (!span.getName().equals("message:" + SleuthSink.INPUT)) { + result.add(convert(span, host)); + } + else { + log.warn("Message tracing cycle detected for: " + input); } } - else { - log.warn("Message tracing cycle detected for: " + input); - } - return null; + return result; } /** @@ -132,8 +94,7 @@ final class SamplingZipkinSpanIterator implements Iterator { zipkinSpan.traceId(span.getTraceId()); if (span.getParents().size() > 0) { if (span.getParents().size() > 1) { - SamplingZipkinSpanIterator.log - .debug("zipkin doesn't support spans with multiple parents. Omitting " + log.debug("zipkin doesn't support spans with multiple parents. Omitting " + "other parents for " + span); } zipkinSpan.parentId(span.getParents().get(0)); diff --git a/spring-cloud-sleuth-zipkin-stream/src/main/java/org/springframework/cloud/sleuth/zipkin/stream/ZipkinMessageListener.java b/spring-cloud-sleuth-zipkin-stream/src/main/java/org/springframework/cloud/sleuth/zipkin/stream/ZipkinMessageListener.java index 4446a93eb..5e3a0f61c 100644 --- a/spring-cloud-sleuth-zipkin-stream/src/main/java/org/springframework/cloud/sleuth/zipkin/stream/ZipkinMessageListener.java +++ b/spring-cloud-sleuth-zipkin-stream/src/main/java/org/springframework/cloud/sleuth/zipkin/stream/ZipkinMessageListener.java @@ -2,7 +2,7 @@ package org.springframework.cloud.sleuth.zipkin.stream; import java.io.UnsupportedEncodingException; import java.util.Collections; -import java.util.Iterator; +import java.util.List; import java.util.Map; import javax.sql.DataSource; @@ -37,7 +37,9 @@ import zipkin.BinaryAnnotation; import zipkin.BinaryAnnotation.Type; import zipkin.Endpoint; import zipkin.Sampler; +import zipkin.SamplingSpanStoreConsumer; import zipkin.Span.Builder; +import zipkin.SpanConsumer; import zipkin.SpanStore; /** @@ -57,19 +59,17 @@ public class ZipkinMessageListener { private static final org.apache.commons.logging.Log log = org.apache.commons.logging.LogFactory .getLog(ZipkinMessageListener.class); static final String UNKNOWN_PROCESS_ID = "unknown"; + final SpanConsumer consumer; @Autowired - SpanStore spanStore; - - @Autowired - Sampler sampler; + ZipkinMessageListener(SpanStore spanStore, Sampler sampler) { + this.consumer = SamplingSpanStoreConsumer.create(sampler, spanStore); + } @ServiceActivator(inputChannel = SleuthSink.INPUT) public void sink(Spans input) { - Iterator sampled = new SamplingZipkinSpanIterator(this.sampler, input); - if (sampled.hasNext()) { - this.spanStore.accept(sampled); - } + List converted = ConvertToZipkinSpanList.convert(input); + this.consumer.accept(converted); } /** diff --git a/spring-cloud-sleuth-zipkin-stream/src/test/java/org/springframework/cloud/sleuth/zipkin/stream/SamplingZipkinSpanIteratorTests.java b/spring-cloud-sleuth-zipkin-stream/src/test/java/org/springframework/cloud/sleuth/zipkin/stream/ConvertToZipkinSpanListTests.java similarity index 70% rename from spring-cloud-sleuth-zipkin-stream/src/test/java/org/springframework/cloud/sleuth/zipkin/stream/SamplingZipkinSpanIteratorTests.java rename to spring-cloud-sleuth-zipkin-stream/src/test/java/org/springframework/cloud/sleuth/zipkin/stream/ConvertToZipkinSpanListTests.java index 0976fabdc..4e29e56de 100644 --- a/spring-cloud-sleuth-zipkin-stream/src/test/java/org/springframework/cloud/sleuth/zipkin/stream/SamplingZipkinSpanIteratorTests.java +++ b/spring-cloud-sleuth-zipkin-stream/src/test/java/org/springframework/cloud/sleuth/zipkin/stream/ConvertToZipkinSpanListTests.java @@ -17,9 +17,8 @@ package org.springframework.cloud.sleuth.zipkin.stream; import java.util.Arrays; import java.util.Collections; -import java.util.Iterator; +import java.util.List; import java.util.Random; -import java.util.concurrent.atomic.AtomicInteger; import org.junit.Test; import org.springframework.cloud.sleuth.Span; @@ -27,11 +26,10 @@ import org.springframework.cloud.sleuth.stream.Host; import org.springframework.cloud.sleuth.stream.Spans; import zipkin.Constants; -import zipkin.Sampler; import static org.assertj.core.api.Assertions.assertThat; -public class SamplingZipkinSpanIteratorTests { +public class ConvertToZipkinSpanListTests { Host host = new Host("myservice", "1.2.3.4", 8080); @@ -40,8 +38,7 @@ public class SamplingZipkinSpanIteratorTests { Spans spans = new Spans(this.host, Collections.singletonList(span("sleuth"))); - Iterator result = new SamplingZipkinSpanIterator( - Sampler.create(1.0f), spans); + List result = ConvertToZipkinSpanList.convert(spans); assertThat(result).isEmpty(); } @@ -51,39 +48,17 @@ public class SamplingZipkinSpanIteratorTests { Spans spans = new Spans(this.host, Arrays.asList(span("foo"), span("bar"), span("baz"))); - Iterator result = new SamplingZipkinSpanIterator( - Sampler.create(1.0f), spans); + List result = ConvertToZipkinSpanList.convert(spans); assertThat(result).extracting(s -> s.name).containsExactly( "message:foo", "message:bar", "message:baz"); } - @Test - public void retainsOnlySampledSpans() { - Spans spans = new Spans(this.host, - Arrays.asList(span("foo"), span("bar"), span("baz"))); - - Sampler everyOtherSampler = new Sampler() { - AtomicInteger counter = new AtomicInteger(); - - public boolean isSampled(long l) { - return counter.getAndIncrement() % 2 == 0; - } - }; - - Iterator result = new SamplingZipkinSpanIterator(everyOtherSampler, - spans); - - assertThat(result).extracting(s -> s.name).containsExactly( - "message:foo", "message:baz"); - } - @Test public void appendsLocalComponentTagIfNoZipkinLogIsPresent() { Spans spans = new Spans(this.host, Collections.singletonList(span("foo"))); - Iterator result = new SamplingZipkinSpanIterator( - Sampler.create(1.0f), spans); + List result = ConvertToZipkinSpanList.convert(spans); assertThat(result) .flatExtracting(s -> s.binaryAnnotations) @@ -97,8 +72,7 @@ public class SamplingZipkinSpanIteratorTests { span.logEvent(Constants.CLIENT_SEND); Spans spans = new Spans(this.host, Collections.singletonList(span)); - Iterator result = new SamplingZipkinSpanIterator( - Sampler.create(1.0f), spans); + List result = ConvertToZipkinSpanList.convert(spans); assertThat(result) .hasSize(1) @@ -115,8 +89,7 @@ public class SamplingZipkinSpanIteratorTests { span.tag(Span.SPAN_PEER_SERVICE_TAG_NAME, "barservice"); Spans spans = new Spans(this.host, Collections.singletonList(span)); - Iterator result = new SamplingZipkinSpanIterator( - Sampler.create(1.0f), spans); + List result = ConvertToZipkinSpanList.convert(spans); assertThat(result) .hasSize(1) diff --git a/spring-cloud-sleuth-zipkin-stream/src/test/java/org/springframework/cloud/sleuth/zipkin/stream/ZipkinMessageListenerTests.java b/spring-cloud-sleuth-zipkin-stream/src/test/java/org/springframework/cloud/sleuth/zipkin/stream/ZipkinMessageListenerTests.java index 0c6e2793d..2047024bf 100644 --- a/spring-cloud-sleuth-zipkin-stream/src/test/java/org/springframework/cloud/sleuth/zipkin/stream/ZipkinMessageListenerTests.java +++ b/spring-cloud-sleuth-zipkin-stream/src/test/java/org/springframework/cloud/sleuth/zipkin/stream/ZipkinMessageListenerTests.java @@ -38,7 +38,7 @@ public class ZipkinMessageListenerTests { long start = System.currentTimeMillis(); this.span.logEvent("hystrix/retry"); // System.currentTimeMillis - zipkin.Span result = SamplingZipkinSpanIterator.convert(this.span, this.host); + zipkin.Span result = ConvertToZipkinSpanList.convert(this.span, this.host); assertThat(result.timestamp) .isEqualTo(this.span.getBegin() * 1000); @@ -55,7 +55,7 @@ public class ZipkinMessageListenerTests { this.span.logEvent("hystrix/retry"); this.span.tag("spring-boot/version", "1.3.1.RELEASE"); - zipkin.Span result = SamplingZipkinSpanIterator.convert(this.span, this.host); + zipkin.Span result = ConvertToZipkinSpanList.convert(this.span, this.host); assertThat(result.annotations.get(0).endpoint) .isEqualTo(this.endpoint); @@ -70,7 +70,7 @@ public class ZipkinMessageListenerTests { */ @Test public void spanWithoutAnnotationsLogsComponent() { - zipkin.Span result = SamplingZipkinSpanIterator.convert(this.span, this.host); + zipkin.Span result = ConvertToZipkinSpanList.convert(this.span, this.host); assertThat(result.binaryAnnotations).hasSize(1); assertThat(result.binaryAnnotations.get(0)).isEqualToComparingFieldByField( @@ -82,7 +82,7 @@ public class ZipkinMessageListenerTests { public void nullProcessIdCoercesToUnknownServiceName() { Span noProcessId = Span.builder().traceId(1L).name("http:parent").remote(true).build(); - zipkin.Span result = SamplingZipkinSpanIterator.convert(noProcessId, this.host); + zipkin.Span result = ConvertToZipkinSpanList.convert(noProcessId, this.host); assertThat(result.binaryAnnotations) .containsOnly(BinaryAnnotation.create("lc", "unknown", this.endpoint)); diff --git a/spring-cloud-sleuth-zipkin/docker-compose.yml b/spring-cloud-sleuth-zipkin/docker-compose.yml index 1cd2aebee..d27933a10 100644 --- a/spring-cloud-sleuth-zipkin/docker-compose.yml +++ b/spring-cloud-sleuth-zipkin/docker-compose.yml @@ -1,27 +1,15 @@ mysql: - image: openzipkin/zipkin-mysql:1.36.0 + image: openzipkin/zipkin-mysql:1.38.0 ports: - 3306:3306 query: - image: openzipkin/zipkin-java:0.7.0 + image: openzipkin/zipkin-java:0.9.1 environment: - # Remove TRANSPORT_TYPE to disable tracing - - TRANSPORT_TYPE=http - STORAGE_TYPE=mysql - # - JAVA_OPTS=your jvm params here - expose: - - 9411 ports: + # Historical port used for the Zipkin HTTP Api - 9411:9411 + # Zipkin UI used to be on a separate process listening on port 8080 + - 8080:9411 links: - mysql:storage -web: - image: openzipkin/zipkin-web:1.36.0 - environment: - # Remove TRANSPORT_TYPE to disable tracing - - TRANSPORT_TYPE=http - ports: - - 8080:8080 - - 9990:9990 - links: - - query