You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@htrace.apache.org by cm...@apache.org on 2014/12/10 21:25:51 UTC

incubator-htrace git commit: HTRACE-2. HTrace should have a factory method for creating trace samplers (cmccabe)

Repository: incubator-htrace
Updated Branches:
  refs/heads/master f43a0ccbf -> 1cb383bf4


HTRACE-2. HTrace should have a factory method for creating trace samplers (cmccabe)


Project: http://git-wip-us.apache.org/repos/asf/incubator-htrace/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-htrace/commit/1cb383bf
Tree: http://git-wip-us.apache.org/repos/asf/incubator-htrace/tree/1cb383bf
Diff: http://git-wip-us.apache.org/repos/asf/incubator-htrace/diff/1cb383bf

Branch: refs/heads/master
Commit: 1cb383bf4afb080840ce580846e790b7e77cba16
Parents: f43a0cc
Author: Colin P. Mccabe <cm...@apache.org>
Authored: Tue Dec 9 14:48:26 2014 -0800
Committer: Colin P. Mccabe <cm...@apache.org>
Committed: Wed Dec 10 12:25:43 2014 -0800

----------------------------------------------------------------------
 .../org/apache/htrace/HTraceConfiguration.java  | 12 ++++
 .../java/org/apache/htrace/SamplerFactory.java  | 73 ++++++++++++++++++++
 .../org/apache/htrace/impl/AlwaysSampler.java   |  5 +-
 .../org/apache/htrace/impl/CountSampler.java    |  6 +-
 .../org/apache/htrace/impl/NeverSampler.java    |  5 +-
 .../apache/htrace/impl/ProbabilitySampler.java  |  9 +--
 .../htrace/impl/TrueIfTracingSampler.java       |  6 +-
 .../org/apache/htrace/TestCountSampler.java     |  7 +-
 .../java/org/apache/htrace/TestSampler.java     | 22 ++++++
 9 files changed, 131 insertions(+), 14 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-htrace/blob/1cb383bf/htrace-core/src/main/java/org/apache/htrace/HTraceConfiguration.java
----------------------------------------------------------------------
diff --git a/htrace-core/src/main/java/org/apache/htrace/HTraceConfiguration.java b/htrace-core/src/main/java/org/apache/htrace/HTraceConfiguration.java
index a5f244b..f674e0d 100644
--- a/htrace-core/src/main/java/org/apache/htrace/HTraceConfiguration.java
+++ b/htrace-core/src/main/java/org/apache/htrace/HTraceConfiguration.java
@@ -48,6 +48,18 @@ public abstract class HTraceConfiguration {
     return new MapConf(conf);
   }
 
+  static HTraceConfiguration fromKeyValuePairs(String... pairs) {
+    if ((pairs.length % 2) != 0) {
+      throw new RuntimeException("You must specify an equal number of keys " +
+          "and values.");
+    }
+    Map<String, String> conf = new HashMap<String, String>();
+    for (int i = 0; i < pairs.length; i+=2) {
+      conf.put(pairs[i], pairs[i + 1]);
+    }
+    return new MapConf(conf);
+  }
+
   public abstract String get(String key);
 
   public abstract String get(String key, String defaultValue);

