diff --git a/pom.xml b/pom.xml index 40875eaf2..bf45ea181 100644 --- a/pom.xml +++ b/pom.xml @@ -254,7 +254,7 @@ 2.2.2.BUILD-SNAPSHOT 2.2.2.BUILD-SNAPSHOT 1.0.1.BUILD-SNAPSHOT - Horsham.SR1 + Horsham.BUILD-SNAPSHOT 2.2.2.BUILD-SNAPSHOT 2.2.2.BUILD-SNAPSHOT 5.10.1 diff --git a/tests/spring-cloud-sleuth-instrumentation-messaging-tests/pom.xml b/tests/spring-cloud-sleuth-instrumentation-messaging-tests/pom.xml index 7560caebb..9133fe704 100644 --- a/tests/spring-cloud-sleuth-instrumentation-messaging-tests/pom.xml +++ b/tests/spring-cloud-sleuth-instrumentation-messaging-tests/pom.xml @@ -60,6 +60,18 @@ https://www.w3.org/2001/XMLSchema-instance "> org.springframework.cloud spring-cloud-starter-sleuth + + org.springframework.cloud + spring-cloud-stream + jar + + + org.springframework.cloud + spring-cloud-stream + test-jar + test + test-binder + org.springframework.boot spring-boot-starter-test diff --git a/tests/spring-cloud-sleuth-instrumentation-messaging-tests/src/test/java/org/springframework/cloud/sleuth/instrument/messaging/TraceContextPropagationChannelInterceptorTests.java b/tests/spring-cloud-sleuth-instrumentation-messaging-tests/src/test/java/org/springframework/cloud/sleuth/instrument/messaging/TraceContextPropagationChannelInterceptorTests.java index ad823b785..52e85490d 100644 --- a/tests/spring-cloud-sleuth-instrumentation-messaging-tests/src/test/java/org/springframework/cloud/sleuth/instrument/messaging/TraceContextPropagationChannelInterceptorTests.java +++ b/tests/spring-cloud-sleuth-instrumentation-messaging-tests/src/test/java/org/springframework/cloud/sleuth/instrument/messaging/TraceContextPropagationChannelInterceptorTests.java @@ -37,14 +37,14 @@ import org.springframework.integration.support.MessageBuilder; import org.springframework.messaging.Message; import org.springframework.messaging.PollableChannel; import org.springframework.test.annotation.DirtiesContext; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.context.junit4.SpringRunner; import static org.assertj.core.api.Assertions.assertThat; /** * @author Spencer Gibb */ -@RunWith(SpringJUnit4ClassRunner.class) +@RunWith(SpringRunner.class) @SpringBootTest(classes = TraceContextPropagationChannelInterceptorTests.App.class) @DirtiesContext public class TraceContextPropagationChannelInterceptorTests { @@ -68,6 +68,7 @@ public class TraceContextPropagationChannelInterceptorTests { public void testSpanPropagation() { Span span = this.tracing.tracer().nextSpan().name("http:testSendMessage").start(); String expectedSpanId = SpanUtil.idToHex(span.context().spanId()); + try (Tracer.SpanInScope ws = this.tracing.tracer().withSpanInScope(span)) { this.channel.send(MessageBuilder.withPayload("hi").build()); } @@ -75,6 +76,10 @@ public class TraceContextPropagationChannelInterceptorTests { span.finish(); } + assertThatNewSpanIdWasSetOnMessage(expectedSpanId); + } + + private void assertThatNewSpanIdWasSetOnMessage(String expectedSpanId) { Message message = this.channel.receive(0); assertThat(message).as("message was null").isNotNull(); @@ -91,7 +96,6 @@ public class TraceContextPropagationChannelInterceptorTests { String.class); assertThat(parentId).as("parentId was not equal to parent's id") .isEqualTo(this.reporter.getSpans().get(0).id()); - } @Configuration diff --git a/tests/spring-cloud-sleuth-instrumentation-messaging-tests/src/test/java/org/springframework/cloud/sleuth/instrument/messaging/TraceStreamChannelInterceptorTests.java b/tests/spring-cloud-sleuth-instrumentation-messaging-tests/src/test/java/org/springframework/cloud/sleuth/instrument/messaging/TraceStreamChannelInterceptorTests.java new file mode 100644 index 000000000..dc126fe9f --- /dev/null +++ b/tests/spring-cloud-sleuth-instrumentation-messaging-tests/src/test/java/org/springframework/cloud/sleuth/instrument/messaging/TraceStreamChannelInterceptorTests.java @@ -0,0 +1,123 @@ +/* + * Copyright 2013-2019 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 + * + * https://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.instrument.messaging; + +import brave.Span; +import brave.Tracer; +import brave.Tracing; +import brave.sampler.Sampler; +import org.junit.After; +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.autoconfigure.ImportAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.cloud.sleuth.instrument.util.SpanUtil; +import org.springframework.cloud.sleuth.util.ArrayListSpanReporter; +import org.springframework.cloud.stream.binder.test.OutputDestination; +import org.springframework.cloud.stream.binder.test.TestChannelBinderConfiguration; +import org.springframework.cloud.stream.function.StreamBridge; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.messaging.Message; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.context.junit4.SpringRunner; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * @author Spencer Gibb + */ +@RunWith(SpringRunner.class) +@SpringBootTest(classes = TraceStreamChannelInterceptorTests.App.class, + properties = "spring.cloud.stream.source=testSupplier") +@DirtiesContext +public class TraceStreamChannelInterceptorTests { + + @Autowired + private OutputDestination channel; + + @Autowired + private Tracing tracing; + + @Autowired + private StreamBridge streamBridge; + + @Autowired + private ArrayListSpanReporter reporter; + + @After + public void close() { + this.reporter.clear(); + } + + @Test + public void testSpanPropagationViaBridge() { + Span span = this.tracing.tracer().nextSpan().name("http:testSendMessage").start(); + String expectedSpanId = SpanUtil.idToHex(span.context().spanId()); + + try (Tracer.SpanInScope ws = this.tracing.tracer().withSpanInScope(span)) { + this.streamBridge.send("testSupplier-out-0", "hi"); + } + finally { + span.finish(); + } + + assertThatNewSpanIdWasSetOnMessage(expectedSpanId); + } + + private void assertThatNewSpanIdWasSetOnMessage(String expectedSpanId) { + Message message = this.channel.receive(0); + assertThat(message).as("message was null").isNotNull(); + + String spanId = message.getHeaders().get(TraceMessageHeaders.SPAN_ID_NAME, + String.class); + assertThat(spanId).as("spanId was equal to parent's id") + .isNotEqualTo(expectedSpanId); + + String traceId = message.getHeaders().get(TraceMessageHeaders.TRACE_ID_NAME, + String.class); + assertThat(traceId).as("traceId was null").isNotNull(); + + String parentId = message.getHeaders().get(TraceMessageHeaders.PARENT_ID_NAME, + String.class); + // [0] - producer + // [1] - http:testsendmessage + assertThat(parentId).as("parentId was not equal to parent's id") + .isEqualTo(this.reporter.getSpans().get(1).id()); + } + + @Configuration + @EnableAutoConfiguration + @ImportAutoConfiguration(TestChannelBinderConfiguration.class) + static class App { + + @Bean + Sampler testSampler() { + return Sampler.ALWAYS_SAMPLE; + } + + @Bean + ArrayListSpanReporter reporter() { + return new ArrayListSpanReporter(); + } + + } + +} diff --git a/tests/spring-cloud-sleuth-instrumentation-messaging-tests/src/test/java/org/springframework/cloud/sleuth/instrument/messaging/issues/issue_943/HelloSpringIntegration.java b/tests/spring-cloud-sleuth-instrumentation-messaging-tests/src/test/java/org/springframework/cloud/sleuth/instrument/messaging/issues/issue_943/HelloSpringIntegration.java index 20fef6839..32b80db76 100644 --- a/tests/spring-cloud-sleuth-instrumentation-messaging-tests/src/test/java/org/springframework/cloud/sleuth/instrument/messaging/issues/issue_943/HelloSpringIntegration.java +++ b/tests/spring-cloud-sleuth-instrumentation-messaging-tests/src/test/java/org/springframework/cloud/sleuth/instrument/messaging/issues/issue_943/HelloSpringIntegration.java @@ -19,7 +19,6 @@ package org.springframework.cloud.sleuth.instrument.messaging.issues.issue_943; import brave.sampler.Sampler; import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration; @@ -30,8 +29,7 @@ import org.springframework.integration.config.EnableIntegration; import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.web.client.RestTemplate; -@SpringBootApplication -@EnableAutoConfiguration(exclude = { DataSourceAutoConfiguration.class, +@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class }) @ImportResource("classpath:beans/applicationContext.xml") @EnableIntegration