From 3b305e6f8fba6d8eb53e3a98f33fe65a7a01dcbc Mon Sep 17 00:00:00 2001 From: Dave Syer Date: Mon, 21 Sep 2015 11:58:53 +0100 Subject: [PATCH] Add basic test for zipkin span listener --- .../zipkin/ZipkinAutoConfiguration.java | 11 +- .../cloud/sleuth/zipkin/ZipkinProperties.java | 7 +- .../sleuth/zipkin/ZipkinSpanListener.java | 5 +- .../zipkin/ZipkinSpanListenerTests.java | 119 ++++++++++++++++++ 4 files changed, 135 insertions(+), 7 deletions(-) create mode 100644 spring-cloud-sleuth-zipkin/src/test/java/org/springframework/cloud/sleuth/zipkin/ZipkinSpanListenerTests.java diff --git a/spring-cloud-sleuth-zipkin/src/main/java/org/springframework/cloud/sleuth/zipkin/ZipkinAutoConfiguration.java b/spring-cloud-sleuth-zipkin/src/main/java/org/springframework/cloud/sleuth/zipkin/ZipkinAutoConfiguration.java index 43b572b39..f3f4049c1 100644 --- a/spring-cloud-sleuth-zipkin/src/main/java/org/springframework/cloud/sleuth/zipkin/ZipkinAutoConfiguration.java +++ b/spring-cloud-sleuth-zipkin/src/main/java/org/springframework/cloud/sleuth/zipkin/ZipkinAutoConfiguration.java @@ -32,14 +32,16 @@ import com.github.kristofa.brave.zipkin.ZipkinSpanCollector; @Configuration @EnableConfigurationProperties @ConditionalOnClass(ZipkinSpanCollector.class) -@ConditionalOnProperty(value = "spring.sleuth.zipkin.enabled", matchIfMissing = true) +@ConditionalOnProperty(value = "spring.zipkin.enabled", matchIfMissing = true) public class ZipkinAutoConfiguration { @Bean @ConditionalOnMissingBean(SpanCollector.class) public ZipkinSpanCollector spanCollector() { - return new ZipkinSpanCollector(zipkinProperties().getHost(), zipkinProperties() - .getPort()); + ZipkinProperties zipkin = zipkinProperties(); + ZipkinSpanCollector collector = new ZipkinSpanCollector(zipkin.getHost(), + zipkin.getPort(), zipkin.getCollector()); + return collector; } @Bean @@ -48,7 +50,8 @@ public class ZipkinAutoConfiguration { } @Bean - // @ConditionalOnProperty(value = "spring.sleuth.zipkin.braveTracer.enabled", havingValue = "false") + // @ConditionalOnProperty(value = "spring.sleuth.zipkin.braveTracer.enabled", + // havingValue = "false") public ZipkinSpanListener sleuthTracer(SpanCollector spanCollector) { return new ZipkinSpanListener(spanCollector); } diff --git a/spring-cloud-sleuth-zipkin/src/main/java/org/springframework/cloud/sleuth/zipkin/ZipkinProperties.java b/spring-cloud-sleuth-zipkin/src/main/java/org/springframework/cloud/sleuth/zipkin/ZipkinProperties.java index c07162366..4f0386c34 100644 --- a/spring-cloud-sleuth-zipkin/src/main/java/org/springframework/cloud/sleuth/zipkin/ZipkinProperties.java +++ b/spring-cloud-sleuth-zipkin/src/main/java/org/springframework/cloud/sleuth/zipkin/ZipkinProperties.java @@ -16,10 +16,12 @@ package org.springframework.cloud.sleuth.zipkin; -import lombok.Data; - import org.springframework.boot.context.properties.ConfigurationProperties; +import com.github.kristofa.brave.zipkin.ZipkinSpanCollectorParams; + +import lombok.Data; + /** * @author Spencer Gibb */ @@ -30,4 +32,5 @@ public class ZipkinProperties { private int fixedSampleRate = 1; private String host = "localhost"; private int port = 9410; + private ZipkinSpanCollectorParams collector = new ZipkinSpanCollectorParams(); } diff --git a/spring-cloud-sleuth-zipkin/src/main/java/org/springframework/cloud/sleuth/zipkin/ZipkinSpanListener.java b/spring-cloud-sleuth-zipkin/src/main/java/org/springframework/cloud/sleuth/zipkin/ZipkinSpanListener.java index 70e8f560f..82685c06e 100644 --- a/spring-cloud-sleuth-zipkin/src/main/java/org/springframework/cloud/sleuth/zipkin/ZipkinSpanListener.java +++ b/spring-cloud-sleuth-zipkin/src/main/java/org/springframework/cloud/sleuth/zipkin/ZipkinSpanListener.java @@ -155,7 +155,7 @@ public class ZipkinSpanListener { public int getAddress() { String address; - if (this.serverProperties.getAddress() != null) { + if (this.serverProperties!=null && this.serverProperties.getAddress() != null) { address = this.serverProperties.getAddress().getHostAddress(); } else { @@ -249,6 +249,9 @@ public class ZipkinSpanListener { private static long hash(String string) { long h = 1125899906842597L; + if (string==null) { + return h; + } int len = string.length(); for (int i = 0; i < len; i++) { diff --git a/spring-cloud-sleuth-zipkin/src/test/java/org/springframework/cloud/sleuth/zipkin/ZipkinSpanListenerTests.java b/spring-cloud-sleuth-zipkin/src/test/java/org/springframework/cloud/sleuth/zipkin/ZipkinSpanListenerTests.java new file mode 100644 index 000000000..ad5c23178 --- /dev/null +++ b/spring-cloud-sleuth-zipkin/src/test/java/org/springframework/cloud/sleuth/zipkin/ZipkinSpanListenerTests.java @@ -0,0 +1,119 @@ +/* + * Copyright 2015 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 + * + * http://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.zipkin; + +import static org.junit.Assert.assertEquals; + +import java.util.ArrayList; +import java.util.List; + +import javax.annotation.PostConstruct; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration; +import org.springframework.boot.test.SpringApplicationConfiguration; +import org.springframework.cloud.sleuth.MilliSpan; +import org.springframework.cloud.sleuth.Sampler; +import org.springframework.cloud.sleuth.Span; +import org.springframework.cloud.sleuth.Trace; +import org.springframework.cloud.sleuth.TraceScope; +import org.springframework.cloud.sleuth.autoconfig.TraceAutoConfiguration; +import org.springframework.cloud.sleuth.event.ClientReceivedEvent; +import org.springframework.cloud.sleuth.event.ClientSentEvent; +import org.springframework.cloud.sleuth.event.ServerReceivedEvent; +import org.springframework.cloud.sleuth.event.ServerSentEvent; +import org.springframework.cloud.sleuth.sampler.AlwaysSampler; +import org.springframework.cloud.sleuth.zipkin.ZipkinSpanListenerTests.TestConfiguration; +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import com.github.kristofa.brave.EmptySpanCollector; +import com.github.kristofa.brave.SpanCollector; + +/** + * @author Dave Syer + * + */ +@SpringApplicationConfiguration(classes = TestConfiguration.class) +@RunWith(SpringJUnit4ClassRunner.class) +public class ZipkinSpanListenerTests { + + @Autowired + private Trace trace; + + @Autowired + private ApplicationContext application; + + @Autowired + private ZipkinTestConfiguration test; + + @PostConstruct + public void init() { + this.test.spans.clear(); + } + + @Test + public void acquireAndRelease() { + TraceScope context = this.trace.startSpan("foo"); + context.close(); + assertEquals(1, this.test.spans.size()); + } + + @Test + public void rpcAnnotations() { + Span parent = MilliSpan.builder().traceId("xxxx").name("parent").remote(true).build(); + TraceScope context = this.trace.startSpan("child", parent); + this.application.publishEvent(new ClientSentEvent(this, context.getSpan())); + this.application.publishEvent(new ServerReceivedEvent(this, parent, context.getSpan())); + this.application.publishEvent(new ServerSentEvent(this, parent, context.getSpan())); + this.application.publishEvent(new ClientReceivedEvent(this, context.getSpan())); + context.close(); + assertEquals(2, this.test.spans.size()); + } + + @Configuration + @Import({ ZipkinTestConfiguration.class, ZipkinAutoConfiguration.class, TraceAutoConfiguration.class, + PropertyPlaceholderAutoConfiguration.class }) + protected static class TestConfiguration { + } + + @Configuration + protected static class ZipkinTestConfiguration { + + private List spans = new ArrayList<>(); + + @Bean + public Sampler defaultSampler() { + return new AlwaysSampler(); + } + + @Bean + public SpanCollector collector() { + return new EmptySpanCollector() { + @Override + public void collect(com.twitter.zipkin.gen.Span span) { + ZipkinTestConfiguration.this.spans.add(span); + } + }; + } + + }}