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
* 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);
}
@@ -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
@@ -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;
@@ -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<Reporter> _reporters = Lists.newArrayList();
protected Multimap<String, Reporter> _reporters = Multimaps.newArrayListMultimap();
/** The frequency with which we generate "state of server" reports. */
protected static final long REPORT_INTERVAL = 15 * 60 * 1000L;