http://git-wip-us.apache.org/repos/asf/incubator-htrace/blob/1cb383bf/htrace-core/src/main/java/org/apache/htrace/SamplerFactory.java
----------------------------------------------------------------------
diff --git a/htrace-core/src/main/java/org/apache/htrace/SamplerFactory.java b/htrace-core/src/main/java/org/apache/htrace/SamplerFactory.java
new file mode 100644
index 0000000..84b52f1
--- /dev/null
+++ b/htrace-core/src/main/java/org/apache/htrace/SamplerFactory.java
@@ -0,0 +1,73 @@
+/*
+ * 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;
+
+import java.lang.reflect.Constructor;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.htrace.impl.AlwaysSampler;
+import org.apache.htrace.impl.NeverSampler;
+
+public class SamplerFactory {
+  private final static String SAMPLER_CONF_KEY = "sampler";
+  private final static ClassLoader classLoader =
+      SamplerFactory.class.getClassLoader();
+  private final HTraceConfiguration conf;
+  private static final Log LOG = LogFactory.getLog(SamplerFactory.class);
+
+  public SamplerFactory(HTraceConfiguration conf) {
+    this.conf = conf;
+  }
+
+  public Sampler build() {
+    String str = conf.get(SAMPLER_CONF_KEY);
+    if (str.isEmpty()) {
+      return NeverSampler.INSTANCE;
+    }
+    if (!str.contains(".")) {
+      str = "org.apache.htrace.impl." + str;
+    }
+    Class cls = null;
+    try {
+      cls = classLoader.loadClass(str);
+    } catch (ClassNotFoundException e) {
+      LOG.error("SamplerFactory cannot find sampler class " + str +
+          ": falling back on NeverSampler.");
+      return NeverSampler.INSTANCE;
+    }
+    Constructor<Sampler> ctor = null;
+    try {
+      ctor = cls.getConstructor(HTraceConfiguration.class);
+    } catch (NoSuchMethodException e) {
+      LOG.error("SamplerFactory cannot find a constructor for class " + str +
+          "which takes an HTraceConfiguration.  Falling back on " +
+          "NeverSampler.");
+      return NeverSampler.INSTANCE;
+    }
+    try {
+      return ctor.newInstance(conf);
+    } catch (ReflectiveOperationException e) {
+      LOG.error("SamplerFactory reflection error when constructing " + str +
+          ".  Falling back on NeverSampler.", e);
+      return NeverSampler.INSTANCE;
+    } catch (Throwable e) {
+      LOG.error("SamplerFactory constructor error when constructing " + str +
+          ".  Falling back on NeverSampler.", e);
+      return NeverSampler.INSTANCE;
+    }
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-htrace/blob/1cb383bf/htrace-core/src/main/java/org/apache/htrace/impl/AlwaysSampler.java
----------------------------------------------------------------------
diff --git a/htrace-core/src/main/java/org/apache/htrace/impl/AlwaysSampler.java b/htrace-core/src/main/java/org/apache/htrace/impl/AlwaysSampler.java
index 8c90eff..69e3aff 100644
--- a/htrace-core/src/main/java/org/apache/htrace/impl/AlwaysSampler.java
+++ b/htrace-core/src/main/java/org/apache/htrace/impl/AlwaysSampler.java
@@ -16,13 +16,14 @@
  */
 package org.apache.htrace.impl;
 
