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:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user