diff --git a/core/java/src/net/i2p/stat/Frequency.java b/core/java/src/net/i2p/stat/Frequency.java index 50536fa4fd14089171ced8d5451b659cb1e9542a..721578ce6e1fc3944780f7ef0440dc064c86c767 100644 --- a/core/java/src/net/i2p/stat/Frequency.java +++ b/core/java/src/net/i2p/stat/Frequency.java @@ -150,4 +150,16 @@ public class Frequency { private final static long now() { return System.currentTimeMillis(); } + + /** + * Appends the data of this frequency to the specified StringBuilder + * @param dest to append data to + * @since 0.9.23 + */ + synchronized void store(StringBuilder dest) { + dest.append("avgInterval:").append(_avgInterval).append(','); + dest.append("minAverageInterval").append(_minAverageInterval).append(','); + dest.append("lastEvent").append(_lastEvent).append(","); + dest.append("count").append(_count); + } } diff --git a/core/java/src/net/i2p/stat/FrequencyStat.java b/core/java/src/net/i2p/stat/FrequencyStat.java index d18a469dbd3c921a640cf7e06d3141db968747be..c2c49d6fbe0999c6e5480d5614b5d842f1ef8fcc 100644 --- a/core/java/src/net/i2p/stat/FrequencyStat.java +++ b/core/java/src/net/i2p/stat/FrequencyStat.java @@ -1,5 +1,10 @@ package net.i2p.stat; +import java.io.IOException; +import java.io.OutputStream; + +import net.i2p.data.DataHelper; + /** coordinate an event frequency over various periods */ public class FrequencyStat { /** unique name of the statistic */ @@ -92,5 +97,34 @@ public class FrequencyStat { if ((obj == null) || !(obj instanceof FrequencyStat)) return false; return _statName.equals(((FrequencyStat)obj)._statName); } + + private final static String NL = System.getProperty("line.separator"); + + /** + * Serializes this FrequencyStat to the provided OutputStream + * @param out to write to + * @param prefix to prepend to the stat + * @throws IOException if something goes wrong + * @since 0.9.23 + */ + public void store(OutputStream out, String prefix) throws IOException { + StringBuilder buf = new StringBuilder(1024); + buf.append(NL); + buf.append("################################################################################").append(NL); + buf.append("# Frequency: ").append(_groupName).append(": ").append(_statName).append(NL); + buf.append("# ").append(_description).append(NL); + buf.append("# ").append(NL).append(NL); + out.write(buf.toString().getBytes("UTF-8")); + buf.setLength(0); + for (Frequency r: _frequencies){ + buf.append("#######").append(NL); + buf.append("# Period : ").append(DataHelper.formatDuration(r.getPeriod())).append(" for rate ") + .append(_groupName).append(" - ").append(_statName).append(NL); + buf.append(NL); + r.store(buf); + out.write(buf.toString().getBytes("UTF-8")); + buf.setLength(0); + } + } } diff --git a/core/java/src/net/i2p/stat/StatManager.java b/core/java/src/net/i2p/stat/StatManager.java index f0f59a1b911675f4a1e78a4acfd8d10f7b3c9ce9..7f6d9859b6aef0ff5a8825c87ebdcff93574e883 100644 --- a/core/java/src/net/i2p/stat/StatManager.java +++ b/core/java/src/net/i2p/stat/StatManager.java @@ -1,5 +1,7 @@ package net.i2p.stat; +import java.io.IOException; +import java.io.OutputStream; import java.text.Collator; import java.util.HashMap; import java.util.HashSet; @@ -247,4 +249,18 @@ public class StatManager { public boolean ignoreStat(String statName) { return _context.isRouterContext() && !_context.getBooleanProperty(PROP_STAT_FULL); } + + /** + * Serializes all Frequencies and Rates to the provided OutputStream + * @param out to write to + * @param prefix to use when serializing + * @throws IOException if something goes wrong + * @since 0.9.23 + */ + public void store(OutputStream out, String prefix) throws IOException { + for (FrequencyStat fs : _frequencyStats.values()) + fs.store(out, prefix); + for (RateStat rs : _rateStats.values()) + rs.store(out,prefix); + } }