From 16fa6a89bca9ae2962928633b8fff35312f33d6c Mon Sep 17 00:00:00 2001 From: zzz Date: Sat, 14 Jul 2007 18:44:11 +0000 Subject: [PATCH] 2007-07-14 zzz * Clean up graphs.jsp - set K=1024 where appropriate, output image sizes in html, catch ooms, other minor tweaks * Fix current event count truncation which fixes graphs with low 60-sec event counts displaying high values (bw.* and router.* graphs for example were 1.5x too high) Affects all "events per period" (non-lifetime) counts. --- .../src/net/i2p/router/web/GraphHelper.java | 14 +++++++--- .../net/i2p/router/web/StatSummarizer.java | 26 +++++++++++-------- .../net/i2p/router/web/SummaryListener.java | 16 ++++++++---- core/java/src/net/i2p/stat/Rate.java | 7 +++-- history.txt | 10 ++++++- .../src/net/i2p/router/RouterVersion.java | 4 +-- 6 files changed, 52 insertions(+), 25 deletions(-) diff --git a/apps/routerconsole/java/src/net/i2p/router/web/GraphHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/GraphHelper.java index 6d247e712..55d27a69f 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/GraphHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/GraphHelper.java @@ -55,10 +55,13 @@ public class GraphHelper { public String getImages() { try { - _out.write("\n"); List listeners = StatSummarizer.instance().getListeners(); @@ -68,7 +71,10 @@ public class GraphHelper { SummaryListener lsnr = (SummaryListener)iter.next(); Rate r = lsnr.getRate(); String title = r.getRateStat().getName() + " for " + DataHelper.formatDuration(_periodCount * r.getPeriod()); - _out.write(" SummaryListener.PERIODS) periodCount = SummaryListener.PERIODS; long period = 60*1000; long start = end - period*periodCount; - long begin = System.currentTimeMillis(); + //long begin = System.currentTimeMillis(); try { RrdGraphDef def = new RrdGraphDef(); def.setTimePeriod(start/1000, end/1000); + def.setBaseValue(1024); String title = "Bandwidth usage"; if (!hideTitle) def.setTitle(title); @@ -159,15 +160,15 @@ public class StatSummarizer implements Runnable { String recvName = SummaryListener.createName(_context, "bw.recvRate.60000"); def.datasource(sendName, sendName, sendName, "AVERAGE", "MEMORY"); def.datasource(recvName, recvName, recvName, "AVERAGE", "MEMORY"); - def.area(sendName, Color.BLUE, "Outbound bytes/second"); - //def.line(sendName, Color.BLUE, "Outbound bytes/second", 3); - //def.line(recvName, Color.RED, "Inbound bytes/second@r", 3); - def.area(recvName, Color.RED, "Inbound bytes/second@r"); + def.area(sendName, Color.BLUE, "Outbound bytes/sec"); + //def.line(sendName, Color.BLUE, "Outbound bytes/sec", 3); + def.line(recvName, Color.RED, "Inbound bytes/sec@r", 3); + //def.area(recvName, Color.RED, "Inbound bytes/sec@r"); if (!hideLegend) { - def.gprint(sendName, "AVERAGE", "outbound average: @2@sbytes/second"); - def.gprint(sendName, "MAX", " max: @2@sbytes/second@r"); - def.gprint(recvName, "AVERAGE", "inbound average: @2bytes/second@s"); - def.gprint(recvName, "MAX", " max: @2@sbytes/second@r"); + def.gprint(sendName, "AVERAGE", "out average: @2@sbytes/sec"); + def.gprint(sendName, "MAX", " max: @2@sbytes/sec@r"); + def.gprint(recvName, "AVERAGE", "in average: @2@sbytes/sec"); + def.gprint(recvName, "MAX", " max: @2@sbytes/sec@r"); } if (!showCredit) def.setShowSignature(false); @@ -188,7 +189,7 @@ public class StatSummarizer implements Runnable { data = graph.getPNGBytes(); else data = graph.getPNGBytes(width, height); - long timeToPlot = System.currentTimeMillis() - begin; + //long timeToPlot = System.currentTimeMillis() - begin; out.write(data); //File t = File.createTempFile("jrobinData", ".xml"); //_listener.getData().dumpXml(new FileOutputStream(t)); @@ -201,6 +202,9 @@ public class StatSummarizer implements Runnable { } catch (IOException ioe) { _log.error("Error rendering", ioe); throw ioe; + } catch (OutOfMemoryError oom) { + _log.error("Error rendering", oom); + throw new IOException("Error plotting: " + oom.getMessage()); } } diff --git a/apps/routerconsole/java/src/net/i2p/router/web/SummaryListener.java b/apps/routerconsole/java/src/net/i2p/router/web/SummaryListener.java index 30370a60a..148fb55cc 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/SummaryListener.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/SummaryListener.java @@ -154,7 +154,7 @@ class SummaryRenderer { * */ public static synchronized void render(I2PAppContext ctx, OutputStream out, String filename) throws IOException { - long end = ctx.clock().now(); + long end = ctx.clock().now() - 60*1000; long start = end - 60*1000*SummaryListener.PERIODS; long begin = System.currentTimeMillis(); try { @@ -174,16 +174,19 @@ class SummaryRenderer { } public void render(OutputStream out) throws IOException { render(out, -1, -1, false, false, false, false, -1, true); } public void render(OutputStream out, int width, int height, boolean hideLegend, boolean hideGrid, boolean hideTitle, boolean showEvents, int periodCount, boolean showCredit) throws IOException { - long end = _listener.now(); + long end = _listener.now() - 60*1000; if (periodCount <= 0) periodCount = SummaryListener.PERIODS; if (periodCount > SummaryListener.PERIODS) periodCount = SummaryListener.PERIODS; long start = end - _listener.getRate().getPeriod()*periodCount; - long begin = System.currentTimeMillis(); + //long begin = System.currentTimeMillis(); try { RrdGraphDef def = new RrdGraphDef(); def.setTimePeriod(start/1000, end/1000); - String title = _listener.getRate().getRateStat().getName() + " averaged for " + String name = _listener.getRate().getRateStat().getName(); + if ((name.startsWith("bw.") || name.endsWith("PacketSize")) && !showEvents) + def.setBaseValue(1024); + String title = name + " averaged for " + DataHelper.formatDuration(_listener.getRate().getPeriod()); if (!hideTitle) def.setTitle(title); @@ -233,7 +236,7 @@ class SummaryRenderer { data = graph.getPNGBytes(); else data = graph.getPNGBytes(width, height); - long timeToPlot = System.currentTimeMillis() - begin; + //long timeToPlot = System.currentTimeMillis() - begin; out.write(data); //File t = File.createTempFile("jrobinData", ".xml"); //_listener.getData().dumpXml(new FileOutputStream(t)); @@ -245,6 +248,9 @@ class SummaryRenderer { } catch (IOException ioe) { _log.error("Error rendering", ioe); throw ioe; + } catch (OutOfMemoryError oom) { + _log.error("Error rendering", oom); + throw new IOException("Error plotting: " + oom.getMessage()); } } } diff --git a/core/java/src/net/i2p/stat/Rate.java b/core/java/src/net/i2p/stat/Rate.java index 8ac385feb..7f9d1e2e6 100644 --- a/core/java/src/net/i2p/stat/Rate.java +++ b/core/java/src/net/i2p/stat/Rate.java @@ -184,6 +184,7 @@ public class Rate { private static final int SLACK = 2000; public void coalesce() { long now = now(); + double correctedTotalValue; // for summaryListener which divides by rounded EventCount synchronized (_lock) { long measuredPeriod = now - _lastCoalesceDate; if (measuredPeriod < _period - SLACK) { @@ -198,9 +199,11 @@ public class Rate { // how much were we off by? (so that we can sample down the measured values) double periodFactor = measuredPeriod / (double)_period; _lastTotalValue = _currentTotalValue / periodFactor; - _lastEventCount = (long) ( (_currentEventCount + periodFactor - 1) / periodFactor); + _lastEventCount = (long) (0.499999 + (_currentEventCount / periodFactor)); _lastTotalEventTime = (long) (_currentTotalEventTime / periodFactor); _lastCoalesceDate = now; + correctedTotalValue = _currentTotalValue * + (_lastEventCount / (double) _currentEventCount); if (_lastTotalValue > _extremeTotalValue) { _extremeTotalValue = _lastTotalValue; @@ -213,7 +216,7 @@ public class Rate { _currentTotalEventTime = 0; } if (_summaryListener != null) - _summaryListener.add(_lastTotalValue, _lastEventCount, _lastTotalEventTime, _period); + _summaryListener.add(correctedTotalValue, _lastEventCount, _lastTotalEventTime, _period); } public void setSummaryListener(RateSummaryListener listener) { _summaryListener = listener; } diff --git a/history.txt b/history.txt index b04513b67..4851135d7 100644 --- a/history.txt +++ b/history.txt @@ -1,4 +1,12 @@ -$Id: history.txt,v 1.573 2007-07-07 15:03:52 zzz Exp $ +$Id: history.txt,v 1.574 2007-07-09 20:20:38 zzz Exp $ + +2007-07-14 zzz + * Clean up graphs.jsp - set K=1024 where appropriate, + output image sizes in html, catch ooms, other minor tweaks + * Fix current event count truncation which fixes graphs with low + 60-sec event counts displaying high values + (bw.* and router.* graphs for example were 1.5x too high) + Affects all "events per period" (non-lifetime) counts. 2007-07-09 zzz * i2psnark: give a better error message for a non-i2p torrent diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java index 7b010d919..3be478f4c 100644 --- a/router/java/src/net/i2p/router/RouterVersion.java +++ b/router/java/src/net/i2p/router/RouterVersion.java @@ -15,9 +15,9 @@ import net.i2p.CoreVersion; * */ public class RouterVersion { - public final static String ID = "$Revision: 1.508 $ $Date: 2007-07-07 15:03:50 $"; + public final static String ID = "$Revision: 1.509 $ $Date: 2007-07-09 20:20:37 $"; public final static String VERSION = "0.6.1.28"; - public final static long BUILD = 11; + public final static long BUILD = 12; public static void main(String args[]) { System.out.println("I2P Router version: " + VERSION + "-" + BUILD); System.out.println("Router ID: " + RouterVersion.ID);