use of net.i2p.stat.Rate in project i2p.i2p by i2p.
the class GraphHelper method getImages.
public String getImages() {
if (StatSummarizer.isDisabled())
return "";
try {
List<SummaryListener> listeners = StatSummarizer.instance().getListeners();
TreeSet<SummaryListener> ordered = new TreeSet<SummaryListener>(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 (SummaryListener lsnr : ordered) {
String title = lsnr.getRate().getRateStat().getName();
if (title.equals("bw.sendRate"))
hasTx = true;
else if (title.equals("bw.recvRate"))
hasRx = true;
}
boolean hideLegend = _context.getProperty(PROP_LEGEND, DEFAULT_LEGEND);
if (hasTx && hasRx && !_showEvents) {
_out.write("<a href=\"graph?stat=bw.combined" + "&c=" + (3 * _periodCount) + "&w=" + (3 * _width) + "&h=" + (3 * _height) + "\">");
String title = _t("Combined bandwidth graph");
_out.write("<img class=\"statimage\"" + " src=\"viewstat.jsp?stat=bw.combined" + "&periodCount=" + _periodCount + "&width=" + _width);
if (!hideLegend) {
// bw.combined graph has two entries in its legend
// -26 pixels equalizes its height with the other images
_out.write("&height=" + (_height - 26));
} else {
// no legend, no height difference needed
_out.write("&height=" + (_height));
}
_out.write("&hideLegend=" + hideLegend + "\" alt=\"" + title + "\" title=\"" + title + "\"></a>\n");
}
for (SummaryListener lsnr : ordered) {
Rate r = lsnr.getRate();
// e.g. "statname for 60m"
String title = _t("{0} for {1}", r.getRateStat().getName(), DataHelper.formatDuration2(_periodCount * r.getPeriod()));
_out.write("<a href=\"graph?stat=" + r.getRateStat().getName() + '.' + r.getPeriod() + "&c=" + (3 * _periodCount) + "&w=" + (3 * _width) + "&h=" + (3 * _height) + (_showEvents ? "&showEvents=1" : "") + "\">");
_out.write("<img class=\"statimage\" border=\"0\"" + " src=\"viewstat.jsp?stat=" + r.getRateStat().getName() + "&showEvents=" + _showEvents + "&period=" + r.getPeriod() + "&periodCount=" + _periodCount + "&width=" + _width + "&height=" + _height + "&hideLegend=" + hideLegend + "\" alt=\"" + title + "\" title=\"" + title + "\"></a>\n");
}
// FIXME jrobin doesn't support setting the timezone, will have to mod TimeAxis.java
// 0.9.1 - all graphs currently state UTC on them, so this text blurb is unnecessary,
// _out.write("<p><i>" + _t("All times are UTC.") + "</i></p>\n");
} catch (IOException ioe) {
ioe.printStackTrace();
}
return "";
}
use of net.i2p.stat.Rate in project i2p.i2p by i2p.
the class ProfileOrganizerRenderer method avg.
private String avg(PeerProfile prof, long rate, RateAverages ra) {
RateStat rs = prof.getDbResponseTime();
if (rs == null)
return _t(NA);
Rate r = rs.getRate(rate);
if (r == null)
return _t(NA);
r.computeAverages(ra, false);
if (ra.getTotalEventCount() == 0)
return _t(NA);
return DataHelper.formatDuration2(Math.round(ra.getAverage()));
}
use of net.i2p.stat.Rate in project i2p.i2p by i2p.
the class ProfileOrganizerRenderer method renderStatusHTML.
/**
* @param mode 0 = high cap; 1 = all; 2 = floodfill
*/
public void renderStatusHTML(Writer out, int mode) throws IOException {
boolean full = mode == 1;
Set<Hash> peers = _organizer.selectAllPeers();
long now = _context.clock().now();
long hideBefore = now - 90 * 60 * 1000;
Set<PeerProfile> order = new TreeSet<PeerProfile>(mode == 2 ? new HashComparator() : new ProfileComparator());
int older = 0;
int standard = 0;
for (Hash peer : peers) {
if (_organizer.getUs().equals(peer))
continue;
PeerProfile prof = _organizer.getProfileNonblocking(peer);
if (prof == null)
continue;
if (mode == 2) {
RouterInfo info = _context.netDb().lookupRouterInfoLocally(peer);
if (info != null && info.getCapabilities().indexOf('f') >= 0)
order.add(prof);
continue;
}
if (prof.getLastSendSuccessful() <= hideBefore) {
older++;
continue;
}
if ((!full) && !_organizer.isHighCapacity(peer)) {
standard++;
continue;
}
order.add(prof);
}
int fast = 0;
int reliable = 0;
int integrated = 0;
StringBuilder buf = new StringBuilder(16 * 1024);
// //
if (mode < 2) {
// buf.append("<h2>").append(_t("Peer Profiles")).append("</h2>\n<p>");
buf.append("<p id=\"profiles_overview\" class=\"infohelp\">");
buf.append(ngettext("Showing 1 recent profile.", "Showing {0} recent profiles.", order.size())).append('\n');
if (older > 0)
buf.append(ngettext("Hiding 1 older profile.", "Hiding {0} older profiles.", older)).append('\n');
if (standard > 0)
buf.append("<a href=\"/profiles?f=1\">").append(ngettext("Hiding 1 standard profile.", "Hiding {0} standard profiles.", standard)).append("</a>\n");
buf.append("</p>");
buf.append("<div class=\"widescroll\"><table id=\"profilelist\">");
buf.append("<tr>");
buf.append("<th>").append(_t("Peer")).append("</th>");
buf.append("<th>").append(_t("Groups")).append("</th>");
buf.append("<th>").append(_t("Caps")).append("</th>");
buf.append("<th>").append(_t("Version")).append("</th>");
buf.append("<th>").append(_t("Speed")).append("</th>");
buf.append("<th>").append(_t("Capacity")).append("</th>");
buf.append("<th>").append(_t("Integration")).append("</th>");
buf.append("<th>").append(_t("Status")).append("</th>");
buf.append("<th>").append(_t("View/Edit")).append("</th>");
buf.append("</tr>");
int prevTier = 1;
for (PeerProfile prof : order) {
Hash peer = prof.getPeer();
int tier = 0;
boolean isIntegrated = false;
if (_organizer.isFast(peer)) {
tier = 1;
fast++;
reliable++;
} else if (_organizer.isHighCapacity(peer)) {
tier = 2;
reliable++;
} else if (_organizer.isFailing(peer)) {
} else {
tier = 3;
}
if (_organizer.isWellIntegrated(peer)) {
isIntegrated = true;
integrated++;
}
if (tier != prevTier)
buf.append("<tr><td colspan=\"9\"><hr></td></tr>\n");
prevTier = tier;
buf.append("<tr><td align=\"center\" nowrap>");
buf.append(_context.commSystem().renderPeerHTML(peer));
// debug
// if(prof.getIsExpandedDB())
// buf.append(" ** ");
buf.append("</td><td align=\"center\">");
switch(tier) {
case 1:
buf.append(_t("Fast, High Capacity"));
break;
case 2:
buf.append(_t("High Capacity"));
break;
case 3:
buf.append(_t("Standard"));
break;
default:
buf.append(_t("Failing"));
break;
}
if (isIntegrated)
buf.append(", ").append(_t("Integrated"));
RouterInfo info = _context.netDb().lookupRouterInfoLocally(peer);
if (info != null) {
// prevent HTML injection in the caps and version
buf.append("<td align=\"right\">").append(DataHelper.stripHTML(info.getCapabilities()));
} else {
buf.append("<td align=\"right\"><i>").append(_t("unknown")).append("</i></td>");
}
buf.append("<td align=\"right\">");
String v = info != null ? info.getOption("router.version") : null;
if (v != null)
buf.append(DataHelper.stripHTML(v));
buf.append("</td><td align=\"right\">").append(num(prof.getSpeedValue()));
long bonus = prof.getSpeedBonus();
if (bonus != 0) {
if (bonus > 0)
buf.append(" (+");
else
buf.append(" (");
buf.append(bonus).append(')');
}
buf.append("</td><td align=\"right\">").append(num(prof.getCapacityValue()));
bonus = prof.getCapacityBonus();
if (bonus != 0) {
if (bonus > 0)
buf.append(" (+");
else
buf.append(" (");
buf.append(bonus).append(')');
}
buf.append("</td><td align=\"right\">").append(num(prof.getIntegrationValue()));
buf.append("</td><td align=\"center\">");
boolean ok = true;
if (_context.banlist().isBanlisted(peer)) {
buf.append(_t("Banned"));
ok = false;
}
if (prof.getIsFailing()) {
buf.append(' ').append(_t("Failing"));
ok = false;
}
if (_context.commSystem().wasUnreachable(peer)) {
buf.append(' ').append(_t("Unreachable"));
ok = false;
}
RateAverages ra = RateAverages.getTemp();
Rate failed = prof.getTunnelHistory().getFailedRate().getRate(30 * 60 * 1000);
long fails = failed.computeAverages(ra, false).getTotalEventCount();
if (ok && fails == 0) {
buf.append(_t("OK"));
} else if (fails > 0) {
Rate accepted = prof.getTunnelCreateResponseTime().getRate(30 * 60 * 1000);
long total = fails + accepted.computeAverages(ra, false).getTotalEventCount();
if (// hide if < 10%
total / fails <= 10)
buf.append(' ').append(fails).append('/').append(total).append(' ').append(_t("Test Fails"));
}
buf.append(" </td>");
// buf.append("<td nowrap align=\"center\"><a target=\"_blank\" href=\"dumpprofile.jsp?peer=")
// .append(peer.toBase64().substring(0,6)).append("\">").append(_t("profile")).append("</a>");
buf.append("<td nowrap align=\"center\"><a href=\"viewprofile?peer=").append(peer.toBase64()).append("\">").append(_t("profile")).append("</a>");
buf.append(" <a title=\"").append(_t("Configure peer")).append("\" href=\"configpeer?peer=").append(peer.toBase64()).append("\">+-</a></td>\n");
buf.append("</tr>");
// let's not build the whole page in memory (~500 bytes per peer)
out.write(buf.toString());
buf.setLength(0);
}
buf.append("</table></div>");
// //
// // don't bother reindenting
// //
} else {
// buf.append("<h2><a name=\"flood\"></a>").append(_t("Floodfill and Integrated Peers"))
// .append(" (").append(integratedPeers.size()).append(")</h2>\n");
buf.append("<div class=\"widescroll\"><table id=\"floodfills\">");
buf.append("<tr class=\"smallhead\">");
buf.append("<th>").append(_t("Peer")).append("</th>");
buf.append("<th>").append(_t("Caps")).append("</th>");
buf.append("<th>").append(_t("Integ. Value")).append("</th>");
buf.append("<th>").append(_t("Last Heard About")).append("</th>");
buf.append("<th>").append(_t("Last Heard From")).append("</th>");
buf.append("<th>").append(_t("Last Good Send")).append("</th>");
buf.append("<th>").append(_t("Last Bad Send")).append("</th>");
buf.append("<th>").append(_t("10m Resp. Time")).append("</th>");
buf.append("<th>").append(_t("1h Resp. Time")).append("</th>");
buf.append("<th>").append(_t("1d Resp. Time")).append("</th>");
buf.append("<th>").append(_t("Last Good Lookup")).append("</th>");
buf.append("<th>").append(_t("Last Bad Lookup")).append("</th>");
buf.append("<th>").append(_t("Last Good Store")).append("</th>");
buf.append("<th>").append(_t("Last Bad Store")).append("</th>");
buf.append("<th>").append(_t("1h Fail Rate")).append("</th>");
buf.append("<th>").append(_t("1d Fail Rate")).append("</th>");
buf.append("</tr>");
RateAverages ra = RateAverages.getTemp();
for (PeerProfile prof : order) {
Hash peer = prof.getPeer();
buf.append("<tr><td align=\"center\" nowrap>");
buf.append(_context.commSystem().renderPeerHTML(peer));
buf.append("</td>");
RouterInfo info = _context.netDb().lookupRouterInfoLocally(peer);
if (info != null)
buf.append("<td align=\"center\">").append(DataHelper.stripHTML(info.getCapabilities())).append("</td>");
else
buf.append("<td> </td>");
buf.append("<td align=\"right\">").append(num(prof.getIntegrationValue())).append("</td>");
buf.append("<td align=\"right\">").append(formatInterval(now, prof.getLastHeardAbout())).append("</td>");
buf.append("<td align=\"right\">").append(formatInterval(now, prof.getLastHeardFrom())).append("</td>");
buf.append("<td align=\"right\">").append(formatInterval(now, prof.getLastSendSuccessful())).append("</td>");
buf.append("<td align=\"right\">").append(formatInterval(now, prof.getLastSendFailed())).append("</td>");
buf.append("<td align=\"right\">").append(avg(prof, 10 * 60 * 1000l, ra)).append("</td>");
buf.append("<td align=\"right\">").append(avg(prof, 60 * 60 * 1000l, ra)).append("</td>");
buf.append("<td align=\"right\">").append(avg(prof, 24 * 60 * 60 * 1000l, ra)).append("</td>");
DBHistory dbh = prof.getDBHistory();
if (dbh != null) {
buf.append("<td align=\"right\">").append(formatInterval(now, dbh.getLastLookupSuccessful())).append("</td>");
buf.append("<td align=\"right\">").append(formatInterval(now, dbh.getLastLookupFailed())).append("</td>");
buf.append("<td align=\"right\">").append(formatInterval(now, dbh.getLastStoreSuccessful())).append("</td>");
buf.append("<td align=\"right\">").append(formatInterval(now, dbh.getLastStoreFailed())).append("</td>");
buf.append("<td align=\"right\">").append(davg(dbh, 60 * 60 * 1000l, ra)).append("</td>");
buf.append("<td align=\"right\">").append(davg(dbh, 24 * 60 * 60 * 1000l, ra)).append("</td>");
} else {
for (int i = 0; i < 6; i++) buf.append("<td align=\"right\">").append(_t(NA));
}
buf.append("</tr>\n");
}
buf.append("</table></div>");
// //
// // don't bother reindenting
// //
}
if (mode < 2) {
buf.append("<h3 class=\"tabletitle\">").append(_t("Thresholds")).append("</h3>\n").append("<table id=\"thresholds\"><tbody>").append("<tr><th><b>").append(_t("Speed")).append(": </b>").append(num(_organizer.getSpeedThreshold())).append("</th><th><b>").append(_t("Capacity")).append(": </b>").append(num(_organizer.getCapacityThreshold())).append("</th><th><b>").append(_t("Integration")).append(": </b>").append(num(_organizer.getIntegrationThreshold())).append("</th></tr><tr><td>").append(fast).append(' ').append(_t("fast peers")).append("</td><td>").append(reliable).append(' ').append(_t("high capacity peers")).append("</td><td>").append(integrated).append(' ').append(_t(" well integrated peers")).append("</td></tr></tbody></table>\n");
buf.append("<h3 class=\"tabletitle\">").append(_t("Definitions")).append("</h3>\n").append("<table id=\"profile_defs\"><tbody>");
buf.append("<tr><td><b>").append(_t("groups")).append(":</b></td><td>").append(_t("as determined by the profile organizer")).append("</td></tr>");
buf.append("<tr><td><b>").append(_t("caps")).append(":</b></td><td>").append(_t("capabilities in the netDb, not used to determine profiles")).append("</td></tr>");
buf.append("<tr id=\"capabilities_key\"><td colspan=\"2\"><table><tbody>");
buf.append("<tr><td> </td>").append("<td><b>B</b></td><td>").append(_t("SSU Testing")).append("</td>").append("<td><b>C</b></td><td>").append(_t("SSU Introducer")).append("</td>").append("<td> </td></tr>");
buf.append("<tr><td> </td>").append("<td><b>f</b></td><td>").append(_t("Floodfill")).append("</td>").append("<td><b>H</b></td><td>").append(_t("Hidden")).append("</td>").append("<td> </td></tr>");
buf.append("<tr><td> </td>").append("<td><b>K</b></td><td>").append(_t("Under {0} shared bandwidth", Router.MIN_BW_L + " KBps")).append("</td>").append("<td><b>L</b></td><td>").append(_t("{0} shared bandwidth", range(Router.MIN_BW_L, Router.MIN_BW_M))).append("</td>").append("<td> </td></tr>");
buf.append("<tr><td> </td>").append("<td><b>M</b></td><td>").append(_t("{0} shared bandwidth", range(Router.MIN_BW_M, Router.MIN_BW_N))).append("</td>").append("<td><b>N</b></td><td>").append(_t("{0} shared bandwidth", range(Router.MIN_BW_N, Router.MIN_BW_O))).append("</td>").append("<td> </td></tr>");
buf.append("<tr><td> </td>").append("<td><b>O</b></td><td>").append(_t("{0} shared bandwidth", range(Router.MIN_BW_O, Router.MIN_BW_P))).append("</td>").append("<td><b>P</b></td><td>").append(_t("{0} shared bandwidth", range(Router.MIN_BW_P, Router.MIN_BW_X))).append("</td>").append("<td> </td></tr>");
buf.append("<tr><td> </td>").append("<td><b>R</b></td><td>").append(_t("Reachable")).append("</td>").append("<td><b>U</b></td><td>").append(_t("Unreachable")).append("</td>").append("<td> </td></tr>");
buf.append("<tr><td> </td>").append("<td><b>X</b></td><td>").append(_t("Over {0} shared bandwidth", Math.round(Router.MIN_BW_X * 1.024f) + " KBps")).append("</td>").append("<td> </td><td> </td><td> </td></tr>");
buf.append("<tr><td> </td><td colspan=\"5\">").append(_t("Note: For P and X bandwidth tiers, O is included for the purpose of backward compatibility in the NetDB.")).append("</tr>");
// profile_defs
buf.append("</tbody></table></td></tr>");
buf.append("<tr><td><b>").append(_t("speed")).append(":</b></td><td>").append(_t("peak throughput (bytes per second) over a 1 minute period that the peer has sustained in a single tunnel")).append("</td></tr>");
buf.append("<tr><td><b>").append(_t("capacity")).append(":</b></td><td>").append(_t("how many tunnels can we ask them to join in an hour?")).append("</td></tr>");
buf.append("<tr><td><b>").append(_t("integration")).append(":</b></td><td>").append(_t("how many new peers have they told us about lately?")).append("</td></tr>");
buf.append("<tr><td><b>").append(_t("status")).append(":</b></td><td>").append(_t("is the peer banned, or unreachable, or failing tunnel tests?")).append("</td></tr>");
// thresholds
buf.append("</tbody></table>\n");
// //
// // don't bother reindenting
// //
}
// mode < 2
out.write(buf.toString());
out.flush();
}
use of net.i2p.stat.Rate in project i2p.i2p by i2p.
the class SummaryHelper method getJobLag.
/**
* How lagged our job queue is over the last minute (pretty printed with
* the units attached)
*/
public String getJobLag() {
if (_context == null)
return "0";
RateStat rs = _context.statManager().getRate("jobQueue.jobLag");
if (rs == null)
return "0";
Rate lagRate = rs.getRate(60 * 1000);
return DataHelper.formatDuration2((long) lagRate.getAverageValue());
}
use of net.i2p.stat.Rate in project i2p.i2p by i2p.
the class StatSummarizer method adjustDatabases.
// ",router.activeSendPeers.60000" +
// ",tunnel.acceptLoad.60000" +
// ",tunnel.dropLoadProactive.60000" +
// ",tunnel.buildExploratorySuccess.60000" +
// ",tunnel.buildExploratoryReject.60000" +
// ",tunnel.buildExploratoryExpire.60000" +
// ",client.sendAckTime.60000" +
// ",client.dispatchNoACK.60000" +
// ",ntcp.sendTime.60000" +
// ",ntcp.transmitTime.60000" +
// ",ntcp.sendBacklogTime.60000" +
// ",ntcp.receiveTime.60000" +
// ",transport.sendMessageFailureLifetime.60000" +
// ",transport.sendProcessingTime.60000";
private String adjustDatabases(String oldSpecs) {
String spec = _context.getProperty("stat.summaries", DEFAULT_DATABASES);
if (((spec == null) && (oldSpecs == null)) || ((spec != null) && (oldSpecs != null) && (oldSpecs.equals(spec))))
return oldSpecs;
Set<Rate> old = parseSpecs(oldSpecs);
Set<Rate> newSpecs = parseSpecs(spec);
// remove old ones
for (Rate r : old) {
if (!newSpecs.contains(r))
removeDb(r);
}
// add new ones
StringBuilder buf = new StringBuilder();
boolean comma = false;
for (Rate r : newSpecs) {
if (!old.contains(r))
addDb(r);
if (comma)
buf.append(',');
else
comma = true;
buf.append(r.getRateStat().getName()).append(".").append(r.getPeriod());
}
return buf.toString();
}
Aggregations