diff --git a/src/java/com/threerings/presents/peer/client/PeerService.java b/src/java/com/threerings/presents/peer/client/PeerService.java index a769532df..616dbb2b8 100644 --- a/src/java/com/threerings/presents/peer/client/PeerService.java +++ b/src/java/com/threerings/presents/peer/client/PeerService.java @@ -45,9 +45,7 @@ public interface PeerService extends InvocationService * Generates a server status report for this peer and returns it to the supplied listener. The * result must be a string. * - * @param type the default implementation always generates a state of the server report, but - * derived classes can request different report types from their peers to take advantage of - * this convenient mechanism for collecting per-peer data. + * @param type the type of report to generate. See ReportManager for more information. */ void generateReport (Client client, String type, ResultListener listener); } diff --git a/src/java/com/threerings/presents/peer/server/PeerManager.java b/src/java/com/threerings/presents/peer/server/PeerManager.java index 82e496a9c..1c15b0e75 100644 --- a/src/java/com/threerings/presents/peer/server/PeerManager.java +++ b/src/java/com/threerings/presents/peer/server/PeerManager.java @@ -765,7 +765,7 @@ public abstract class PeerManager PeerService.ResultListener listener) throws InvocationException { - listener.requestProcessed(_repmgr.generateReport()); + listener.requestProcessed(_repmgr.generateReport(type)); } // from interface ClientManager.ClientObserver diff --git a/src/java/com/threerings/presents/server/AbstractSignalHandler.java b/src/java/com/threerings/presents/server/AbstractSignalHandler.java index 8a7d0692e..742cc471f 100644 --- a/src/java/com/threerings/presents/server/AbstractSignalHandler.java +++ b/src/java/com/threerings/presents/server/AbstractSignalHandler.java @@ -69,7 +69,7 @@ public abstract class AbstractSignalHandler */ protected void hupReceived () { - log.info(_repmgr.generateReport()); + log.info(_repmgr.generateReport(ReportManager.DEFAULT_TYPE)); } @Inject protected ShutdownManager _shutmgr; diff --git a/src/java/com/threerings/presents/server/ReportManager.java b/src/java/com/threerings/presents/server/ReportManager.java index c3516b8eb..f293c2319 100644 --- a/src/java/com/threerings/presents/server/ReportManager.java +++ b/src/java/com/threerings/presents/server/ReportManager.java @@ -24,6 +24,8 @@ package com.threerings.presents.server; import java.util.List; import com.google.common.collect.Lists; +import com.google.common.collect.Multimap; +import com.google.common.collect.Multimaps; import com.google.inject.Singleton; import com.samskivert.util.Interval; @@ -56,6 +58,9 @@ public class ReportManager void appendReport (StringBuilder buffer, long now, long sinceLast, boolean reset); } + /** A string constant representing the default report. */ + public static final String DEFAULT_TYPE = ""; + /** * Starts up our periodic report generation task on the supplied run queue. */ @@ -65,53 +70,63 @@ public class ReportManager _reportInterval = new Interval(rqueue) { @Override public void expired () { - logReport(LOG_REPORT_HEADER + generateReport(System.currentTimeMillis(), true)); + logReport(LOG_REPORT_HEADER + + generateReport(DEFAULT_TYPE, System.currentTimeMillis(), true)); } }; _reportInterval.schedule(REPORT_INTERVAL, true); } /** - * A report is generated by the presents server periodically in which server entities can - * participate by registering a {@link Reporter} with this method. + * Registers a reporter for the default state of server report. */ public void registerReporter (Reporter reporter) { - _reporters.add(reporter); + registerReporter(DEFAULT_TYPE, reporter); + } + + /** + * Registers a reporter for the report of the specified type. + */ + public void registerReporter (String type, Reporter reporter) + { + _reporters.put(type, reporter); } /** * Generates a report for all system services registered as a {@link Reporter}. */ - public String generateReport () + public String generateReport (String type) { - return generateReport(System.currentTimeMillis(), false); + return generateReport(type, System.currentTimeMillis(), false); } /** * Generates and logs a "state of server" report. */ - protected String generateReport (long now, boolean reset) + protected String generateReport (String type, long now, boolean reset) { long sinceLast = now - _lastReportStamp; long uptime = now - _serverStartTime; StringBuilder report = new StringBuilder(); - report.append("- Uptime: "); - report.append(StringUtil.intervalToString(uptime)).append("\n"); - report.append("- Report period: "); - report.append(StringUtil.intervalToString(sinceLast)).append("\n"); + // add standard bits to the default report + if (DEFAULT_TYPE.equals(type)) { + report.append("- Uptime: "); + report.append(StringUtil.intervalToString(uptime)).append("\n"); + report.append("- Report period: "); + report.append(StringUtil.intervalToString(sinceLast)).append("\n"); - // report on the state of memory - Runtime rt = Runtime.getRuntime(); - long total = rt.totalMemory(), max = rt.maxMemory(); - long used = (total - rt.freeMemory()); - report.append("- Memory: ").append(used/1024).append("k used, "); - report.append(total/1024).append("k total, "); - report.append(max/1024).append("k max\n"); + // report on the state of memory + Runtime rt = Runtime.getRuntime(); + long total = rt.totalMemory(), max = rt.maxMemory(); + long used = (total - rt.freeMemory()); + report.append("- Memory: ").append(used/1024).append("k used, "); + report.append(total/1024).append("k total, "); + report.append(max/1024).append("k max\n"); + } - for (int ii = 0; ii < _reporters.size(); ii++) { - Reporter rptr = _reporters.get(ii); + for (Reporter rptr : _reporters.get(type)) { try { rptr.appendReport(report, now, sinceLast, reset); } catch (Throwable t) { @@ -162,7 +177,7 @@ public class ReportManager protected long _lastReportStamp = _serverStartTime; /** Used to generate "state of server" reports. */ - protected List _reporters = Lists.newArrayList(); + protected Multimap _reporters = Multimaps.newArrayListMultimap(); /** The frequency with which we generate "state of server" reports. */ protected static final long REPORT_INTERVAL = 15 * 60 * 1000L;