You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@avro.apache.org by ph...@apache.org on 2010/07/28 21:28:54 UTC

svn commit: r980173 [4/4] - in /avro/trunk: ./ lang/java/ lang/java/src/java/org/apache/avro/ipc/stats/ lang/java/src/java/org/apache/avro/ipc/stats/static/ lang/java/src/java/org/apache/avro/ipc/stats/templates/ lang/java/src/test/java/org/apache/avro...

Added: avro/trunk/lang/java/src/java/org/apache/avro/ipc/stats/static/tipsy.css
URL: http://svn.apache.org/viewvc/avro/trunk/lang/java/src/java/org/apache/avro/ipc/stats/static/tipsy.css?rev=980173&view=auto
==============================================================================
--- avro/trunk/lang/java/src/java/org/apache/avro/ipc/stats/static/tipsy.css (added)
+++ avro/trunk/lang/java/src/java/org/apache/avro/ipc/stats/static/tipsy.css Wed Jul 28 19:28:53 2010
@@ -0,0 +1,30 @@
+/*!
+ * The MIT License
+ * 
+ * Copyright (c) 2008 Jason Frame (jason@onehackoranother.com)
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ * 
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+.tipsy { padding: 5px; font-size: 10px; opacity: 0.8; filter: alpha(opacity=80); background-repeat: no-repeat;  background-image: url(../images/tipsy.gif); }
+  .tipsy-inner { padding: 5px 8px 4px 8px; background-color: black; color: white; max-width: 200px; text-align: center; }
+  .tipsy-inner { -moz-border-radius:3px; -webkit-border-radius:3px; }
+  .tipsy-north { background-position: top center; }
+  .tipsy-south { background-position: bottom center; }
+  .tipsy-east { background-position: right center; }
+  .tipsy-west { background-position: left center; }

Added: avro/trunk/lang/java/src/java/org/apache/avro/ipc/stats/static/tipsy.js
URL: http://svn.apache.org/viewvc/avro/trunk/lang/java/src/java/org/apache/avro/ipc/stats/static/tipsy.js?rev=980173&view=auto
==============================================================================
--- avro/trunk/lang/java/src/java/org/apache/avro/ipc/stats/static/tipsy.js (added)
+++ avro/trunk/lang/java/src/java/org/apache/avro/ipc/stats/static/tipsy.js Wed Jul 28 19:28:53 2010
@@ -0,0 +1,92 @@
+/*!
+ * The MIT License
+ * 
+ * Copyright (c) 2008 Jason Frame (jason@onehackoranother.com)
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ * 
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+pv.Behavior.tipsy = function(opts) {
+  var tip;
+
+  /**
+   * @private When the mouse leaves the root panel, trigger a mouseleave event
+   * on the tooltip span. This is necessary for dimensionless marks (e.g.,
+   * lines) when the mouse isn't actually over the span.
+   */
+  function trigger() {
+    $(tip).tipsy("hide");
+  }
+
+  /**
+   * @private When the mouse leaves the tooltip, remove the tooltip span. This
+   * event handler is declared outside of the event handler such that duplicate
+   * registrations are ignored.
+   */
+  function cleanup() {
+    if (tip) {
+      tip.parentNode.removeChild(tip);
+      tip = null;
+    }
+  }
+
+  return function(d) {
+      /* Compute the transform to offset the tooltip position. */
+      var t = pv.Transform.identity, p = this.parent;
+      do {
+        t = t.translate(p.left(), p.top()).times(p.transform());
+      } while (p = p.parent);
+
+      /* Create and cache the tooltip span to be used by tipsy. */
+      if (!tip) {
+        var c = this.root.canvas();
+        c.style.position = "relative";
+        $(c).mouseleave(trigger);
+
+        tip = c.appendChild(document.createElement("div"));
+        tip.style.position = "absolute";
+        $(tip).tipsy(opts);
+      }
+
+      /* Propagate the tooltip text. */
+      tip.title = this.title() || this.text();
+
+      /*
+       * Compute bounding box. TODO support area, lines, wedges, stroke. Also
+       * note that CSS positioning does not support subpixels, and the current
+       * rounding implementation can be off by one pixel.
+       */
+      if (this.properties.width) {
+        tip.style.width = Math.ceil(this.width() * t.k) + 1 + "px";
+        tip.style.height = Math.ceil(this.height() * t.k) + 1 + "px";
+      } else if (this.properties.radius) {
+        var r = this.radius();
+        t.x -= r;
+        t.y -= r;
+        tip.style.height = tip.style.width = Math.ceil(2 * r * t.k) + "px";
+      }
+      tip.style.left = Math.floor(this.left() * t.k + t.x) + "px";
+      tip.style.top = Math.floor(this.top() * t.k + t.y) + "px";
+
+      /*
+       * Cleanup the tooltip span on mouseout. Immediately trigger the tooltip;
+       * this is necessary for dimensionless marks.
+       */
+      $(tip).mouseleave(cleanup).tipsy("show");
+    };
+};

