diff --git a/router/java/src/net/i2p/router/admin/StatsGenerator.java b/router/java/src/net/i2p/router/admin/StatsGenerator.java
index 6c718ff15..cdd8fbbde 100644
--- a/router/java/src/net/i2p/router/admin/StatsGenerator.java
+++ b/router/java/src/net/i2p/router/admin/StatsGenerator.java
@@ -29,183 +29,180 @@ public class StatsGenerator {
_log = context.logManager().getLog(StatsGenerator.class);
}
- public String generateStatsPage() {
- ByteArrayOutputStream baos = new ByteArrayOutputStream(32*1024);
- try {
- generateStatsPage(baos);
- } catch (IOException ioe) {
- _log.error("Error generating stats", ioe);
- }
- return new String(baos.toByteArray());
- }
-
public void generateStatsPage(OutputStream out) throws IOException {
- PrintWriter pw = new PrintWriter(out);
- pw.println("
I2P Router Stats");
- pw.println("Router statistics
");
- pw.println("console | stats
");
+ StringBuffer buf = new StringBuffer(16*1024);
+ buf.append("I2P Router Stats");
+ buf.append("Router statistics
");
+ buf.append("console | stats
");
+ buf.append("");
- pw.print("Statistics gathered during this router's uptime (");
+ buf.append("Statistics gathered during this router's uptime (");
long uptime = _context.router().getUptime();
- pw.print(DataHelper.formatDuration(uptime));
- pw.println("). The data gathered is quantized over a 1 minute period, so should just be used as an estimate");
+ buf.append(DataHelper.formatDuration(uptime));
+ buf.append("). The data gathered is quantized over a 1 minute period, so should just be used as an estimate");
+
+ out.write(buf.toString().getBytes());
+ buf.setLength(0);
for (Iterator iter = groups.keySet().iterator(); iter.hasNext(); ) {
String group = (String)iter.next();
Set stats = (Set)groups.get(group);
- pw.print("");
- pw.println("");
+ buf.append("");
+ buf.append("");
+ out.write(buf.toString().getBytes());
+ buf.setLength(0);
for (Iterator statIter = stats.iterator(); statIter.hasNext(); ) {
String stat = (String)statIter.next();
- pw.print("- ");
- pw.print(stat);
- pw.println("
");
+ buf.append(" - ");
+ buf.append(stat);
+ buf.append("
");
if (_context.statManager().isFrequency(stat))
- renderFrequency(stat, pw);
+ renderFrequency(stat, buf);
else
- renderRate(stat, pw);
+ renderRate(stat, buf);
+ out.write(buf.toString().getBytes());
+ buf.setLength(0);
}
- pw.println("
");
+ out.write("
".getBytes());
}
- pw.println("");
- pw.flush();
+ out.write("".getBytes());
}
- private void renderFrequency(String name, PrintWriter pw) throws IOException {
+ private void renderFrequency(String name, StringBuffer buf) {
FrequencyStat freq = _context.statManager().getFrequency(name);
- pw.print("");
- pw.print(freq.getDescription());
- pw.println("
");
+ buf.append("");
+ buf.append(freq.getDescription());
+ buf.append("
");
long periods[] = freq.getPeriods();
Arrays.sort(periods);
for (int i = 0; i < periods.length; i++) {
- renderPeriod(pw, periods[i], "frequency");
+ renderPeriod(buf, periods[i], "frequency");
Frequency curFreq = freq.getFrequency(periods[i]);
- pw.print(" avg per period: (");
- pw.print(num(curFreq.getAverageEventsPerPeriod()));
- pw.print(", max ");
- pw.print(num(curFreq.getMaxAverageEventsPerPeriod()));
+ buf.append(" avg per period: (");
+ buf.append(num(curFreq.getAverageEventsPerPeriod()));
+ buf.append(", max ");
+ buf.append(num(curFreq.getMaxAverageEventsPerPeriod()));
if ( (curFreq.getMaxAverageEventsPerPeriod() > 0) && (curFreq.getAverageEventsPerPeriod() > 0) ) {
- pw.print(", current is ");
- pw.print(pct(curFreq.getAverageEventsPerPeriod()/curFreq.getMaxAverageEventsPerPeriod()));
- pw.print(" of max");
+ buf.append(", current is ");
+ buf.append(pct(curFreq.getAverageEventsPerPeriod()/curFreq.getMaxAverageEventsPerPeriod()));
+ buf.append(" of max");
}
- pw.print(")");
+ buf.append(")");
//buf.append(" avg interval between updates: (").append(num(curFreq.getAverageInterval())).append("ms, min ");
//buf.append(num(curFreq.getMinAverageInterval())).append("ms)");
- pw.print(" strict average per period: ");
- pw.print(num(curFreq.getStrictAverageEventsPerPeriod()));
- pw.print(" events (averaged ");
- pw.print(" using the lifetime of ");
- pw.print(num(curFreq.getEventCount()));
- pw.print(" events)");
- pw.println("
");
+ buf.append(" strict average per period: ");
+ buf.append(num(curFreq.getStrictAverageEventsPerPeriod()));
+ buf.append(" events (averaged ");
+ buf.append(" using the lifetime of ");
+ buf.append(num(curFreq.getEventCount()));
+ buf.append(" events)");
+ buf.append("
");
}
- pw.println("
");
+ buf.append("
");
}
- private void renderRate(String name, PrintWriter pw) throws IOException {
+ private void renderRate(String name, StringBuffer buf) {
RateStat rate = _context.statManager().getRate(name);
- pw.print("");
- pw.print(rate.getDescription());
- pw.println("
");
+ buf.append("");
+ buf.append(rate.getDescription());
+ buf.append("
");
long periods[] = rate.getPeriods();
Arrays.sort(periods);
- pw.println("");
+ buf.append("");
for (int i = 0; i < periods.length; i++) {
- pw.println("- ");
- renderPeriod(pw, periods[i], "rate");
+ buf.append("
- ");
+ renderPeriod(buf, periods[i], "rate");
Rate curRate = rate.getRate(periods[i]);
- pw.print( "avg value: (");
- pw.print(num(curRate.getAverageValue()));
- pw.print(" peak ");
- pw.print(num(curRate.getExtremeAverageValue()));
- pw.print(", [");
- pw.print(pct(curRate.getPercentageOfExtremeValue()));
- pw.print(" of max");
- pw.print(", and ");
- pw.print(pct(curRate.getPercentageOfLifetimeValue()));
- pw.print(" of lifetime average]");
+ buf.append( "avg value: (");
+ buf.append(num(curRate.getAverageValue()));
+ buf.append(" peak ");
+ buf.append(num(curRate.getExtremeAverageValue()));
+ buf.append(", [");
+ buf.append(pct(curRate.getPercentageOfExtremeValue()));
+ buf.append(" of max");
+ buf.append(", and ");
+ buf.append(pct(curRate.getPercentageOfLifetimeValue()));
+ buf.append(" of lifetime average]");
- pw.print(")");
- pw.print(" highest total period value: (");
- pw.print(num(curRate.getExtremeTotalValue()));
- pw.print(")");
+ buf.append(")");
+ buf.append(" highest total period value: (");
+ buf.append(num(curRate.getExtremeTotalValue()));
+ buf.append(")");
if (curRate.getLifetimeTotalEventTime() > 0) {
- pw.print(" saturation: (");
- pw.print(pct(curRate.getLastEventSaturation()));
- pw.print(")");
- pw.print(" saturated limit: (");
- pw.print(num(curRate.getLastSaturationLimit()));
- pw.print(")");
- pw.print(" peak saturation: (");
- pw.print(pct(curRate.getExtremeEventSaturation()));
- pw.print(")");
- pw.print(" peak saturated limit: (");
- pw.print(num(curRate.getExtremeSaturationLimit()));
- pw.print(")");
+ buf.append(" saturation: (");
+ buf.append(pct(curRate.getLastEventSaturation()));
+ buf.append(")");
+ buf.append(" saturated limit: (");
+ buf.append(num(curRate.getLastSaturationLimit()));
+ buf.append(")");
+ buf.append(" peak saturation: (");
+ buf.append(pct(curRate.getExtremeEventSaturation()));
+ buf.append(")");
+ buf.append(" peak saturated limit: (");
+ buf.append(num(curRate.getExtremeSaturationLimit()));
+ buf.append(")");
}
- pw.print(" events per period: ");
- pw.print(num(curRate.getLastEventCount()));
+ buf.append(" events per period: ");
+ buf.append(num(curRate.getLastEventCount()));
long numPeriods = curRate.getLifetimePeriods();
if (numPeriods > 0) {
double avgFrequency = curRate.getLifetimeEventCount() / (double)numPeriods;
double peakFrequency = curRate.getExtremeEventCount();
- pw.print(" (lifetime average: ");
- pw.print(num(avgFrequency));
- pw.print(", peak average: ");
- pw.print(num(curRate.getExtremeEventCount()));
- pw.println(")");
+ buf.append(" (lifetime average: ");
+ buf.append(num(avgFrequency));
+ buf.append(", peak average: ");
+ buf.append(num(curRate.getExtremeEventCount()));
+ buf.append(")");
}
- pw.print("
");
+ buf.append("");
if (i + 1 == periods.length) {
// last one, so lets display the strict average
- pw.print("- lifetime average value: ");
- pw.print(num(curRate.getLifetimeAverageValue()));
- pw.print(" over ");
- pw.print(num(curRate.getLifetimeEventCount()));
- pw.println(" events
");
+ buf.append("- lifetime average value: ");
+ buf.append(num(curRate.getLifetimeAverageValue()));
+ buf.append(" over ");
+ buf.append(num(curRate.getLifetimeEventCount()));
+ buf.append(" events
");
}
}
- pw.print("
");
- pw.println("
");
+ buf.append("
");
+ buf.append("
");
}
- private static void renderPeriod(PrintWriter pw, long period, String name) throws IOException {
- pw.print("");
- pw.print(DataHelper.formatDuration(period));
- pw.print(" ");
- pw.print(name);
- pw.print(": ");
+ private static void renderPeriod(StringBuffer buf, long period, String name) {
+ buf.append("");
+ buf.append(DataHelper.formatDuration(period));
+ buf.append(" ");
+ buf.append(name);
+ buf.append(": ");
}
private final static DecimalFormat _fmt = new DecimalFormat("###,##0.00");