diff --git a/apps/routerconsole/java/src/net/i2p/router/web/helpers/ConfigStatsHandler.java b/apps/routerconsole/java/src/net/i2p/router/web/helpers/ConfigStatsHandler.java index a77ea07d4..769a659c6 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/helpers/ConfigStatsHandler.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/helpers/ConfigStatsHandler.java @@ -15,18 +15,12 @@ import net.i2p.stat.StatManager; * */ public class ConfigStatsHandler extends FormHandler { - private String _filename; - private List _stats; private String _graphs; - private boolean _explicitFilter; - private String _explicitFilterValue; private boolean _isFull; public ConfigStatsHandler() { super(); - _stats = new ArrayList(); _graphs = ""; - _explicitFilter = false; _isFull = false; } @@ -36,20 +30,6 @@ public class ConfigStatsHandler extends FormHandler { saveChanges(); } } - - public void setFilename(String filename) { - _filename = (filename != null ? filename.trim() : null); - } - - public void setStatList(String stats[]) { - if (stats != null) { - for (int i = 0; i < stats.length; i++) { - String cur = stats[i].trim(); - if ( (cur.length() > 0) && (!_stats.contains(cur)) ) - _stats.add(cur); - } - } - } public void setGraphList(String stats[]) { if (stats != null) { @@ -68,8 +48,6 @@ public class ConfigStatsHandler extends FormHandler { } } - public void setExplicitFilter(String foo) { _explicitFilter = true; } - public void setExplicitFilterValue(String filter) { _explicitFilterValue = filter; } public void setIsFull(String foo) { _isFull = true; } /** @@ -79,44 +57,11 @@ public class ConfigStatsHandler extends FormHandler { */ private void saveChanges() { Map changes = new HashMap(); - if (_filename == null) - _filename = StatManager.DEFAULT_STAT_FILE; - changes.put(StatManager.PROP_STAT_FILE, _filename); - - if (_explicitFilter) { - _stats.clear(); - if (_explicitFilterValue == null) - _explicitFilterValue = ""; - - if (_explicitFilterValue.indexOf(',') != -1) { - StringTokenizer tok = new StringTokenizer(_explicitFilterValue, ","); - while (tok.hasMoreTokens()) { - String cur = tok.nextToken().trim(); - if ( (cur.length() > 0) && (!_stats.contains(cur)) ) - _stats.add(cur); - } - } else { - String stat = _explicitFilterValue.trim(); - if ( (stat.length() > 0) && (!_stats.contains(stat)) ) - _stats.add(stat); - } - } - - StringBuilder stats = new StringBuilder(); - for (int i = 0; i < _stats.size(); i++) { - stats.append(_stats.get(i)); - if (i + 1 < _stats.size()) - stats.append(','); - } - - changes.put(StatManager.PROP_STAT_FILTER, stats.toString()); boolean graphsChanged = !_graphs.equals(_context.getProperty("stat.summaries")); changes.put("stat.summaries", _graphs); boolean fullChanged = _context.getBooleanProperty(StatManager.PROP_STAT_FULL) != _isFull; changes.put(StatManager.PROP_STAT_FULL, Boolean.toString(_isFull)); _context.router().saveConfig(changes, null); - if (!_stats.isEmpty()) - addFormNotice(_t("Stat filter and location updated successfully to") + ": " + stats.toString()); if (fullChanged) { if (_isFull) addFormNotice(_t("Full statistics enabled")); diff --git a/apps/routerconsole/java/src/net/i2p/router/web/helpers/ConfigStatsHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/helpers/ConfigStatsHelper.java index 7696c81f6..111aeb5c0 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/helpers/ConfigStatsHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/helpers/ConfigStatsHelper.java @@ -22,8 +22,6 @@ import net.i2p.util.Log; public class ConfigStatsHelper extends HelperBase { private Log _log; - private String _filter; - private final Set _filters; private final Set _graphs; /** list of names of stats which are remaining, ordered by nested groups */ private final List _stats; @@ -33,14 +31,11 @@ public class ConfigStatsHelper extends HelperBase { private String _currentGroup; /** true if the current stat is the first in the group */ private boolean _currentIsFirstInGroup; - /** true if the stat is being logged */ - private boolean _currentIsLogged; private boolean _currentIsGraphed; private boolean _currentCanBeGraphed; public ConfigStatsHelper() { _stats = new ArrayList(); - _filters = new HashSet(); _graphs = new HashSet(); } @@ -61,35 +56,16 @@ public class ConfigStatsHelper extends HelperBase { for (Set stats : groups.values()) { _stats.addAll(stats); } - _filter = _context.statManager().getStatFilter(); - if (_filter == null) - _filter = ""; - - StringTokenizer tok = new StringTokenizer(_filter, ","); - while (tok.hasMoreTokens()) - _filters.add(tok.nextToken().trim()); // create a local copy of the config. Querying r.getSummaryListener() // lags behind, as StatSummarizer only runs once a minute. String specs = _context.getProperty("stat.summaries", StatSummarizer.DEFAULT_DATABASES); - tok = new StringTokenizer(specs, ","); + StringTokenizer tok = new StringTokenizer(specs, ","); while (tok.hasMoreTokens()) { _graphs.add(tok.nextToken().trim()); } } - /** - * Just hide for everybody unless already set. - * To enable set advanced config stat.logFilters=foo before starting... - * it has to be set at startup anyway for logging to be enabled at all - * @since 0.9 - */ - public boolean shouldShowLog() { - return !_filters.isEmpty(); - } - - public String getFilename() { return _context.statManager().getStatFile(); } - /** * move the cursor to the next known stat, returning true if a valid * stat is available. @@ -143,10 +119,6 @@ public class ConfigStatsHelper extends HelperBase { } } - if (_filters.contains("*") || _filters.contains(_currentStatName)) - _currentIsLogged = true; - else - _currentIsLogged = false; return true; } @@ -172,10 +144,8 @@ public class ConfigStatsHelper extends HelperBase { public String getCurrentStatName() { return _currentStatName; } public String getCurrentGraphName() { return _currentGraphName; } public String getCurrentStatDescription() { return _currentStatDescription; } - public boolean getCurrentIsLogged() { return _currentIsLogged; } public boolean getCurrentIsGraphed() { return _currentIsGraphed; } public boolean getCurrentCanBeGraphed() { return _currentCanBeGraphed; } - public String getExplicitFilter() { return _filter; } public boolean getIsFull() { return _context.getBooleanProperty(StatManager.PROP_STAT_FULL); } diff --git a/apps/routerconsole/jsp/configstats.jsp b/apps/routerconsole/jsp/configstats.jsp index b58925be4..9adbb0953 100644 --- a/apps/routerconsole/jsp/configstats.jsp +++ b/apps/routerconsole/jsp/configstats.jsp @@ -27,19 +27,8 @@ checked="checked" <% } %> > (<%=intl._t("change requires restart to take effect")%>)
-<% - // stats.log for devs only and grows without bounds, not recommended - boolean shouldShowLog = statshelper.shouldShowLog(); - if (shouldShowLog) { - -%><%=intl._t("Stat file")%>: -Warning - Log with care, stat file grows without limit.
-<% - - } // shouldShowLog - -%>

+

<% while (statshelper.hasMoreStats()) { @@ -50,47 +39,21 @@ Warning - Log with care, stat file grows without limit.
" href="#">[<%=intl._t("toggle all")%>] -<% - if (shouldShowLog) { - -%> -<% - - } // shouldShowLog - -%> + <% } // end iterating over required groups for the current stat %> -<% - if (shouldShowLog) { - -%> -<% - - } // shouldShowLog - -%> <% // no whitespace here so we can use td:empty to remove css pointer from inert labels %> <% } // end iterating over all stats +%> - if (shouldShowLog) { - -%> - - -<% - - } // shouldShowLog - -%> diff --git a/core/java/src/net/i2p/stat/BufferedStatLog.java b/core/java/src/net/i2p/stat/BufferedStatLog.java deleted file mode 100644 index 57e4b6a31..000000000 --- a/core/java/src/net/i2p/stat/BufferedStatLog.java +++ /dev/null @@ -1,208 +0,0 @@ -package net.i2p.stat; - -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.OutputStreamWriter; -import java.util.ArrayList; -import java.util.List; -import java.util.StringTokenizer; - -import net.i2p.I2PAppContext; -import net.i2p.data.DataHelper; -import net.i2p.util.I2PThread; -import net.i2p.util.Log; - -/** - * Note - if no filter is defined in stat.logFilters at startup, this class will not - * be instantiated - see StatManager. - * - * Deprecated - unused - to be removed. - * Not for external use - not a public API. - */ -public class BufferedStatLog implements StatLog { - private final I2PAppContext _context; - private final Log _log; - private final StatEvent _events[]; - private int _eventNext; - private int _lastWrite; - /** flush stat events to disk after this many events (or 30s)*/ - private int _flushFrequency; - private final List _statFilters; - private String _lastFilters; - private BufferedWriter _out; - private String _outFile; - /** short circuit for adding data, set to true if some filters are set, false if its empty (so we can skip the sync) */ - private volatile boolean _filtersSpecified; - - private static final int BUFFER_SIZE = 1024; - private static final boolean DISABLE_LOGGING = false; - - public BufferedStatLog(I2PAppContext ctx) { - _context = ctx; - _log = ctx.logManager().getLog(BufferedStatLog.class); - _events = new StatEvent[BUFFER_SIZE]; - if (DISABLE_LOGGING) return; - for (int i = 0; i < BUFFER_SIZE; i++) - _events[i] = new StatEvent(); - _eventNext = 0; - _lastWrite = _events.length-1; - _statFilters = new ArrayList(10); - _flushFrequency = 500; - updateFilters(); - I2PThread writer = new I2PThread(new StatLogWriter(), "StatLogWriter"); - writer.setDaemon(true); - writer.start(); - } - - public void addData(String scope, String stat, long value, long duration) { - if (DISABLE_LOGGING) return; - if (!shouldLog(stat)) return; - synchronized (_events) { - _events[_eventNext].init(scope, stat, value, duration); - _eventNext = (_eventNext + 1) % _events.length; - - if (_eventNext == _lastWrite) - _lastWrite = (_lastWrite + 1) % _events.length; // drop an event - - if (_log.shouldLog(Log.DEBUG)) - _log.debug("AddData next=" + _eventNext + " lastWrite=" + _lastWrite); - - if (_eventNext > _lastWrite) { - if (_eventNext - _lastWrite >= _flushFrequency) - _events.notifyAll(); - } else { - if (_events.length - 1 - _lastWrite + _eventNext >= _flushFrequency) - _events.notifyAll(); - } - } - } - - private boolean shouldLog(String stat) { - if (!_filtersSpecified) return false; - synchronized (_statFilters) { - return _statFilters.contains(stat) || _statFilters.contains("*"); - } - } - - private void updateFilters() { - String val = _context.getProperty(StatManager.PROP_STAT_FILTER); - if (val != null) { - if ( (_lastFilters != null) && (_lastFilters.equals(val)) ) { - // noop - } else { - StringTokenizer tok = new StringTokenizer(val, ","); - synchronized (_statFilters) { - _statFilters.clear(); - while (tok.hasMoreTokens()) - _statFilters.add(tok.nextToken().trim()); - _filtersSpecified = !_statFilters.isEmpty(); - } - } - _lastFilters = val; - } else { - synchronized (_statFilters) { - _statFilters.clear(); - _filtersSpecified = false; - } - } - - String filename = _context.getProperty(StatManager.PROP_STAT_FILE, StatManager.DEFAULT_STAT_FILE); - File foo = new File(filename); - if (!foo.isAbsolute()) - filename = (new File(_context.getRouterDir(), filename)).getAbsolutePath(); - if ( (_outFile != null) && (_outFile.equals(filename)) ) { - // noop - } else { - if (_out != null) try { _out.close(); } catch (IOException ioe) {} - _outFile = filename; - try { - _out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(_outFile, true), "UTF-8"), 32*1024); - } catch (IOException ioe) { ioe.printStackTrace(); } - } - } - - private class StatLogWriter implements Runnable { - public void run() { - int writeStart = -1; - int writeEnd = -1; - while (true) { - try { - synchronized (_events) { - if (_eventNext > _lastWrite) { - if (_eventNext - _lastWrite < _flushFrequency) - _events.wait(30*1000); - } else { - if (_events.length - 1 - _lastWrite + _eventNext < _flushFrequency) - _events.wait(30*1000); - } - writeStart = (_lastWrite + 1) % _events.length; - writeEnd = _eventNext; - _lastWrite = (writeEnd == 0 ? _events.length-1 : writeEnd - 1); - } - if (writeStart != writeEnd) { - try { - if (_log.shouldLog(Log.DEBUG)) - _log.debug("writing " + writeStart +"->"+ writeEnd); - writeEvents(writeStart, writeEnd); - } catch (RuntimeException e) { - _log.error("error writing " + writeStart +"->"+ writeEnd, e); - } - } - } catch (InterruptedException ie) {} - } - } - - private void writeEvents(int start, int end) { - try { - updateFilters(); - int cur = start; - while (cur != end) { - //if (shouldLog(_events[cur].getStat())) { - String when = DataHelper.formatTime(_events[cur].getTime()); - _out.write(when); - _out.write(" "); - if (_events[cur].getScope() == null) - _out.write("noScope"); - else - _out.write(_events[cur].getScope()); - _out.write(" "); - _out.write(_events[cur].getStat()); - _out.write(" "); - _out.write(Long.toString(_events[cur].getValue())); - _out.write(" "); - _out.write(Long.toString(_events[cur].getDuration())); - _out.write("\n"); - //} - cur = (cur + 1) % _events.length; - } - _out.flush(); - } catch (IOException ioe) { - _log.error("Error writing out", ioe); - } - } - } - - private class StatEvent { - private long _time; - private String _scope; - private String _stat; - private long _value; - private long _duration; - - public long getTime() { return _time; } - public String getScope() { return _scope; } - public String getStat() { return _stat; } - public long getValue() { return _value; } - public long getDuration() { return _duration; } - - public void init(String scope, String stat, long value, long duration) { - _scope = scope; - _stat = stat; - _value = value; - _duration = duration; - _time = _context.clock().now(); - } - } -} diff --git a/core/java/src/net/i2p/stat/RateStat.java b/core/java/src/net/i2p/stat/RateStat.java index 8cd7dab17..5402baf9e 100644 --- a/core/java/src/net/i2p/stat/RateStat.java +++ b/core/java/src/net/i2p/stat/RateStat.java @@ -17,8 +17,6 @@ public class RateStat { private final String _description; /** actual rate objects for this statistic */ protected final Rate[] _rates; - /** component we tell about events as they occur */ - private StatLog _statLog; public RateStat(String name, String description, String group, long periods[]) { _statName = name; @@ -39,17 +37,10 @@ public class RateStat { } } - /** - * Sets the default stat log for this RateStat. - * Deprecated, unused, to be disabled in a future release. - */ - public void setStatLog(StatLog sl) { _statLog = sl; } - /** * update all of the rates for the various periods with the given value. */ public void addData(long value, long eventDuration) { - if (_statLog != null) _statLog.addData(_groupName, _statName, value, eventDuration); for (Rate r: _rates) r.addData(value, eventDuration); } @@ -60,7 +51,6 @@ public class RateStat { * @since 0.8.10 */ public void addData(long value) { - if (_statLog != null) _statLog.addData(_groupName, _statName, value, 0); for (Rate r: _rates) r.addData(value); } diff --git a/core/java/src/net/i2p/stat/StatLog.java b/core/java/src/net/i2p/stat/StatLog.java deleted file mode 100644 index bc4ef8128..000000000 --- a/core/java/src/net/i2p/stat/StatLog.java +++ /dev/null @@ -1,8 +0,0 @@ -package net.i2p.stat; - -/** - * Component to be notified when a particular event occurs - */ -public interface StatLog { - public void addData(String scope, String stat, long value, long duration); -} diff --git a/core/java/src/net/i2p/stat/StatManager.java b/core/java/src/net/i2p/stat/StatManager.java index cfba4ecc5..78db6ea3d 100644 --- a/core/java/src/net/i2p/stat/StatManager.java +++ b/core/java/src/net/i2p/stat/StatManager.java @@ -29,22 +29,11 @@ public class StatManager { private final ConcurrentHashMap _frequencyStats; /** stat name to RateStat */ private final ConcurrentHashMap _rateStats; - /** may be null */ - private StatLog _statLog; private int coalesceCounter; /** every this many minutes for frequencies */ private static final int FREQ_COALESCE_RATE = 9; - - /** - * Comma-separated stats or * for all. - * This property must be set at startup, or - * logging is disabled. - */ - public static final String PROP_STAT_FILTER = "stat.logFilters"; - public static final String PROP_STAT_FILE = "stat.logFile"; - public static final String DEFAULT_STAT_FILE = "stats.log"; /** default false */ public static final String PROP_STAT_FULL = "stat.full"; @@ -59,9 +48,6 @@ public class StatManager { _log = context.logManager().getLog(getClass()); _frequencyStats = new ConcurrentHashMap(8); _rateStats = new ConcurrentHashMap(128); - String filter = getStatFilter(); - if (filter != null && filter.length() > 0) - _statLog = new BufferedStatLog(context); } /** @since 0.8.8 */ @@ -70,26 +56,6 @@ public class StatManager { _rateStats.clear(); } - /** - * Gets the default stat log for RateStats - * Deprecated, unused - * @return null always - */ - public synchronized StatLog getStatLog() { return _statLog; } - - /** - * Sets the default stat log for ALL known RateStats. - * Deprecated, unused - * @deprecated unused - */ - @Deprecated - public synchronized void setStatLog(StatLog log) { - _statLog = log; - for (RateStat rs : _rateStats.values()) { - rs.setStatLog(log); - } - } - /** * Create a new statistic to monitor the frequency of some event. * The stat is ONLY created if the stat.full property is true or we are not in the router context. @@ -146,7 +112,6 @@ public class StatManager { public void createRequiredRateStat(String name, String description, String group, long periods[]) { if (_rateStats.containsKey(name)) return; RateStat rs = new RateStat(name, description, group, periods); - if (_statLog != null) rs.setStatLog(_statLog); _rateStats.putIfAbsent(name, rs); } @@ -263,9 +228,6 @@ public class StatManager { return groups; } - public String getStatFilter() { return _context.getProperty(PROP_STAT_FILTER); } - public String getStatFile() { return _context.getProperty(PROP_STAT_FILE, DEFAULT_STAT_FILE); } - /** * Save memory by not creating stats unless they are required for router operation. * For backward compatibility of any external clients, always returns false if not in router context.
<%=intl._t("Log")%>"><%=intl._t("Graph")%>"><%=intl._t("Graph")%>
checked="checked" <% } %> ><% if (statshelper.getCurrentCanBeGraphed()) { %><% if (statshelper.getCurrentCanBeGraphed()) { %>checked="checked" <% } %> ><% } %>
<%=intl._t("Advanced filter")%>: -
+
" > " >