diff --git a/brave/src/main/java/brave/TracingCustomizer.java b/brave/src/main/java/brave/TracingCustomizer.java
new file mode 100644
index 0000000000..69dc4c5c53
--- /dev/null
+++ b/brave/src/main/java/brave/TracingCustomizer.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2013-2019 The OpenZipkin 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 brave;
+
+import brave.handler.FinishedSpanHandler;
+import zipkin2.reporter.Reporter;
+
+/**
+ * This allows configuration plugins to collaborate on building an instance of {@link Tracing}.
+ *
+ *
For example a customizer can configure {@link Tracing.Builder#addFinishedSpanHandler(FinishedSpanHandler)
+ * finished span handlers} without having to also configure {@link Tracing.Builder#spanReporter(Reporter)
+ * span reporting}.
+ *
+ *
Integration examples
+ *
+ * In practice, a dependency injection tool applies a collection of these instances prior to
+ * {@link Tracing.Builder#build() building the tracing instance}. For example, an injected {@code
+ * List} parameter to a provider of {@link Tracing}.
+ *
+ * Here are some examples, in alphabetical order:
+ *
+ *
+ * @since 5.7
+ */
+public interface TracingCustomizer {
+ void customize(Tracing.Builder builder);
+}
diff --git a/instrumentation/http/src/main/java/brave/http/HttpTracingCustomizer.java b/instrumentation/http/src/main/java/brave/http/HttpTracingCustomizer.java
new file mode 100644
index 0000000000..8d7004501f
--- /dev/null
+++ b/instrumentation/http/src/main/java/brave/http/HttpTracingCustomizer.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2013-2019 The OpenZipkin 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 brave.http;
+
+import brave.Tracing;
+import brave.TracingCustomizer;
+
+/**
+ * This allows configuration plugins to collaborate on building an instance of {@link HttpTracing}.
+ *
+ * For example, a customizer can setup {@link HttpTracing.Builder#clientParser(HttpClientParser)
+ * http parsers} without a reference to the {@link HttpTracing.Builder#Builder(Tracing) tracing
+ * component}.
+ *
+ *
This also allows one object to customize both {@link Tracing}, via {@link TracingCustomizer},
+ * and the http layer {@link HttpTracing}, by implementing both customizer interfaces.
+ *
+ *
Integration examples
+ *
+ * In practice, a dependency injection tool applies a collection of these instances prior to
+ * {@link HttpTracing.Builder#build() building the tracing instance}. For example, an injected
+ * {@code List} parameter to a provider of {@link HttpTracing}.
+ *
+ * Here are some examples, in alphabetical order:
+ *
+ *
+ * @see TracingCustomizer
+ * @since 5.7
+ */
+public interface HttpTracingCustomizer {
+ void customize(HttpTracing.Builder builder);
+}
diff --git a/spring-beans/src/main/java/brave/spring/beans/HttpTracingFactoryBean.java b/spring-beans/src/main/java/brave/spring/beans/HttpTracingFactoryBean.java
index 6a2e722255..655aa4056a 100644
--- a/spring-beans/src/main/java/brave/spring/beans/HttpTracingFactoryBean.java
+++ b/spring-beans/src/main/java/brave/spring/beans/HttpTracingFactoryBean.java
@@ -18,6 +18,8 @@
import brave.http.HttpSampler;
import brave.http.HttpServerParser;
import brave.http.HttpTracing;
+import brave.http.HttpTracingCustomizer;
+import java.util.List;
import org.springframework.beans.factory.FactoryBean;
/** Spring XML config does not support chained builders. This converts accordingly */
@@ -28,6 +30,7 @@ public class HttpTracingFactoryBean implements FactoryBean {
HttpServerParser serverParser;
HttpSampler clientSampler;
HttpSampler serverSampler;
+ List customizers;
@Override public HttpTracing getObject() {
HttpTracing.Builder builder = HttpTracing.newBuilder(tracing);
@@ -35,6 +38,9 @@ public class HttpTracingFactoryBean implements FactoryBean {
if (serverParser != null) builder.serverParser(serverParser);
if (clientSampler != null) builder.clientSampler(clientSampler);
if (serverSampler != null) builder.serverSampler(serverSampler);
+ if (customizers != null) {
+ for (HttpTracingCustomizer customizer : customizers) customizer.customize(builder);
+ }
return builder.build();
}
@@ -65,4 +71,8 @@ public void setClientSampler(HttpSampler clientSampler) {
public void setServerSampler(HttpSampler serverSampler) {
this.serverSampler = serverSampler;
}
+
+ public void setCustomizers(List customizers) {
+ this.customizers = customizers;
+ }
}
diff --git a/spring-beans/src/main/java/brave/spring/beans/TracingFactoryBean.java b/spring-beans/src/main/java/brave/spring/beans/TracingFactoryBean.java
index 1f3b3af6f7..dbbb82108f 100644
--- a/spring-beans/src/main/java/brave/spring/beans/TracingFactoryBean.java
+++ b/spring-beans/src/main/java/brave/spring/beans/TracingFactoryBean.java
@@ -16,6 +16,7 @@
import brave.Clock;
import brave.ErrorParser;
import brave.Tracing;
+import brave.TracingCustomizer;
import brave.handler.FinishedSpanHandler;
import brave.propagation.CurrentTraceContext;
import brave.propagation.Propagation;
@@ -40,6 +41,7 @@ public class TracingFactoryBean extends AbstractFactoryBean {
Propagation.Factory propagationFactory;
Boolean traceId128Bit;
Boolean supportsJoin;
+ List customizers;
@Override protected Tracing createInstance() {
Tracing.Builder builder = Tracing.newBuilder();
@@ -59,6 +61,9 @@ public class TracingFactoryBean extends AbstractFactoryBean {
if (propagationFactory != null) builder.propagationFactory(propagationFactory);
if (traceId128Bit != null) builder.traceId128Bit(traceId128Bit);
if (supportsJoin != null) builder.supportsJoin(supportsJoin);
+ if (customizers != null) {
+ for (TracingCustomizer customizer : customizers) customizer.customize(builder);
+ }
return builder.build();
}
@@ -114,10 +119,6 @@ public void setCurrentTraceContext(CurrentTraceContext currentTraceContext) {
this.currentTraceContext = currentTraceContext;
}
- public Propagation.Factory getPropagationFactory() {
- return propagationFactory;
- }
-
public void setPropagationFactory(Propagation.Factory propagationFactory) {
this.propagationFactory = propagationFactory;
}
@@ -126,11 +127,11 @@ public void setTraceId128Bit(boolean traceId128Bit) {
this.traceId128Bit = traceId128Bit;
}
- public Boolean getSupportsJoin() {
- return supportsJoin;
- }
-
public void setSupportsJoin(Boolean supportsJoin) {
this.supportsJoin = supportsJoin;
}
+
+ public void setCustomizers(List customizers) {
+ this.customizers = customizers;
+ }
}
diff --git a/spring-beans/src/test/java/brave/spring/beans/CurrentTraceContextFactoryBeanTest.java b/spring-beans/src/test/java/brave/spring/beans/CurrentTraceContextFactoryBeanTest.java
index 3de0fe4ec5..3a269bd7db 100755
--- a/spring-beans/src/test/java/brave/spring/beans/CurrentTraceContextFactoryBeanTest.java
+++ b/spring-beans/src/test/java/brave/spring/beans/CurrentTraceContextFactoryBeanTest.java
@@ -31,7 +31,9 @@ public class CurrentTraceContextFactoryBeanTest {
context = new XmlBeans(""
+ "\n"
+ " \n"
- + " \n"
+ + " \n"
+ + " \n"
+ + "
\n"
+ " "
+ ""
);
diff --git a/spring-beans/src/test/java/brave/spring/beans/HttpTracingFactoryBeanTest.java b/spring-beans/src/test/java/brave/spring/beans/HttpTracingFactoryBeanTest.java
index dc35e43c87..340b5bf1d5 100755
--- a/spring-beans/src/test/java/brave/spring/beans/HttpTracingFactoryBeanTest.java
+++ b/spring-beans/src/test/java/brave/spring/beans/HttpTracingFactoryBeanTest.java
@@ -14,15 +14,19 @@
package brave.spring.beans;
import brave.Tracing;
+import brave.TracingCustomizer;
import brave.http.HttpClientParser;
import brave.http.HttpSampler;
import brave.http.HttpServerParser;
import brave.http.HttpTracing;
+import brave.http.HttpTracingCustomizer;
import org.junit.After;
import org.junit.Test;
import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
public class HttpTracingFactoryBeanTest {
@@ -117,4 +121,28 @@ public class HttpTracingFactoryBeanTest {
.extracting("serverSampler")
.isEqualTo(HttpSampler.NEVER_SAMPLE);
}
+
+ public static final HttpTracingCustomizer CUSTOMIZER_ONE = mock(HttpTracingCustomizer.class);
+ public static final HttpTracingCustomizer CUSTOMIZER_TWO = mock(HttpTracingCustomizer.class);
+
+ @Test public void customizers() {
+ context = new XmlBeans(""
+ + "\n"
+ + " \n"
+ + " \n"
+ + " \n"
+ + " \n"
+ + " \n"
+ + " \n"
+ + " \n"
+ + "
\n"
+ + " "
+ + ""
+ );
+
+ context.getBean("httpTracing", HttpTracing.class);
+
+ verify(CUSTOMIZER_ONE).customize(any(HttpTracing.Builder.class));
+ verify(CUSTOMIZER_TWO).customize(any(HttpTracing.Builder.class));
+ }
}
diff --git a/spring-beans/src/test/java/brave/spring/beans/TracingFactoryBeanTest.java b/spring-beans/src/test/java/brave/spring/beans/TracingFactoryBeanTest.java
index c1112dadb2..264d296408 100755
--- a/spring-beans/src/test/java/brave/spring/beans/TracingFactoryBeanTest.java
+++ b/spring-beans/src/test/java/brave/spring/beans/TracingFactoryBeanTest.java
@@ -16,17 +16,22 @@
import brave.Clock;
import brave.ErrorParser;
import brave.Tracing;
+import brave.TracingCustomizer;
import brave.handler.FinishedSpanHandler;
+import brave.propagation.CurrentTraceContext;
import brave.propagation.ExtraFieldPropagation;
import brave.propagation.ThreadLocalCurrentTraceContext;
import brave.sampler.Sampler;
+import java.util.List;
import org.junit.After;
import org.junit.Test;
import zipkin2.Endpoint;
import zipkin2.reporter.Reporter;
import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
public class TracingFactoryBeanTest {
public static final Clock CLOCK = mock(Clock.class);
@@ -243,4 +248,25 @@ public class TracingFactoryBeanTest {
.extracting("tracer.supportsJoin")
.isEqualTo(true);
}
+
+ public static final TracingCustomizer CUSTOMIZER_ONE = mock(TracingCustomizer.class);
+ public static final TracingCustomizer CUSTOMIZER_TWO = mock(TracingCustomizer.class);
+
+ @Test public void customizers() {
+ context = new XmlBeans(""
+ + "\n"
+ + " \n"
+ + " \n"
+ + " \n"
+ + " \n"
+ + "
\n"
+ + " "
+ + ""
+ );
+
+ context.getBean("tracing", Tracing.class);
+
+ verify(CUSTOMIZER_ONE).customize(any(Tracing.Builder.class));
+ verify(CUSTOMIZER_TWO).customize(any(Tracing.Builder.class));
+ }
}