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);