diff --git a/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-stream/src/test/java/sample/SampleSleuthApplicationTests.java b/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-stream/src/test/java/sample/SampleSleuthApplicationTests.java index afcab38cb..fde9576c4 100644 --- a/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-stream/src/test/java/sample/SampleSleuthApplicationTests.java +++ b/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-stream/src/test/java/sample/SampleSleuthApplicationTests.java @@ -1,17 +1,14 @@ package sample; -import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.context.web.WebAppConfiguration; -// TODO: Fix me @RunWith(SpringRunner.class) @SpringBootTest(classes = SampleSleuthApplication.class) @WebAppConfiguration -@Ignore public class SampleSleuthApplicationTests { @Test diff --git a/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-test-core/src/main/java/tools/AbstractIntegrationTest.java b/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-test-core/src/main/java/tools/AbstractIntegrationTest.java index 8c14cb6b1..eeee29d26 100644 --- a/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-test-core/src/main/java/tools/AbstractIntegrationTest.java +++ b/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-test-core/src/main/java/tools/AbstractIntegrationTest.java @@ -15,9 +15,6 @@ */ package tools; -import zipkin.Codec; -import zipkin.Span; - import java.lang.invoke.MethodHandles; import java.net.URI; import java.util.ArrayList; @@ -40,6 +37,8 @@ import org.springframework.http.HttpStatus; import org.springframework.http.RequestEntity; import org.springframework.http.ResponseEntity; import org.springframework.web.client.RestTemplate; +import zipkin.Codec; +import zipkin.Span; import static java.util.concurrent.TimeUnit.SECONDS; import static org.assertj.core.api.BDDAssertions.then; @@ -87,7 +86,7 @@ public abstract class AbstractIntegrationTest { } protected ResponseEntity endpointToCheckZipkinServerHealth() { - URI uri = URI.create("http://localhost:" +getZipkinServerPort()+"/application/health"); + URI uri = URI.create("http://localhost:" + getZipkinServerPort() + "/zipkin/"); log.info(String.format("Sending request to the Zipkin Server [%s]", uri)); return exchangeRequest(uri); } diff --git a/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-zipkin-stream/src/test/java/example/ZipkinServerApplicationTests.java b/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-zipkin-stream/src/test/java/example/ZipkinServerApplicationTests.java index d2469fac5..24448f093 100644 --- a/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-zipkin-stream/src/test/java/example/ZipkinServerApplicationTests.java +++ b/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-zipkin-stream/src/test/java/example/ZipkinServerApplicationTests.java @@ -1,23 +1,38 @@ package example; -import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.Mockito; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.cloud.sleuth.stream.SleuthSink; +import org.springframework.cloud.sleuth.zipkin.stream.ZipkinMessageListener; +import org.springframework.cloud.stream.annotation.EnableBinding; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.junit4.SpringRunner; +import zipkin.collector.CollectorMetrics; +import zipkin.collector.CollectorSampler; +import zipkin.internal.V2StorageComponent; +import zipkin.server.ZipkinHttpCollector; +import zipkin.server.ZipkinQueryApiV1; import zipkin.storage.StorageComponent; +import zipkin2.storage.InMemoryStorage; import static org.junit.Assert.assertEquals; -// TODO: Fix me @RunWith(SpringRunner.class) -@SpringBootTest(classes = ZipkinStreamServerApplication.class, webEnvironment = WebEnvironment.RANDOM_PORT, properties = { +@SpringBootTest(classes = ZipkinStreamTestsConfig.class, + webEnvironment = WebEnvironment.RANDOM_PORT, properties = { "spring.datasource.initialize=true" }) @ActiveProfiles("test") -@Ignore public class ZipkinServerApplicationTests { @Autowired @@ -30,3 +45,62 @@ public class ZipkinServerApplicationTests { } } + + +// TODO: Zipkin Server is not Boot 2.0 compatible +@Configuration +@SpringBootApplication +@EnableBoot2CompatibleZipkinServer +class ZipkinStreamTestsConfig { + +} + +//@EnableZipkinStreamServer +@EnableBinding(SleuthSink.class) +@Import({ZipkinMessageListener.class, + Boot2ZipkinCompatibleConfig.class, + ZipkinQueryApiV1.class, + ZipkinHttpCollector.class}) +@interface EnableBoot2CompatibleZipkinServer { +} + +// CollectorMetrics bean definition from `ZipkinServerConfiguration` +// is not Boot 2.0 compatible +@Configuration +class Boot2ZipkinCompatibleConfig { + + @Bean CollectorMetrics collectorMetrics() { + CollectorMetrics mock = Mockito.mock(CollectorMetrics.class); + Mockito.when(mock.forTransport(Mockito.anyString())).thenReturn(mock); + return mock; + } + + @Bean + @ConditionalOnMissingBean(CollectorSampler.class) + CollectorSampler traceIdSampler(@Value("${zipkin.collector.sample-rate:1.0}") float rate) { + return CollectorSampler.create(rate); + } + + /** + * This is a special-case configuration if there's no StorageComponent of any kind. In-Mem can + * supply both read apis, so we add two beans here. + */ + @Configuration + // "matchIfMissing = true" ensures this is used when there's no configured storage type + @ConditionalOnProperty(name = "zipkin.storage.type", havingValue = "mem", matchIfMissing = true) + @ConditionalOnMissingBean(StorageComponent.class) + static class InMemoryConfiguration { + @Bean StorageComponent storage( + @Value("${zipkin.storage.strict-trace-id:true}") boolean strictTraceId, + @Value("${zipkin.storage.mem.max-spans:500000}") int maxSpans) { + return V2StorageComponent.create(InMemoryStorage.newBuilder() + .strictTraceId(strictTraceId) + .maxSpanCount(maxSpans) + .build()); + } + + @Bean InMemoryStorage v2Storage(V2StorageComponent component) { + return (InMemoryStorage) component.delegate(); + } + } +} diff --git a/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-zipkin-stream/src/test/java/integration/ZipkinStreamTests.java b/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-zipkin-stream/src/test/java/integration/ZipkinStreamTests.java index b6deefaa9..75bcb76d8 100644 --- a/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-zipkin-stream/src/test/java/integration/ZipkinStreamTests.java +++ b/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-zipkin-stream/src/test/java/integration/ZipkinStreamTests.java @@ -24,15 +24,25 @@ import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.Mockito; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.cloud.sleuth.Span; import org.springframework.cloud.sleuth.stream.Host; import org.springframework.cloud.sleuth.stream.SleuthSink; import org.springframework.cloud.sleuth.stream.Spans; +import org.springframework.cloud.sleuth.zipkin.stream.ZipkinMessageListener; +import org.springframework.cloud.stream.annotation.EnableBinding; import org.springframework.cloud.stream.test.binder.TestSupportBinderAutoConfiguration; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; import org.springframework.integration.support.MessageBuilder; import org.springframework.messaging.Message; import org.springframework.messaging.MessageChannel; @@ -41,15 +51,24 @@ import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import example.ZipkinStreamServerApplication; +import org.springframework.test.context.junit4.SpringRunner; import tools.AbstractIntegrationTest; +import zipkin.collector.CollectorMetrics; +import zipkin.collector.CollectorSampler; +import zipkin.internal.V2StorageComponent; +import zipkin.server.ZipkinHttpCollector; +import zipkin.server.ZipkinQueryApiV1; +import zipkin.storage.StorageComponent; +import zipkin2.storage.InMemoryStorage; -// TODO: Fix me -@RunWith(SpringJUnit4ClassRunner.class) -@SpringBootTest(classes = { TestSupportBinderAutoConfiguration.class, ZipkinStreamServerApplication.class }, +@RunWith(SpringRunner.class) +// TODO: Without ZipkinStreamServerApplication.class cause Zipkin is not comp with Boot +@SpringBootTest(classes = { ZipkinStreamTestsConfig.class, + TestSupportBinderAutoConfiguration.class}, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) -@TestPropertySource(properties = { "server.port=0", "management.health.rabbit.enabled=false" }) +@TestPropertySource(properties = { "server.port=0", + "management.health.rabbit.enabled=false" }) @ActiveProfiles("test") -@Ignore public class ZipkinStreamTests extends AbstractIntegrationTest { @Value("${local.server.port}") @@ -96,3 +115,62 @@ public class ZipkinStreamTests extends AbstractIntegrationTest { } } + +// TODO: Zipkin Server is not Boot 2.0 compatible +@Configuration +@SpringBootApplication +@EnableBoot2CompatibleZipkinServer +class ZipkinStreamTestsConfig { + +} + +//@EnableZipkinStreamServer +@EnableBinding(SleuthSink.class) +@Import({ZipkinMessageListener.class, + Boot2ZipkinCompatibleConfig.class, + ZipkinQueryApiV1.class, + ZipkinHttpCollector.class}) +@interface EnableBoot2CompatibleZipkinServer { +} + +// CollectorMetrics bean definition from `ZipkinServerConfiguration` +// is not Boot 2.0 compatible +@Configuration +class Boot2ZipkinCompatibleConfig { + + @Bean CollectorMetrics collectorMetrics() { + CollectorMetrics mock = Mockito.mock(CollectorMetrics.class); + Mockito.when(mock.forTransport(Mockito.anyString())).thenReturn(mock); + return mock; + } + + @Bean + @ConditionalOnMissingBean(CollectorSampler.class) + CollectorSampler traceIdSampler(@Value("${zipkin.collector.sample-rate:1.0}") float rate) { + return CollectorSampler.create(rate); + } + + /** + * This is a special-case configuration if there's no StorageComponent of any kind. In-Mem can + * supply both read apis, so we add two beans here. + */ + @Configuration + // "matchIfMissing = true" ensures this is used when there's no configured storage type + @ConditionalOnProperty(name = "zipkin.storage.type", havingValue = "mem", matchIfMissing = true) + @ConditionalOnMissingBean(StorageComponent.class) + static class InMemoryConfiguration { + @Bean StorageComponent storage( + @Value("${zipkin.storage.strict-trace-id:true}") boolean strictTraceId, + @Value("${zipkin.storage.mem.max-spans:500000}") int maxSpans) { + return V2StorageComponent.create(InMemoryStorage.newBuilder() + .strictTraceId(strictTraceId) + .maxSpanCount(maxSpans) + .build()); + } + + @Bean InMemoryStorage v2Storage(V2StorageComponent component) { + return (InMemoryStorage) component.delegate(); + } + } +} + diff --git a/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-zipkin-stream/src/test/resources/application-test.yml b/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-zipkin-stream/src/test/resources/application-test.yml index 55d8fa962..59a2c44df 100644 --- a/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-zipkin-stream/src/test/resources/application-test.yml +++ b/spring-cloud-sleuth-samples/spring-cloud-sleuth-sample-zipkin-stream/src/test/resources/application-test.yml @@ -1,3 +1,5 @@ zipkin: storage: type: mem # default is inMemory + +spring.autoconfigure.exclude: org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration, org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration, org.springframework.boot.autoconfigure.security.SecurityAutoConfiguration \ No newline at end of file diff --git a/spring-cloud-sleuth-zipkin-stream/src/test/java/org/springframework/cloud/sleuth/zipkin/stream/ZipkinServerApplicationTests.java b/spring-cloud-sleuth-zipkin-stream/src/test/java/org/springframework/cloud/sleuth/zipkin/stream/ZipkinServerApplicationTests.java index 50aa9913b..6dce55fa3 100644 --- a/spring-cloud-sleuth-zipkin-stream/src/test/java/org/springframework/cloud/sleuth/zipkin/stream/ZipkinServerApplicationTests.java +++ b/spring-cloud-sleuth-zipkin-stream/src/test/java/org/springframework/cloud/sleuth/zipkin/stream/ZipkinServerApplicationTests.java @@ -30,7 +30,6 @@ import zipkin2.storage.InMemoryStorage; import static org.junit.Assert.assertEquals; -@Ignore @RunWith(SpringJUnit4ClassRunner.class) @SpringBootTest(classes = ZipkinStreamServerApplication.class, properties = { "spring.datasource.initialize=true" }, webEnvironment = WebEnvironment.RANDOM_PORT) diff --git a/spring-cloud-sleuth-zipkin2/src/test/java/org/springframework/cloud/sleuth/zipkin2/ZipkinDiscoveryClientTests.java b/spring-cloud-sleuth-zipkin2/src/test/java/org/springframework/cloud/sleuth/zipkin2/ZipkinDiscoveryClientTests.java index 1c143c92f..f1aa42647 100644 --- a/spring-cloud-sleuth-zipkin2/src/test/java/org/springframework/cloud/sleuth/zipkin2/ZipkinDiscoveryClientTests.java +++ b/spring-cloud-sleuth-zipkin2/src/test/java/org/springframework/cloud/sleuth/zipkin2/ZipkinDiscoveryClientTests.java @@ -26,11 +26,10 @@ import org.springframework.test.context.junit4.SpringRunner; import zipkin.junit.ZipkinRule; -// TODO: Fix me -@Ignore @RunWith(SpringRunner.class) @SpringBootTest(classes = ZipkinDiscoveryClientTests.Config.class, - properties = "spring.zipkin.baseUrl=http://zipkin/") + properties = {"spring.zipkin.baseUrl=http://zipkin/", + "spring.cloud.discovery.client.composite-indicator.enabled=false"}) public class ZipkinDiscoveryClientTests { @ClassRule public static ZipkinRule ZIPKIN_RULE = new ZipkinRule();