diff --git a/apps/routerconsole/java/src/net/i2p/router/web/StatSummarizer.java b/apps/routerconsole/java/src/net/i2p/router/web/StatSummarizer.java index 50d8ba4f55..87e4932724 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/StatSummarizer.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/StatSummarizer.java @@ -86,12 +86,14 @@ public class StatSummarizer implements Runnable { lsnr.startListening(); //System.out.println("Start listening for " + r.getRateStat().getName() + ": " + r.getPeriod()); } - public boolean renderPng(Rate rate, OutputStream out) throws IOException { return renderPng(rate, out, -1, -1); } - public boolean renderPng(Rate rate, OutputStream out, int width, int height) throws IOException { + public boolean renderPng(Rate rate, OutputStream out) throws IOException { + return renderPng(rate, out, -1, -1, false, false, false, false); + } + public boolean renderPng(Rate rate, OutputStream out, int width, int height, boolean hideLegend, boolean hideGrid, boolean hideTitle, boolean showEvents) throws IOException { for (int i = 0; i < _listeners.size(); i++) { SummaryListener lsnr = (SummaryListener)_listeners.get(i); if (lsnr.getRate().equals(rate)) { - lsnr.renderPng(out, width, height); + lsnr.renderPng(out, width, height, hideLegend, hideGrid, hideTitle, showEvents); return true; } } 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 3d3094b402..049ab077c9 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/SummaryListener.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/SummaryListener.java @@ -116,7 +116,9 @@ class SummaryListener implements RateSummaryListener { _factory.delete(_db.getPath()); _db = null; } - public void renderPng(OutputStream out, int width, int height) throws IOException { _renderer.render(out, width, height); } + public void renderPng(OutputStream out, int width, int height, boolean hideLegend, boolean hideGrid, boolean hideTitle, boolean showEvents) throws IOException { + _renderer.render(out, width, height, hideLegend, hideGrid, hideTitle, showEvents); + } public void renderPng(OutputStream out) throws IOException { _renderer.render(out); } String getName() { return _name; } @@ -138,8 +140,8 @@ class SummaryRenderer { _listener = lsnr; } - public void render(OutputStream out) throws IOException { render(out, -1, -1); } - public void render(OutputStream out, int width, int height) throws IOException { + public void render(OutputStream out) throws IOException { render(out, -1, -1, false, false, false, false); } + public void render(OutputStream out, int width, int height, boolean hideLegend, boolean hideGrid, boolean hideTitle, boolean showEvents) throws IOException { long end = _listener.now(); long start = end - _listener.getRate().getPeriod()*SummaryListener.PERIODS; long begin = System.currentTimeMillis(); @@ -148,15 +150,30 @@ class SummaryRenderer { def.setTimePeriod(start/1000, end/1000); String title = _listener.getRate().getRateStat().getName() + " averaged for " + DataHelper.formatDuration(_listener.getRate().getPeriod()); - def.setTitle(title); + if (!hideTitle) + def.setTitle(title); String path = _listener.getData().getPath(); String dsNames[] = _listener.getData().getDsNames(); - def.datasource(_listener.getName(), path, dsNames[0], "AVERAGE", "MEMORY"); - // include the average event count on the plot - //def.datasource(_listener.getName(), path, dsNames[1], "AVERAGE", "MEMORY"); - def.area(dsNames[0], Color.BLUE, _listener.getRate().getRateStat().getDescription()); - //def.line(dsNames[1], Color.RED, "Events per period"); - //System.out.println("rendering: path=" + path + " dsNames[0]=" + dsNames[0] + " dsNames[1]=" + dsNames[1] + " lsnr.getName=" + _listener.getName()); + String plotName = null; + String descr = null; + if (showEvents) { + // include the average event count on the plot + plotName = dsNames[1]; + descr = "Events per period"; + } else { + // include the average value + plotName = dsNames[0]; + descr = _listener.getRate().getRateStat().getDescription(); + } + def.datasource(plotName, path, plotName, "AVERAGE", "MEMORY"); + def.area(plotName, Color.BLUE, descr); + if (hideLegend) + def.setShowLegend(false); + if (hideGrid) { + def.setGridX(false); + def.setGridY(false); + } + System.out.println("rendering: path=" + path + " dsNames[0]=" + dsNames[0] + " dsNames[1]=" + dsNames[1] + " lsnr.getName=" + _listener.getName()); def.setAntiAliasing(false); RrdGraph graph = new RrdGraph(def); //System.out.println("Graph created");em. diff --git a/apps/routerconsole/jsp/viewstat.jsp b/apps/routerconsole/jsp/viewstat.jsp index 77e46ee62f..0542c768ed 100644 --- a/apps/routerconsole/jsp/viewstat.jsp +++ b/apps/routerconsole/jsp/viewstat.jsp @@ -23,7 +23,11 @@ if (rs != null) { if (str != null) try { width = Integer.parseInt(str); } catch (NumberFormatException nfe) {} str = request.getParameter("height"); if (str != null) try { height = Integer.parseInt(str); } catch (NumberFormatException nfe) {} - rendered = net.i2p.router.web.StatSummarizer.instance().renderPng(rate, cout, width, height); + boolean hideLegend = Boolean.valueOf(""+request.getParameter("hideLegend")).booleanValue(); + boolean hideGrid = Boolean.valueOf(""+request.getParameter("hideGrid")).booleanValue(); + boolean hideTitle = Boolean.valueOf(""+request.getParameter("hideTitle")).booleanValue(); + boolean showEvents = Boolean.valueOf(""+request.getParameter("showEvents")).booleanValue(); + rendered = net.i2p.router.web.StatSummarizer.instance().renderPng(rate, cout, width, height, hideLegend, hideGrid, hideTitle, showEvents); } if (rendered) cout.close(); diff --git a/history.txt b/history.txt index b5901c9aa5..dd359597e5 100644 --- a/history.txt +++ b/history.txt @@ -1,4 +1,12 @@ -$Id: history.txt,v 1.431 2006/03/15 19:49:22 complication Exp $ +$Id: history.txt,v 1.432 2006/03/16 16:45:28 jrandom Exp $ + +2006-03-17 jrandom + * Add support for graphing the event count as well as the average stat + value (done by adding &showEvents=true to the URL). Also supports + hiding the legend (&hideLegend=true), the grid (&hideGrid=true), and + the title (&hideTitle=true). + * Removed an unnecessary arbitrary filter on the profile organizer so we + can pick high capacity and fast peers more appropriately 2006-03-16 jrandom * Integrate basic hooks for jrobin (http://jrobin.org) into the router diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java index 7830e70784..67ced28430 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.372 $ $Date: 2006/03/15 19:49:23 $"; + public final static String ID = "$Revision: 1.373 $ $Date: 2006/03/16 16:45:26 $"; public final static String VERSION = "0.6.1.12"; - public final static long BUILD = 10; + public final static long BUILD = 11; public static void main(String args[]) { System.out.println("I2P Router version: " + VERSION + "-" + BUILD); System.out.println("Router ID: " + RouterVersion.ID); diff --git a/router/java/src/net/i2p/router/admin/StatsGenerator.java b/router/java/src/net/i2p/router/admin/StatsGenerator.java index 1fac4a3a01..caca35ce56 100644 --- a/router/java/src/net/i2p/router/admin/StatsGenerator.java +++ b/router/java/src/net/i2p/router/admin/StatsGenerator.java @@ -184,6 +184,8 @@ public class StatsGenerator { buf.append(" render"); + buf.append(" events"); buf.append(" (as XML"); diff --git a/router/java/src/net/i2p/router/peermanager/ProfileOrganizer.java b/router/java/src/net/i2p/router/peermanager/ProfileOrganizer.java index 28d121d884..7bf9e10db0 100644 --- a/router/java/src/net/i2p/router/peermanager/ProfileOrganizer.java +++ b/router/java/src/net/i2p/router/peermanager/ProfileOrganizer.java @@ -482,9 +482,10 @@ public class ProfileOrganizer { placeTime = System.currentTimeMillis()-placeStart; - if (_log.shouldLog(Log.DEBUG)) { - _log.debug("Profiles reorganized. averages: [integration: " + _thresholdIntegrationValue + if (_log.shouldLog(Log.INFO)) + _log.info("Profiles reorganized. averages: [integration: " + _thresholdIntegrationValue + ", capacity: " + _thresholdCapacityValue + ", speed: " + _thresholdSpeedValue + "]"); + if (_log.shouldLog(Log.DEBUG)) { StringBuffer buf = new StringBuffer(512); for (Iterator iter = _strictCapacityOrder.iterator(); iter.hasNext(); ) { PeerProfile prof = (PeerProfile)iter.next(); @@ -522,7 +523,7 @@ public class ProfileOrganizer { if ( (!_fastPeers.containsKey(cur.getPeer())) && (!cur.getIsFailing()) ) { if (!isSelectable(cur.getPeer())) { // skip peers we dont have in the netDb - if (_log.shouldLog(Log.INFO)) + if (_log.shouldLog(Log.INFO)) _log.info("skip unknown peer from fast promotion: " + cur.getPeer().toBase64()); continue; } @@ -611,8 +612,9 @@ public class ProfileOrganizer { continue; // dont bother trying to make sense of things below the baseline - if (profile.getCapacityValue() <= CapacityCalculator.GROWTH_FACTOR) - continue; + // otoh, keep them in the threshold calculation, so we can adapt + ////if (profile.getCapacityValue() <= CapacityCalculator.GROWTH_FACTOR) + //// continue; totalCapacity += profile.getCapacityValue(); totalIntegration += profile.getIntegrationValue();