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

svn commit: r966416 - in /avro/trunk: ./ lang/java/ lang/java/src/java/org/apache/avro/ipc/stats/ lang/java/src/test/java/org/apache/avro/ipc/stats/ share/

Author: cutting
Date: Wed Jul 21 21:06:36 2010
New Revision: 966416

URL: http://svn.apache.org/viewvc?rev=966416&view=rev
Log:
Reverting r966342 for AVRO-587 because it's missing files from the patch and, even when these files are added, tests still fail.

Modified:
    avro/trunk/CHANGES.txt
    avro/trunk/lang/java/build.xml
    avro/trunk/lang/java/ivy.xml
    avro/trunk/lang/java/src/java/org/apache/avro/ipc/stats/StatsPlugin.java
    avro/trunk/lang/java/src/java/org/apache/avro/ipc/stats/StatsServlet.java
    avro/trunk/lang/java/src/test/java/org/apache/avro/ipc/stats/TestStatsPluginAndServlet.java
    avro/trunk/share/rat-excludes.txt

Modified: avro/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/avro/trunk/CHANGES.txt?rev=966416&r1=966415&r2=966416&view=diff
==============================================================================
--- avro/trunk/CHANGES.txt (original)
+++ avro/trunk/CHANGES.txt Wed Jul 21 21:06:36 2010
@@ -33,9 +33,6 @@ Avro 1.4.0 (unreleased)
     implementation. (Harry Wang via cutting)
 
   IMPROVEMENTS
-    AVRO-587. Add Charts and Templating to Stats View
-    (Patrick Wendell via philz)
-
     AVRO-584. Update Histogram for Stats Plugin
     (Patrick Wendell via philz)
 

Modified: avro/trunk/lang/java/build.xml
URL: http://svn.apache.org/viewvc/avro/trunk/lang/java/build.xml?rev=966416&r1=966415&r2=966416&view=diff
==============================================================================
--- avro/trunk/lang/java/build.xml (original)
+++ avro/trunk/lang/java/build.xml Wed Jul 21 21:06:36 2010
@@ -41,16 +41,11 @@
   <property name="java.src.dir" value="${src.dir}/java"/>  	
   <property name="build.dir" value="${basedir}/build"/>
   <property name="lib.dir" value="${basedir}/lib"/>
-  <property name="template.dir" value="${src.dir}/java/org/apache/avro/ipc/stats/templates"/>
-  <property name="static.dir" value="${src.dir}/java/org/apache/avro/ipc/stats/static"/>
-
 
   <property name="build.classes" value="${build.dir}/classes"/>
   <property name="build.doc" value="${build.dir}/doc"/>
   <property name="build.javadoc" value="${build.doc}/api/java"/>
   <property name="build.javadoc.log" value="${build.dir}/javadoc.log"/>
-  <property name="build.template.dir" value="${build.classes}/org/apache/avro/ipc/stats/templates"/>
-  <property name="build.static.dir" value="${build.classes}/org/apache/avro/ipc/stats/static"/>
 
   <property name="test.count" value="100"/>
   <property name="test.junit.output.format" value="plain"/>
@@ -174,12 +169,6 @@
       <fileset file="${basedir}/../../NOTICE.txt"/>
       <fileset file="${basedir}/../../share/VERSION.txt"/>
     </copy>
-    <copy todir="${build.template.dir}">
-      <fileset dir="${template.dir}" includes="**/**"/>
-    </copy>
-    <copy todir="${build.static.dir}">
-      <fileset dir="${static.dir}" includes="**/**"/>
-    </copy>
   </target>
 
   <target name="ivy-download" unless="ivy.jar.exists" depends="init">

Modified: avro/trunk/lang/java/ivy.xml
URL: http://svn.apache.org/viewvc/avro/trunk/lang/java/ivy.xml?rev=966416&r1=966415&r2=966416&view=diff
==============================================================================
--- avro/trunk/lang/java/ivy.xml (original)
+++ avro/trunk/lang/java/ivy.xml Wed Jul 21 21:06:36 2010
@@ -45,7 +45,6 @@
         rev="2.2"/>
     <dependency org="org.mortbay.jetty" name="jetty"
         rev="6.1.22"/>
