Sigar java 伺服器資訊探針、監控

fhadmin發表於2022-02-09
 
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;
	}
	
}


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31558068/viewspace-2854924/,如需轉載,請註明出處,否則將追究法律責任。

相關文章