diff --git a/descriptor.xml b/descriptor.xml new file mode 100644 index 00000000..e1d56b28 --- /dev/null +++ b/descriptor.xml @@ -0,0 +1,25 @@ + + + dir + + dir + + false + + + lib + false + false + runtime + + + + + target/bench4q-monitor.jar + / + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml index ef947836..43bbe944 100644 --- a/pom.xml +++ b/pom.xml @@ -1,44 +1,75 @@ - - 4.0.0 - org.bench4q - bench4q-monitor - jar - 0.0.1-SNAPSHOT - Bench4Q Monitor - Bench4Q Monitor - - TCSE, ISCAS - - - - junit - junit - 4.11 - test - - - org.eclipse.jetty - jetty-server - 8.1.11.v20130520 - - - org.eclipse.jetty - jetty-servlet - 8.1.11.v20130520 - - - org.springframework - spring-webmvc - 3.2.3.RELEASE - - - org.codehaus.jackson - jackson-mapper-asl - 1.9.12 - - - - bench4q-monitor - + + 4.0.0 + org.bench4q + bench4q-monitor + jar + 0.0.1-SNAPSHOT + Bench4Q Monitor + Bench4Q Monitor + + TCSE, ISCAS + + + + junit + junit + 4.11 + test + + + org.eclipse.jetty + jetty-server + 8.1.11.v20130520 + + + org.eclipse.jetty + jetty-servlet + 8.1.11.v20130520 + + + org.springframework + spring-webmvc + 3.2.3.RELEASE + + + org.codehaus.jackson + jackson-mapper-asl + 1.9.12 + + + + + + maven-jar-plugin + + + + org.bench4q.monitor.Main + true + lib/ + + + + + + maven-assembly-plugin + + + make-zip + package + + single + + + + descriptor.xml + + + + + + + bench4q-monitor + \ No newline at end of file diff --git a/src/main/java/org/bench4q/monitor/MonitorServer.java b/src/main/java/org/bench4q/monitor/MonitorServer.java index 4453d029..0f90f7f3 100644 --- a/src/main/java/org/bench4q/monitor/MonitorServer.java +++ b/src/main/java/org/bench4q/monitor/MonitorServer.java @@ -1,67 +1,68 @@ -package org.bench4q.monitor; - -import org.eclipse.jetty.server.Connector; -import org.eclipse.jetty.server.Server; -import org.eclipse.jetty.server.bio.SocketConnector; -import org.eclipse.jetty.servlet.ServletContextHandler; -import org.eclipse.jetty.servlet.ServletHolder; -import org.springframework.web.servlet.DispatcherServlet; - -public class MonitorServer { - private Server server; - private int port; - - private Server getServer() { - return server; - } - - private void setServer(Server server) { - this.server = server; - } - - private int getPort() { - return port; - } - - private void setPort(int port) { - this.port = port; - } - - public MonitorServer(int port) { - this.setPort(port); - } - - public boolean start() { - try { - this.setServer(new Server()); - Connector connector = new SocketConnector(); - connector.setPort(this.getPort()); - this.getServer().addConnector(connector); - ServletContextHandler servletContextHandler = new ServletContextHandler(); - ServletHolder servletHolder = servletContextHandler.addServlet( - DispatcherServlet.class, "/"); - servletHolder.setInitParameter("contextConfigLocation", - "classpath*:/application-context.xml"); - this.getServer().setHandler(servletContextHandler); - this.getServer().start(); - return true; - } catch (Exception e) { - e.printStackTrace(); - return false; - } - } - - public boolean stop() { - try { - if (this.getServer() != null) { - this.getServer().stop(); - } - return true; - } catch (Exception e) { - e.printStackTrace(); - return false; - } finally { - this.setServer(null); - } - } -} +package org.bench4q.monitor; + +import org.eclipse.jetty.server.Connector; +import org.eclipse.jetty.server.Server; +import org.eclipse.jetty.server.bio.SocketConnector; +import org.eclipse.jetty.servlet.ServletContextHandler; +import org.eclipse.jetty.servlet.ServletHolder; +import org.springframework.web.servlet.DispatcherServlet; + +public class MonitorServer { + private Server server; + private int port; + + private Server getServer() { + return server; + } + + private void setServer(Server server) { + this.server = server; + } + + private int getPort() { + return port; + } + + private void setPort(int port) { + this.port = port; + } + + public MonitorServer(int port) { + this.setPort(port); + } + + public boolean start() { + try { + this.setServer(new Server()); + Connector connector = new SocketConnector(); + connector.setPort(this.getPort()); + this.getServer().addConnector(connector); + ServletContextHandler servletContextHandler = new ServletContextHandler(); + ServletHolder servletHolder = servletContextHandler.addServlet( + DispatcherServlet.class, "/"); + servletHolder + .setInitParameter("contextConfigLocation", + "classpath*:org/bench4q/monitor/config/application-context.xml"); + this.getServer().setHandler(servletContextHandler); + this.getServer().start(); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + public boolean stop() { + try { + if (this.getServer() != null) { + this.getServer().stop(); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } finally { + this.setServer(null); + } + } +} diff --git a/src/main/java/org/bench4q/monitor/probe/LinuxCpuProbe.java b/src/main/java/org/bench4q/monitor/probe/LinuxCpuProbe.java new file mode 100644 index 00000000..d616a3ad --- /dev/null +++ b/src/main/java/org/bench4q/monitor/probe/LinuxCpuProbe.java @@ -0,0 +1,5 @@ +package org.bench4q.monitor.probe; + +public class LinuxCpuProbe { + // /proc/stat +} \ No newline at end of file diff --git a/src/main/java/org/bench4q/monitor/probe/LinuxCpuProbeInfo.java b/src/main/java/org/bench4q/monitor/probe/LinuxCpuProbeInfo.java new file mode 100644 index 00000000..d4472317 --- /dev/null +++ b/src/main/java/org/bench4q/monitor/probe/LinuxCpuProbeInfo.java @@ -0,0 +1,5 @@ +package org.bench4q.monitor.probe; + +public class LinuxCpuProbeInfo { + +} diff --git a/src/main/java/org/bench4q/monitor/probe/LinuxDiskProbe.java b/src/main/java/org/bench4q/monitor/probe/LinuxDiskProbe.java new file mode 100644 index 00000000..213f733b --- /dev/null +++ b/src/main/java/org/bench4q/monitor/probe/LinuxDiskProbe.java @@ -0,0 +1,5 @@ +package org.bench4q.monitor.probe; + +public class LinuxDiskProbe { + // /proc/diskstats +} diff --git a/src/main/java/org/bench4q/monitor/probe/LinuxDiskProbeInfo.java b/src/main/java/org/bench4q/monitor/probe/LinuxDiskProbeInfo.java new file mode 100644 index 00000000..89967cfb --- /dev/null +++ b/src/main/java/org/bench4q/monitor/probe/LinuxDiskProbeInfo.java @@ -0,0 +1,5 @@ +package org.bench4q.monitor.probe; + +public class LinuxDiskProbeInfo { + +} diff --git a/src/main/java/org/bench4q/monitor/probe/LinuxMemoryProbe.java b/src/main/java/org/bench4q/monitor/probe/LinuxMemoryProbe.java new file mode 100644 index 00000000..8b0f3b1a --- /dev/null +++ b/src/main/java/org/bench4q/monitor/probe/LinuxMemoryProbe.java @@ -0,0 +1,5 @@ +package org.bench4q.monitor.probe; + +public class LinuxMemoryProbe { + // /proc/meminfo +} diff --git a/src/main/java/org/bench4q/monitor/probe/LinuxMemoryProbeInfo.java b/src/main/java/org/bench4q/monitor/probe/LinuxMemoryProbeInfo.java new file mode 100644 index 00000000..f6780295 --- /dev/null +++ b/src/main/java/org/bench4q/monitor/probe/LinuxMemoryProbeInfo.java @@ -0,0 +1,5 @@ +package org.bench4q.monitor.probe; + +public class LinuxMemoryProbeInfo { + +} diff --git a/src/main/java/org/bench4q/monitor/probe/LinuxNetworkProbe.java b/src/main/java/org/bench4q/monitor/probe/LinuxNetworkProbe.java new file mode 100644 index 00000000..58800544 --- /dev/null +++ b/src/main/java/org/bench4q/monitor/probe/LinuxNetworkProbe.java @@ -0,0 +1,5 @@ +package org.bench4q.monitor.probe; + +public class LinuxNetworkProbe { + +} diff --git a/src/main/java/org/bench4q/monitor/probe/LinuxNetworkProbeInfo.java b/src/main/java/org/bench4q/monitor/probe/LinuxNetworkProbeInfo.java new file mode 100644 index 00000000..5e51db3f --- /dev/null +++ b/src/main/java/org/bench4q/monitor/probe/LinuxNetworkProbeInfo.java @@ -0,0 +1,5 @@ +package org.bench4q.monitor.probe; + +public class LinuxNetworkProbeInfo { + +} diff --git a/src/main/java/org/bench4q/monitor/service/MonitorService.java b/src/main/java/org/bench4q/monitor/service/MonitorService.java index 02d88701..c84fafdb 100644 --- a/src/main/java/org/bench4q/monitor/service/MonitorService.java +++ b/src/main/java/org/bench4q/monitor/service/MonitorService.java @@ -1,180 +1,180 @@ -package org.bench4q.monitor.service; - -import java.io.BufferedReader; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.LineNumberReader; -import java.util.StringTokenizer; - -import sun.management.ManagementFactory; -import com.sun.management.OperatingSystemMXBean; - -import org.bench4q.monitor.entity.MonitorInfo; -import org.springframework.stereotype.Component; - -@Component -public class MonitorService { - - private static final int CPUTIME = 30; - private static final int PERCENT = 100; - private static final int FAULTLENGTH = 10; - - public MonitorInfo getMonitorInfo() { - MonitorInfo monitorInfo = new MonitorInfo(); - monitorInfo.setTotalVirtualMachineMemory(Runtime.getRuntime() - .totalMemory()); - monitorInfo.setFreeVirtualMachineMemory(Runtime.getRuntime() - .freeMemory()); - monitorInfo - .setMaxVirtualMachineMemory(Runtime.getRuntime().maxMemory()); - monitorInfo.setOperationSystem(System.getProperty("os.name")); - OperatingSystemMXBean operatingSystemMXBean = (OperatingSystemMXBean) ManagementFactory - .getOperatingSystemMXBean(); - monitorInfo.setTotalPhysicsMemory(operatingSystemMXBean - .getTotalPhysicalMemorySize()); - monitorInfo.setFreePhysicsMemory(operatingSystemMXBean - .getFreePhysicalMemorySize()); - monitorInfo.setUsedPhysicsMemory(monitorInfo.getTotalPhysicsMemory() - - monitorInfo.getFreePhysicsMemory()); - ThreadGroup parentThread; - for (parentThread = Thread.currentThread().getThreadGroup(); parentThread - .getParent() != null; parentThread = parentThread.getParent()) - ; - double cpuRatio = 0; - if (monitorInfo.getOperationSystem().toLowerCase() - .startsWith("windows")) { - cpuRatio = this.getCpuRatioForWindows(); - } else { - cpuRatio = this.getCpuRatioForLinux(); - } - monitorInfo.setCpuRatio(cpuRatio); - return monitorInfo; - } - - private double getCpuRatioForLinux() { - InputStream is = null; - InputStreamReader isr = null; - BufferedReader br = null; - StringTokenizer tokenStat = null; - try { - Process process = Runtime.getRuntime().exec("top -b -n 1"); - is = process.getInputStream(); - isr = new InputStreamReader(is); - br = new BufferedReader(isr); - br.readLine(); - br.readLine(); - tokenStat = new StringTokenizer(br.readLine()); - tokenStat.nextToken(); - tokenStat.nextToken(); - tokenStat.nextToken(); - tokenStat.nextToken(); - tokenStat.nextToken(); - tokenStat.nextToken(); - tokenStat.nextToken(); - String cpuUsage = tokenStat.nextToken(); - Float usage = new Float( - cpuUsage.substring(0, cpuUsage.indexOf("%"))); - return (1 - usage.floatValue() / 100); - } catch (Exception e) { - e.printStackTrace(); - return -1; - } finally { - try { - if (is != null) { - is.close(); - } - if (isr != null) { - isr.close(); - } - if (br != null) { - br.close(); - } - } catch (Exception e) { - e.printStackTrace(); - } - } - } - - private double getCpuRatioForWindows() { - try { - String procCmd = System.getenv("windir") - + "\\system32\\wbem\\wmic.exe process get Caption,CommandLine," - + "KernelModeTime,ReadOperationCount,ThreadCount,UserModeTime,WriteOperationCount"; - // 取进程信息 - long[] c0 = readCpu(Runtime.getRuntime().exec(procCmd)); - Thread.sleep(CPUTIME); - long[] c1 = readCpu(Runtime.getRuntime().exec(procCmd)); - if (c0 != null && c1 != null) { - long idletime = c1[0] - c0[0]; - long busytime = c1[1] - c0[1]; - return Double.valueOf( - PERCENT * (busytime) / (busytime + idletime)) - .doubleValue(); - } else { - return 0.0; - } - } catch (Exception ex) { - ex.printStackTrace(); - return 0.0; - } - } - - private long[] readCpu(final Process proc) { - long[] retn = new long[2]; - try { - proc.getOutputStream().close(); - InputStreamReader ir = new InputStreamReader(proc.getInputStream()); - LineNumberReader input = new LineNumberReader(ir); - String line = input.readLine(); - if (line == null || line.length() < FAULTLENGTH) { - return null; - } - int capidx = line.indexOf("Caption"); - int cmdidx = line.indexOf("CommandLine"); - int rocidx = line.indexOf("ReadOperationCount"); - int umtidx = line.indexOf("UserModeTime"); - int kmtidx = line.indexOf("KernelModeTime"); - int wocidx = line.indexOf("WriteOperationCount"); - long idletime = 0; - long kneltime = 0; - long usertime = 0; - while ((line = input.readLine()) != null) { - if (line.length() < wocidx) { - continue; - } - - String caption = line.substring(capidx, cmdidx - 1).trim(); - String cmd = line.substring(cmdidx, kmtidx - 1).trim(); - if (cmd.indexOf("wmic.exe") >= 0) { - continue; - } - if (caption.equals("System Idle Process") - || caption.equals("System")) { - idletime += Long.valueOf( - line.substring(kmtidx, rocidx - 1).trim()) - .longValue(); - idletime += Long.valueOf( - line.substring(umtidx, wocidx - 1).trim()) - .longValue(); - continue; - } - kneltime += Long.valueOf( - line.substring(kmtidx, rocidx - 1).trim()).longValue(); - usertime += Long.valueOf( - line.substring(umtidx, wocidx - 1).trim()).longValue(); - } - retn[0] = idletime; - retn[1] = kneltime + usertime; - return retn; - } catch (Exception e) { - e.printStackTrace(); - return null; - } finally { - try { - proc.getInputStream().close(); - } catch (Exception e) { - e.printStackTrace(); - } - } - } -} +package org.bench4q.monitor.service; + +import java.io.BufferedReader; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.LineNumberReader; +import java.lang.management.ManagementFactory; +import java.util.StringTokenizer; + +import com.sun.management.OperatingSystemMXBean; + +import org.bench4q.monitor.entity.MonitorInfo; +import org.springframework.stereotype.Component; + +@Component +public class MonitorService { + + private static final int CPUTIME = 30; + private static final int PERCENT = 100; + private static final int FAULTLENGTH = 10; + + public MonitorInfo getMonitorInfo() { + MonitorInfo monitorInfo = new MonitorInfo(); + monitorInfo.setTotalVirtualMachineMemory(Runtime.getRuntime() + .totalMemory()); + monitorInfo.setFreeVirtualMachineMemory(Runtime.getRuntime() + .freeMemory()); + monitorInfo + .setMaxVirtualMachineMemory(Runtime.getRuntime().maxMemory()); + monitorInfo.setOperationSystem(System.getProperty("os.name")); + OperatingSystemMXBean operatingSystemMXBean = (OperatingSystemMXBean) ManagementFactory + .getOperatingSystemMXBean(); + monitorInfo.setTotalPhysicsMemory(operatingSystemMXBean + .getTotalPhysicalMemorySize()); + monitorInfo.setFreePhysicsMemory(operatingSystemMXBean + .getFreePhysicalMemorySize()); + monitorInfo.setUsedPhysicsMemory(monitorInfo.getTotalPhysicsMemory() + - monitorInfo.getFreePhysicsMemory()); + ThreadGroup parentThread; + for (parentThread = Thread.currentThread().getThreadGroup(); parentThread + .getParent() != null; parentThread = parentThread.getParent()) + ; + double cpuRatio = 0; + if (monitorInfo.getOperationSystem().toLowerCase() + .startsWith("windows")) { + cpuRatio = this.getCpuRatioForWindows(); + } else { + cpuRatio = this.getCpuRatioForLinux(); + } + monitorInfo.setCpuRatio(cpuRatio); + return monitorInfo; + } + + private double getCpuRatioForLinux() { + InputStream is = null; + InputStreamReader isr = null; + BufferedReader br = null; + StringTokenizer tokenStat = null; + try { + Process process = Runtime.getRuntime().exec("top -b -n 1"); + is = process.getInputStream(); + isr = new InputStreamReader(is); + br = new BufferedReader(isr); + br.readLine(); + br.readLine(); + tokenStat = new StringTokenizer(br.readLine()); + tokenStat.nextToken(); + tokenStat.nextToken(); + tokenStat.nextToken(); + tokenStat.nextToken(); + tokenStat.nextToken(); + tokenStat.nextToken(); + tokenStat.nextToken(); + String cpuUsage = tokenStat.nextToken(); + Float usage = new Float( + cpuUsage.substring(0, cpuUsage.indexOf("%"))); + return (1 - usage.floatValue() / 100); + } catch (Exception e) { + e.printStackTrace(); + return -1; + } finally { + try { + if (is != null) { + is.close(); + } + if (isr != null) { + isr.close(); + } + if (br != null) { + br.close(); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + private double getCpuRatioForWindows() { + try { + String procCmd = System.getenv("windir") + + "\\system32\\wbem\\wmic.exe process get Caption,CommandLine," + + "KernelModeTime,ReadOperationCount,ThreadCount,UserModeTime,WriteOperationCount"; + // 取进程信息 + long[] c0 = readCpu(Runtime.getRuntime().exec(procCmd)); + Thread.sleep(CPUTIME); + long[] c1 = readCpu(Runtime.getRuntime().exec(procCmd)); + if (c0 != null && c1 != null) { + long idletime = c1[0] - c0[0]; + long busytime = c1[1] - c0[1]; + return Double.valueOf( + PERCENT * (busytime) / (busytime + idletime)) + .doubleValue(); + } else { + return 0.0; + } + } catch (Exception ex) { + ex.printStackTrace(); + return 0.0; + } + } + + private long[] readCpu(final Process proc) { + long[] retn = new long[2]; + try { + proc.getOutputStream().close(); + InputStreamReader ir = new InputStreamReader(proc.getInputStream()); + LineNumberReader input = new LineNumberReader(ir); + String line = input.readLine(); + if (line == null || line.length() < FAULTLENGTH) { + return null; + } + int capidx = line.indexOf("Caption"); + int cmdidx = line.indexOf("CommandLine"); + int rocidx = line.indexOf("ReadOperationCount"); + int umtidx = line.indexOf("UserModeTime"); + int kmtidx = line.indexOf("KernelModeTime"); + int wocidx = line.indexOf("WriteOperationCount"); + long idletime = 0; + long kneltime = 0; + long usertime = 0; + while ((line = input.readLine()) != null) { + if (line.length() < wocidx) { + continue; + } + + String caption = line.substring(capidx, cmdidx - 1).trim(); + String cmd = line.substring(cmdidx, kmtidx - 1).trim(); + if (cmd.indexOf("wmic.exe") >= 0) { + continue; + } + if (caption.equals("System Idle Process") + || caption.equals("System")) { + idletime += Long.valueOf( + line.substring(kmtidx, rocidx - 1).trim()) + .longValue(); + idletime += Long.valueOf( + line.substring(umtidx, wocidx - 1).trim()) + .longValue(); + continue; + } + kneltime += Long.valueOf( + line.substring(kmtidx, rocidx - 1).trim()).longValue(); + usertime += Long.valueOf( + line.substring(umtidx, wocidx - 1).trim()).longValue(); + } + retn[0] = idletime; + retn[1] = kneltime + usertime; + return retn; + } catch (Exception e) { + e.printStackTrace(); + return null; + } finally { + try { + proc.getInputStream().close(); + } catch (Exception e) { + e.printStackTrace(); + } + } + } +} diff --git a/src/main/resources/application-context.xml b/src/main/resources/org/bench4q/monitor/config/application-context.xml similarity index 98% rename from src/main/resources/application-context.xml rename to src/main/resources/org/bench4q/monitor/config/application-context.xml index 6c72d7ff..909a7298 100644 --- a/src/main/resources/application-context.xml +++ b/src/main/resources/org/bench4q/monitor/config/application-context.xml @@ -1,10 +1,10 @@ - - - - - + + + + + diff --git a/src/test/java/org/bench4q/monitor/test/MonitorServiceTest.java b/src/test/java/org/bench4q/monitor/test/MonitorServiceTest.java new file mode 100644 index 00000000..d70a323c --- /dev/null +++ b/src/test/java/org/bench4q/monitor/test/MonitorServiceTest.java @@ -0,0 +1,5 @@ +package org.bench4q.monitor.test; + +public class MonitorServiceTest { + +}