From 48606e8a08d1c6f60d8a8adb0c253d4394604be2 Mon Sep 17 00:00:00 2001 From: Mike Drob Date: Tue, 19 Apr 2016 10:44:54 -0500 Subject: [PATCH] HTRACE-359. TraceRunnable and TraceCallable should store parent SpanId not scope --- .../java/org/apache/htrace/core/TraceCallable.java | 8 +++--- .../java/org/apache/htrace/core/TraceRunnable.java | 11 ++++++-- .../main/java/org/apache/htrace/core/Tracer.java | 33 ++++++++++++++++++++-- .../org/apache/htrace/core/TestTraceExecutor.java | 23 +++++++++++++++ 4 files changed, 66 insertions(+), 9 deletions(-) diff --git a/htrace-core4/src/main/java/org/apache/htrace/core/TraceCallable.java b/htrace-core4/src/main/java/org/apache/htrace/core/TraceCallable.java index 9cf478d..3851883 100644 --- a/htrace-core4/src/main/java/org/apache/htrace/core/TraceCallable.java +++ b/htrace-core4/src/main/java/org/apache/htrace/core/TraceCallable.java @@ -24,14 +24,14 @@ import java.util.concurrent.Callable; public class TraceCallable implements Callable { private final Tracer tracer; private final Callable impl; - private final TraceScope parent; + private final SpanId parentId; private final String description; - TraceCallable(Tracer tracer, TraceScope parent, Callable impl, + TraceCallable(Tracer tracer, SpanId parentId, Callable impl, String description) { this.tracer = tracer; this.impl = impl; - this.parent = parent; + this.parentId = parentId; this.description = description; } @@ -41,7 +41,7 @@ public class TraceCallable implements Callable { if (description == null) { description = Thread.currentThread().getName(); } - try (TraceScope chunk = tracer.newScope(description, parent.getSpan().getSpanId())) { + try (TraceScope chunk = tracer.newScope(description, parentId)) { return impl.call(); } } diff --git a/htrace-core4/src/main/java/org/apache/htrace/core/TraceRunnable.java b/htrace-core4/src/main/java/org/apache/htrace/core/TraceRunnable.java index f2db5c2..4e26715 100644 --- a/htrace-core4/src/main/java/org/apache/htrace/core/TraceRunnable.java +++ b/htrace-core4/src/main/java/org/apache/htrace/core/TraceRunnable.java @@ -21,14 +21,19 @@ package org.apache.htrace.core; */ public class TraceRunnable implements Runnable { private final Tracer tracer; - private final TraceScope parent; + private final SpanId parentId; private final Runnable runnable; private final String description; public TraceRunnable(Tracer tracer, TraceScope parent, Runnable runnable, String description) { + this(tracer, parent.getSpanId(), runnable, description); + } + + TraceRunnable(Tracer tracer, SpanId parentId, + Runnable runnable, String description) { this.tracer = tracer; - this.parent = parent; + this.parentId = parentId; this.runnable = runnable; this.description = description; } @@ -39,7 +44,7 @@ public class TraceRunnable implements Runnable { if (description == null) { description = Thread.currentThread().getName(); } - try (TraceScope chunk = tracer.newScope(description, parent.getSpan().getSpanId())) { + try (TraceScope chunk = tracer.newScope(description, parentId)) { runnable.run(); } } diff --git a/htrace-core4/src/main/java/org/apache/htrace/core/Tracer.java b/htrace-core4/src/main/java/org/apache/htrace/core/Tracer.java index 83a8a3e..87d2fb9 100644 --- a/htrace-core4/src/main/java/org/apache/htrace/core/Tracer.java +++ b/htrace-core4/src/main/java/org/apache/htrace/core/Tracer.java @@ -447,7 +447,22 @@ public class Tracer implements Closeable { if (parentScope == null) { return callable; } - return new TraceCallable(this, parentScope, callable, description); + return wrap(callable, description, parentScope.getSpanId()); + } + + /** + * Wrap the callable in a TraceCallable anchored from a given parent ID. + * + * @param The subclass of callable. + * @param callable The callable to wrap. + * @param description A description of the callable, or null if there + * is no description. + * @param parentId If this is a valid span ID, it will be added to + * the parents of the new span we create. + * @return The callable provided, wrapped if tracing, 'callable' if not. + */ + public Callable wrap(Callable callable, String description, SpanId parentId) { + return new TraceCallable(this, parentId, callable, description); } /** @@ -463,7 +478,21 @@ public class Tracer implements Closeable { if (parentScope == null) { return runnable; } - return new TraceRunnable(this, parentScope, runnable, description); + return wrap(runnable, description, parentScope.getSpanId()); + } + + /** + * Wrap the runnable in a TraceRunnable anchored from a given parent ID. + * + * @param runnable The runnable to wrap. + * @param description A description of the runnable, or null if there is + * no description. + * @param parentId If this is a valid span ID, it will be added to + * the parents of the new span we create. + * @return The runnable provided, wrapped if tracing, 'runnable' if not. + */ + public Runnable wrap(Runnable runnable, String description, SpanId parentId) { + return new TraceRunnable(this, parentId, runnable, description); } public TraceExecutorService newTraceExecutorService(ExecutorService impl) { diff --git a/htrace-core4/src/test/java/org/apache/htrace/core/TestTraceExecutor.java b/htrace-core4/src/test/java/org/apache/htrace/core/TestTraceExecutor.java index 426d9fe..8f0c3db 100644 --- a/htrace-core4/src/test/java/org/apache/htrace/core/TestTraceExecutor.java +++ b/htrace-core4/src/test/java/org/apache/htrace/core/TestTraceExecutor.java @@ -123,6 +123,29 @@ public class TestTraceExecutor { } } + @Test + public void testWrappingFromSpan() throws Exception { + HTraceConfiguration conf = HTraceConfiguration.fromKeyValuePairs("sampler.classes", "AlwaysSampler"); + + ExecutorService es = Executors.newSingleThreadExecutor(); + try (Tracer tracer = new Tracer.Builder("TestTraceExecutor").conf(conf).build()) { + SpanId random = SpanId.fromRandom(); + try (TraceScope parentScope = tracer.newScope("parent")) { + Callable callable = tracer.wrap(new Callable() { + @Override + public SpanId call() throws Exception { + return Tracer.getCurrentSpan().getParents()[0]; + } + }, "child", random); + + SpanId result = es.submit(callable).get(WAIT_TIME_SECONDS, TimeUnit.SECONDS); + assertEquals(random, result); + } + } finally { + es.shutdown(); + } + } + /* * Inspired by org.apache.solr.util.DefaultSolrThreadFactory */ -- 1.9.1