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 */ private final String _statName; /** grouping under which the stat is kept */ private final String _groupName; /** describe the stat */ private final String _description; /** actual frequency objects for this statistic */ private final Frequency _frequencies[]; public FrequencyStat(String name, String description, String group, long periods[]) { _statName = name; _description = description; _groupName = group; _frequencies = new Frequency[periods.length]; for (int i = 0; i < periods.length; i++) _frequencies[i] = new Frequency(periods[i]); } /** update all of the frequencies for the various periods */ public void eventOccurred() { for (int i = 0; i < _frequencies.length; i++) _frequencies[i].eventOccurred(); } /** * coalesce all the stats */ public void coalesceStats() { for (int i = 0; i < _frequencies.length; i++) _frequencies[i].recalculate(); } public String getName() { return _statName; } public String getGroupName() { return _groupName; } public String getDescription() { return _description; } public long[] getPeriods() { long rv[] = new long[_frequencies.length]; for (int i = 0; i < _frequencies.length; i++) rv[i] = _frequencies[i].getPeriod(); return rv; } public Frequency getFrequency(long period) { for (int i = 0; i < _frequencies.length; i++) { if (_frequencies[i].getPeriod() == period) return _frequencies[i]; } return null; } /** * @return lifetime event count * @since 0.8.2 */ public long getEventCount() { if ( (_frequencies == null) || (_frequencies.length <= 0) ) return 0; return _frequencies[0].getEventCount(); } /** * @return lifetime average frequency in millisedonds, i.e. the average time between events, or Long.MAX_VALUE if no events ever * @since 0.8.2 */ public long getFrequency() { if ( (_frequencies == null) || (_frequencies.length <= 0) ) return Long.MAX_VALUE; double d = _frequencies[0].getStrictAverageInterval(); if (d > _frequencies[0].getPeriod()) return Long.MAX_VALUE; return Math.round(d); } @Override public int hashCode() { return _statName.hashCode(); } /** @since 0.8.2 */ @Override public boolean equals(Object obj) { 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); } } }