ACCUMULO-3715 handle unrooted spans better and fix TraceDump options

Project: http://git-wip-us.apache.org/repos/asf/accumulo/repo
Commit: http://git-wip-us.apache.org/repos/asf/accumulo/commit/3a99300a
Tree: http://git-wip-us.apache.org/repos/asf/accumulo/tree/3a99300a
Diff: http://git-wip-us.apache.org/repos/asf/accumulo/diff/3a99300a

Branch: refs/heads/master
Commit: 3a99300a2b897f9f8740a3efa0271c43536ef0cc
Parents: 7e72d56
Author: Billie Rinaldi <billie.rina...@gmail.com>
Authored: Thu Apr 9 08:30:06 2015 -0700
Committer: Billie Rinaldi <billie.rina...@gmail.com>
Committed: Fri Apr 10 17:01:00 2015 -0700

----------------------------------------------------------------------
 .../monitor/servlets/trace/ShowTrace.java       | 90 ++++++++++----------
 .../org/apache/accumulo/tracer/TraceDump.java   | 19 ++---
 2 files changed, 54 insertions(+), 55 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/accumulo/blob/3a99300a/server/monitor/src/main/java/org/apache/accumulo/monitor/servlets/trace/ShowTrace.java
----------------------------------------------------------------------
diff --git 
a/server/monitor/src/main/java/org/apache/accumulo/monitor/servlets/trace/ShowTrace.java
 
