HTRACE-230. Make TracerBuilder like all other Builders; an internal rather than adjacent class (cmccabe)
diff --git a/htrace-core/src/main/java/org/apache/htrace/core/Tracer.java b/htrace-core/src/main/java/org/apache/htrace/core/Tracer.java
index 6054a27..28ecdc3 100644
--- a/htrace-core/src/main/java/org/apache/htrace/core/Tracer.java
+++ b/htrace-core/src/main/java/org/apache/htrace/core/Tracer.java
@@ -22,6 +22,8 @@
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;
+import java.util.LinkedList;
+import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.ThreadLocalRandom;
@@ -36,6 +38,121 @@
public class Tracer implements Closeable {
private static final Log LOG = LogFactory.getLog(Tracer.class);
+ public final static String SPAN_RECEIVER_CLASSES_KEY =
+ "span.receiver.classes";
+ public final static String SAMPLER_CLASSES_KEY =
+ "sampler.classes";
+
+ public static class Builder {
+ private String name;
+ private HTraceConfiguration conf = HTraceConfiguration.EMPTY;
+ private ClassLoader classLoader =
+ Builder.class.getClassLoader();
+ private TracerPool tracerPool = TracerPool.GLOBAL;
+
+ public Builder() {
+ }
+
+ public Builder name(String name) {
+ this.name = name;
+ return this;
+ }
+
+ public Builder conf(HTraceConfiguration conf) {
+ this.conf = conf;
+ return this;
+ }
+
+ public Builder tracerPool(TracerPool tracerPool) {
+ this.tracerPool = tracerPool;
+ return this;
+ }
+
+ private void loadSamplers(List<Sampler> samplers) {
+ String classNamesStr = conf.get(SAMPLER_CLASSES_KEY, "");
+ List<String> classNames = getClassNamesFromConf(classNamesStr);
+ StringBuilder bld = new StringBuilder();
+ String prefix = "";
+ for (String className : classNames) {
+ try {
+ Sampler sampler = new Sampler.Builder(conf).
+ className(className).
+ classLoader(classLoader).
+ build();
+ samplers.add(sampler);
+ bld.append(prefix).append(className);
+ prefix = ", ";
+ } catch (Throwable e) {
+ LOG.error("Failed to create SpanReceiver of type " + className, e);
+ }
+ }
+ String resultString = bld.toString();
+ if (resultString.isEmpty()) {
+ resultString = "no samplers";
+ }
+ LOG.info(SAMPLER_CLASSES_KEY + " = " + classNamesStr +
+ "; loaded " + resultString);
+ }
+
+ private void loadSpanReceivers() {
+ String classNamesStr = conf.get(SPAN_RECEIVER_CLASSES_KEY, "");
+ List<String> classNames = getClassNamesFromConf(classNamesStr);
+ StringBuilder bld = new StringBuilder();
+ String prefix = "";
+ for (String className : classNames) {
+ try {
+ tracerPool.loadReceiverType(className, conf, classLoader);
+ bld.append(prefix).append(className);
+ prefix = ", ";
+ } catch (Throwable e) {
+ LOG.error("Failed to create SpanReceiver of type " + className, e);
+ }
+ }
+ String resultString = bld.toString();
+ if (resultString.isEmpty()) {
+ resultString = "no span receivers";
+ }
+ LOG.info(SPAN_RECEIVER_CLASSES_KEY + " = " + classNamesStr +
+ "; loaded " + resultString);
+ }
+
+ /**
+ * Get a list of class names from the HTrace configuration.
+ * Entries which are empty will be removed. Entries which lack a package will
+ * be given the default package.
+ *
+ * @param classNamesStr A semicolon-separated string containing a list
+ * of class names.
+ * @return A list of class names.
+ */
+ private List<String> getClassNamesFromConf(String classNamesStr) {
+ String classNames[] = classNamesStr.split(";");
+ LinkedList<String> cleanedClassNames = new LinkedList<String>();
+ for (String className : classNames) {
+ String cleanedClassName = className.trim();
+ if (!cleanedClassName.isEmpty()) {
+ cleanedClassNames.add(cleanedClassName);
+ }
+ }
+ return cleanedClassNames;
+ }
+
+ public Tracer build() {
+ if (name == null) {
+ throw new RuntimeException("You must specify a name for this Tracer.");
+ }
+ LinkedList<SpanReceiver> spanReceivers = new LinkedList<SpanReceiver>();
+ LinkedList<Sampler> samplers = new LinkedList<Sampler>();
+ loadSamplers(samplers);
+ String tracerId = new TracerId(conf, name).get();
+ Tracer tracer = new Tracer(tracerId, tracerPool,
+ samplers.toArray(new Sampler[samplers.size()]));
+ tracerPool.addTracer(tracer);
+ loadSpanReceivers();
+ return tracer;
+ }
+ }
+
/**
* The thread-specific context for this Tracer.
*
diff --git a/htrace-core/src/main/java/org/apache/htrace/core/TracerBuilder.java b/htrace-core/src/main/java/org/apache/htrace/core/TracerBuilder.java
deleted file mode 100644
index 0f12253..0000000
--- a/htrace-core/src/main/java/org/apache/htrace/core/TracerBuilder.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.htrace.core;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import java.lang.reflect.Constructor;
-import java.util.LinkedList;
-import java.util.List;
-
-/**
- * Builds a new Tracer object.
- */
-public class TracerBuilder {
- public final static String SPAN_RECEIVER_CLASSES_KEY =
- "span.receiver.classes";
- public final static String SAMPLER_CLASSES_KEY =
- "sampler.classes";
-
- private static final Log LOG = LogFactory.getLog(TracerBuilder.class);
-
- private String name;
- private HTraceConfiguration conf = HTraceConfiguration.EMPTY;
- private ClassLoader classLoader =
- TracerBuilder.class.getClassLoader();
- private TracerPool tracerPool = TracerPool.GLOBAL;
-
- public TracerBuilder() {
- }
-
- public TracerBuilder name(String name) {
- this.name = name;
- return this;
- }
-
- public TracerBuilder conf(HTraceConfiguration conf) {
- this.conf = conf;
- return this;
- }
-
- public TracerBuilder tracerPool(TracerPool tracerPool) {
- this.tracerPool = tracerPool;
- return this;
- }
-
- private void loadSamplers(List<Sampler> samplers) {
- String classNamesStr = conf.get(SAMPLER_CLASSES_KEY, "");
- List<String> classNames = getClassNamesFromConf(classNamesStr);
- StringBuilder bld = new StringBuilder();
- String prefix = "";
- for (String className : classNames) {
- try {
- Sampler sampler = new Sampler.Builder(conf).
- className(className).
- classLoader(classLoader).
- build();
- samplers.add(sampler);
- bld.append(prefix).append(className);
- prefix = ", ";
- } catch (Throwable e) {
- LOG.error("Failed to create SpanReceiver of type " + className, e);
- }
- }
- String resultString = bld.toString();
- if (resultString.isEmpty()) {
- resultString = "no samplers";
- }
- LOG.info(SAMPLER_CLASSES_KEY + " = " + classNamesStr +
- "; loaded " + resultString);
- }
-
- private void loadSpanReceivers() {
- String classNamesStr = conf.get(SPAN_RECEIVER_CLASSES_KEY, "");
- List<String> classNames = getClassNamesFromConf(classNamesStr);
- StringBuilder bld = new StringBuilder();
- String prefix = "";
- for (String className : classNames) {
- try {
- tracerPool.loadReceiverType(className, conf, classLoader);
- bld.append(prefix).append(className);
- prefix = ", ";
- } catch (Throwable e) {
- LOG.error("Failed to create SpanReceiver of type " + className, e);
- }
- }
- String resultString = bld.toString();
- if (resultString.isEmpty()) {
- resultString = "no span receivers";
- }
- LOG.info(SPAN_RECEIVER_CLASSES_KEY + " = " + classNamesStr +
- "; loaded " + resultString);
- }
-
- /**
- * Get a list of class names from the HTrace configuration.
- * Entries which are empty will be removed. Entries which lack a package will
- * be given the default package.
- *
- * @param classNamesStr A semicolon-separated string containing a list
- * of class names.
- * @return A list of class names.
- */
- private List<String> getClassNamesFromConf(String classNamesStr) {
- String classNames[] = classNamesStr.split(";");
- LinkedList<String> cleanedClassNames = new LinkedList<String>();
- for (String className : classNames) {
- String cleanedClassName = className.trim();
- if (!cleanedClassName.isEmpty()) {
- cleanedClassNames.add(cleanedClassName);
- }
- }
- return cleanedClassNames;
- }
-
- public Tracer build() {
- if (name == null) {
- throw new RuntimeException("You must specify a name for this Tracer.");
- }
- LinkedList<SpanReceiver> spanReceivers = new LinkedList<SpanReceiver>();
- LinkedList<Sampler> samplers = new LinkedList<Sampler>();
- loadSamplers(samplers);
- String tracerId = new TracerId(conf, name).get();
- Tracer tracer = new Tracer(tracerId, tracerPool,
- samplers.toArray(new Sampler[samplers.size()]));
- tracerPool.addTracer(tracer);
- loadSpanReceivers();
- return tracer;
- }
-}
diff --git a/htrace-core/src/test/java/org/apache/htrace/core/TestBadClient.java b/htrace-core/src/test/java/org/apache/htrace/core/TestBadClient.java
index e30ea3e..87ae8e9 100644
--- a/htrace-core/src/test/java/org/apache/htrace/core/TestBadClient.java
+++ b/htrace-core/src/test/java/org/apache/htrace/core/TestBadClient.java
@@ -43,7 +43,7 @@
*/
@Test
public void TestClosingOuterScope() throws Exception {
- Tracer tracer = new TracerBuilder().
+ Tracer tracer = new Tracer.Builder().
name("TestClosingOuterScopeTracer").
tracerPool(new TracerPool("TestClosingOuterScope")).
conf(HTraceConfiguration.
@@ -69,7 +69,7 @@
*/
@Test
public void TestDoubleDetachIsCaught() throws Exception {
- Tracer tracer = new TracerBuilder().
+ Tracer tracer = new Tracer.Builder().
name("TestDoubleDetach").
tracerPool(new TracerPool("TestDoubleDetachIsCaught")).
conf(HTraceConfiguration.
@@ -94,7 +94,7 @@
*/
@Test
public void TestDoubleDetachOnNullScope() throws Exception {
- Tracer tracer = new TracerBuilder().
+ Tracer tracer = new Tracer.Builder().
name("TestDoubleDetachOnNullScope").
tracerPool(new TracerPool("TestDoubleDetachOnNullScope")).
conf(HTraceConfiguration.
@@ -119,7 +119,7 @@
*/
@Test
public void TestDoubleReattachIsCaught() throws Exception {
- Tracer tracer = new TracerBuilder().
+ Tracer tracer = new Tracer.Builder().
name("TestDoubleReattach").
tracerPool(new TracerPool("TestDoubleReattachIsCaught")).
conf(HTraceConfiguration.
@@ -153,7 +153,7 @@
*/
@Test
public void TestPassingSpanBetweenThreads() throws Exception {
- final Tracer tracer = new TracerBuilder().
+ final Tracer tracer = new Tracer.Builder().
name("TestPassingSpanBetweenThreads").
tracerPool(new TracerPool("TestPassingSpanBetweenThreads")).
conf(HTraceConfiguration.
diff --git a/htrace-core/src/test/java/org/apache/htrace/core/TestHTrace.java b/htrace-core/src/test/java/org/apache/htrace/core/TestHTrace.java
index 1771407..06ca189 100644
--- a/htrace-core/src/test/java/org/apache/htrace/core/TestHTrace.java
+++ b/htrace-core/src/test/java/org/apache/htrace/core/TestHTrace.java
@@ -28,7 +28,7 @@
public class TestHTrace {
@Test
public void TestTracerCreateAndClose() throws Exception {
- Tracer tracer = new TracerBuilder().
+ Tracer tracer = new Tracer.Builder().
name("TestSimpleScope").
tracerPool(new TracerPool("TestTracerCreateAndClose")).
conf(HTraceConfiguration.fromKeyValuePairs(
@@ -43,7 +43,7 @@
@Test
public void TestSimpleScope() throws Exception {
- Tracer tracer = new TracerBuilder().
+ Tracer tracer = new Tracer.Builder().
name("TestSimpleScope").
tracerPool(new TracerPool("TestSimpleScope")).
conf(HTraceConfiguration.fromKeyValuePairs(
@@ -62,7 +62,7 @@
@Test
public void TestCreateSpans() throws Exception {
- Tracer tracer = new TracerBuilder().
+ Tracer tracer = new Tracer.Builder().
name("TestCreateSpans").
tracerPool(new TracerPool("TestCreateSpans")).
conf(HTraceConfiguration.fromKeyValuePairs(
@@ -113,7 +113,7 @@
@Test(timeout=60000)
public void testRootSpansHaveNonZeroSpanId() throws Exception {
- Tracer tracer = new TracerBuilder().
+ Tracer tracer = new Tracer.Builder().
name("testRootSpansHaveNonZeroSpanId").
tracerPool(new TracerPool("testRootSpansHaveNonZeroSpanId")).
conf(HTraceConfiguration.fromKeyValuePairs(
diff --git a/htrace-core/src/test/java/org/apache/htrace/core/TestLocalFileSpanReceiver.java b/htrace-core/src/test/java/org/apache/htrace/core/TestLocalFileSpanReceiver.java
index b4a579b..9388707 100644
--- a/htrace-core/src/test/java/org/apache/htrace/core/TestLocalFileSpanReceiver.java
+++ b/htrace-core/src/test/java/org/apache/htrace/core/TestLocalFileSpanReceiver.java
@@ -44,7 +44,7 @@
@Test
public void testWriteToLocalFile() throws IOException {
String traceFileName = LocalFileSpanReceiver.getUniqueLocalTraceFileName();
- Tracer tracer = new TracerBuilder().
+ Tracer tracer = new Tracer.Builder().
name("testWriteToLocalFileTracer").
tracerPool(new TracerPool("testWriteToLocalFile")).
conf(HTraceConfiguration.fromKeyValuePairs(
diff --git a/htrace-core/src/test/java/org/apache/htrace/core/TestNullScope.java b/htrace-core/src/test/java/org/apache/htrace/core/TestNullScope.java
index 592ce79..c8ed7f1 100644
--- a/htrace-core/src/test/java/org/apache/htrace/core/TestNullScope.java
+++ b/htrace-core/src/test/java/org/apache/htrace/core/TestNullScope.java
@@ -32,7 +32,7 @@
@Test
public void testNullScope() {
- Tracer tracer = new TracerBuilder().
+ Tracer tracer = new Tracer.Builder().
name("testNullScope").
tracerPool(new TracerPool("testNullScope")).
conf(HTraceConfiguration.EMPTY).
diff --git a/htrace-core/src/test/java/org/apache/htrace/core/TestSampler.java b/htrace-core/src/test/java/org/apache/htrace/core/TestSampler.java
index aa57d2c..2305d9f 100644
--- a/htrace-core/src/test/java/org/apache/htrace/core/TestSampler.java
+++ b/htrace-core/src/test/java/org/apache/htrace/core/TestSampler.java
@@ -25,7 +25,7 @@
public class TestSampler {
private Sampler[] getSamplersFromConf(HTraceConfiguration conf) {
- Tracer tracer = new TracerBuilder().
+ Tracer tracer = new Tracer.Builder().
name("MyTracer").
tracerPool(new TracerPool("getSamplersFromConf")).
conf(conf).
diff --git a/htrace-core/src/test/java/org/apache/htrace/core/TestSpanReceiverBuilder.java b/htrace-core/src/test/java/org/apache/htrace/core/TestSpanReceiverBuilder.java
index e0ce2ac..b97d624 100644
--- a/htrace-core/src/test/java/org/apache/htrace/core/TestSpanReceiverBuilder.java
+++ b/htrace-core/src/test/java/org/apache/htrace/core/TestSpanReceiverBuilder.java
@@ -32,7 +32,7 @@
LogFactory.getLog(TestSpanReceiverBuilder.class);
private List<SpanReceiver> createSpanReceivers(String classes) {
- Tracer tracer = new TracerBuilder().
+ Tracer tracer = new Tracer.Builder().
name("MyTracer").
tracerPool(new TracerPool("createSpanReceivers")).
conf(HTraceConfiguration.fromKeyValuePairs(
diff --git a/htrace-flume/src/test/java/org/apache/htrace/impl/TestFlumeSpanReceiver.java b/htrace-flume/src/test/java/org/apache/htrace/impl/TestFlumeSpanReceiver.java
index 6cdab2e..eaa5f08 100644
--- a/htrace-flume/src/test/java/org/apache/htrace/impl/TestFlumeSpanReceiver.java
+++ b/htrace-flume/src/test/java/org/apache/htrace/impl/TestFlumeSpanReceiver.java
@@ -25,7 +25,6 @@
import org.apache.htrace.core.TraceCreator;
import org.apache.htrace.core.TraceScope;
import org.apache.htrace.core.Tracer;
-import org.apache.htrace.core.TracerBuilder;
import org.apache.htrace.core.TracerPool;
import org.junit.Assert;
@@ -39,7 +38,7 @@
public FakeFlume flumeServer = new FakeFlume();
private Tracer newTracer() {
- return new TracerBuilder().
+ return new Tracer.Builder().
name("FlumeTracer").
tracerPool(new TracerPool("newTracer")).
conf(HTraceConfiguration.fromKeyValuePairs(
diff --git a/htrace-hbase/src/main/java/org/apache/htrace/impl/HBaseSpanReceiver.java b/htrace-hbase/src/main/java/org/apache/htrace/impl/HBaseSpanReceiver.java
index 85de849..aa471ab 100644
--- a/htrace-hbase/src/main/java/org/apache/htrace/impl/HBaseSpanReceiver.java
+++ b/htrace-hbase/src/main/java/org/apache/htrace/impl/HBaseSpanReceiver.java
@@ -48,7 +48,6 @@
import org.apache.htrace.core.TimelineAnnotation;
import org.apache.htrace.core.TraceScope;
import org.apache.htrace.core.Tracer;
-import org.apache.htrace.core.TracerBuilder;
import org.apache.htrace.protobuf.generated.SpanProtos;
/**
@@ -348,7 +347,7 @@
* @throws IOException
*/
public static void main(String[] args) throws Exception {
- Tracer tracer = new TracerBuilder().
+ Tracer tracer = new Tracer.Builder().
conf(new HBaseHTraceConfiguration(HBaseConfiguration.create())).
build();
tracer.addSampler(Sampler.ALWAYS);
diff --git a/htrace-hbase/src/test/java/org/apache/htrace/impl/TestHBaseSpanReceiver.java b/htrace-hbase/src/test/java/org/apache/htrace/impl/TestHBaseSpanReceiver.java
index 253a873..bba19f5 100644
--- a/htrace-hbase/src/test/java/org/apache/htrace/impl/TestHBaseSpanReceiver.java
+++ b/htrace-hbase/src/test/java/org/apache/htrace/impl/TestHBaseSpanReceiver.java
@@ -47,7 +47,6 @@
import org.apache.htrace.core.TraceGraph;
import org.apache.htrace.core.TraceGraph.SpansByParent;
import org.apache.htrace.core.Tracer;
-import org.apache.htrace.core.TracerBuilder;
import org.apache.htrace.core.TracerPool;
import org.apache.htrace.protobuf.generated.SpanProtos;
import org.junit.AfterClass;
@@ -87,7 +86,7 @@
public void testHBaseSpanReceiver() {
Table htable = createTable(UTIL);
Configuration conf = UTIL.getConfiguration();
- Tracer tracer = new TracerBuilder().
+ Tracer tracer = new Tracer.Builder().
name("testHBaseSpanReceiver").
tracerPool(new TracerPool("testHBaseSpanReceiver")).
conf(HTraceConfiguration.fromKeyValuePairs(
diff --git a/src/main/site/markdown/index.md b/src/main/site/markdown/index.md
index e8e88fc..9207690 100644
--- a/src/main/site/markdown/index.md
+++ b/src/main/site/markdown/index.md
@@ -53,13 +53,13 @@
To instrument your system you must:
<b>1. Create a Tracer object.</b>
-You can create a Tracer object via the TracerBuilder.
+You can create a Tracer object via the Tracer#Builder.
````java
- Tracer tracer = new TracerBuilder(conf).setName("MyApp").build();
+ Tracer tracer = new Tracer#Builder(conf).setName("MyApp").build();
...
-The TracerBuilder will take care of creating the appropriate Sampler and
+The Tracer#Builder will take care of creating the appropriate Sampler and
SpanReceiver objects, as well as the Tracer itself. If a SpanReceiver was
created, we will install a shutdown hook to close it when the JVM shuts down.