forked from I2P_Developers/i2p.i2p
2007-07-16 zzz
* Make selection of graphed data configurable via configstats.jsp, remove most of the default graphs to save some memory
This commit is contained in:
@ -17,6 +17,7 @@ import net.i2p.stat.StatManager;
|
|||||||
public class ConfigStatsHandler extends FormHandler {
|
public class ConfigStatsHandler extends FormHandler {
|
||||||
private String _filename;
|
private String _filename;
|
||||||
private List _stats;
|
private List _stats;
|
||||||
|
private String _graphs;
|
||||||
private boolean _explicitFilter;
|
private boolean _explicitFilter;
|
||||||
private String _explicitFilterValue;
|
private String _explicitFilterValue;
|
||||||
|
|
||||||
@ -48,6 +49,25 @@ public class ConfigStatsHandler extends FormHandler {
|
|||||||
_log.debug("Updated stats: " + _stats);
|
_log.debug("Updated stats: " + _stats);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setGraphList(String stats[]) {
|
||||||
|
if (stats != null) {
|
||||||
|
String s = "";
|
||||||
|
for (int i = 0; i < stats.length; i++) {
|
||||||
|
String cur = stats[i].trim();
|
||||||
|
if (cur.length() > 0) {
|
||||||
|
if (s.length() > 0)
|
||||||
|
s = s + ",";
|
||||||
|
s = s + cur;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_graphs = s;
|
||||||
|
} else {
|
||||||
|
_graphs = "";
|
||||||
|
}
|
||||||
|
if (_log.shouldLog(Log.DEBUG))
|
||||||
|
_log.debug("Updated graphs: " + _graphs);
|
||||||
|
}
|
||||||
|
|
||||||
public void setExplicitFilter(String foo) { _explicitFilter = true; }
|
public void setExplicitFilter(String foo) { _explicitFilter = true; }
|
||||||
public void setExplicitFilterValue(String filter) { _explicitFilterValue = filter; }
|
public void setExplicitFilterValue(String filter) { _explicitFilterValue = filter; }
|
||||||
|
|
||||||
@ -88,11 +108,13 @@ public class ConfigStatsHandler extends FormHandler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_context.router().setConfigSetting(StatManager.PROP_STAT_FILTER, stats.toString());
|
_context.router().setConfigSetting(StatManager.PROP_STAT_FILTER, stats.toString());
|
||||||
|
_context.router().setConfigSetting("stat.summaries", _graphs);
|
||||||
boolean ok = _context.router().saveConfig();
|
boolean ok = _context.router().saveConfig();
|
||||||
if (ok)
|
if (ok)
|
||||||
addFormNotice("Stat filter and location updated successfully to: " + stats.toString());
|
addFormNotice("Stat filter and location updated successfully to: " + stats.toString());
|
||||||
else
|
else
|
||||||
addFormError("Failed to update the stat filter and location");
|
addFormError("Failed to update the stat filter and location");
|
||||||
|
addFormNotice("Graph list updated, may take up to 60s to be reflected here and on the <a href=\"graphs.jsp\">Graphs Page</a>");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -7,6 +7,7 @@ import java.util.List;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.StringTokenizer;
|
import java.util.StringTokenizer;
|
||||||
|
import net.i2p.stat.Rate;
|
||||||
import net.i2p.stat.RateStat;
|
import net.i2p.stat.RateStat;
|
||||||
import net.i2p.stat.FrequencyStat;
|
import net.i2p.stat.FrequencyStat;
|
||||||
import net.i2p.router.RouterContext;
|
import net.i2p.router.RouterContext;
|
||||||
@ -20,12 +21,15 @@ public class ConfigStatsHelper {
|
|||||||
/** list of names of stats which are remaining, ordered by nested groups */
|
/** list of names of stats which are remaining, ordered by nested groups */
|
||||||
private List _stats;
|
private List _stats;
|
||||||
private String _currentStatName;
|
private String _currentStatName;
|
||||||
|
private String _currentGraphName;
|
||||||
private String _currentStatDescription;
|
private String _currentStatDescription;
|
||||||
private String _currentGroup;
|
private String _currentGroup;
|
||||||
/** true if the current stat is the first in the group */
|
/** true if the current stat is the first in the group */
|
||||||
private boolean _currentIsFirstInGroup;
|
private boolean _currentIsFirstInGroup;
|
||||||
/** true if the stat is being logged */
|
/** true if the stat is being logged */
|
||||||
private boolean _currentIsLogged;
|
private boolean _currentIsLogged;
|
||||||
|
private boolean _currentIsGraphed;
|
||||||
|
private boolean _currentCanBeGraphed;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Configure this bean to query a particular router context
|
* Configure this bean to query a particular router context
|
||||||
@ -71,6 +75,7 @@ public class ConfigStatsHelper {
|
|||||||
public boolean hasMoreStats() {
|
public boolean hasMoreStats() {
|
||||||
if (_stats.size() <= 0)
|
if (_stats.size() <= 0)
|
||||||
return false;
|
return false;
|
||||||
|
_currentIsGraphed = false;
|
||||||
_currentStatName = (String)_stats.remove(0);
|
_currentStatName = (String)_stats.remove(0);
|
||||||
RateStat rs = _context.statManager().getRate(_currentStatName);
|
RateStat rs = _context.statManager().getRate(_currentStatName);
|
||||||
if (rs != null) {
|
if (rs != null) {
|
||||||
@ -82,6 +87,16 @@ public class ConfigStatsHelper {
|
|||||||
else
|
else
|
||||||
_currentIsFirstInGroup = false;
|
_currentIsFirstInGroup = false;
|
||||||
_currentGroup = rs.getGroupName();
|
_currentGroup = rs.getGroupName();
|
||||||
|
long period = rs.getPeriods()[0]; // should be the minimum
|
||||||
|
if (period <= 10*60*1000) {
|
||||||
|
Rate r = rs.getRate(period);
|
||||||
|
_currentCanBeGraphed = r != null;
|
||||||
|
if (_currentCanBeGraphed)
|
||||||
|
_currentIsGraphed = r.getSummaryListener() != null;
|
||||||
|
_currentGraphName = _currentStatName + "." + period;
|
||||||
|
} else {
|
||||||
|
_currentCanBeGraphed = false;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
FrequencyStat fs = _context.statManager().getFrequency(_currentStatName);
|
FrequencyStat fs = _context.statManager().getFrequency(_currentStatName);
|
||||||
if (fs != null) {
|
if (fs != null) {
|
||||||
@ -93,6 +108,7 @@ public class ConfigStatsHelper {
|
|||||||
else
|
else
|
||||||
_currentIsFirstInGroup = false;
|
_currentIsFirstInGroup = false;
|
||||||
_currentGroup = fs.getGroupName();
|
_currentGroup = fs.getGroupName();
|
||||||
|
_currentCanBeGraphed = false;
|
||||||
} else {
|
} else {
|
||||||
if (_log.shouldLog(Log.ERROR))
|
if (_log.shouldLog(Log.ERROR))
|
||||||
_log.error("Stat does not exist?! [" + _currentStatName + "]");
|
_log.error("Stat does not exist?! [" + _currentStatName + "]");
|
||||||
@ -119,7 +135,10 @@ public class ConfigStatsHelper {
|
|||||||
/** What group is the current stat in */
|
/** What group is the current stat in */
|
||||||
public String getCurrentGroupName() { return _currentGroup; }
|
public String getCurrentGroupName() { return _currentGroup; }
|
||||||
public String getCurrentStatName() { return _currentStatName; }
|
public String getCurrentStatName() { return _currentStatName; }
|
||||||
|
public String getCurrentGraphName() { return _currentGraphName; }
|
||||||
public String getCurrentStatDescription() { return _currentStatDescription; }
|
public String getCurrentStatDescription() { return _currentStatDescription; }
|
||||||
public boolean getCurrentIsLogged() { return _currentIsLogged; }
|
public boolean getCurrentIsLogged() { return _currentIsLogged; }
|
||||||
|
public boolean getCurrentIsGraphed() { return _currentIsGraphed; }
|
||||||
|
public boolean getCurrentCanBeGraphed() { return _currentCanBeGraphed; }
|
||||||
public String getExplicitFilter() { return _filter; }
|
public String getExplicitFilter() { return _filter; }
|
||||||
}
|
}
|
||||||
|
@ -55,7 +55,21 @@ public class GraphHelper {
|
|||||||
|
|
||||||
public String getImages() {
|
public String getImages() {
|
||||||
try {
|
try {
|
||||||
if (!_showEvents)
|
List listeners = StatSummarizer.instance().getListeners();
|
||||||
|
TreeSet ordered = new TreeSet(new AlphaComparator());
|
||||||
|
ordered.addAll(listeners);
|
||||||
|
|
||||||
|
// go to some trouble to see if we have the data for the combined bw graph
|
||||||
|
boolean hasTx = false;
|
||||||
|
boolean hasRx = false;
|
||||||
|
for (Iterator iter = ordered.iterator(); iter.hasNext(); ) {
|
||||||
|
SummaryListener lsnr = (SummaryListener)iter.next();
|
||||||
|
String title = lsnr.getRate().getRateStat().getName();
|
||||||
|
if (title.equals("bw.sendRate")) hasTx = true;
|
||||||
|
else if (title.equals("bw.recvRate")) hasRx = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hasTx && hasRx && !_showEvents)
|
||||||
_out.write("<img width=\""
|
_out.write("<img width=\""
|
||||||
+ (_width + 83) + "\" height=\"" + (_height + 92)
|
+ (_width + 83) + "\" height=\"" + (_height + 92)
|
||||||
+ "\" src=\"viewstat.jsp?stat=bw.combined"
|
+ "\" src=\"viewstat.jsp?stat=bw.combined"
|
||||||
@ -64,9 +78,6 @@ public class GraphHelper {
|
|||||||
+ "&height=" + (_height - 14)
|
+ "&height=" + (_height - 14)
|
||||||
+ "\" title=\"Combined bandwidth graph\" />\n");
|
+ "\" title=\"Combined bandwidth graph\" />\n");
|
||||||
|
|
||||||
List listeners = StatSummarizer.instance().getListeners();
|
|
||||||
TreeSet ordered = new TreeSet(new AlphaComparator());
|
|
||||||
ordered.addAll(listeners);
|
|
||||||
for (Iterator iter = ordered.iterator(); iter.hasNext(); ) {
|
for (Iterator iter = ordered.iterator(); iter.hasNext(); ) {
|
||||||
SummaryListener lsnr = (SummaryListener)iter.next();
|
SummaryListener lsnr = (SummaryListener)iter.next();
|
||||||
Rate r = lsnr.getRate();
|
Rate r = lsnr.getRate();
|
||||||
@ -92,6 +103,7 @@ public class GraphHelper {
|
|||||||
}
|
}
|
||||||
public String getForm() {
|
public String getForm() {
|
||||||
try {
|
try {
|
||||||
|
_out.write("<p /><a href=\"configstats.jsp\">Select Stats to Graph</a><p />");
|
||||||
_out.write("<form action=\"graphs.jsp\" method=\"GET\">");
|
_out.write("<form action=\"graphs.jsp\" method=\"GET\">");
|
||||||
_out.write("Periods: <input size=\"3\" type=\"text\" name=\"periodCount\" value=\"" + _periodCount + "\" /><br />\n");
|
_out.write("Periods: <input size=\"3\" type=\"text\" name=\"periodCount\" value=\"" + _periodCount + "\" /><br />\n");
|
||||||
_out.write("Plot averages: <input type=\"radio\" name=\"showEvents\" value=\"false\" " + (_showEvents ? "" : "checked=\"true\" ") + " /> ");
|
_out.write("Plot averages: <input type=\"radio\" name=\"showEvents\" value=\"false\" " + (_showEvents ? "" : "checked=\"true\" ") + " /> ");
|
||||||
|
@ -45,27 +45,27 @@ public class StatSummarizer implements Runnable {
|
|||||||
|
|
||||||
private static final String DEFAULT_DATABASES = "bw.sendRate.60000" +
|
private static final String DEFAULT_DATABASES = "bw.sendRate.60000" +
|
||||||
",bw.recvRate.60000" +
|
",bw.recvRate.60000" +
|
||||||
",tunnel.testSuccessTime.60000" +
|
// ",tunnel.testSuccessTime.60000" +
|
||||||
",udp.outboundActiveCount.60000" +
|
// ",udp.outboundActiveCount.60000" +
|
||||||
",udp.receivePacketSize.60000" +
|
// ",udp.receivePacketSize.60000" +
|
||||||
",udp.receivePacketSkew.60000" +
|
// ",udp.receivePacketSkew.60000" +
|
||||||
",udp.sendConfirmTime.60000" +
|
// ",udp.sendConfirmTime.60000" +
|
||||||
",udp.sendPacketSize.60000" +
|
// ",udp.sendPacketSize.60000" +
|
||||||
",router.activePeers.60000" +
|
",router.activePeers.60000";
|
||||||
",router.activeSendPeers.60000" +
|
// ",router.activeSendPeers.60000" +
|
||||||
",tunnel.acceptLoad.60000" +
|
// ",tunnel.acceptLoad.60000" +
|
||||||
",tunnel.dropLoadProactive.60000" +
|
// ",tunnel.dropLoadProactive.60000" +
|
||||||
",tunnel.buildExploratorySuccess.60000" +
|
// ",tunnel.buildExploratorySuccess.60000" +
|
||||||
",tunnel.buildExploratoryReject.60000" +
|
// ",tunnel.buildExploratoryReject.60000" +
|
||||||
",tunnel.buildExploratoryExpire.60000" +
|
// ",tunnel.buildExploratoryExpire.60000" +
|
||||||
",client.sendAckTime.60000" +
|
// ",client.sendAckTime.60000" +
|
||||||
",client.dispatchNoACK.60000" +
|
// ",client.dispatchNoACK.60000" +
|
||||||
",ntcp.sendTime.60000" +
|
// ",ntcp.sendTime.60000" +
|
||||||
",ntcp.transmitTime.60000" +
|
// ",ntcp.transmitTime.60000" +
|
||||||
",ntcp.sendBacklogTime.60000" +
|
// ",ntcp.sendBacklogTime.60000" +
|
||||||
",ntcp.receiveTime.60000" +
|
// ",ntcp.receiveTime.60000" +
|
||||||
",transport.sendMessageFailureLifetime.60000" +
|
// ",transport.sendMessageFailureLifetime.60000" +
|
||||||
",transport.sendProcessingTime.60000";
|
// ",transport.sendProcessingTime.60000";
|
||||||
|
|
||||||
private String adjustDatabases(String oldSpecs) {
|
private String adjustDatabases(String oldSpecs) {
|
||||||
String spec = _context.getProperty("stat.summaries", DEFAULT_DATABASES);
|
String spec = _context.getProperty("stat.summaries", DEFAULT_DATABASES);
|
||||||
|
@ -184,7 +184,9 @@ class SummaryRenderer {
|
|||||||
RrdGraphDef def = new RrdGraphDef();
|
RrdGraphDef def = new RrdGraphDef();
|
||||||
def.setTimePeriod(start/1000, 0);
|
def.setTimePeriod(start/1000, 0);
|
||||||
String name = _listener.getRate().getRateStat().getName();
|
String name = _listener.getRate().getRateStat().getName();
|
||||||
if ((name.startsWith("bw.") || name.endsWith("PacketSize")) && !showEvents)
|
// heuristic to set K=1024
|
||||||
|
if ((name.startsWith("bw.") || name.indexOf("Size") >= 0 || name.indexOf("Bps") >= 0)
|
||||||
|
&& !showEvents)
|
||||||
def.setBaseValue(1024);
|
def.setBaseValue(1024);
|
||||||
String title = name;
|
String title = name;
|
||||||
if (showEvents)
|
if (showEvents)
|
||||||
|
@ -78,22 +78,26 @@ function toggleAll(category)
|
|||||||
<table>
|
<table>
|
||||||
<% while (statshelper.hasMoreStats()) {
|
<% while (statshelper.hasMoreStats()) {
|
||||||
while (statshelper.groupRequired()) { %>
|
while (statshelper.groupRequired()) { %>
|
||||||
<tr><td valign="top" align="left" colspan="2">
|
<tr><td valign="top" align="left" colspan="3">
|
||||||
<b><%=statshelper.getCurrentGroupName()%></b>
|
<b><%=statshelper.getCurrentGroupName()%></b>
|
||||||
(<a href="javascript: void(null);" onclick="toggleAll('<%=statshelper.getCurrentGroupName()%>')">toggle all</a>)
|
(<a href="javascript: void(null);" onclick="toggleAll('<%=statshelper.getCurrentGroupName()%>')">toggle all</a>)
|
||||||
</td></tr><%
|
</td></tr><tr><td>Log</td><td>Graph</td><td></td></tr><%
|
||||||
} // end iterating over required groups for the current stat %>
|
} // end iterating over required groups for the current stat %>
|
||||||
<tr><td valign="top" align="left">
|
<tr><td valign="top" align="left">
|
||||||
<input id="<%=statshelper.getCurrentGroupName()%>" type="checkbox" name="statList" value="<%=statshelper.getCurrentStatName()%>" <%
|
<input id="<%=statshelper.getCurrentGroupName()%>" type="checkbox" name="statList" value="<%=statshelper.getCurrentStatName()%>" <%
|
||||||
if (statshelper.getCurrentIsLogged()) { %>checked="true" <% } %>/></td>
|
if (statshelper.getCurrentIsLogged()) { %>checked="true" <% } %>/></td>
|
||||||
|
<td valign="top" align="left">
|
||||||
|
<% if (statshelper.getCurrentCanBeGraphed()) { %>
|
||||||
|
<input id="<%=statshelper.getCurrentGroupName()%>" type="checkbox" name="graphList" value="<%=statshelper.getCurrentGraphName()%>" <%
|
||||||
|
if (statshelper.getCurrentIsGraphed()) { %>checked="true" <% } %>/><% } %></td>
|
||||||
<td valign="top" align="left"><b><%=statshelper.getCurrentStatName()%>:</b><br />
|
<td valign="top" align="left"><b><%=statshelper.getCurrentStatName()%>:</b><br />
|
||||||
<%=statshelper.getCurrentStatDescription()%></td></tr><%
|
<%=statshelper.getCurrentStatDescription()%></td></tr><%
|
||||||
} // end iterating over all stats %>
|
} // end iterating over all stats %>
|
||||||
<tr><td colspan="2"><hr /></td></tr>
|
<tr><td colspan="3"><hr /></td></tr>
|
||||||
<tr><td><input type="checkbox" name="explicitFilter" /></td>
|
<tr><td><input type="checkbox" name="explicitFilter" /></td>
|
||||||
<td>Advanced filter:
|
<td colspan="2">Advanced filter:
|
||||||
<input type="text" name="explicitFilterValue" value="<%=statshelper.getExplicitFilter()%>" size="40" /></td></tr>
|
<input type="text" name="explicitFilterValue" value="<%=statshelper.getExplicitFilter()%>" size="40" /></td></tr>
|
||||||
<tr><td colspan="2"><hr /></td></tr>
|
<tr><td colspan="3"><hr /></td></tr>
|
||||||
<tr><td><input type="submit" name="shouldsave" value="Save changes" /> </td>
|
<tr><td><input type="submit" name="shouldsave" value="Save changes" /> </td>
|
||||||
<td><input type="reset" value="Cancel" /></td></tr>
|
<td><input type="reset" value="Cancel" /></td></tr>
|
||||||
</form>
|
</form>
|
||||||
@ -101,4 +105,4 @@ function toggleAll(category)
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
@ -1,4 +1,8 @@
|
|||||||
$Id: history.txt,v 1.576 2007-07-14 19:56:18 complication Exp $
|
$Id: history.txt,v 1.577 2007-07-15 13:34:33 zzz Exp $
|
||||||
|
|
||||||
|
2007-07-16 zzz
|
||||||
|
* Make selection of graphed data configurable via configstats.jsp,
|
||||||
|
remove most of the default graphs to save some memory
|
||||||
|
|
||||||
2007-07-15 zzz
|
2007-07-15 zzz
|
||||||
* Add current values to graph legends
|
* Add current values to graph legends
|
||||||
|
@ -15,9 +15,9 @@ import net.i2p.CoreVersion;
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public class RouterVersion {
|
public class RouterVersion {
|
||||||
public final static String ID = "$Revision: 1.511 $ $Date: 2007-07-14 19:56:20 $";
|
public final static String ID = "$Revision: 1.512 $ $Date: 2007-07-15 13:34:34 $";
|
||||||
public final static String VERSION = "0.6.1.28";
|
public final static String VERSION = "0.6.1.28";
|
||||||
public final static long BUILD = 14;
|
public final static long BUILD = 15;
|
||||||
public static void main(String args[]) {
|
public static void main(String args[]) {
|
||||||
System.out.println("I2P Router version: " + VERSION + "-" + BUILD);
|
System.out.println("I2P Router version: " + VERSION + "-" + BUILD);
|
||||||
System.out.println("Router ID: " + RouterVersion.ID);
|
System.out.println("Router ID: " + RouterVersion.ID);
|
||||||
|
Reference in New Issue
Block a user