+import org.apache.htrace.HTraceConfiguration;
 import org.apache.htrace.Sampler;
 
 public final class AlwaysSampler implements Sampler<Object> {
 
-  public static final AlwaysSampler INSTANCE = new AlwaysSampler();
+  public static final AlwaysSampler INSTANCE = new AlwaysSampler(null);
 
-  private AlwaysSampler() {
+  public AlwaysSampler(HTraceConfiguration conf) {
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/incubator-htrace/blob/1cb383bf/htrace-core/src/main/java/org/apache/htrace/impl/CountSampler.java
----------------------------------------------------------------------
diff --git a/htrace-core/src/main/java/org/apache/htrace/impl/CountSampler.java b/htrace-core/src/main/java/org/apache/htrace/impl/CountSampler.java
index 78e155c..03b444b 100644
--- a/htrace-core/src/main/java/org/apache/htrace/impl/CountSampler.java
+++ b/htrace-core/src/main/java/org/apache/htrace/impl/CountSampler.java
@@ -16,6 +16,7 @@
  */
 package org.apache.htrace.impl;
 
+import org.apache.htrace.HTraceConfiguration;
 import org.apache.htrace.Sampler;
 
 import java.util.Random;
@@ -24,14 +25,15 @@ import java.util.Random;
  * Sampler that returns true every N calls.
  */
 public class CountSampler implements Sampler<Object> {
+  private final static String SAMPLER_FREQUENCY_CONF_KEY = "sampler.frequency";
 
   final static Random random = new Random();
 
   final long frequency;
   long count = random.nextLong();
 
-  public CountSampler(long frequency) {
-    this.frequency = frequency;
+  public CountSampler(HTraceConfiguration conf) {
+    this.frequency = Long.parseLong(conf.get(SAMPLER_FREQUENCY_CONF_KEY), 10);
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/incubator-htrace/blob/1cb383bf/htrace-core/src/main/java/org/apache/htrace/impl/NeverSampler.java
----------------------------------------------------------------------
diff --git a/htrace-core/src/main/java/org/apache/htrace/impl/NeverSampler.java b/htrace-core/src/main/java/org/apache/htrace/impl/NeverSampler.java
index 20233d9..3ab192d 100644
--- a/htrace-core/src/main/java/org/apache/htrace/impl/NeverSampler.java
+++ b/htrace-core/src/main/java/org/apache/htrace/impl/NeverSampler.java
@@ -16,13 +16,14 @@
  */
 package org.apache.htrace.impl;
 
+import org.apache.htrace.HTraceConfiguration;
 import org.apache.htrace.Sampler;
 
 public final class NeverSampler implements Sampler<Object> {
 
-  public static final NeverSampler INSTANCE = new NeverSampler();
+  public static final NeverSampler INSTANCE = new NeverSampler(null);
 
-  private NeverSampler() {
+  public NeverSampler(HTraceConfiguration conf) {
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/incubator-htrace/blob/1cb383bf/htrace-core/src/main/java/org/apache/htrace/impl/ProbabilitySampler.java
----------------------------------------------------------------------
diff --git a/htrace-core/src/main/java/org/apache/htrace/impl/ProbabilitySampler.java b/htrace-core/src/main/java/org/apache/htrace/impl/ProbabilitySampler.java
index a34c5ec..c53d914 100644
--- a/htrace-core/src/main/java/org/apache/htrace/impl/ProbabilitySampler.java
+++ b/htrace-core/src/main/java/org/apache/htrace/impl/ProbabilitySampler.java
@@ -16,17 +16,18 @@
  */
 package org.apache.htrace.impl;
 
+import org.apache.htrace.HTraceConfiguration;
 import org.apache.htrace.Sampler;
 
 import java.util.Random;
 
 public class ProbabilitySampler implements Sampler<Object> {
   public final double threshold;
-  private Random random;
+  private Random random = new Random();
+  private final static String SAMPLER_FRACTION_CONF_KEY = "sampler.fraction";
 
-  public ProbabilitySampler(double threshold) {
-    this.threshold = threshold;
-    random = new Random();
+  public ProbabilitySampler(HTraceConfiguration conf) {
+    this.threshold = Double.parseDouble(conf.get(SAMPLER_FRACTION_CONF_KEY));
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/incubator-htrace/blob/1cb383bf/htrace-core/src/main/java/org/apache/htrace/impl/TrueIfTracingSampler.java
----------------------------------------------------------------------
diff --git a/htrace-core/src/main/java/org/apache/htrace/impl/TrueIfTracingSampler.java b/htrace-core/src/main/java/org/apache/htrace/impl/TrueIfTracingSampler.java
index 69598ba..7be7fc9 100644
--- a/htrace-core/src/main/java/org/apache/htrace/impl/TrueIfTracingSampler.java
+++ b/htrace-core/src/main/java/org/apache/htrace/impl/TrueIfTracingSampler.java
@@ -16,6 +16,7 @@
  */
 package org.apache.htrace.impl;
 
+import org.apache.htrace.HTraceConfiguration;
 import org.apache.htrace.Sampler;
 import org.apache.htrace.Trace;
 
@@ -24,9 +25,10 @@ import org.apache.htrace.Trace;
  */
 public class TrueIfTracingSampler implements Sampler<Object> {
 
-  public static final TrueIfTracingSampler INSTANCE = new TrueIfTracingSampler();
+  public static final TrueIfTracingSampler INSTANCE =
+    new TrueIfTracingSampler(null);
 
-  private TrueIfTracingSampler() {
+  public TrueIfTracingSampler(HTraceConfiguration conf) {
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/incubator-htrace/blob/1cb383bf/htrace-core/src/test/java/org/apache/htrace/TestCountSampler.java
----------------------------------------------------------------------
diff --git a/htrace-core/src/test/java/org/apache/htrace/TestCountSampler.java b/htrace-core/src/test/java/org/apache/htrace/TestCountSampler.java
index 41c06a3..1cc7753 100644
--- a/htrace-core/src/test/java/org/apache/htrace/TestCountSampler.java
+++ b/htrace-core/src/test/java/org/apache/htrace/TestCountSampler.java
@@ -16,6 +16,7 @@
  */
 package org.apache.htrace;
 
+import org.apache.htrace.HTraceConfiguration;
 import org.apache.htrace.impl.CountSampler;
 import org.junit.Assert;
 import org.junit.Test;
@@ -24,8 +25,10 @@ public class TestCountSampler {
 
   @Test
   public void testNext() {
-    CountSampler half = new CountSampler(2);
-    CountSampler hundred = new CountSampler(100);
+    CountSampler half = new CountSampler(HTraceConfiguration.
+        fromKeyValuePairs("sampler.frequency", "2"));
+    CountSampler hundred = new CountSampler(HTraceConfiguration.
+        fromKeyValuePairs("sampler.frequency", "100"));
     int halfCount = 0;
     int hundredCount = 0;
     for (int i = 0; i < 200; i++) {

http://git-wip-us.apache.org/repos/asf/incubator-htrace/blob/1cb383bf/htrace-core/src/test/java/org/apache/htrace/TestSampler.java
----------------------------------------------------------------------
diff --git a/htrace-core/src/test/java/org/apache/htrace/TestSampler.java b/htrace-core/src/test/java/org/apache/htrace/TestSampler.java
index 81b965e..265d603 100644
--- a/htrace-core/src/test/java/org/apache/htrace/TestSampler.java
+++ b/htrace-core/src/test/java/org/apache/htrace/TestSampler.java
@@ -16,15 +16,37 @@
  */
 package org.apache.htrace;
 
+import java.util.HashMap;
+import java.util.Map;
 import org.apache.htrace.Sampler;
 import org.apache.htrace.Trace;
 import org.apache.htrace.TraceInfo;
 import org.apache.htrace.TraceScope;
+import org.apache.htrace.impl.AlwaysSampler;
+import org.apache.htrace.impl.NeverSampler;
 import org.junit.Assert;
 import org.junit.Test;
 
 public class TestSampler {
   @Test
+  public void testSamplerFactory() {
+    Sampler alwaysSampler = new SamplerFactory(
+        HTraceConfiguration.fromKeyValuePairs("sampler", "AlwaysSampler")).
+        build();
+    Assert.assertEquals(AlwaysSampler.class, alwaysSampler.getClass());
+
+    Sampler neverSampler = new SamplerFactory(
+        HTraceConfiguration.fromKeyValuePairs("sampler", "NeverSampler")).
+        build();
+    Assert.assertEquals(NeverSampler.class, neverSampler.getClass());
+
+    Sampler neverSampler2 = new SamplerFactory(HTraceConfiguration.
+        fromKeyValuePairs("sampler", "NonExistentSampler")).
+        build();
+    Assert.assertEquals(NeverSampler.class, neverSampler2.getClass());
+  }
+
+  @Test
   public void testParamterizedSampler() {
     TestParamSampler sampler = new TestParamSampler();
     TraceScope s = Trace.startSpan("test", sampler, 1);