Added: avro/trunk/lang/java/src/java/org/apache/avro/ipc/stats/templates/statsview.vm
URL: http://svn.apache.org/viewvc/avro/trunk/lang/java/src/java/org/apache/avro/ipc/stats/templates/statsview.vm?rev=980173&view=auto
==============================================================================
--- avro/trunk/lang/java/src/java/org/apache/avro/ipc/stats/templates/statsview.vm (added)
+++ avro/trunk/lang/java/src/java/org/apache/avro/ipc/stats/templates/statsview.vm Wed Jul 28 19:28:53 2010
@@ -0,0 +1,98 @@
+##
+## 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.
+
+#macro( makeChart $attr_map )
+#if ($attr_map.type == "bar") 
+  <script>
+    makeBarChart($attr_map.labelStr, $attr_map.boundaryStr, $attr_map.dataStr);
+  </script>
+#end
+
+#if ($attr_map.type == "dot") 
+  <script>
+    makeDotChart($attr_map.dataStr);
+  </script>
+#end
+#end
+
+#macro( makeChartHeader $attr_map )
+#if ($attr_map.type == "bar") 
+  <p>
+    $attr_map.title <br>
+    Average: $attr_map.avg$attr_map.units<br>
+    Stdev: $attr_map.stdDev$attr_map.units
+  </p>
+#end
+
+#if ($attr_map.type == "dot") 
+  <p>
+    $attr_map.title <br>
+    Most recent calls
+  </p>
+#end
+#end
+
+<html>
+<head>
+<title>$title</title>
+<script type="text/javascript" src="static/protovis-r3.2.js"></script>
+<script type="text/javascript" src="static/tipsy.js"></script>
+<script src="static/jquery-1.4.2.min.js" type="text/javascript"></script>
+<script src="static/jquery.tipsy.js" type="text/javascript"></script>
+<script src="static/tipsy.js" type="text/javascript"></script>
+<link href="static/tipsy.css" type="text/css" rel="stylesheet"/>
+<script src="static/avro.js" type="text/javascript"></script>
+<link href="static/avro.css" type="text/css" rel="stylesheet"/>
+
+<script>
+
+</script>
+</head>
+<body>
+  <h1>$title</h1>
+  <p>
+    Running since: $startupTime<br>
+    Currently: $currTime
+  </p>
+  
+  #if ($inFlightRpcs.size() != 0) 
+  <h4>Active RPC's</h4>
+    <ol>
+    #foreach( $rpc in $inFlightRpcs ) 
+      <li>$rpc</li>
+    #end
+    </ol>
+  #end
+    #foreach ($message in $messages)
+    #set( $width = $message.charts.size() * 300 ) 
+    <table id="charts_table" width=$width>
+      <h3>$message.name ($message.numCalls calls)</h3>
+      <tr valign="top">
+      #foreach ($chart in $message.charts)
+        <td>#makeChartHeader($chart) </td>
+      #end
+      </tr>
+      <tr>
+      #foreach ($chart in $message.charts)
+        <td>#makeChart($chart) </td>
+      #end
+      </tr>
+    </table>
+    #end
+
+</body>
+</html>
\ No newline at end of file

