diff --git a/.gitignore b/.gitignore index a3f50035..b9266af2 100644 --- a/.gitignore +++ b/.gitignore @@ -22,3 +22,13 @@ target # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml hs_err_pid* + +# IntelliJ project files +.idea/ +*.iml + +# Eclipse +.project +.classpath +.settings + diff --git a/opentracing-spring-cloud-api-extensions/pom.xml b/opentracing-spring-cloud-api-extensions/pom.xml new file mode 100644 index 00000000..5a50110a --- /dev/null +++ b/opentracing-spring-cloud-api-extensions/pom.xml @@ -0,0 +1,68 @@ + + + 4.0.0 + + io.opentracing.contrib + opentracing-spring-cloud-parent + 0.0.1-SNAPSHOT + + + opentracing-spring-cloud-api-extensions + + + + io.opentracing.contrib + opentracing-api-extensions + ${version.io.opentracing.contrib-opentracing-api-extensions} + + + io.opentracing.contrib + opentracing-api-extensions-tracer + ${version.io.opentracing.contrib-opentracing-api-extensions} + + + + org.springframework.boot + spring-boot-autoconfigure + ${version.org.springframework.boot} + + + + commons-logging + commons-logging + ${version.commons-logging} + provided + + + + io.opentracing + opentracing-mock + test + + + io.opentracing + opentracing-util + test + + + org.awaitility + awaitility + ${version.org.awaitility-awaitility} + test + + + org.springframework.boot + spring-boot-starter-test + ${version.org.springframework.boot} + test + + + org.springframework.boot + spring-boot-starter-web + ${version.org.springframework.boot} + test + + + diff --git a/opentracing-spring-cloud-api-extensions/src/main/java/io/opentracing/contrib/spring/cloud/api/extensions/TracerBeanPostProcessor.java b/opentracing-spring-cloud-api-extensions/src/main/java/io/opentracing/contrib/spring/cloud/api/extensions/TracerBeanPostProcessor.java new file mode 100644 index 00000000..cf230c2e --- /dev/null +++ b/opentracing-spring-cloud-api-extensions/src/main/java/io/opentracing/contrib/spring/cloud/api/extensions/TracerBeanPostProcessor.java @@ -0,0 +1,61 @@ +/** + * Copyright 2017 The OpenTracing 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 io.opentracing.contrib.spring.cloud.api.extensions; + +import java.util.Set; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.config.BeanPostProcessor; +import org.springframework.context.annotation.Configuration; + +import io.opentracing.Tracer; +import io.opentracing.contrib.api.TracerObserver; +import io.opentracing.contrib.api.tracer.APIExtensionsTracer; + +@Configuration +public class TracerBeanPostProcessor implements BeanPostProcessor { + + private static final Log log = LogFactory.getLog(TracerBeanPostProcessor.class); + + @Autowired(required=false) + private Set tracerObservers; + + @Override + public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { + if (tracerObservers != null && bean instanceof Tracer) { + boolean observerFound = false; + APIExtensionsTracer tracer = new APIExtensionsTracer((Tracer)bean); + for (TracerObserver observer : tracerObservers) { + if (observer != null) { + observerFound = true; + tracer.addTracerObserver(observer); + } + } + if (observerFound) { + log.info("Use extensions API tracer with observers=" + tracerObservers); + return tracer; + } + } + return bean; + } + + @Override + public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { + return bean; + } + +} diff --git a/opentracing-spring-cloud-api-extensions/src/main/resources/META-INF/spring.factories b/opentracing-spring-cloud-api-extensions/src/main/resources/META-INF/spring.factories new file mode 100644 index 00000000..c15178c5 --- /dev/null +++ b/opentracing-spring-cloud-api-extensions/src/main/resources/META-INF/spring.factories @@ -0,0 +1,2 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ +io.opentracing.contrib.spring.cloud.api.extensions.TracerBeanPostProcessor diff --git a/opentracing-spring-cloud-api-extensions/src/test/java/io/opentracing/contrib/spring/cloud/api/extensions/TracerBeanPostProcessorNoObserversTest.java b/opentracing-spring-cloud-api-extensions/src/test/java/io/opentracing/contrib/spring/cloud/api/extensions/TracerBeanPostProcessorNoObserversTest.java new file mode 100644 index 00000000..479edd38 --- /dev/null +++ b/opentracing-spring-cloud-api-extensions/src/test/java/io/opentracing/contrib/spring/cloud/api/extensions/TracerBeanPostProcessorNoObserversTest.java @@ -0,0 +1,51 @@ +/** + * Copyright 2017 The OpenTracing 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 io.opentracing.contrib.spring.cloud.api.extensions; + +import static org.junit.Assert.assertEquals; + +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.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import io.opentracing.Tracer; +import io.opentracing.mock.MockTracer; +import io.opentracing.util.ThreadLocalActiveSpanSource; + +@SpringBootTest( + classes = {TracerBeanPostProcessorNoObserversTest.SpringConfiguration.class}) +@RunWith(SpringJUnit4ClassRunner.class) +public class TracerBeanPostProcessorNoObserversTest { + + @Configuration + @EnableAutoConfiguration + public static class SpringConfiguration { + @Bean + public MockTracer tracer() { + return new MockTracer(new ThreadLocalActiveSpanSource()); + } + } + + @Autowired + protected Tracer tracer; + + @Test + public void testTracerNotWrapped() { + assertEquals(MockTracer.class, tracer.getClass()); + } +} diff --git a/opentracing-spring-cloud-api-extensions/src/test/java/io/opentracing/contrib/spring/cloud/api/extensions/TracerBeanPostProcessorTest.java b/opentracing-spring-cloud-api-extensions/src/test/java/io/opentracing/contrib/spring/cloud/api/extensions/TracerBeanPostProcessorTest.java new file mode 100644 index 00000000..ad09cb70 --- /dev/null +++ b/opentracing-spring-cloud-api-extensions/src/test/java/io/opentracing/contrib/spring/cloud/api/extensions/TracerBeanPostProcessorTest.java @@ -0,0 +1,76 @@ +/** + * Copyright 2017 The OpenTracing 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 io.opentracing.contrib.spring.cloud.api.extensions; + +import static org.junit.Assert.assertNotEquals; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Matchers; +import org.mockito.Mockito; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import io.opentracing.Tracer; +import io.opentracing.contrib.api.SpanData; +import io.opentracing.contrib.api.TracerObserver; +import io.opentracing.mock.MockTracer; +import io.opentracing.util.ThreadLocalActiveSpanSource; + +@SpringBootTest( + classes = {TracerBeanPostProcessorTest.SpringConfiguration.class}) +@RunWith(SpringJUnit4ClassRunner.class) +public class TracerBeanPostProcessorTest { + + private static final MockTracer mockTracer = new MockTracer(new ThreadLocalActiveSpanSource()); + + private static final TracerObserver tracerObserver = Mockito.mock(TracerObserver.class); + + @Configuration + @EnableAutoConfiguration + public static class SpringConfiguration { + @Bean + public Tracer tracer() { + return mockTracer; + } + + @Bean + public TracerObserver observer() { + return tracerObserver; + } + } + + @Autowired + protected Tracer tracer; + + @Before + public void before() { + mockTracer.reset(); + } + + @Test + public void testTracerWrapped() { + assertNotEquals(MockTracer.class, tracer.getClass()); + + tracer.buildSpan("testop").startManual(); + + Mockito.verify(tracerObserver).onStart(Matchers.any(SpanData.class)); + } + +} diff --git a/opentracing-spring-cloud-metrics-prometheus/pom.xml b/opentracing-spring-cloud-metrics-prometheus/pom.xml new file mode 100644 index 00000000..6aa08aa4 --- /dev/null +++ b/opentracing-spring-cloud-metrics-prometheus/pom.xml @@ -0,0 +1,89 @@ + + + 4.0.0 + + io.opentracing.contrib + opentracing-spring-cloud-parent + 0.0.1-SNAPSHOT + + + opentracing-spring-cloud-metrics-prometheus + + + + io.opentracing.contrib + opentracing-spring-cloud-metrics + ${project.version} + + + + io.opentracing.contrib + opentracing-metrics-prometheus + ${version.io.opentracing.contrib-opentracing-metrics} + + + io.prometheus + * + + + + + + io.prometheus + simpleclient + ${version.io.prometheus} + provided + + + io.prometheus + simpleclient_servlet + ${version.io.prometheus} + provided + + + + javax.servlet + javax.servlet-api + ${version.javax.servlet-api} + provided + + + io.opentracing.contrib + opentracing-web-servlet-filter + ${version.io.opentracing.contrib-opentracing-web-servlet-filter} + provided + + + + org.springframework.boot + spring-boot-autoconfigure + ${version.org.springframework.boot} + + + + io.opentracing + opentracing-mock + test + + + org.awaitility + awaitility + ${version.org.awaitility-awaitility} + test + + + org.springframework.boot + spring-boot-starter-test + ${version.org.springframework.boot} + test + + + org.springframework.boot + spring-boot-starter-web + ${version.org.springframework.boot} + test + + + diff --git a/opentracing-spring-cloud-metrics-prometheus/src/main/java/io/opentracing/contrib/spring/cloud/metrics/prometheus/PrometheusConfiguration.java b/opentracing-spring-cloud-metrics-prometheus/src/main/java/io/opentracing/contrib/spring/cloud/metrics/prometheus/PrometheusConfiguration.java new file mode 100644 index 00000000..271ea797 --- /dev/null +++ b/opentracing-spring-cloud-metrics-prometheus/src/main/java/io/opentracing/contrib/spring/cloud/metrics/prometheus/PrometheusConfiguration.java @@ -0,0 +1,32 @@ +/** + * Copyright 2017 The OpenTracing 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 io.opentracing.contrib.spring.cloud.metrics.prometheus; + +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import io.prometheus.client.CollectorRegistry; + +@Configuration +@ConditionalOnClass(value = {CollectorRegistry.class}) +public class PrometheusConfiguration { + + @Bean + @ConditionalOnMissingBean + public CollectorRegistry defaultCollectorRegistry() { + return CollectorRegistry.defaultRegistry; + } +} diff --git a/opentracing-spring-cloud-metrics-prometheus/src/main/java/io/opentracing/contrib/spring/cloud/metrics/prometheus/PrometheusMetricsReporterConfiguration.java b/opentracing-spring-cloud-metrics-prometheus/src/main/java/io/opentracing/contrib/spring/cloud/metrics/prometheus/PrometheusMetricsReporterConfiguration.java new file mode 100644 index 00000000..5999759b --- /dev/null +++ b/opentracing-spring-cloud-metrics-prometheus/src/main/java/io/opentracing/contrib/spring/cloud/metrics/prometheus/PrometheusMetricsReporterConfiguration.java @@ -0,0 +1,57 @@ +/** + * Copyright 2017 The OpenTracing 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 io.opentracing.contrib.spring.cloud.metrics.prometheus; + +import java.util.Set; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import io.opentracing.contrib.metrics.MetricLabel; +import io.opentracing.contrib.metrics.MetricsReporter; +import io.opentracing.contrib.metrics.prometheus.PrometheusMetricsReporter; +import io.prometheus.client.CollectorRegistry; + +@Configuration +@ConditionalOnClass(value = {CollectorRegistry.class}) +public class PrometheusMetricsReporterConfiguration { + + @Autowired + private CollectorRegistry collectorRegistry; + + @Value("${opentracing.metrics.name:}") + private String metricsName; + + @Autowired(required=false) + private Set metricLabels; + + @Bean + public MetricsReporter prometheusMetricsReporter() { + PrometheusMetricsReporter.Builder builder = PrometheusMetricsReporter.newMetricsReporter(); + if (metricsName != null && !metricsName.isEmpty()) { + builder.withName(metricsName); + } + builder.withCollectorRegistry(collectorRegistry); + if (metricLabels != null && !metricLabels.isEmpty()) { + for (MetricLabel label : metricLabels) { + builder.withCustomLabel(label); + } + } + return builder.build(); + } + +} diff --git a/opentracing-spring-cloud-metrics-prometheus/src/main/java/io/opentracing/contrib/spring/cloud/metrics/prometheus/PrometheusServletConfiguration.java b/opentracing-spring-cloud-metrics-prometheus/src/main/java/io/opentracing/contrib/spring/cloud/metrics/prometheus/PrometheusServletConfiguration.java new file mode 100644 index 00000000..bc8894e4 --- /dev/null +++ b/opentracing-spring-cloud-metrics-prometheus/src/main/java/io/opentracing/contrib/spring/cloud/metrics/prometheus/PrometheusServletConfiguration.java @@ -0,0 +1,39 @@ +/** + * Copyright 2017 The OpenTracing 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 io.opentracing.contrib.spring.cloud.metrics.prometheus; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.web.servlet.ServletRegistrationBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import io.prometheus.client.CollectorRegistry; +import io.prometheus.client.exporter.MetricsServlet; + +@Configuration +@ConditionalOnClass(value = {MetricsServlet.class}) +public class PrometheusServletConfiguration { + + @Value("${opentracing.metrics.exporter.http.path:false}") + private String metricsPath; + + @Bean + @ConditionalOnProperty(name="opentracing.metrics.exporter.http.path") + ServletRegistrationBean registerPrometheusExporterServlet(CollectorRegistry metricRegistry) { + return new ServletRegistrationBean(new MetricsServlet(metricRegistry), metricsPath); + } + +} diff --git a/opentracing-spring-cloud-metrics-prometheus/src/main/java/io/opentracing/contrib/spring/cloud/metrics/prometheus/PrometheusServletSkipPatternConfiguration.java b/opentracing-spring-cloud-metrics-prometheus/src/main/java/io/opentracing/contrib/spring/cloud/metrics/prometheus/PrometheusServletSkipPatternConfiguration.java new file mode 100644 index 00000000..a914ed07 --- /dev/null +++ b/opentracing-spring-cloud-metrics-prometheus/src/main/java/io/opentracing/contrib/spring/cloud/metrics/prometheus/PrometheusServletSkipPatternConfiguration.java @@ -0,0 +1,43 @@ +/** + * Copyright 2017 The OpenTracing 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 io.opentracing.contrib.spring.cloud.metrics.prometheus; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import java.util.regex.Pattern; + +import org.springframework.context.annotation.Configuration; + +import io.opentracing.contrib.web.servlet.filter.TracingFilter; +import io.prometheus.client.exporter.MetricsServlet; + +@Configuration +@ConditionalOnClass(value = {MetricsServlet.class, TracingFilter.class}) +@ConditionalOnProperty(name="opentracing.metrics.exporter.http.path") +public class PrometheusServletSkipPatternConfiguration implements javax.servlet.ServletContextListener { + + @Value("${opentracing.metrics.exporter.http.path:false}") + private String metricsPath; + + @Override + public void contextInitialized(javax.servlet.ServletContextEvent sce) { + sce.getServletContext().setAttribute(TracingFilter.SKIP_PATTERN, Pattern.compile(metricsPath)); + } + + @Override + public void contextDestroyed(javax.servlet.ServletContextEvent sce) { + } + +} diff --git a/opentracing-spring-cloud-metrics-prometheus/src/main/resources/META-INF/spring.factories b/opentracing-spring-cloud-metrics-prometheus/src/main/resources/META-INF/spring.factories new file mode 100644 index 00000000..a65be4d0 --- /dev/null +++ b/opentracing-spring-cloud-metrics-prometheus/src/main/resources/META-INF/spring.factories @@ -0,0 +1,5 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ +io.opentracing.contrib.spring.cloud.metrics.prometheus.PrometheusConfiguration,\ +io.opentracing.contrib.spring.cloud.metrics.prometheus.PrometheusMetricsReporterConfiguration,\ +io.opentracing.contrib.spring.cloud.metrics.prometheus.PrometheusServletConfiguration,\ +io.opentracing.contrib.spring.cloud.metrics.prometheus.PrometheusServletSkipPatternConfiguration diff --git a/opentracing-spring-cloud-metrics/pom.xml b/opentracing-spring-cloud-metrics/pom.xml new file mode 100644 index 00000000..0250705e --- /dev/null +++ b/opentracing-spring-cloud-metrics/pom.xml @@ -0,0 +1,57 @@ + + + 4.0.0 + + io.opentracing.contrib + opentracing-spring-cloud-parent + 0.0.1-SNAPSHOT + + + opentracing-spring-cloud-metrics + + + + io.opentracing.contrib + opentracing-spring-cloud-api-extensions + ${project.version} + + + + io.opentracing.contrib + opentracing-metrics + ${version.io.opentracing.contrib-opentracing-metrics} + + + + org.springframework.boot + spring-boot-autoconfigure + ${version.org.springframework.boot} + + + + io.opentracing + opentracing-mock + test + + + org.awaitility + awaitility + ${version.org.awaitility-awaitility} + test + + + org.springframework.boot + spring-boot-starter-test + ${version.org.springframework.boot} + test + + + org.springframework.boot + spring-boot-starter-web + ${version.org.springframework.boot} + test + + + diff --git a/opentracing-spring-cloud-metrics/src/main/java/io/opentracing/contrib/spring/cloud/metrics/MetricsTracerObserverConfiguration.java b/opentracing-spring-cloud-metrics/src/main/java/io/opentracing/contrib/spring/cloud/metrics/MetricsTracerObserverConfiguration.java new file mode 100644 index 00000000..10063f3d --- /dev/null +++ b/opentracing-spring-cloud-metrics/src/main/java/io/opentracing/contrib/spring/cloud/metrics/MetricsTracerObserverConfiguration.java @@ -0,0 +1,40 @@ +/** + * Copyright 2017 The OpenTracing 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 io.opentracing.contrib.spring.cloud.metrics; + +import java.util.Set; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import io.opentracing.contrib.api.TracerObserver; +import io.opentracing.contrib.metrics.MetricsObserver; +import io.opentracing.contrib.metrics.MetricsReporter; + +@Configuration +public class MetricsTracerObserverConfiguration { + + @Autowired(required=false) + private Set metricsReporters; + + @Bean + public TracerObserver metricsTracerObserver() { + if (metricsReporters != null && !metricsReporters.isEmpty()) { + return new MetricsObserver(metricsReporters); + } + return null; + } + +} diff --git a/opentracing-spring-cloud-metrics/src/main/resources/META-INF/spring.factories b/opentracing-spring-cloud-metrics/src/main/resources/META-INF/spring.factories new file mode 100644 index 00000000..7d9cefa2 --- /dev/null +++ b/opentracing-spring-cloud-metrics/src/main/resources/META-INF/spring.factories @@ -0,0 +1,2 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ +io.opentracing.contrib.spring.cloud.metrics.MetricsTracerObserverConfiguration diff --git a/opentracing-spring-cloud-metrics/src/test/java/io/opentracing/contrib/spring/cloud/metrics/MetricsTracerObserverConfigurationNoReportersTest.java b/opentracing-spring-cloud-metrics/src/test/java/io/opentracing/contrib/spring/cloud/metrics/MetricsTracerObserverConfigurationNoReportersTest.java new file mode 100644 index 00000000..1be668c0 --- /dev/null +++ b/opentracing-spring-cloud-metrics/src/test/java/io/opentracing/contrib/spring/cloud/metrics/MetricsTracerObserverConfigurationNoReportersTest.java @@ -0,0 +1,45 @@ +/** + * Copyright 2017 The OpenTracing 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 io.opentracing.contrib.spring.cloud.metrics; + +import static org.junit.Assert.assertNull; + +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.context.annotation.Configuration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import io.opentracing.contrib.api.TracerObserver; + +@SpringBootTest( + classes = {MetricsTracerObserverConfigurationNoReportersTest.SpringConfiguration.class}) +@RunWith(SpringJUnit4ClassRunner.class) +public class MetricsTracerObserverConfigurationNoReportersTest { + + @Configuration + @EnableAutoConfiguration + public static class SpringConfiguration { + } + + @Autowired(required=false) + protected TracerObserver tracerObserver; + + @Test + public void testTracerObserverNoReporters() { + // No tracer observer should be found, as no metrics reporters have been defined + assertNull(tracerObserver); + } +} diff --git a/opentracing-spring-cloud-metrics/src/test/java/io/opentracing/contrib/spring/cloud/metrics/MetricsTracerObserverConfigurationWithReportersTest.java b/opentracing-spring-cloud-metrics/src/test/java/io/opentracing/contrib/spring/cloud/metrics/MetricsTracerObserverConfigurationWithReportersTest.java new file mode 100644 index 00000000..03504b11 --- /dev/null +++ b/opentracing-spring-cloud-metrics/src/test/java/io/opentracing/contrib/spring/cloud/metrics/MetricsTracerObserverConfigurationWithReportersTest.java @@ -0,0 +1,61 @@ +/** + * Copyright 2017 The OpenTracing 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 io.opentracing.contrib.spring.cloud.metrics; + +import static org.junit.Assert.assertNotNull; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mockito; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import io.opentracing.contrib.api.SpanData; +import io.opentracing.contrib.api.TracerObserver; +import io.opentracing.contrib.metrics.MetricsReporter; + +@SpringBootTest( + classes = {MetricsTracerObserverConfigurationWithReportersTest.SpringConfiguration.class}) +@RunWith(SpringJUnit4ClassRunner.class) +public class MetricsTracerObserverConfigurationWithReportersTest { + + private static final MetricsReporter metricsReporter = Mockito.mock(MetricsReporter.class); + + @Configuration + @EnableAutoConfiguration + public static class SpringConfiguration { + @Bean + public MetricsReporter reporter() { + return metricsReporter; + } + } + + @Autowired(required=false) + protected TracerObserver tracerObserver; + + @Test + public void testTracerObserverWithReporters() { + assertNotNull(tracerObserver); + + SpanData spanData = Mockito.mock(SpanData.class); + + tracerObserver.onStart(spanData).onFinish(spanData, System.currentTimeMillis()); + + Mockito.verify(metricsReporter).reportSpan(spanData); + } +} diff --git a/pom.xml b/pom.xml index c5a0922a..17fdde2c 100644 --- a/pom.xml +++ b/pom.xml @@ -7,6 +7,9 @@ 0.0.1-SNAPSHOT opentracing-spring-cloud + opentracing-spring-cloud-api-extensions + opentracing-spring-cloud-metrics + opentracing-spring-cloud-metrics-prometheus pom @@ -42,8 +45,14 @@ 1.8 UTF-8 + 1.2 0.30.0 + 0.0.2 + 0.1.2 0.0.6 + 0.0.9 + 0.0.23 + 3.1.0 1.4.3.RELEASE 3.0.0