b/server/monitor/src/main/java/org/apache/accumulo/monitor/servlets/trace/ShowTrace.java
index 4e05b89..a4a67d7 100644
--- 
a/server/monitor/src/main/java/org/apache/accumulo/monitor/servlets/trace/ShowTrace.java
+++ 
b/server/monitor/src/main/java/org/apache/accumulo/monitor/servlets/trace/ShowTrace.java
@@ -130,61 +130,63 @@ public class ShowTrace extends Basic {
     Set<Long> visited = tree.visit(new SpanTreeVisitor() {
       @Override
       public void visit(int level, RemoteSpan parent, RemoteSpan node, 
Collection<RemoteSpan> children) {
-        sb.append("<tr>\n");
-        sb.append(String.format("<td class='right'>%d+</td><td 
class='left'>%d</td>%n", node.stop - node.start, node.start - finalStart));
-        sb.append(String.format("<td style='text-indent: %dpx'>%s@%s</td>%n", 
level * 10, node.svc, node.sender));
-        sb.append("<td>" + node.description + "</td>");
-        boolean hasData = node.data != null && !node.data.isEmpty();
-        boolean hasAnnotations = node.annotations != null && 
!node.annotations.isEmpty();
-        if (hasData || hasAnnotations) {
-          String hexSpanId = Long.toHexString(node.spanId);
-          sb.append("<td><input type='checkbox' id=\"");
-          sb.append(hexSpanId);
-          sb.append(checkboxIdSuffix);
-          sb.append("\" onclick='toggle(\"" + Long.toHexString(node.spanId) + 
"\")'></td>\n");
-        } else {
-          sb.append("<td></td>\n");
-        }
-        sb.append("</tr>\n");
-        sb.append("<tr id='" + Long.toHexString(node.spanId) + "' 
style='display:none'>");
-        sb.append("<td colspan='5'>\n");
-        if (hasData || hasAnnotations) {
-          sb.append("  <table class='indent,noborder'>\n");
-          if (hasData) {
-            sb.append("  <tr><th>Key</th><th>Value</th></tr>\n");
-            for (Entry<ByteBuffer,ByteBuffer> entry : node.data.entrySet()) {
-              String key = new String(entry.getKey().array(), 
entry.getKey().arrayOffset(), entry.getKey().limit(), UTF_8);
-              String value = new String(entry.getValue().array(), 
entry.getValue().arrayOffset(), entry.getValue().limit(), UTF_8);
-              sb.append("  <tr><td>" + BasicServlet.sanitize(key) + "</td>");
-              sb.append("<td>" + BasicServlet.sanitize(value) + 
"</td></tr>\n");
-            }
-          }
-          if (hasAnnotations) {
-            sb.append("  <tr><th>Annotation</th><th>Time Offset</th></tr>\n");
-            for (Annotation entry : node.annotations) {
-              sb.append("  <tr><td>" + BasicServlet.sanitize(entry.getMsg()) + 
"</td>");
-              sb.append(String.format("<td>%d</td></tr>\n", entry.getTime() - 
finalStart));
-            }
-          }
-          sb.append("  </table>");
-        }
-        sb.append("</td>\n");
-        sb.append("</tr>\n");
+        appendRow(sb, level, node, finalStart);
       }
     });
     tree.nodes.keySet().removeAll(visited);
     if (!tree.nodes.isEmpty()) {
-      sb.append("<span type='warn'>Warning: the following spans are not 
rooted!</span>\n");
-      sb.append("<ul>\n");
+      sb.append("<tr><td colspan=10>The following spans are not rooted 
(probably due to a parent span of length 0ms):<td></tr>\n");
       for (RemoteSpan span : TraceDump.sortByStart(tree.nodes.values())) {
-        sb.append(String.format("<li>%s %s %s</li>\n", 
Long.toHexString(span.spanId), Long.toHexString(span.parentId), 
span.description));
+        appendRow(sb, 0, span, finalStart);
       }
-      sb.append("</ul>\n");
     }
     sb.append("</table>\n");
     sb.append("</div>\n");
   }
 
+  private static void appendRow(StringBuilder sb, int level, RemoteSpan node, 
long finalStart) {
+    sb.append("<tr>\n");
+    sb.append(String.format("<td class='right'>%d+</td><td 
class='left'>%d</td>%n", node.stop - node.start, node.start - finalStart));
+    sb.append(String.format("<td style='text-indent: %dpx'>%s@%s</td>%n", 
level * 10, node.svc, node.sender));
+    sb.append("<td>" + node.description + "</td>");
+    boolean hasData = node.data != null && !node.data.isEmpty();
+    boolean hasAnnotations = node.annotations != null && 
!node.annotations.isEmpty();
+    if (hasData || hasAnnotations) {
+      String hexSpanId = Long.toHexString(node.spanId);
+      sb.append("<td><input type='checkbox' id=\"");
+      sb.append(hexSpanId);
+      sb.append(checkboxIdSuffix);
+      sb.append("\" onclick='toggle(\"" + Long.toHexString(node.spanId) + 
"\")'></td>\n");
+    } else {
+      sb.append("<td></td>\n");
+    }
+    sb.append("</tr>\n");
+    sb.append("<tr id='" + Long.toHexString(node.spanId) + "' 
style='display:none'>");
+    sb.append("<td colspan='5'>\n");
+    if (hasData || hasAnnotations) {
+      sb.append("  <table class='indent,noborder'>\n");
+      if (hasData) {
+        sb.append("  <tr><th>Key</th><th>Value</th></tr>\n");
+        for (Entry<ByteBuffer,ByteBuffer> entry : node.data.entrySet()) {
+          String key = new String(entry.getKey().array(), 
entry.getKey().arrayOffset(), entry.getKey().limit(), UTF_8);
+          String value = new String(entry.getValue().array(), 
entry.getValue().arrayOffset(), entry.getValue().limit(), UTF_8);
+          sb.append("  <tr><td>" + BasicServlet.sanitize(key) + "</td>");
+          sb.append("<td>" + BasicServlet.sanitize(value) + "</td></tr>\n");
+        }
+      }
+      if (hasAnnotations) {
+        sb.append("  <tr><th>Annotation</th><th>Time Offset</th></tr>\n");
+        for (Annotation entry : node.annotations) {
+          sb.append("  <tr><td>" + BasicServlet.sanitize(entry.getMsg()) + 
"</td>");
+          sb.append(String.format("<td>%d</td></tr>\n", entry.getTime() - 
finalStart));
+        }
+      }
+      sb.append("  </table>");
+    }
+    sb.append("</td>\n");
+    sb.append("</tr>\n");
+  }
+
   @Override
   protected String getBodyAttributes() {
     return " onload=\"" + pageLoadFunctionName + "()\" ";

http://git-wip-us.apache.org/repos/asf/accumulo/blob/3a99300a/server/tracer/src/main/java/org/apache/accumulo/tracer/TraceDump.java
----------------------------------------------------------------------
diff --git 
a/server/tracer/src/main/java/org/apache/accumulo/tracer/TraceDump.java 
b/server/tracer/src/main/java/org/apache/accumulo/tracer/TraceDump.java
index e4eb70e..0a87469 100644
--- a/server/tracer/src/main/java/org/apache/accumulo/tracer/TraceDump.java
+++ b/server/tracer/src/main/java/org/apache/accumulo/tracer/TraceDump.java
@@ -45,16 +45,12 @@ public class TraceDump {
   static final long DEFAULT_TIME_IN_MILLIS = 10 * 60 * 1000l;
 
   static class Opts extends ClientOnDefaultTable {
-    @Parameter(names = {"-l", "--list"}, description = "List recent traces")
+    @Parameter(names = {"-r", "--recent"}, description = "List recent traces")
     boolean list = false;
-    @Parameter(names = {"-s", "--start"}, description = "The start time of 
traces to display")
-    String start;
-    @Parameter(names = {"-e", "--end"}, description = "The end time of traces 
to display")
-    String end;
-    @Parameter(names = {"-d", "--dump"}, description = "Dump the traces")
+    @Parameter(names = {"-ms", "--ms"}, description = "Time period of recent 
traces to list in ms")
+    long length = DEFAULT_TIME_IN_MILLIS;
+    @Parameter(names = {"-d", "--dump"}, description = "Dump all traces")
     boolean dump = false;
-    @Parameter(names = {"-i", "--instance"}, description = "URL to point to 
accumulo.")
-    String instance;
     @Parameter(description = " <trace id> { <trace id> ... }")
     List<String> traceIds = new ArrayList<String>();
 
@@ -91,7 +87,7 @@ public class TraceDump {
   private static int listSpans(Opts opts, ScannerOpts scanOpts) throws 
Exception {
     PrintStream out = System.out;
     long endTime = System.currentTimeMillis();
-    long startTime = endTime - DEFAULT_TIME_IN_MILLIS;
+    long startTime = endTime - opts.length;
     Connector conn = opts.getConnector();
     Scanner scanner = conn.createScanner(opts.getTableName(), opts.auths);
     scanner.setBatchSize(scanOpts.scanBatchSize);
@@ -157,9 +153,10 @@ public class TraceDump {
     });
     tree.nodes.keySet().removeAll(visited);
     if (!tree.nodes.isEmpty()) {
-      out.print("Warning: the following spans are not rooted!");
+      out.print("The following spans are not rooted (probably due to a parent 
span of length 0ms):");
       for (RemoteSpan span : sortByStart(tree.nodes.values())) {
-        out.print(String.format("%s %s %s", Long.toHexString(span.spanId), 
Long.toHexString(span.parentId), span.description));
+        String fmt = "%5d+%-5d %" + 1 + "s%s@%s %s";
+        out.print(String.format(fmt, span.stop - span.start, span.start - 
finalStart, "", span.svc, span.sender, span.description));
       }
       return -1;
     }

Reply via email to