package org.fh.controller.tools; import java.net.InetAddress; import java.util.HashMap; import java.util.Map; import java.util.Properties; import org.fh.controller.base.BaseController; import org.fh.entity.PageData; import org.hyperic.sigar.CpuInfo; import org.hyperic.sigar.CpuPerc; import org.hyperic.sigar.FileSystem; import org.hyperic.sigar.FileSystemUsage; import org.hyperic.sigar.Mem; import org.hyperic.sigar.NetInterfaceConfig; import org.hyperic.sigar.NetInterfaceStat; import org.hyperic.sigar.Sigar; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; /** * 说明:服务器信息监控 * 作者:FH Admin * from:fhadmin.cn */ @Controller @RequestMapping("/serverRunstate") public class ServerRunstateController extends BaseController { /**获取常量数据 * @return */ @RequestMapping(value="/getData") @ResponseBody public Object getData() throws Exception{ Map<String,Object> map = new HashMap<String,Object>(); Sigar sigar = new Sigar(); String errInfo = "success"; PageData pd = new PageData(); property(pd); //基本信息 gethardDiskData(pd,sigar); //硬盘使用情况 map.put("pd", pd); map.put("result", errInfo); return map; } /**获取事实数据 * @return */ @RequestMapping(value="/realTimeData") @ResponseBody public Object realTimeData() throws Exception{ Map<String,Object> map = new HashMap<String,Object>(); Sigar sigar = new Sigar(); String errInfo = "success"; PageData pd = new PageData(); getJvmMemoryData(pd); //JVM内存 getServerMemoryData(pd,sigar); //服务器内存 getCpuData(pd,sigar); //CPU map.put("pd", pd); map.put("result", errInfo); return map; } /**获取网速 * @return */ @RequestMapping(value="/networkspeed") @ResponseBody public Object networkspeed() throws Exception{ Map<String,Object> map = new HashMap<String,Object>(); Sigar sigar = new Sigar(); String errInfo = "success"; PageData pd = new PageData(); long[] fhbytes1 = getNet(sigar); Thread.sleep(1000); long[] fhbytes2 = getNet(sigar); long rxspeed = fhbytes2[0] - fhbytes1[0]; long txspeed = fhbytes2[1] - fhbytes1[1]; pd.put("rxspeed", (double) Math.round((rxspeed/2014.0) * 100) / 100); //下载网速 pd.put("txspeed", (double) Math.round((txspeed/1024.0) * 100) / 100); //上传网速 map.put("pd", pd); map.put("result", errInfo); return map; } /**获取JVM内存数据 * @param pd * @return * @throws Exception */ private PageData getJvmMemoryData(PageData pd){ double byteToMb = 1024.0 * 1024.0; double jvmTotal = 0; double jvmFree = 0; double jvmUse = 0; Runtime rt = Runtime.getRuntime(); jvmTotal = rt.totalMemory() / byteToMb; jvmFree = rt.freeMemory() / byteToMb; jvmUse = jvmTotal - jvmFree; pd.put("totalJvmMemory", (double) Math.round(jvmTotal * 100) / 100); //JVM总内存空间 pd.put("useJvmMemory", (double) Math.round(jvmUse * 100) / 100); //JVM已使用的内存 return pd; } /**获取服务器内存数据 * @param pd * @param sigar * @throws Exception */ private void getServerMemoryData(PageData pd, Sigar sigar) throws Exception { double byteToGb = 1024.0 * 1024.0 * 1024.0; double serveotal = 0; double serverUse = 0; Mem mem = sigar.getMem(); serveotal = mem.getTotal() / byteToGb; serverUse = mem.getUsed() / byteToGb; pd.put("totalServerMemory", (double) Math.round(serveotal * 100) / 100); //服务器总内存空间 pd.put("useServerMemory", (double) Math.round(serverUse * 100) / 100); //服务器已使用的内存 } /**获取服务器CUP使用率 * @param pd * @param sigar * @throws Exception */ private void getCpuData(PageData pd, Sigar sigar) throws Exception { CpuInfo infos[] = sigar.getCpuInfoList(); CpuPerc cpuList[] = null; cpuList = sigar.getCpuPercList(); double cpuuse = 0; for (int i = 0; i < infos.length; i++) { //多块或者多核心CPU cpuuse += cpuList[i].getCombined() * 100.00; } pd.put("cpuuse", (double) Math.round(((cpuuse/(infos.length * 100))*100) * 100) / 100 );//使用率 } /**获取服务器硬盘情况 * @param pd * @param sigar * @throws Exception */ private void gethardDiskData(PageData pd, Sigar sigar) throws Exception { double byteToGb = 1024.0 * 1024.0; long totalSize = 0; long useSize = 0; FileSystem fslist[] = sigar.getFileSystemList(); for (int i = 0; i < fslist.length; i++) { FileSystem fs = fslist[i]; FileSystemUsage usage = null; usage = sigar.getFileSystemUsage(fs.getDirName()); switch (fs.getType()) { case 0: // TYPE_UNKNOWN :未知 break; case 1: // TYPE_NONE break; case 2: // TYPE_LOCAL_DISK : 本地硬盘 totalSize += usage.getTotal(); //总大小 useSize += usage.getUsed(); //已经使用量 break; case 3:// TYPE_NETWORK :网络 break; case 4:// TYPE_RAM_DISK :闪存 break; case 5:// TYPE_CDROM :光驱 break; case 6:// TYPE_SWAP :页面交换 break; } } pd.put("totalDiskSize",(double) Math.round((totalSize / byteToGb) * 10) / 10); //硬盘总大小 pd.put("useDiskSize",(double) Math.round((useSize / byteToGb) * 10) / 10); //硬盘已使用大小 } /**获取基础信息 * @param pd * @return * @throws Exception */ private PageData property(PageData pd) throws Exception { Runtime r = Runtime.getRuntime(); Properties props = System.getProperties(); InetAddress addr; addr = InetAddress.getLocalHost(); String ip = addr.getHostAddress(); Map<String, String> map = System.getenv(); String userName = map.get("USERNAME");// 获取用户名 pd.put("userName", userName); //计算机用户 pd.put("IP", ip); //本地ip地址 pd.put("HostName", addr.getHostName()); //本地主机名 pd.put("availableProcessors", r.availableProcessors()); //JVM可以使用的处理器个数 pd.put("javaversion", props.getProperty("java.version")); //Java的运行环境版本 pd.put("javahome", props.getProperty("java.home")); //Java的安装路径 pd.put("javavmversion", props.getProperty("java.vm.specification.version")); //Java的虚拟机规范版本 pd.put("javavmname", props.getProperty("java.vm.name")); //Java的虚拟机实现名称 pd.put("javaclassversion", props.getProperty("java.class.version")); //Java的类格式版本号 pd.put("osarch", props.getProperty("os.arch")); //操作系统的构架 pd.put("userdir", props.getProperty("user.dir")); //用户的当前工作目录 return pd; } /**获取接收字节数 * @return * @throws Exception */ private static long[] getNet(Sigar sigar) throws Exception { long[] fhbytes = new long[2]; String ifNames[] = sigar.getNetInterfaceList(); for (int i = 0; i < ifNames.length; i++) { String name = ifNames[i]; NetInterfaceConfig ifconfig = sigar.getNetInterfaceConfig(name); if ((ifconfig.getFlags() & 1L) <= 0L) { continue; } NetInterfaceStat ifstat = sigar.getNetInterfaceStat(name); long fhRxBytes = ifstat.getRxBytes(); long fhTxBytes = ifstat.getTxBytes(); if(fhRxBytes > 0) { fhbytes[0] = fhRxBytes; fhbytes[1] = fhTxBytes; return fhbytes; } } fhbytes[0] = 0; fhbytes[1] = 0; return fhbytes; } }