From 362f20d0a8b4f9caf47bd50ed18b6efc7aba6c5d Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Sat, 15 Jul 2017 15:15:20 +0200 Subject: [PATCH 1/3] WIP --- .../TraceAutoConfigurationTests.java | 2 +- .../SleuthStreamAutoConfigurationTest.java | 2 +- .../zipkin/ZipkinAutoConfiguration.java | 51 ++++++++++- .../zipkin/ZipkinDiscoveryClientTests.java | 7 ++ .../zipkin/ZipkinSpanListenerTests.java | 84 ++++++++++++++++++- 5 files changed, 142 insertions(+), 4 deletions(-) create mode 100644 spring-cloud-sleuth-zipkin/src/main/java/org/springframework/cloud/sleuth/zipkin/ZipkinDiscoveryClientTests.java diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/autoconfig/TraceAutoConfigurationTests.java b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/autoconfig/TraceAutoConfigurationTests.java index 4afe8692c..593dc8066 100644 --- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/autoconfig/TraceAutoConfigurationTests.java +++ b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/autoconfig/TraceAutoConfigurationTests.java @@ -17,7 +17,7 @@ import static org.assertj.core.api.Assertions.assertThat; import org.junit.After; import org.junit.Test; -import org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration; +import org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration import org.springframework.boot.test.util.EnvironmentTestUtils; import org.springframework.cloud.sleuth.Span; import org.springframework.cloud.sleuth.Tracer; diff --git a/spring-cloud-sleuth-stream/src/test/java/org/springframework/cloud/sleuth/stream/SleuthStreamAutoConfigurationTest.java b/spring-cloud-sleuth-stream/src/test/java/org/springframework/cloud/sleuth/stream/SleuthStreamAutoConfigurationTest.java index 113d027fc..d705ca3b4 100644 --- a/spring-cloud-sleuth-stream/src/test/java/org/springframework/cloud/sleuth/stream/SleuthStreamAutoConfigurationTest.java +++ b/spring-cloud-sleuth-stream/src/test/java/org/springframework/cloud/sleuth/stream/SleuthStreamAutoConfigurationTest.java @@ -8,7 +8,7 @@ import java.util.Date; import org.junit.After; import org.junit.BeforeClass; import org.junit.Test; -import org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration; +import org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration import org.springframework.cloud.commons.util.UtilAutoConfiguration; import org.springframework.boot.test.util.EnvironmentTestUtils; import org.springframework.cloud.sleuth.autoconfig.TraceAutoConfiguration; 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 da83b58e6..ce8f33d2f 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 @@ -16,6 +16,7 @@ package org.springframework.cloud.sleuth.zipkin; +import java.net.URI; import java.util.ArrayList; import java.util.List; @@ -24,9 +25,11 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.AutoConfigureBefore; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.autoconfigure.web.ServerProperties; import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.discovery.DiscoveryClient; import org.springframework.cloud.commons.util.InetUtils; import org.springframework.cloud.sleuth.Sampler; @@ -64,6 +67,7 @@ import org.springframework.web.client.RestTemplate; public class ZipkinAutoConfiguration { @Autowired(required = false) List spanAdjusters = new ArrayList<>(); + @Autowired ZipkinUrlExtractor extractor; @Bean @ConditionalOnMissingBean @@ -71,10 +75,51 @@ public class ZipkinAutoConfiguration { ZipkinRestTemplateCustomizer zipkinRestTemplateCustomizer) { RestTemplate restTemplate = new RestTemplate(); zipkinRestTemplateCustomizer.customize(restTemplate); - return new HttpZipkinSpanReporter(restTemplate, zipkin.getBaseUrl(), zipkin.getFlushInterval(), + String zipkinUrl = this.extractor.zipkinUrl(zipkin); + return new HttpZipkinSpanReporter(restTemplate, zipkinUrl, zipkin.getFlushInterval(), spanMetricReporter); } + @Configuration + @ConditionalOnClass(DiscoveryClient.class) + static class DiscoveryClientZipkinUrlExtractorConfiguration { + + @Autowired(required = false) DiscoveryClient discoveryClient; + + @Bean + ZipkinUrlExtractor zipkinUrlExtractor() { + final DiscoveryClient discoveryClient = this.discoveryClient; + return new ZipkinUrlExtractor() { + @Override + public String zipkinUrl(ZipkinProperties zipkinProperties) { + if (discoveryClient != null) { + URI uri = URI.create(zipkinProperties.getBaseUrl()); + String host = uri.getHost(); + List instances = discoveryClient.getInstances(host); + if (!instances.isEmpty()) { + return instances.get(0).getUri().toString(); + } + } + return zipkinProperties.getBaseUrl(); + } + }; + } + } + + @Configuration + @ConditionalOnMissingClass("org.springframework.cloud.client.discovery.DiscoveryClient") + static class DefaultZipkinUrlExtractorConfiguration { + @Bean + ZipkinUrlExtractor zipkinUrlExtractor() { + return new ZipkinUrlExtractor() { + @Override + public String zipkinUrl(ZipkinProperties zipkinProperties) { + return zipkinProperties.getBaseUrl(); + } + }; + } + } + @Bean @ConditionalOnMissingBean public ZipkinRestTemplateCustomizer zipkinRestTemplateCustomizer(ZipkinProperties zipkinProperties) { @@ -156,3 +201,7 @@ public class ZipkinAutoConfiguration { } } + +interface ZipkinUrlExtractor { + String zipkinUrl(ZipkinProperties zipkinProperties); +} \ No newline at end of file diff --git a/spring-cloud-sleuth-zipkin/src/main/java/org/springframework/cloud/sleuth/zipkin/ZipkinDiscoveryClientTests.java b/spring-cloud-sleuth-zipkin/src/main/java/org/springframework/cloud/sleuth/zipkin/ZipkinDiscoveryClientTests.java new file mode 100644 index 000000000..2f690dafb --- /dev/null +++ b/spring-cloud-sleuth-zipkin/src/main/java/org/springframework/cloud/sleuth/zipkin/ZipkinDiscoveryClientTests.java @@ -0,0 +1,7 @@ +package org.springframework.cloud.sleuth.zipkin; + +/** + * @author Marcin Grzejszczak + */ +class ZipkinDiscoveryClientTests { +} 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 index b5aecddaa..e0ddbc5d8 100644 --- 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 @@ -17,11 +17,16 @@ package org.springframework.cloud.sleuth.zipkin; import org.assertj.core.api.Condition; +import org.junit.Ignore; +import org.springframework.cloud.client.ServiceInstance; +import org.springframework.cloud.client.discovery.DiscoveryClient; import zipkin.Constants; +import java.net.URI; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Map; import javax.annotation.PostConstruct; import org.junit.Test; @@ -56,16 +61,17 @@ import static org.junit.Assert.assertEquals; public class ZipkinSpanListenerTests { @Autowired Tracer tracer; - @Autowired ApplicationContext application; @Autowired TestConfiguration test; @Autowired ZipkinSpanListener spanListener; @Autowired ZipkinSpanReporter spanReporter; @Autowired MockEnvironment mockEnvironment; @Autowired EndpointLocator endpointLocator; + @Autowired ZipkinDiscoveryClient discoveryClient; @PostConstruct public void init() { this.test.zipkinSpans.clear(); + this.discoveryClient.serviceCalled = false; } Span parent = Span.builder().traceId(1L).name("http:parent").remote(true).build(); @@ -276,6 +282,17 @@ public class ZipkinSpanListenerTests { assertThat(this.test.zipkinSpans).isEmpty(); } + @Test + @Ignore + public void shouldUseDiscoveryClientToFindZipkinUrlIfPresent() { + Span span = Span.builder().traceIdHigh(1L).traceId(2L).spanId(3L).name("foo").build(); + + this.spanListener.report(span); + + assertThat(this.test.zipkinSpans).isNotEmpty(); + assertThat(this.discoveryClient.serviceCalled).isTrue(); + } + @Test public void shouldAddClientServiceIdTagWhenSpanContainsRpcEvent() { this.parent.logEvent(Span.CLIENT_SEND); @@ -335,6 +352,71 @@ public class ZipkinSpanListenerTests { return new MockEnvironment(); } + @Bean + DiscoveryClient client() { + return new ZipkinDiscoveryClient(); + } + } } + +class ZipkinDiscoveryClient implements DiscoveryClient { + + boolean serviceCalled = false; + + @Override + public String description() { + return ""; + } + + @Override + public ServiceInstance getLocalServiceInstance() { + return null; + } + + @Override + public List getInstances(String s) { + if ("zipkin".equals(s)) { + this.serviceCalled = true; + return Collections.singletonList(new ServiceInstance() { + @Override + public String getServiceId() { + return "zipkin"; + } + + @Override + public String getHost() { + return "1.2.3.4"; + } + + @Override + public int getPort() { + return 1234; + } + + @Override + public boolean isSecure() { + return false; + } + + @Override + public URI getUri() { + return URI.create("http://1.2.3.4:1234"); + } + + @Override + public Map getMetadata() { + return null; + } + }); + } + return Collections.emptyList(); + } + + @Override + public List getServices() { + return Collections.singletonList("zipkin"); + } + +} \ No newline at end of file From 8c98386c1429bd2bd57a77ddd28db49996d9e77e Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Sat, 15 Jul 2017 19:39:48 +0200 Subject: [PATCH 2/3] WIP --- pom.xml | 6 - .../TraceAutoConfigurationTests.java | 2 +- .../SleuthStreamAutoConfigurationTest.java | 8 +- spring-cloud-sleuth-zipkin/pom.xml | 5 + .../zipkin/ZipkinDiscoveryClientTests.java | 7 -- .../zipkin/ZipkinDiscoveryClientTests.java | 118 ++++++++++++++++++ .../zipkin/ZipkinSpanListenerTests.java | 78 ------------ 7 files changed, 128 insertions(+), 96 deletions(-) delete mode 100644 spring-cloud-sleuth-zipkin/src/main/java/org/springframework/cloud/sleuth/zipkin/ZipkinDiscoveryClientTests.java create mode 100644 spring-cloud-sleuth-zipkin/src/test/java/org/springframework/cloud/sleuth/zipkin/ZipkinDiscoveryClientTests.java diff --git a/pom.xml b/pom.xml index e6265634a..ecc80a547 100644 --- a/pom.xml +++ b/pom.xml @@ -217,12 +217,6 @@ 3.0.0 test - - com.github.tomakehurst - wiremock - 2.6.0 - test - pl.pragmatists JUnitParams diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/autoconfig/TraceAutoConfigurationTests.java b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/autoconfig/TraceAutoConfigurationTests.java index 593dc8066..505dc2c6a 100644 --- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/autoconfig/TraceAutoConfigurationTests.java +++ b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/autoconfig/TraceAutoConfigurationTests.java @@ -17,7 +17,7 @@ import static org.assertj.core.api.Assertions.assertThat; import org.junit.After; import org.junit.Test; -import org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration +import org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration; import org.springframework.boot.test.util.EnvironmentTestUtils; import org.springframework.cloud.sleuth.Span; import org.springframework.cloud.sleuth.Tracer; diff --git a/spring-cloud-sleuth-stream/src/test/java/org/springframework/cloud/sleuth/stream/SleuthStreamAutoConfigurationTest.java b/spring-cloud-sleuth-stream/src/test/java/org/springframework/cloud/sleuth/stream/SleuthStreamAutoConfigurationTest.java index d705ca3b4..8e912ca93 100644 --- a/spring-cloud-sleuth-stream/src/test/java/org/springframework/cloud/sleuth/stream/SleuthStreamAutoConfigurationTest.java +++ b/spring-cloud-sleuth-stream/src/test/java/org/springframework/cloud/sleuth/stream/SleuthStreamAutoConfigurationTest.java @@ -1,5 +1,7 @@ package org.springframework.cloud.sleuth.stream; +import static org.assertj.core.api.Assertions.assertThat; + import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; @@ -8,9 +10,9 @@ import java.util.Date; import org.junit.After; import org.junit.BeforeClass; import org.junit.Test; -import org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration -import org.springframework.cloud.commons.util.UtilAutoConfiguration; +import org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration; import org.springframework.boot.test.util.EnvironmentTestUtils; +import org.springframework.cloud.commons.util.UtilAutoConfiguration; import org.springframework.cloud.sleuth.autoconfig.TraceAutoConfiguration; import org.springframework.cloud.sleuth.log.NoOpSpanLogger; import org.springframework.cloud.sleuth.log.SpanLogger; @@ -27,8 +29,6 @@ import org.springframework.scheduling.TriggerContext; import org.springframework.scheduling.support.PeriodicTrigger; import org.springframework.scheduling.support.SimpleTriggerContext; -import static org.assertj.core.api.Assertions.assertThat; - public class SleuthStreamAutoConfigurationTest { private AnnotationConfigApplicationContext ctx; diff --git a/spring-cloud-sleuth-zipkin/pom.xml b/spring-cloud-sleuth-zipkin/pom.xml index bdd6595b7..455116294 100644 --- a/spring-cloud-sleuth-zipkin/pom.xml +++ b/spring-cloud-sleuth-zipkin/pom.xml @@ -88,6 +88,11 @@ zipkin-junit test + + org.awaitility + awaitility + test + com.squareup.okhttp3 diff --git a/spring-cloud-sleuth-zipkin/src/main/java/org/springframework/cloud/sleuth/zipkin/ZipkinDiscoveryClientTests.java b/spring-cloud-sleuth-zipkin/src/main/java/org/springframework/cloud/sleuth/zipkin/ZipkinDiscoveryClientTests.java deleted file mode 100644 index 2f690dafb..000000000 --- a/spring-cloud-sleuth-zipkin/src/main/java/org/springframework/cloud/sleuth/zipkin/ZipkinDiscoveryClientTests.java +++ /dev/null @@ -1,7 +0,0 @@ -package org.springframework.cloud.sleuth.zipkin; - -/** - * @author Marcin Grzejszczak - */ -class ZipkinDiscoveryClientTests { -} diff --git a/spring-cloud-sleuth-zipkin/src/test/java/org/springframework/cloud/sleuth/zipkin/ZipkinDiscoveryClientTests.java b/spring-cloud-sleuth-zipkin/src/test/java/org/springframework/cloud/sleuth/zipkin/ZipkinDiscoveryClientTests.java new file mode 100644 index 000000000..80027526c --- /dev/null +++ b/spring-cloud-sleuth-zipkin/src/test/java/org/springframework/cloud/sleuth/zipkin/ZipkinDiscoveryClientTests.java @@ -0,0 +1,118 @@ +package org.springframework.cloud.sleuth.zipkin; + +import static org.assertj.core.api.BDDAssertions.then; +import static org.springframework.cloud.sleuth.zipkin.ZipkinDiscoveryClientTests.ZIPKIN_RULE; + +import java.io.IOException; +import java.net.URI; +import java.util.Collections; +import java.util.List; +import java.util.Map; + +import org.assertj.core.api.BDDAssertions; +import org.awaitility.Awaitility; +import org.junit.Before; +import org.junit.ClassRule; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.cloud.client.ServiceInstance; +import org.springframework.cloud.client.discovery.DiscoveryClient; +import org.springframework.cloud.sleuth.Span; +import org.springframework.cloud.sleuth.SpanReporter; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.util.SocketUtils; + +import zipkin.junit.ZipkinRule; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = ZipkinDiscoveryClientTests.Config.class, + properties = "spring.zipkin.baseUrl=http://zipkin/") +public class ZipkinDiscoveryClientTests { + + @ClassRule public static ZipkinRule ZIPKIN_RULE = new ZipkinRule(); + + @Autowired SpanReporter spanReporter; + + @Test + public void shouldUseDiscoveryClientToFindZipkinUrlIfPresent() throws Exception { + Span span = Span.builder().traceIdHigh(1L).traceId(2L).spanId(3L).name("foo") + .build(); + + this.spanReporter.report(span); + + Awaitility.await().untilAsserted(() -> then(ZIPKIN_RULE.httpRequestCount()).isGreaterThan(0)); + } + + @Configuration + @EnableAutoConfiguration + static class Config { + @Bean + DiscoveryClient client() { + return new ZipkinDiscoveryClient(); + } + } +} + + +class ZipkinDiscoveryClient implements DiscoveryClient { + + @Override + public String description() { + return ""; + } + + @Override + public ServiceInstance getLocalServiceInstance() { + return null; + } + + @Override + public List getInstances(String s) { + if ("zipkin".equals(s)) { + return Collections.singletonList(new ServiceInstance() { + @Override + public String getServiceId() { + return "zipkin"; + } + + @Override + public String getHost() { + return "localhost"; + } + + @Override + public int getPort() { + return URI.create(ZIPKIN_RULE.httpUrl()).getPort(); + } + + @Override + public boolean isSecure() { + return false; + } + + @Override + public URI getUri() { + return URI.create(ZIPKIN_RULE.httpUrl()); + } + + @Override + public Map getMetadata() { + return null; + } + }); + } + return Collections.emptyList(); + } + + @Override + public List getServices() { + return Collections.singletonList("zipkin"); + } + +} \ No newline at end of file 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 index e0ddbc5d8..878cd5c8b 100644 --- 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 @@ -66,12 +66,10 @@ public class ZipkinSpanListenerTests { @Autowired ZipkinSpanReporter spanReporter; @Autowired MockEnvironment mockEnvironment; @Autowired EndpointLocator endpointLocator; - @Autowired ZipkinDiscoveryClient discoveryClient; @PostConstruct public void init() { this.test.zipkinSpans.clear(); - this.discoveryClient.serviceCalled = false; } Span parent = Span.builder().traceId(1L).name("http:parent").remote(true).build(); @@ -282,17 +280,6 @@ public class ZipkinSpanListenerTests { assertThat(this.test.zipkinSpans).isEmpty(); } - @Test - @Ignore - public void shouldUseDiscoveryClientToFindZipkinUrlIfPresent() { - Span span = Span.builder().traceIdHigh(1L).traceId(2L).spanId(3L).name("foo").build(); - - this.spanListener.report(span); - - assertThat(this.test.zipkinSpans).isNotEmpty(); - assertThat(this.discoveryClient.serviceCalled).isTrue(); - } - @Test public void shouldAddClientServiceIdTagWhenSpanContainsRpcEvent() { this.parent.logEvent(Span.CLIENT_SEND); @@ -352,71 +339,6 @@ public class ZipkinSpanListenerTests { return new MockEnvironment(); } - @Bean - DiscoveryClient client() { - return new ZipkinDiscoveryClient(); - } - - } - -} - -class ZipkinDiscoveryClient implements DiscoveryClient { - - boolean serviceCalled = false; - - @Override - public String description() { - return ""; - } - - @Override - public ServiceInstance getLocalServiceInstance() { - return null; - } - - @Override - public List getInstances(String s) { - if ("zipkin".equals(s)) { - this.serviceCalled = true; - return Collections.singletonList(new ServiceInstance() { - @Override - public String getServiceId() { - return "zipkin"; - } - - @Override - public String getHost() { - return "1.2.3.4"; - } - - @Override - public int getPort() { - return 1234; - } - - @Override - public boolean isSecure() { - return false; - } - - @Override - public URI getUri() { - return URI.create("http://1.2.3.4:1234"); - } - - @Override - public Map getMetadata() { - return null; - } - }); - } - return Collections.emptyList(); - } - - @Override - public List getServices() { - return Collections.singletonList("zipkin"); } } \ No newline at end of file From a626632b405af1ac1cec26be56c544284ccd6e84 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Sat, 15 Jul 2017 19:50:05 +0200 Subject: [PATCH 3/3] Added support for service discovery based Zipkin URL resolution --- README.adoc | 1 + .../main/asciidoc/spring-cloud-sleuth.adoc | 20 +++++++++++++++++++ .../cloud/sleuth/zipkin/ZipkinProperties.java | 5 ++++- 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/README.adoc b/README.adoc index 4b30082a6..ab8207b34 100644 --- a/README.adoc +++ b/README.adoc @@ -322,6 +322,7 @@ Example of setting baggage on a span: ---- Span initialSpan = this.tracer.createSpan("span"); initialSpan.setBaggageItem("foo", "bar"); +initialSpan.setBaggageItem("UPPER_CASE", "someValue"); ---- ===== Baggage vs. Span Tags diff --git a/docs/src/main/asciidoc/spring-cloud-sleuth.adoc b/docs/src/main/asciidoc/spring-cloud-sleuth.adoc index f1175c263..bbf232e53 100644 --- a/docs/src/main/asciidoc/spring-cloud-sleuth.adoc +++ b/docs/src/main/asciidoc/spring-cloud-sleuth.adoc @@ -484,6 +484,26 @@ Stream based span reporting). spring.zipkin.locator.discovery.enabled: true ---- +== Sending spans to Zipkin + +By default if you add `spring-cloud-starter-zipkin` as a dependency to your project, +when the span is closed, it will be sent to Zipkin over HTTP. The communication +is asynchronous. You can configure the URL by setting the `spring.zipkin.baseUrl` +property as follows: + +[source,yaml] +---- +spring.zipkin.baseUrl: http://192.168.99.100:9411/ +---- + +If you want to find Zipkin via service discovery it's enough to pass the +Zipkin's service id inside the URL (example for `zipkinserver` service id) + +[source,yaml] +---- +spring.zipkin.baseUrl: http://zipkinserver/ +---- + == Span Data as Messages You can accumulate and send span data over 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 1144d0d0c..037a9dc2f 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 @@ -26,7 +26,10 @@ import org.springframework.boot.context.properties.ConfigurationProperties; */ @ConfigurationProperties("spring.zipkin") public class ZipkinProperties { - /** URL of the zipkin query server instance. */ + /** URL of the zipkin query server instance. You can also provide + * the service id of the Zipkin server if Zipkin's registered in + * service discovery (e.g. http://zipkinserver/) + */ private String baseUrl = "http://localhost:9411/"; private boolean enabled = true; private int flushInterval = 1;