/******************************************************************************* * Copyright 2014 Miami-Dade County * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. ******************************************************************************/ package org.sharegov.cirm.utils; import static mjson.Json.object; import java.io.FileWriter; import java.lang.management.ManagementFactory; import javax.management.MBeanServer; import javax.management.ObjectName; import mjson.Json; import org.restlet.Context; import org.restlet.Request; import org.restlet.Response; import org.restlet.data.MediaType; import org.restlet.data.Method; import org.restlet.routing.Filter; /** * Filter that monitors cpu utilization and memory allocation * of the running JVM process. * @author SABBAS * */ public class ServerMonitorFilter extends Filter { public static Boolean ON = false; private Json A = Json.array(); public ServerMonitorFilter() { } public ServerMonitorFilter(Context context) { super(context); } protected synchronized void afterHandle(Request request, Response response) { if(ON) { Json monitorData = (Json)request.getAttributes().get("monitorData"); Long threadCpuStartTime = monitorData.at("threadCpuStartTime").asLong(); //Long processCpuStartTime = monitorData.at("processCpuStartTime").asLong(); Long sysStartTime = monitorData.at("sysStartTime").asLong(); Long threadCpuEndTime = getThreadCpuTime(); Long processCpuEndTime = getProcessCpuTime(); Long sysEndTime = System.nanoTime(); Long cpuPercentageLoad = 0l; if(sysEndTime > sysStartTime) cpuPercentageLoad = ((threadCpuEndTime - threadCpuStartTime) * 100l) / (sysEndTime - sysStartTime); monitorData.set("threadCpuEndTime", threadCpuEndTime); monitorData.set("processCpuEndTime", processCpuEndTime); monitorData.set("cpuPercentageLoad", cpuPercentageLoad); monitorData.set("sysEndTime", sysEndTime); monitorData.set("freeMemoryMB", Runtime.getRuntime().freeMemory()/(1024*1024)); monitorData.set("totalMemoryMB", Runtime.getRuntime().totalMemory()/(1024*1024)); monitorData.set("call", object("url", request.getOriginalRef().toString(), "responseCode", response.getStatus().getCode())); A.add(monitorData); } } protected synchronized int beforeHandle(Request request, Response response) { if(ON) { if (request.getOriginalRef().toString().contains("/monitor/stop")) { try { FileWriter out = new FileWriter("c:/temp/cirmmonitor.json"); out.write(A.toString()); out.close(); A = Json.array(); } catch (Throwable t) { t.printStackTrace(System.err); } }else { Json monitorData = Json.object() .set("sysStartTime", System.nanoTime()) .set("threadCpuStartTime", getThreadCpuTime()) .set("processCpuStartTime" , getProcessCpuTime()) .set("timestamp", System.currentTimeMillis()); request.getAttributes().put( "monitorData", monitorData ); } } return Filter.CONTINUE; } private Long getProcessCpuTime() { try { MBeanServer managementServer = ManagementFactory.getPlatformMBeanServer(); ObjectName osname = new ObjectName(ManagementFactory.OPERATING_SYSTEM_MXBEAN_NAME); return (Long) managementServer.getAttribute(osname, "ProcessCpuTime"); } catch (Exception e) { e.printStackTrace(System.err); } return -1l; } private Long getThreadCpuTime() { try { MBeanServer managementServer = ManagementFactory.getPlatformMBeanServer(); ObjectName tname = new ObjectName(ManagementFactory.THREAD_MXBEAN_NAME); return (Long) managementServer.getAttribute(tname, "CurrentThreadCpuTime"); } catch (Exception e) { e.printStackTrace(System.err); } return -1l; } }