Modified: avro/trunk/lang/java/src/test/java/org/apache/avro/ipc/stats/TestStatsPluginAndServlet.java
URL: http://svn.apache.org/viewvc/avro/trunk/lang/java/src/test/java/org/apache/avro/ipc/stats/TestStatsPluginAndServlet.java?rev=980173&r1=980172&r2=980173&view=diff
==============================================================================
--- avro/trunk/lang/java/src/test/java/org/apache/avro/ipc/stats/TestStatsPluginAndServlet.java (original)
+++ avro/trunk/lang/java/src/test/java/org/apache/avro/ipc/stats/TestStatsPluginAndServlet.java Wed Jul 28 19:28:53 2010
@@ -22,6 +22,11 @@ import static org.junit.Assert.assertTru
 
 import java.io.IOException;
 import java.io.StringWriter;
+import java.net.URL;
+import java.nio.ByteBuffer;
+import java.util.Random;
+
+import javax.servlet.UnavailableException;
 
 import org.apache.avro.Protocol;
 import org.apache.avro.Protocol.Message;
@@ -31,14 +36,12 @@ import org.apache.avro.generic.GenericRe
 import org.apache.avro.generic.GenericResponder;
 import org.apache.avro.ipc.AvroRemoteException;
 import org.apache.avro.ipc.HttpServer;
+import org.apache.avro.ipc.HttpTransceiver;
 import org.apache.avro.ipc.LocalTransceiver;
 import org.apache.avro.ipc.RPCContext;
 import org.apache.avro.ipc.Responder;
 import org.apache.avro.ipc.Transceiver;
 import org.junit.Test;
