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