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 <[email protected]> Authored: Tue Dec 9 14:48:26 2014 -0800 Committer: Colin P. Mccabe <[email protected]> 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);
