Allow reporters to be registered for different report types and the type to be

specified at report generation time.


git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@5564 542714f4-19e9-0310-aa3c-eee0fc999fb1
This commit is contained in:
Michael Bayne
2008-11-19 19:53:46 +00:00
parent 9a67119557
commit 457c8a59d6
4 changed files with 39 additions and 26 deletions
@@ -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 * Generates a server status report for this peer and returns it to the supplied listener. The
* result must be a string. * result must be a string.
* *
* @param type the default implementation always generates a state of the server report, but * @param type the type of report to generate. See ReportManager for more information.
* derived classes can request different report types from their peers to take advantage of
* this convenient mechanism for collecting per-peer data.
*/ */
void generateReport (Client client, String type, ResultListener listener); void generateReport (Client client, String type, ResultListener listener);
} }
@@ -765,7 +765,7 @@ public abstract class PeerManager
PeerService.ResultListener listener) PeerService.ResultListener listener)
throws InvocationException throws InvocationException
{ {
listener.requestProcessed(_repmgr.generateReport()); listener.requestProcessed(_repmgr.generateReport(type));
} }
// from interface ClientManager.ClientObserver // from interface ClientManager.ClientObserver
@@ -69,7 +69,7 @@ public abstract class AbstractSignalHandler
*/ */
protected void hupReceived () protected void hupReceived ()
{ {
log.info(_repmgr.generateReport()); log.info(_repmgr.generateReport(ReportManager.DEFAULT_TYPE));
} }
@Inject protected ShutdownManager _shutmgr; @Inject protected ShutdownManager _shutmgr;
@@ -24,6 +24,8 @@ package com.threerings.presents.server;
import java.util.List; import java.util.List;
import com.google.common.collect.Lists; 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.google.inject.Singleton;
import com.samskivert.util.Interval; import com.samskivert.util.Interval;
@@ -56,6 +58,9 @@ public class ReportManager
void appendReport (StringBuilder buffer, long now, long sinceLast, boolean reset); 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. * Starts up our periodic report generation task on the supplied run queue.
*/ */
@@ -65,53 +70,63 @@ public class ReportManager
_reportInterval = new Interval(rqueue) { _reportInterval = new Interval(rqueue) {
@Override @Override
public void expired () { 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); _reportInterval.schedule(REPORT_INTERVAL, true);
} }
/** /**
* A report is generated by the presents server periodically in which server entities can * Registers a reporter for the default state of server report.
* participate by registering a {@link Reporter} with this method.
*/ */
public void registerReporter (Reporter reporter) 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}. * 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. * 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 sinceLast = now - _lastReportStamp;
long uptime = now - _serverStartTime; long uptime = now - _serverStartTime;
StringBuilder report = new StringBuilder(); StringBuilder report = new StringBuilder();
report.append("- Uptime: "); // add standard bits to the default report
report.append(StringUtil.intervalToString(uptime)).append("\n"); if (DEFAULT_TYPE.equals(type)) {
report.append("- Report period: "); report.append("- Uptime: ");
report.append(StringUtil.intervalToString(sinceLast)).append("\n"); report.append(StringUtil.intervalToString(uptime)).append("\n");
report.append("- Report period: ");
report.append(StringUtil.intervalToString(sinceLast)).append("\n");
// report on the state of memory // report on the state of memory
Runtime rt = Runtime.getRuntime(); Runtime rt = Runtime.getRuntime();
long total = rt.totalMemory(), max = rt.maxMemory(); long total = rt.totalMemory(), max = rt.maxMemory();
long used = (total - rt.freeMemory()); long used = (total - rt.freeMemory());
report.append("- Memory: ").append(used/1024).append("k used, "); report.append("- Memory: ").append(used/1024).append("k used, ");
report.append(total/1024).append("k total, "); report.append(total/1024).append("k total, ");
report.append(max/1024).append("k max\n"); report.append(max/1024).append("k max\n");
}
for (int ii = 0; ii < _reporters.size(); ii++) { for (Reporter rptr : _reporters.get(type)) {
Reporter rptr = _reporters.get(ii);
try { try {
rptr.appendReport(report, now, sinceLast, reset); rptr.appendReport(report, now, sinceLast, reset);
} catch (Throwable t) { } catch (Throwable t) {
@@ -162,7 +177,7 @@ public class ReportManager
protected long _lastReportStamp = _serverStartTime; protected long _lastReportStamp = _serverStartTime;
/** Used to generate "state of server" reports. */ /** Used to generate "state of server" reports. */
protected List<Reporter> _reporters = Lists.newArrayList(); protected Multimap<String, Reporter> _reporters = Multimaps.newArrayListMultimap();
/** The frequency with which we generate "state of server" reports. */ /** The frequency with which we generate "state of server" reports. */
protected static final long REPORT_INTERVAL = 15 * 60 * 1000L; protected static final long REPORT_INTERVAL = 15 * 60 * 1000L;