实例

public class PerformanceMetricsTask implements TimerTask {

    // Values to use with TimeOutTaskCreator
    // Count performance metrics every second
    public static final long DELAY = 1;
    public static final TimeUnit UNIT = TimeUnit.SECONDS;

    private static final int BYTES_PER_KILO = 1024;
    private ByteCounterHandler byteCounter;
    private MessageCounterHandler msgCounter;
    private static Logger logger = LoggerFactory.getLogger(PerformanceMetricsTask.class);

    public PerformanceMetricsTask(ByteCounterHandler byteCounter, MessageCounterHandler msgCounter) {
        this.msgCounter = msgCounter;
        this.byteCounter = byteCounter;
    }

    @Override
    public void run(Timeout timeout) throws Exception {

        if (logger.isInfoEnabled()) {

            // ****************************** Network Stats

            // Bytes read and written in kilobytes
            double bytesRead = (byteCounter != null) ? byteCounter.getReadBytesAndClear()
                    / (double) (BYTES_PER_KILO * DELAY) : 0;
            double bytesWritten = (byteCounter != null) ? byteCounter.getWrittenBytesAndClear()
                    / (double) (BYTES_PER_KILO * DELAY) : 0;

            // Message read and written in thousands
            double msgRead = (msgCounter != null) ? msgCounter.getReadMessagesAndClear()
                    / (double) (BYTES_PER_KILO * DELAY) : 0;
            double msgWritten = (msgCounter != null) ? msgCounter.getWrittenMessagesAndClear()
                    / (double) (BYTES_PER_KILO * DELAY) : 0;

            // ***************************** CPU / RAM Stats

            RamUsageInfo systemRam = PerformanceMetrics.instance().getSystemRamInfo();
            CpuUsageInfo cpuInfo = PerformanceMetrics.instance().getCpuUsageInfo();

            double cpuUsage = cpuInfo.totalPerc * 100;
            double ramUsage = (systemRam.ramUsed / (double) systemRam.ramMax) * 100;

            // Form the reqRespReport
            String reqRespReport = "\t(Key:AvgResp)";
            for (Integer key : ServerState.reqRespMetricsMap.keySet()) {
                ReqRespMetrics.Data rrMet = ServerState.reqRespMetricsMap.get(key).getAndResetInfo();

                double avgResp = (rrMet.totalNumReqResps == 0) ? 0 : rrMet.totalRespTime
                        / (double) rrMet.totalNumReqResps;
                reqRespReport += String.format("(" + OneMessage.Type.valueOf(key) + ":%.2f) ", avgResp);
            }
            reqRespReport += "\n";

            String networkReport = String.format("Performance Report\n"
                    + "\t(Read/Write): Messages(1000s): (%.2f/%.2f) KB: (%.2f/%.2f)\n", msgRead, msgWritten, bytesRead,
                    bytesWritten);
            String statusReport = String.format("\tNum Active Connections: %d Num Logger In Users: %d\n",
                    ServerState.numActiveConnections.longValue(), ServerState.numLoggedInUsers.longValue());
            String cpuMemReport = String.format("\tSystem CPU Usage (%%): %.2f System Ram Usage (%%): %.2f", cpuUsage,
                    ramUsage);
            logger.info(networkReport + reqRespReport + statusReport + cpuMemReport);
        }

        // Make this task recurring
        TimeOutTaskCreator.createTask(new PerformanceMetricsTask(byteCounter, msgCounter), DELAY, UNIT);
    }
}

docs


codecraft
11.9k 声望2k 粉丝

当一个代码的工匠回首往事时,不因虚度年华而悔恨,也不因碌碌无为而羞愧,这样,当他老的时候,可以很自豪告诉世人,我曾经将代码注入生命去打造互联网的浪潮之巅,那是个很疯狂的时代,我在一波波的浪潮上留下...