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);