-    <dependency org="org.apache.velocity" name="velocity" rev="1.6.4"/>
     <dependency org="junit" name="junit" rev="4.8.1" conf="test->default"/>
     <dependency org="checkstyle" name="checkstyle" rev="5.0"
         conf="test->default"/>

Modified: avro/trunk/lang/java/src/java/org/apache/avro/ipc/stats/StatsPlugin.java
URL: http://svn.apache.org/viewvc/avro/trunk/lang/java/src/java/org/apache/avro/ipc/stats/StatsPlugin.java?rev=966416&r1=966415&r2=966416&view=diff
==============================================================================
--- avro/trunk/lang/java/src/java/org/apache/avro/ipc/stats/StatsPlugin.java (original)
+++ avro/trunk/lang/java/src/java/org/apache/avro/ipc/stats/StatsPlugin.java Wed Jul 21 21:06:36 2010
@@ -17,11 +17,8 @@
  */
 package org.apache.avro.ipc.stats;
 
-import java.nio.ByteBuffer;
 import java.util.Arrays;
-import java.util.Date;
 import java.util.HashMap;
-import java.util.List;
 import java.util.Map;
 import java.util.TreeSet;
 import java.util.concurrent.ConcurrentHashMap;
@@ -35,15 +32,14 @@ import org.apache.avro.ipc.stats.Stopwat
 
 /**
  * Collects count and latency statistics about RPC calls.  Keeps
- * data for every method. Can be added to a Requestor (client)
- * or Responder (server). 
+ * data for every method.
  *
  * This uses milliseconds as the standard unit of measure
  * throughout the class, stored in floats.
  */
 public class StatsPlugin extends RPCPlugin {
   /** Static declaration of histogram buckets. */
-  static final Segmenter<String, Float> LATENCY_SEGMENTER =
+  static final Segmenter<String, Float> DEFAULT_SEGMENTER =
     new Histogram.TreeMapSegmenter<Float>(new TreeSet<Float>(Arrays.asList(
             0f,
            25f,
@@ -61,74 +57,28 @@ public class StatsPlugin extends RPCPlug
         60000f, // 1 minute
        600000f)));
 
-  static final Segmenter<String, Integer> PAYLOAD_SEGMENTER =
-    new Histogram.TreeMapSegmenter<Integer>(new TreeSet<Integer>(Arrays.asList(
-            0,
-           25,
-           50,
-           75,
-          100,
-          200,
-          300,
-          500,
-          750,
-         1000, // 1 k
-         2000,
-         5000,
-        10000,
-        50000, 
-       100000)));
-  
   /** Per-method histograms.
-   * Must be accessed while holding a lock. */
+   * Must be accessed while holding a lock on methodTimings. */
   Map<Message, FloatHistogram<?>> methodTimings =
     new HashMap<Message, FloatHistogram<?>>();
 
-  Map<Message, IntegerHistogram<?>> sendPayloads =
-    new HashMap<Message, IntegerHistogram<?>>();
-  
-  Map<Message, IntegerHistogram<?>> receivePayloads =
-    new HashMap<Message, IntegerHistogram<?>>();
-  
   /** RPCs in flight. */
   ConcurrentMap<RPCContext, Stopwatch> activeRpcs =
     new ConcurrentHashMap<RPCContext, Stopwatch>();
   private Ticks ticks;
 
-  /** How long I've been alive */
-  public Date startupTime = new Date();
-  
-  private Segmenter<?, Float> floatSegmenter;
-  private Segmenter<?, Integer> integerSegmenter;
+  private Segmenter<?, Float> segmenter;
 
   /** Construct a plugin with custom Ticks and Segmenter implementations. */
-  StatsPlugin(Ticks ticks, Segmenter<?, Float> floatSegmenter, 
-      Segmenter<?, Integer> integerSegmenter) {
-    this.floatSegmenter = floatSegmenter;
-    this.integerSegmenter = integerSegmenter;
+  StatsPlugin(Ticks ticks, Segmenter<?, Float> segmenter) {
+    this.segmenter = segmenter;
     this.ticks = ticks;
   }
 
   /** Construct a plugin with default (system) ticks, and default
    * histogram segmentation. */
   public StatsPlugin() {
-    this(Stopwatch.SYSTEM_TICKS, LATENCY_SEGMENTER, PAYLOAD_SEGMENTER);
-  }
-  
-  /**
-   * Helper to get the size of an RPC payload.
-   */
-  private int getPayloadSize(List<ByteBuffer> payload) {
-    if (payload == null) {
-      return 0;
-    }
-    
-    int size = 0;
-    for (ByteBuffer bb: payload) {
-      size = size + bb.limit();
-    }
-    
-    return size;
+    this(Stopwatch.SYSTEM_TICKS, DEFAULT_SEGMENTER);
   }
 
   @Override
@@ -136,65 +86,15 @@ public class StatsPlugin extends RPCPlug
     Stopwatch t = new Stopwatch(ticks);
     t.start();
     this.activeRpcs.put(context, t);
-    
-    synchronized(receivePayloads) {
-      IntegerHistogram<?> h = receivePayloads.get(context.getMessage());
-      if (h == null) {
-        h = createNewIntegerHistogram();
-        receivePayloads.put(context.getMessage(), h);
-      }
-      h.add(getPayloadSize(context.getRequestPayload()));
-    }
   }
-  
+
   @Override
   public void serverSendResponse(RPCContext context) {
     Stopwatch t = this.activeRpcs.remove(context);
     t.stop();
     publish(context, t);
-    
-    synchronized(sendPayloads) {
-      IntegerHistogram<?> h = sendPayloads.get(context.getMessage());
-      if (h == null) {
-        h = createNewIntegerHistogram();
-        sendPayloads.put(context.getMessage(), h);
-      }
-      h.add(getPayloadSize(context.getResponsePayload()));
-    }
   }
-  
-  @Override
-  public void clientSendRequest(RPCContext context) {
-    Stopwatch t = new Stopwatch(ticks);
-    t.start();
-    this.activeRpcs.put(context, t);
-    
-    synchronized(sendPayloads) {
-      IntegerHistogram<?> h = sendPayloads.get(context.getMessage());
-      if (h == null) {
-        h = createNewIntegerHistogram();
-       sendPayloads.put(context.getMessage(), h);
-      }
-      h.add(getPayloadSize(context.getRequestPayload()));
-    }
-  }
-  
-  @Override
-  public void clientReceiveResponse(RPCContext context) {
-    Stopwatch t = this.activeRpcs.remove(context);
-    t.stop();
-    publish(context, t);
-    
-    synchronized(receivePayloads) {
-      IntegerHistogram<?> h = receivePayloads.get(context.getMessage());
-      if (h == null) {
-        h = createNewIntegerHistogram();
-        receivePayloads.put(context.getMessage(), h);
-      }
-      h.add(getPayloadSize(context.getRequestPayload()));
-    }
-  }
-  
+
   /** Adds timing to the histograms. */
   private void publish(RPCContext context, Stopwatch t) {
     Message message = context.getMessage();
@@ -202,7 +102,7 @@ public class StatsPlugin extends RPCPlug
     synchronized(methodTimings) {
       FloatHistogram<?> h = methodTimings.get(context.getMessage());
       if (h == null) {
-        h = createNewFloatHistogram();
+        h = createNewHistogram();
         methodTimings.put(context.getMessage(), h);
       }
       h.add(nanosToMillis(t.elapsedNanos()));
@@ -210,15 +110,10 @@ public class StatsPlugin extends RPCPlug
   }
 
   @SuppressWarnings("unchecked")
-  private FloatHistogram<?> createNewFloatHistogram() {
-    return new FloatHistogram(floatSegmenter);
+  private FloatHistogram<?> createNewHistogram() {
+    return new FloatHistogram(segmenter);
   }
 
-  @SuppressWarnings("unchecked")
-  private IntegerHistogram<?> createNewIntegerHistogram() {
-    return new IntegerHistogram(integerSegmenter);
-  }
-  
   /** Converts nanoseconds to milliseconds. */
   static float nanosToMillis(long elapsedNanos) {
     return elapsedNanos / 1000000.0f;

Modified: avro/trunk/lang/java/src/java/org/apache/avro/ipc/stats/StatsServlet.java
URL: http://svn.apache.org/viewvc/avro/trunk/lang/java/src/java/org/apache/avro/ipc/stats/StatsServlet.java?rev=966416&r1=966415&r2=966416&view=diff
==============================================================================
--- avro/trunk/lang/java/src/java/org/apache/avro/ipc/stats/StatsServlet.java (original)
+++ avro/trunk/lang/java/src/java/org/apache/avro/ipc/stats/StatsServlet.java Wed Jul 21 21:06:36 2010
@@ -19,33 +19,15 @@ package org.apache.avro.ipc.stats;
 
 import java.io.IOException;
 import java.io.Writer;
-import java.net.URL;
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Set;
 import java.util.Map.Entry;
 
-import javax.servlet.RequestDispatcher;
-import javax.servlet.ServletConfig;
 import javax.servlet.ServletException;
-import javax.servlet.UnavailableException;
 import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
-import org.apache.velocity.Template;
-import org.apache.velocity.VelocityContext;
-import org.apache.velocity.app.VelocityEngine;
-import org.apache.velocity.exception.ParseErrorException;
-import org.apache.velocity.exception.ResourceNotFoundException;
 
 import org.apache.avro.Protocol.Message;
 import org.apache.avro.ipc.RPCContext;
-import org.mortbay.jetty.servlet.DefaultServlet;
-import org.mortbay.resource.Resource;
 
 /**
  * Exposes information provided by a StatsPlugin as
@@ -54,217 +36,71 @@ import org.mortbay.resource.Resource;
  * This class follows the same synchronization conventions
  * as StatsPlugin, to avoid requiring StatsPlugin to serve
  * a copy of the data.
- */ 
+ */
 public class StatsServlet extends HttpServlet {
   private final StatsPlugin statsPlugin;
-  private VelocityEngine velocityEngine;
-  private static final SimpleDateFormat FORMATTER = 
-    new SimpleDateFormat("dd-MMM-yyyy HH:mm:ss");
 
-  public StatsServlet(StatsPlugin statsPlugin) throws UnavailableException {
+  public StatsServlet(StatsPlugin statsPlugin) {
     this.statsPlugin = statsPlugin;
-    this.velocityEngine = new VelocityEngine();
-    
-    // These two properties tell Velocity to use its own classpath-based loader
-    velocityEngine.addProperty("resource.loader", "class");
-    velocityEngine.addProperty("class.resource.loader.class",
-        "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
-  }
-  
-  /* Helper class to store per-message data which is passed to templates.
-   * 
-   * The template expects a list of charts, each of which is parameterized by
-   * map key-value string attributes. */
-  public class RenderableMessage { // Velocity brakes if not public
-    public String name;
-    public int numCalls;
-    public ArrayList<HashMap<String, String>> charts;
-    
-    public RenderableMessage(String name) {
-      this.name = name;
-      this.charts = new ArrayList<HashMap<String, String>>();
-    }
-    
-    public ArrayList<HashMap<String, String>> getCharts() {
-      return this.charts;
-    }
-    
-    public String getname() {
-      return this.name;
-    }
-    
-    public int getNumCalls() {
-      return this.numCalls;
-    }
   }
 
-  /* Surround each string in an array with
-   * quotation marks and escape existing quotes.
-   * 
-   * This is useful when we have an array of strings that we want to turn into
-   * a javascript array declaration. 
-   */
-  protected static List<String> escapeStringArray(List<String> input) {
-    for (int i = 0; i < input.size(); i++) {
-      input.set(i, "\"" + input.get(i).replace("\"", "\\\"") + "\"");
-    }
-    return input;
-  }
-  
   @Override
   protected void doGet(HttpServletRequest req, HttpServletResponse resp)
       throws ServletException, IOException {
     resp.setContentType("text/html");
-    String url = req.getRequestURL().toString();
-    String[] parts = url.split("//")[1].split("/");
-    
-    try {
-      writeStats(resp.getWriter()); 
-    }
-    catch (Exception e) {
-      e.printStackTrace();
-    }
+    writeStats(resp.getWriter());
   }
 
   void writeStats(Writer w) throws IOException {
-    VelocityContext context = new VelocityContext();
-    context.put("title", "Avro RPC Stats"); 
-    
-    ArrayList<String> rpcs = new ArrayList<String>();  // in flight rpcs
-    
-    ArrayList<RenderableMessage> messages = 
-      new ArrayList<RenderableMessage>();
-    
-    for (Entry<RPCContext, Stopwatch> rpc : 
-         this.statsPlugin.activeRpcs.entrySet()) {
-      rpcs.add(renderActiveRpc(rpc.getKey(), rpc.getValue()));
+    w.append("<html><head><title>Avro RPC Stats</title></head>");
+    w.append("<body><h1>Avro RPC Stats</h1>");
+
+    w.append("<h2>Active RPCs</h2>");
+    w.append("<ol>");
+    for (Entry<RPCContext, Stopwatch> rpc : this.statsPlugin.activeRpcs.entrySet()) {
+      writeActiveRpc(w, rpc.getKey(), rpc.getValue());
     }
-    
-    // Get set of all seen messages
-    Set<Message> keys = null;
+    w.append("</ol>");
+
+    w.append("<h2>Per-method Timing</h2>");
     synchronized(this.statsPlugin.methodTimings) {
-       keys = this.statsPlugin.methodTimings.keySet();
-    
-      for (Message m: keys) {
-        messages.add(renderMethod(m));
+      for (Entry<Message, FloatHistogram<?>> e :
+        this.statsPlugin.methodTimings.entrySet()) {
+        writeMethod(w, e.getKey(), e.getValue());
       }
     }
-    
-    context.put("inFlightRpcs", rpcs);
-    context.put("messages", messages);
-    
-    context.put("currTime", FORMATTER.format(new Date()));
-    context.put("startupTime", FORMATTER.format(statsPlugin.startupTime));
-    
-    Template t;
-    try {
-      t = velocityEngine.getTemplate(
-          "org/apache/avro/ipc/stats/templates/statsview.vm");
-    } catch (ResourceNotFoundException e) {
-      throw new IOException();
-    } catch (ParseErrorException e) {
-      throw new IOException();
-    } catch (Exception e) {
-      throw new IOException();
-    }
-    t.merge(context, w);
-  }
-
-  private String renderActiveRpc(RPCContext rpc, Stopwatch stopwatch) 
-      throws IOException {
-    String out = new String();
-    out += rpc.getMessage().getName() + ": " + 
-        formatMillis(StatsPlugin.nanosToMillis(stopwatch.elapsedNanos()));
-    return out;
+    w.append("</body></html>");
   }
 
-  
-  private RenderableMessage renderMethod(Message message) {
-    RenderableMessage out = new RenderableMessage(message.getName());
-    
-    synchronized(this.statsPlugin.methodTimings) {
-      FloatHistogram<?> hist = this.statsPlugin.methodTimings.get(message);
-      out.numCalls = hist.getCount();
-      
-      HashMap<String, String> latencyBar = new HashMap<String, String>();
-      // Fill in chart attributes for velocity
-      latencyBar.put("type", "bar");
-      latencyBar.put("title", "All-Time Latency");
-      latencyBar.put("units", "ms");
-      latencyBar.put("numCalls", Integer.toString(hist.getCount()));
-      latencyBar.put("avg", Float.toString(hist.getMean()));
-      latencyBar.put("stdDev", Float.toString(hist.getUnbiasedStdDev()));
-      latencyBar.put("labelStr", 
-          Arrays.toString(hist.getSegmenter().getBoundaryLabels().toArray()));
-      latencyBar.put("boundaryStr",
-          Arrays.toString(escapeStringArray(hist.getSegmenter().
-              getBucketLabels()).toArray()));
-      latencyBar.put("dataStr", Arrays.toString(hist.getHistogram())); 
-      out.charts.add(latencyBar);
-      
-      HashMap<String, String> latencyDot = new HashMap<String, String>();
-      latencyDot.put("title", "Latency");
-      latencyDot.put("type", "dot");
-      latencyDot.put("dataStr", 
-          Arrays.toString(hist.getRecentAdditions().toArray()));
-      out.charts.add(latencyDot);
-    }
-    
-    synchronized(this.statsPlugin.sendPayloads) {
-      IntegerHistogram<?> hist = this.statsPlugin.sendPayloads.get(message);
-      HashMap<String, String> latencyBar = new HashMap<String, String>();
-      // Fill in chart attributes for velocity
-      latencyBar.put("type", "bar");
-      latencyBar.put("title", "All-Time Send Payload");
-      latencyBar.put("units", "ms");
-      latencyBar.put("numCalls", Integer.toString(hist.getCount()));
-      latencyBar.put("avg", Float.toString(hist.getMean()));
-      latencyBar.put("stdDev", Float.toString(hist.getUnbiasedStdDev()));
-      latencyBar.put("labelStr", 
-          Arrays.toString(hist.getSegmenter().getBoundaryLabels().toArray()));
-      latencyBar.put("boundaryStr",
-          Arrays.toString(escapeStringArray(hist.getSegmenter().
-              getBucketLabels()).toArray()));
-      latencyBar.put("dataStr", Arrays.toString(hist.getHistogram())); 
-      out.charts.add(latencyBar);
-      
-      HashMap<String, String> latencyDot = new HashMap<String, String>();
-      latencyDot.put("title", "Send Payload");
-      latencyDot.put("type", "dot");
-      latencyDot.put("dataStr", 
-          Arrays.toString(hist.getRecentAdditions().toArray()));
-      out.charts.add(latencyDot);
+  private void writeActiveRpc(Writer w, RPCContext rpc, Stopwatch stopwatch) throws IOException {
+    w.append("<li>").append(rpc.getMessage().getName()).append(": ");
+    w.append(formatMillis(StatsPlugin.nanosToMillis(stopwatch.elapsedNanos())));
+    w.append("</li>");
+  }
+
+  private void writeMethod(Writer w, Message message, FloatHistogram<?> hist) throws IOException {
+    w.append("<h3>").append(message.getName()).append("</h3>");
+    w.append("<p>Number of calls: ");
+    w.append(Integer.toString(hist.getCount()));
+    w.append("</p><p>Average Duration: ");
+    w.append(formatMillis(hist.getMean()));
+    w.append("</p>");
+    w.append("</p><p>Std Dev: ");
+    w.append(formatMillis(hist.getUnbiasedStdDev()));
+    w.append("</p>");
+
+    w.append("<dl>");
+
+    for (Histogram.Entry<?> e : hist.entries()) {
+      w.append("<dt>");
+      w.append(e.bucket.toString());
+      w.append("</dt>");
+      w.append("<dd>").append(Integer.toString(e.count)).append("</dd>");
+      w.append("</dt>");
     }
-    
-    synchronized(this.statsPlugin.receivePayloads) {
-      IntegerHistogram<?> hist = this.statsPlugin.receivePayloads.get(message);
-      HashMap<String, String> latencyBar = new HashMap<String, String>();
-      // Fill in chart attributes for velocity
-      latencyBar.put("type", "bar");
-      latencyBar.put("title", "All-Time Receive Payload");
-      latencyBar.put("units", "ms");
-      latencyBar.put("numCalls", Integer.toString(hist.getCount()));
-      latencyBar.put("avg", Float.toString(hist.getMean()));
-      latencyBar.put("stdDev", Float.toString(hist.getUnbiasedStdDev()));
-      latencyBar.put("labelStr", 
-          Arrays.toString(hist.getSegmenter().getBoundaryLabels().toArray()));
-      latencyBar.put("boundaryStr",
-          Arrays.toString(escapeStringArray(hist.getSegmenter().
-              getBucketLabels()).toArray()));
-      latencyBar.put("dataStr", Arrays.toString(hist.getHistogram())); 
-      out.charts.add(latencyBar);
-      
-      HashMap<String, String> latencyDot = new HashMap<String, String>();
-      latencyDot.put("title", "Recv Payload");
-      latencyDot.put("type", "dot");
-      latencyDot.put("dataStr", 
-          Arrays.toString(hist.getRecentAdditions().toArray()));
-      out.charts.add(latencyDot);
-    }
-    
-    return out;
+    w.append("</dl>");
   }
-  
+
   private CharSequence formatMillis(float millis) {
     return String.format("%.0fms", millis);
   }

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=966416&r1=966415&r2=966416&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 21 21:06:36 2010
@@ -22,11 +22,6 @@ 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;
@@ -36,12 +31,14 @@ 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 {
@@ -56,18 +53,9 @@ public class TestStatsPluginAndServlet {
   /** Returns an HTML string. */
   private String generateServletResponse(StatsPlugin statsPlugin)
       throws IOException {
-    StatsServlet servlet;
-    try {
-      servlet = new StatsServlet(statsPlugin);
-    } catch (UnavailableException e1) {
-      throw new IOException();
-    }
+    StatsServlet servlet = new StatsServlet(statsPlugin);
     StringWriter w = new StringWriter();
-    try {
-      servlet.writeStats(w);
-    } catch (Exception e) {
-      e.printStackTrace();
-    }
+    servlet.writeStats(w);
     String o = w.toString();
     return o;
   }
@@ -107,14 +95,13 @@ public class TestStatsPluginAndServlet {
     }
 
     String o = generateServletResponse(statsPlugin);
-    assertTrue(o.contains("10 calls"));
+    assertTrue(o.contains("Number of calls: 10"));
   }
 
   @Test
   public void testMultipleRPCs() throws IOException {
     FakeTicks t = new FakeTicks();
-    StatsPlugin statsPlugin = new StatsPlugin(t, StatsPlugin.LATENCY_SEGMENTER,
-        StatsPlugin.PAYLOAD_SEGMENTER);
+    StatsPlugin statsPlugin = new StatsPlugin(t, StatsPlugin.DEFAULT_SEGMENTER);
     RPCContext context1 = makeContext();
     RPCContext context2 = makeContext();
     statsPlugin.serverReceiveRequest(context1);
@@ -127,23 +114,11 @@ public class TestStatsPluginAndServlet {
     statsPlugin.serverSendResponse(context1);
     t.passTime(900*MS); // second takes 900ms
     statsPlugin.serverSendResponse(context2);
+
     r = generateServletResponse(statsPlugin);
-    assertTrue(r.contains("Average: 500.0ms"));
+    assertTrue(r.contains("Average Duration: 500ms"));
   }
 
-  @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);
@@ -169,8 +144,7 @@ public class TestStatsPluginAndServlet {
   }
 
   /**
-   * Demo program for using RPC stats. This automatically generates
-   * client RPC requests. Alternatively a can be used (as below)
+   * Demo program for using RPC stats.  Tool 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}'
@@ -184,8 +158,7 @@ public class TestStatsPluginAndServlet {
     }
     Protocol protocol = Protocol.parse("{\"protocol\": \"sleepy\", "
         + "\"messages\": { \"sleep\": {"
-        + "   \"request\": [{\"name\": \"millis\", \"type\": \"long\"}," +
-          "{\"name\": \"data\", \"type\": \"bytes\"}], "
+        + "   \"request\": [{\"name\": \"millis\", \"type\": \"long\"}], "
         + "   \"response\": \"null\"} } }");
     Log.info("Using protocol: " + protocol.toString());
     Responder r = new SleepyResponder(protocol);
@@ -196,24 +169,11 @@ public class TestStatsPluginAndServlet {
     HttpServer avroServer = new HttpServer(r, Integer.parseInt(args[0]));
     avroServer.start();
 
-    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);
-    }
+    // 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();
   }
 }

Modified: avro/trunk/share/rat-excludes.txt
URL: http://svn.apache.org/viewvc/avro/trunk/share/rat-excludes.txt?rev=966416&r1=966415&r2=966416&view=diff
==============================================================================
--- avro/trunk/share/rat-excludes.txt (original)
+++ avro/trunk/share/rat-excludes.txt Wed Jul 21 21:06:36 2010
@@ -30,5 +30,3 @@ 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