Repository: incubator-htrace Updated Branches: refs/heads/master 10f2b8987 -> e20cb1ddb
HTRACE-16. Remove guava dependency for htrace-core (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/e20cb1dd Tree: http://git-wip-us.apache.org/repos/asf/incubator-htrace/tree/e20cb1dd Diff: http://git-wip-us.apache.org/repos/asf/incubator-htrace/diff/e20cb1dd Branch: refs/heads/master Commit: e20cb1ddb78c8adb9806ebdae4a7a1e351d69ad3 Parents: 10f2b89 Author: Colin P. Mccabe <[email protected]> Authored: Thu Dec 11 19:07:04 2014 -0800 Committer: Colin P. Mccabe <[email protected]> Committed: Thu Dec 11 23:20:24 2014 -0800 ---------------------------------------------------------------------- htrace-core/pom.xml | 4 - .../org/apache/htrace/HTraceConfiguration.java | 1 - .../main/java/org/apache/htrace/TraceTree.java | 172 +++++++++++++------ .../test/java/org/apache/htrace/TestHTrace.java | 22 +-- htrace-hbase/pom.xml | 2 +- .../htrace/impl/TestHBaseSpanReceiver.java | 21 ++- 6 files changed, 143 insertions(+), 79 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-htrace/blob/e20cb1dd/htrace-core/pom.xml ---------------------------------------------------------------------- diff --git a/htrace-core/pom.xml b/htrace-core/pom.xml index 67b876e..28d772e 100644 --- a/htrace-core/pom.xml +++ b/htrace-core/pom.xml @@ -121,10 +121,6 @@ language governing permissions and limitations under the License. --> <dependencies> <!-- Global deps. --> <dependency> - <groupId>com.google.guava</groupId> - <artifactId>guava</artifactId> - </dependency> - <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> </dependency> http://git-wip-us.apache.org/repos/asf/incubator-htrace/blob/e20cb1dd/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 f674e0d..f4896e9 100644 --- a/htrace-core/src/main/java/org/apache/htrace/HTraceConfiguration.java +++ b/htrace-core/src/main/java/org/apache/htrace/HTraceConfiguration.java @@ -16,7 +16,6 @@ */ package org.apache.htrace; -import com.google.common.collect.ImmutableMap; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; http://git-wip-us.apache.org/repos/asf/incubator-htrace/blob/e20cb1dd/htrace-core/src/main/java/org/apache/htrace/TraceTree.java ---------------------------------------------------------------------- diff --git a/htrace-core/src/main/java/org/apache/htrace/TraceTree.java b/htrace-core/src/main/java/org/apache/htrace/TraceTree.java index 8dc6a30..a005c55 100644 --- a/htrace-core/src/main/java/org/apache/htrace/TraceTree.java +++ b/htrace-core/src/main/java/org/apache/htrace/TraceTree.java @@ -16,80 +16,146 @@ */ package org.apache.htrace; -import com.google.common.collect.HashMultimap; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.Multimap; +import org.apache.htrace.impl.MilliSpan; + import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; +import java.util.Comparator; +import java.util.Iterator; +import java.util.List; +import java.util.TreeSet; /** * Used to create the graph formed by spans. */ public class TraceTree { public static final Log LOG = LogFactory.getLog(Tracer.class); - private Multimap<Long, Span> spansByParentID; - private Collection<Span> spans; - private Multimap<String, Span> spansByPid; - /** - * Create a new TraceTree - * - * @param spans The collection of spans to use to create this TraceTree. Should - * have at least one root span (span with parentId = - * Span.ROOT_SPAN_ID - */ - public TraceTree(Collection<Span> spans) { - this.spans = ImmutableList.copyOf(spans); - this.spansByParentID = HashMultimap.<Long, Span>create(); - this.spansByPid = HashMultimap.<String, Span>create(); - - for (Span s : this.spans) { - if (s.getProcessId() != null) { - spansByPid.put(s.getProcessId(), s); - } else { - LOG.warn("Encountered span with null processId. This should not happen. Span: " - + s); + public static class SpansByParent { + private static Comparator<Span> COMPARATOR = + new Comparator<Span>() { + @Override + public int compare(Span a, Span b) { + if (a.getParentId() < b.getParentId()) { + return -1; + } else if (a.getParentId() > b.getParentId()) { + return 1; + } else if (a.getSpanId() < b.getSpanId()) { + return -1; + } else if (a.getSpanId() > b.getSpanId()) { + return 1; + } else { + return 0; + } + } + }; + + private final TreeSet<Span> treeSet; + + SpansByParent(Collection<Span> spans) { + TreeSet<Span> treeSet = new TreeSet<Span>(COMPARATOR); + for (Span span : spans) { + treeSet.add(span); } - spansByParentID.put(s.getParentId(), s); + this.treeSet = treeSet; + } + + public List<Span> find(long parentId) { + List<Span> spans = new ArrayList<Span>(); + Span span = new MilliSpan("", Long.MIN_VALUE, + parentId, Long.MIN_VALUE, ""); + while (true) { + span = treeSet.higher(span); + if (span == null) { + break; + } + if (span.getParentId() != parentId) { + break; + } + spans.add(span); + } + return spans; + } + + public Iterator<Span> iterator() { + return Collections.unmodifiableSortedSet(treeSet).iterator(); } } - /** - * @return The collection of spans given to this TraceTree at construction. - */ - public Collection<Span> getSpans() { - return spans; + public static class SpansByProcessId { + private static Comparator<Span> COMPARATOR = + new Comparator<Span>() { + @Override + public int compare(Span a, Span b) { + int cmp = a.getProcessId().compareTo(b.getProcessId()); + if (cmp != 0) { + return cmp; + } else if (a.getSpanId() < b.getSpanId()) { + return -1; + } else if (a.getSpanId() > b.getSpanId()) { + return 1; + } else { + return 0; + } + } + }; + + private final TreeSet<Span> treeSet; + + SpansByProcessId(Collection<Span> spans) { + TreeSet<Span> treeSet = new TreeSet<Span>(COMPARATOR); + for (Span span : spans) { + treeSet.add(span); + } + this.treeSet = treeSet; + } + + public List<Span> find(String processId) { + List<Span> spans = new ArrayList<Span>(); + Span span = new MilliSpan("", Long.MIN_VALUE, + Long.MIN_VALUE, Long.MIN_VALUE, processId); + while (true) { + span = treeSet.higher(span); + if (span == null) { + break; + } + if (span.getProcessId().equals(processId)) { + break; + } + spans.add(span); + } + return spans; + } + + public Iterator<Span> iterator() { + return Collections.unmodifiableSortedSet(treeSet).iterator(); + } } + private final SpansByParent spansByParent; + private final SpansByProcessId spansByProcessId; + /** - * @return A copy of the MultiMap from parent span ID -> children of span with - * that ID. + * Create a new TraceTree + * + * @param spans The collection of spans to use to create this TraceTree. Should + * have at least one root span (span with parentId = + * Span.ROOT_SPAN_ID */ - public Multimap<Long, Span> getSpansByParentIdMap() { - return HashMultimap.<Long, Span>create(spansByParentID); + public TraceTree(Collection<Span> spans) { + this.spansByParent = new SpansByParent(spans); + this.spansByProcessId = new SpansByProcessId(spans); } - /** - * @return A collection of the root spans (spans with parent ID = - * Span.ROOT_SPAN_ID) in this tree. - */ - public Collection<Span> getRoots() { - Collection<Span> roots = spansByParentID.get(Span.ROOT_SPAN_ID); - if (roots != null) { - return roots; - } - throw new IllegalStateException( - "TraceTree is not correctly formed - there are no root spans in the collection provided at construction."); + public SpansByParent getSpansByParent() { + return spansByParent; } - /** - * @return A copy of the Multimap from String process ID -> spans with that - * process ID. If process ID was not set in Trace.java, all spans will - * have empty string process IDs. - */ - public Multimap<String, Span> getSpansByPidMap() { - return HashMultimap.<String, Span>create(spansByPid); + public SpansByProcessId getSpansByProcessId() { + return spansByProcessId; } -} \ No newline at end of file +} http://git-wip-us.apache.org/repos/asf/incubator-htrace/blob/e20cb1dd/htrace-core/src/test/java/org/apache/htrace/TestHTrace.java ---------------------------------------------------------------------- diff --git a/htrace-core/src/test/java/org/apache/htrace/TestHTrace.java b/htrace-core/src/test/java/org/apache/htrace/TestHTrace.java index e3d8964..7b058d7 100644 --- a/htrace-core/src/test/java/org/apache/htrace/TestHTrace.java +++ b/htrace-core/src/test/java/org/apache/htrace/TestHTrace.java @@ -16,12 +16,11 @@ */ package org.apache.htrace; -import com.google.common.collect.Multimap; - import org.apache.htrace.HTraceConfiguration; import org.apache.htrace.Span; import org.apache.htrace.SpanReceiver; import org.apache.htrace.TraceTree; +import org.apache.htrace.TraceTree.SpansByParent; import org.apache.htrace.impl.LocalFileSpanReceiver; import org.apache.htrace.impl.POJOSpanReceiver; import org.apache.htrace.impl.StandardOutSpanReceiver; @@ -78,7 +77,8 @@ public class TestHTrace { Collection<Span> spans = psr.getSpans(); TraceTree traceTree = new TraceTree(spans); - Collection<Span> roots = traceTree.getRoots(); + Collection<Span> roots = traceTree.getSpansByParent().find(Span.ROOT_SPAN_ID); + Assert.assertTrue("Trace tree must have roots", !roots.isEmpty()); Assert.assertEquals(numTraces, roots.size()); Map<String, Span> descriptionToRootSpan = new HashMap<String, Span>(); @@ -93,21 +93,21 @@ public class TestHTrace { Assert.assertTrue(descriptionToRootSpan.keySet().contains( TraceCreator.THREADED_TRACE_ROOT)); - Multimap<Long, Span> spansByParentId = traceTree.getSpansByParentIdMap(); + SpansByParent spansByParentId = traceTree.getSpansByParent(); Span rpcTraceRoot = descriptionToRootSpan.get(TraceCreator.RPC_TRACE_ROOT); - Assert.assertEquals(1, spansByParentId.get(rpcTraceRoot.getSpanId()).size()); + Assert.assertEquals(1, spansByParentId.find(rpcTraceRoot.getSpanId()).size()); - Span rpcTraceChild1 = spansByParentId.get(rpcTraceRoot.getSpanId()) + Span rpcTraceChild1 = spansByParentId.find(rpcTraceRoot.getSpanId()) .iterator().next(); - Assert.assertEquals(1, spansByParentId.get(rpcTraceChild1.getSpanId()).size()); + Assert.assertEquals(1, spansByParentId.find(rpcTraceChild1.getSpanId()).size()); - Span rpcTraceChild2 = spansByParentId.get(rpcTraceChild1.getSpanId()) + Span rpcTraceChild2 = spansByParentId.find(rpcTraceChild1.getSpanId()) .iterator().next(); - Assert.assertEquals(1, spansByParentId.get(rpcTraceChild2.getSpanId()).size()); + Assert.assertEquals(1, spansByParentId.find(rpcTraceChild2.getSpanId()).size()); - Span rpcTraceChild3 = spansByParentId.get(rpcTraceChild2.getSpanId()) + Span rpcTraceChild3 = spansByParentId.find(rpcTraceChild2.getSpanId()) .iterator().next(); - Assert.assertEquals(0, spansByParentId.get(rpcTraceChild3.getSpanId()).size()); + Assert.assertEquals(0, spansByParentId.find(rpcTraceChild3.getSpanId()).size()); } private void runTraceCreatorTraces(TraceCreator tc) { http://git-wip-us.apache.org/repos/asf/incubator-htrace/blob/e20cb1dd/htrace-hbase/pom.xml ---------------------------------------------------------------------- diff --git a/htrace-hbase/pom.xml b/htrace-hbase/pom.xml index ccb43a6..bff6b81 100644 --- a/htrace-hbase/pom.xml +++ b/htrace-hbase/pom.xml @@ -30,7 +30,7 @@ language governing permissions and limitations under the License. --> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> - <hbase.version>2.0.0-SNAPSHOT</hbase.version> + <hbase.version>0.99.2</hbase.version> <!-- <hbase.version>0.99.0-SNAPSHOT</hbase.version> --> <hadoop.version>2.4.0</hadoop.version> <!-- <hadoop.version>3.0.0-SNAPSHOT</hadoop.version> --> http://git-wip-us.apache.org/repos/asf/incubator-htrace/blob/e20cb1dd/htrace-hbase/src/test/java/org/apache/htrace/impl/TestHBaseSpanReceiver.java ---------------------------------------------------------------------- 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 9fd3ca8..e6a6491 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 @@ -40,6 +40,7 @@ import org.apache.htrace.Span; import org.apache.htrace.SpanReceiver; import org.apache.htrace.TimelineAnnotation; import org.apache.htrace.TraceCreator; +import org.apache.htrace.TraceTree.SpansByParent; import org.apache.htrace.TraceTree; import org.apache.htrace.protobuf.generated.SpanProtos; import org.junit.AfterClass; @@ -95,7 +96,9 @@ public class TestHBaseSpanReceiver { } TraceTree traceTree = new TraceTree(spans); - Collection<Span> roots = traceTree.getRoots(); + Collection<Span> roots = + traceTree.getSpansByParent().find(Span.ROOT_SPAN_ID); + Assert.assertTrue("Trace tree must have roots", !roots.isEmpty()); Assert.assertEquals(3, roots.size()); Map<String, Span> descs = new HashMap<String, Span>(); @@ -106,15 +109,15 @@ public class TestHBaseSpanReceiver { Assert.assertTrue(descs.keySet().contains(TraceCreator.SIMPLE_TRACE_ROOT)); Assert.assertTrue(descs.keySet().contains(TraceCreator.THREADED_TRACE_ROOT)); - Multimap<Long, Span> spansByParentId = traceTree.getSpansByParentIdMap(); + SpansByParent spansByParentId = traceTree.getSpansByParent(); Span rpcRoot = descs.get(TraceCreator.RPC_TRACE_ROOT); - Assert.assertEquals(1, spansByParentId.get(rpcRoot.getSpanId()).size()); - Span rpcChild1 = spansByParentId.get(rpcRoot.getSpanId()).iterator().next(); - Assert.assertEquals(1, spansByParentId.get(rpcChild1.getSpanId()).size()); - Span rpcChild2 = spansByParentId.get(rpcChild1.getSpanId()).iterator().next(); - Assert.assertEquals(1, spansByParentId.get(rpcChild2.getSpanId()).size()); - Span rpcChild3 = spansByParentId.get(rpcChild2.getSpanId()).iterator().next(); - Assert.assertEquals(0, spansByParentId.get(rpcChild3.getSpanId()).size()); + Assert.assertEquals(1, spansByParentId.find(rpcRoot.getSpanId()).size()); + Span rpcChild1 = spansByParentId.find(rpcRoot.getSpanId()).iterator().next(); + Assert.assertEquals(1, spansByParentId.find(rpcChild1.getSpanId()).size()); + Span rpcChild2 = spansByParentId.find(rpcChild1.getSpanId()).iterator().next(); + Assert.assertEquals(1, spansByParentId.find(rpcChild2.getSpanId()).size()); + Span rpcChild3 = spansByParentId.find(rpcChild2.getSpanId()).iterator().next(); + Assert.assertEquals(0, spansByParentId.find(rpcChild3.getSpanId()).size()); Scan iscan = new Scan(); iscan.addColumn(Bytes.toBytes(HBaseSpanReceiver.DEFAULT_INDEXFAMILY),