-import org.mortbay.jetty.Server;
-import org.mortbay.jetty.servlet.Context;
-import org.mortbay.jetty.servlet.ServletHolder;
 import org.mortbay.log.Log;
 
 public class TestStatsPluginAndServlet {
@@ -53,9 +56,18 @@ public class TestStatsPluginAndServlet {
   /** Returns an HTML string. */
   private String generateServletResponse(StatsPlugin statsPlugin)
       throws IOException {
-    StatsServlet servlet = new StatsServlet(statsPlugin);
+    StatsServlet servlet;
+    try {
+      servlet = new StatsServlet(statsPlugin);
+    } catch (UnavailableException e1) {
+      throw new IOException();
+    }
     StringWriter w = new StringWriter();
-    servlet.writeStats(w);
+    try {
+      servlet.writeStats(w);
+    } catch (Exception e) {
+      e.printStackTrace();
+    }
     String o = w.toString();
     return o;
   }
@@ -95,13 +107,14 @@ public class TestStatsPluginAndServlet {
     }
 
     String o = generateServletResponse(statsPlugin);
-    assertTrue(o.contains("Number of calls: 10"));
+    assertTrue(o.contains("10 calls"));
   }
 
   @Test
   public void testMultipleRPCs() throws IOException {
     FakeTicks t = new FakeTicks();
-    StatsPlugin statsPlugin = new StatsPlugin(t, StatsPlugin.DEFAULT_SEGMENTER);
+    StatsPlugin statsPlugin = new StatsPlugin(t, StatsPlugin.LATENCY_SEGMENTER,
+        StatsPlugin.PAYLOAD_SEGMENTER);
     RPCContext context1 = makeContext();
     RPCContext context2 = makeContext();
     statsPlugin.serverReceiveRequest(context1);
@@ -114,11 +127,23 @@ public class TestStatsPluginAndServlet {
     statsPlugin.serverSendResponse(context1);
     t.passTime(900*MS); // second takes 900ms
     statsPlugin.serverSendResponse(context2);
-
     r = generateServletResponse(statsPlugin);
-    assertTrue(r.contains("Average Duration: 500ms"));
+    assertTrue(r.contains("Average: 500.0ms"));
   }
 
+  @Test
+  public void testPayloadSize() throws IOException {
+    Responder r = new TestResponder(protocol);
+    StatsPlugin statsPlugin = new StatsPlugin();
+    r.addRPCPlugin(statsPlugin);
+    Transceiver t = new LocalTransceiver(r);
+    makeRequest(t);
+    
+    String resp = generateServletResponse(statsPlugin);
+    assertTrue(resp.contains("Average: 2.0"));
+ 
+  }
+  
   private RPCContext makeContext() {
     RPCContext context = new RPCContext();
     context.setMessage(message);
@@ -144,7 +169,8 @@ public class TestStatsPluginAndServlet {
   }
 
   /**
-   * Demo program for using RPC stats.  Tool can be used (as below)
+   * Demo program for using RPC stats. This automatically generates
+   * client RPC requests. Alternatively a can be used (as below)
    * to trigger RPCs.
    * <pre>
    * java -jar build/avro-tools-*.jar rpcsend '{"protocol":"sleepy","namespace":null,"types":[],"messages":{"sleep":{"request":[{"name":"millis","type":"long"}],"response":"null"}}}' sleep localhost 7002 '{"millis": 20000}'
@@ -158,7 +184,8 @@ public class TestStatsPluginAndServlet {
     }
     Protocol protocol = Protocol.parse("{\"protocol\": \"sleepy\", "
         + "\"messages\": { \"sleep\": {"
-        + "   \"request\": [{\"name\": \"millis\", \"type\": \"long\"}], "
+        + "   \"request\": [{\"name\": \"millis\", \"type\": \"long\"}," +
+          "{\"name\": \"data\", \"type\": \"bytes\"}], "
         + "   \"response\": \"null\"} } }");
     Log.info("Using protocol: " + protocol.toString());
     Responder r = new SleepyResponder(protocol);
@@ -169,11 +196,23 @@ public class TestStatsPluginAndServlet {
     HttpServer avroServer = new HttpServer(r, Integer.parseInt(args[0]));
     avroServer.start();
 
-    // Ideally we could use the same Jetty server
-    Server httpServer = new Server(Integer.parseInt(args[1]));
-    new Context(httpServer, "/").addServlet(
-        new ServletHolder(new StatsServlet(p)), "/*");
-    httpServer.start();
-    httpServer.join();
+    StatsServer ss = new StatsServer(p, 8080);
+    
+    HttpTransceiver trans = new HttpTransceiver(
+        new URL("http://localhost:" + Integer.parseInt(args[0])));
+    GenericRequestor req = new GenericRequestor(protocol, trans); 
+
+    while(true) {
+      Thread.sleep(1000);
+      GenericRecord params = new GenericData.Record(protocol.getMessages().get(
+        "sleep").getRequest());
+      Random rand = new Random();
+      params.put("millis", Math.abs(rand.nextLong()) % 1000);
+      int payloadSize = Math.abs(rand.nextInt()) % 10000;
+      byte[] payload = new byte[payloadSize];
+      rand.nextBytes(payload);
+      params.put("data", ByteBuffer.wrap(payload));
+      req.request("sleep", params);
+    }
   }
 }

Modified: avro/trunk/share/rat-excludes.txt
URL: http://svn.apache.org/viewvc/avro/trunk/share/rat-excludes.txt?rev=980173&r1=980172&r2=980173&view=diff
==============================================================================
--- avro/trunk/share/rat-excludes.txt (original)
+++ avro/trunk/share/rat-excludes.txt Wed Jul 28 19:28:53 2010
@@ -30,3 +30,5 @@ lang/c/jansson/**
 lang/c/src/queue.h
 lang/c/src/st.h
 lang/c/src/st.c
+lang/java/src/java/org/apache/avro/ipc/stats/static/*.js
+lang/java/src/java/org/apache/avro/ipc/stats/static/*.css