Sigar监控系统性能信息

参考:

使用Sigar监控系统性能

demo用的这个的,jar包也是,也可以从网上自己下载。

这里记录下自己遇到的坑。

 

最终的项目结构,和原作者的差不多,这里只获取盘符信息。

 

创建项目的时候也别需要注意:

到底选择是jdk还是jre,不过最终都要拷贝dll文件到bin目录下面,这里工具类就是SigarUtils.java 

jdk:

jre:

 

SigarUtils.java 

部署到正式项目中,其实只需要执行一次,初始化的时候执行。bin目录中拷贝以后就可以了。

特别注意:这里区分了不同的系统,不同的系统位数。考虑的相当全面了!!!

 

Windows:将sigar.jar包放到classpath下,将sigar-amd64-winnt.dll放到环境变量java.library.path下。

Linux:将sigar.jar包放到classpath下,将libsigar-x86-linux.so放到环境变量java.library.path下。


public class SigarUtils {

	
	/**
	 * 使代码生效需要把一些对应的批处理文件放到java的bin目录下,也就是jdk的bin目录下,不能手动添加,并且分别考虑win和linux系统。
	 * 
	 * Windows:将sigar.jar包放到classpath下,将sigar-amd64-winnt.dll放到环境变量java.library.path下。
	   Linux:将sigar.jar包放到classpath下,将libsigar-x86-linux.so放到环境变量java.library.path下。
	 * 
	 */
	
	private final static String WINDOWS64 = "\\sigar-amd64-winnt.dll";
	private final static String WINDOWS32 = "\\sigar-x86-winnt.dll";
	private final static String LINUX32 = "\\libsigar-x86-linux.so";
	private final static String LINUX64 = "\\libsigar-amd64-linux.so";

	/**
	 * 获取操作系统类型
	 * 
	 * @return
	 */
	public static String getOsType() {
		String osName = System.getProperty("os.name");
		if (!isNull(osName)) {
			System.out.println("osName:" + osName);
			String sysName = "";
			if (osName.toLowerCase().startsWith("windows") || osName.toLowerCase().startsWith("win")) {
				sysName = "windows";
			} else if (osName.toLowerCase().startsWith("linux")) {
				sysName = "linux";
			}
			return sysName;
		}
		return "UnknownSys";
	}

	//操作系统+单位数
	public static String getSysBit() {
		String systemtype = getOsType(); // 获取操作系统类型
		if (systemtype.equalsIgnoreCase("windows")) { // 检测到系统为Windows系统
			String arch = System.getenv("PROCESSOR_ARCHITECTURE");
			String wow64Arch = System.getenv("PROCESSOR_ARCHITEW6432");
			if (arch.endsWith("64") || wow64Arch != null && wow64Arch.endsWith("64")) {
				return systemtype + " 64";
			} else {
				return systemtype + " 32";
			}
		} else if (systemtype.equalsIgnoreCase("linux")) { // 检测到系统为Linux系统
			try {
				Process process = Runtime.getRuntime().exec("getconf LONG_BIT");
				BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
				String s = bufferedReader.readLine();
				if (s.contains("64")) {
					return systemtype + " 64";
				} else {
					return systemtype + " 32";
				}
			} catch (IOException e) {
				return systemtype + " UnknownBit";
			}
		}
		return systemtype + " UnknownBit";
	}

	/**
	 * 判断对象是否为空
	 * 
	 * @param obj
	 * @return
	 */
	public static boolean isNull(Object obj) {
		if (obj instanceof String)
			return obj == null || "".equals(obj);
		if (obj instanceof Collection)
			return ((Collection) obj).size() <= 0;
		if (obj instanceof Map)
			return ((Map) obj).size() <= 0;
		return obj == null;
	}

	public static String getJavaBinPath() {
		String libraryPath = System.getProperty("java.library.path");
		return libraryPath.substring(0, libraryPath.indexOf(";"));
	}

	public static String getUsrDirPath() {
		return System.getProperty("user.dir") + "\\sigar-dll";
	}

	private static void copyFile(String source, String dest) {
		copyFile(new File(source), new File(dest));
	}

	private static void copyFile(File source, File dest) {
		FileChannel inputChannel = null;
		FileChannel outputChannel = null;
		try {
			try {
				inputChannel = new FileInputStream(source).getChannel();
				outputChannel = new FileOutputStream(dest).getChannel();
				outputChannel.transferFrom(inputChannel, 0, inputChannel.size());
			} catch (FileNotFoundException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}
		} finally {
			try {
				inputChannel.close();
				outputChannel.close();
			} catch (IOException e) {
				System.out.println("无该目录访问权限,请手动拷贝" + dest);
				e.printStackTrace();
			}

		}
	}

	public static void chooseFile() {
		String system = getSysBit();
		String srcFile = getUsrDirPath();
		String descFile = getJavaBinPath();
		// windows操作系统单位数未知
		if (system.indexOf("windows") != -1 && system.indexOf("UnknownBit") == -1) {
			copyFile(srcFile + WINDOWS64, descFile + WINDOWS64);
			copyFile(srcFile + WINDOWS32, descFile + WINDOWS32);
			return;
		}
		if (system.indexOf("windows") != -1 && system.endsWith("32")) {
			copyFile(srcFile + WINDOWS32, descFile + WINDOWS32);
		} else {
			copyFile(srcFile + WINDOWS64, descFile + WINDOWS64);
		}

		if (system.indexOf("linux") != -1 && system.indexOf("UnknownBit") == -1) {
			copyFile(srcFile + LINUX64, descFile + LINUX64);
			copyFile(srcFile + LINUX32, descFile + LINUX32);
			return;
		}

		if (system.indexOf("linux") != -1 && system.endsWith("32")) {
			copyFile(srcFile + LINUX32, descFile + LINUX32);
		} else {
			copyFile(srcFile + LINUX64, descFile + LINUX64);
		}

		if (system.indexOf("UnknownSys") != -1) {
			System.out.println("==================未知操作系统,请手动选择命令文件!=================");
		}
	}

	public static void main(String[] args) {

		
		//拷贝dll文件到jdk(执行一次)
//		chooseFile();
		
		System.out.println(System.getProperty("java.library.path"));
		
		System.out.println("getSysBit:" + getSysBit());
		System.out.println("getJavaBinPath:" + getJavaBinPath());
	}
}

 

RuntimeUtils.java

主要类,通过调用dll,获取系统盘符信息。

public class RuntimeUtils {

	public static void main(String[] args) {

		try {
			//文件系统信息
			System.out.println(getDiskInfo()[0].toString());
		} catch (Exception el) {
			el.printStackTrace();
		}
		
	}

	public static DiskInfo[] getDiskInfo() throws Exception{
		Sigar sigar = new Sigar();
		FileSystem fslist[] = sigar.getFileSystemList();	//分区
		DiskInfo[] diskInfos = new DiskInfo[fslist.length];
		for (int i = 0; i < fslist.length; i++) {
			System.out.println("分区的盘符名称" + i);
			DiskInfo diskInfo = new DiskInfo();
			FileSystem fs = fslist[i];
			
			// 分区的盘符名称
			diskInfo.setDiskName(fs.getDevName());
			// 分区的盘符类型
			diskInfo.setDiskType(fs.getSysTypeName());
			
			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 : 本地硬盘
				// 文件系统总大小
				diskInfo.setTotalDisk(usage.getTotal()/1024); //单位 M
				System.out.println(fs.getDevName() + "总大小:    "
						+ usage.getTotal() + "KB");
				// 文件系统剩余大小
				diskInfo.setFreeDisk(usage.getFree()/1024);
				//System.out.println(fs.getDevName() + "剩余大小:    "+ usage.getFree() + "KB");
				
				// 文件系统已经使用量
				//System.out.println(fs.getDevName() + "已经使用量:    "+ usage.getUsed() + "KB");
				double usePercent = usage.getUsePercent() * 100D;
				diskInfo.setResUseAge(usePercent+ "%");
				
				// 文件系统资源的利用率
				System.out.println(fs.getDevName() + "资源的利用率:    " + usePercent+ "%");
				
				break;
			case 3:// TYPE_NETWORK :网络
				break;
			case 4:// TYPE_RAM_DISK :闪存
				break;
			case 5:// TYPE_CDROM :光驱
				break;
			case 6:// TYPE_SWAP :页面交换
				break;
			}
			diskInfo.setReadDisk(usage.getDiskReads());
			diskInfo.setWriteDisk(usage.getDiskWrites());
			diskInfos[i] = diskInfo;
			//System.out.println(fs.getDevName() + "读出:    "+ usage.getDiskReads());
			//System.out.println(fs.getDevName() + "写入:    "+ usage.getDiskWrites());
		}
		return diskInfos;
	}
}

 

DiskInfo.java 

封装盘符信息的实体类,方便数据传递。 

/**
 *	磁盘信息
 */
public class DiskInfo {
	private String diskName;
	private String diskType;
	private long totalDisk;
	private long freeDisk;
	private long useDisk;
	private String resUseAge;
	private long readDisk;
	private long writeDisk;

	public String getDiskName() {
		return diskName;
	}

	public void setDiskName(String diskName) {
		this.diskName = diskName;
	}

	public String getDiskType() {
		return diskType;
	}

	public void setDiskType(String diskType) {
		this.diskType = diskType;
	}

	public long getTotalDisk() {
		return totalDisk;
	}

	public void setTotalDisk(long totalDisk) {
		this.totalDisk = totalDisk;
	}

	public long getFreeDisk() {
		return freeDisk;
	}

	public void setFreeDisk(long freeDisk) {
		this.freeDisk = freeDisk;
	}

	public long getUseDisk() {
		return useDisk;
	}

	public void setUseDisk(long useDisk) {
		this.useDisk = useDisk;
	}

	public String getResUseAge() {
		return resUseAge;
	}

	public void setResUseAge(String resUseAge) {
		this.resUseAge = resUseAge;
	}

	public long getReadDisk() {
		return readDisk;
	}

	public void setReadDisk(long readDisk) {
		this.readDisk = readDisk;
	}

	public long getWriteDisk() {
		return writeDisk;
	}

	public void setWriteDisk(long writeDisk) {
		this.writeDisk = writeDisk;
	}

	@Override
	public String toString() {
		return "DiskInfo [diskName=" + diskName + ", diskType=" + diskType
				+ ", totalDisk=" + totalDisk + ", freeDisk=" + freeDisk
				+ ", useDisk=" + useDisk + ", resUseAge=" + resUseAge
				+ ", readDisk=" + readDisk + ", writeDisk=" + writeDisk + "]";
	}
	
}

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Sugar NMS是一种网络管理系统,用于管理和监控网络设备和服务。它是一个开源项目,源代码可以在GitHub上找到。 Sugar NMS使用Java作为主要编程语言,采用模块化的设计方法,可以轻松地扩展和定制。它提供了丰富的功能,包括全面的设备管理,网络拓扑图显示,性能监控,事件管理,报警通知等。 Sugar NMS的源代码包含不同的模块,每个模块负责特定的功能。例如,设备管理模块负责添加、修改、删除和监控网络设备。同时,该模块还支持对设备进行配置管理和设备发现。除了设备管理,网络拓扑图显示模块可以创建和显示网络拓扑图,以帮助管理员了解网络结构和设备间的连接。 性能监控模块是Sugar NMS的重要组成部分,它可以收集和分析网络设备的性能数据,例如流量、带宽利用率、接口状态等。此外,Sugar NMS还支持配置和触发事件,以便在发生网络问题时进行相应的操作。管理员可以配置不同类型的报警通知,如电子邮件、短信或即时消息,以便及时获得有关网络故障的通知。 总之,Sugar NMS是一个功能强大的网络管理系统,它的源代码可以根据需要进行定制和扩展。它提供了全面的设备管理、网络拓扑图显示、性能监控、事件管理和报警通知等功能,可以帮助管理员更好地管理和监控网络设备和服务。 ### 回答2: Sugar NMS,全称为Sugar Network Management System,是一种基于开源的网络管理系统。 Sugar NMS 提供一系列的功能和工具,用于帮助网络管理员对企业的网络进行监控、配置和管理。它具备网络拓扑图绘制、性能监测、配置管理、日志审计等功能,可帮助用户快速定位和解决网络问题,提高网络的安全性和稳定性。 Sugar NMS 的源码是以开源方式发布的,这意味着任何用户都可以获取并自由修改、分发和使用它。这使得用户可以根据自己的需求对Sugar NMS 进行个性化的定制和扩展。 Sugar NMS 的源代码是基于一些主要的开源组件开发的,包括SNMP协议的解析、数据库连接、Web界面设计等。这些组件的选择和整合,使得Sugar NMS 在功能和性能方面都具备优势。 通过查看Sugar NMS 的源码,用户可以深入了解其实现逻辑和技术细节,进而进行二次开发或定制。用户可以根据自己的需求添加特定的功能模块、修改界面设计或集成其他的网络管理工具。 总之,Sugar NMS的源码开放给用户,使用户可以自由的使用、修改和扩展它。这为用户提供了一个强大的工具来管理和监控企业的网络,提高网络的可用性和安全性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿姨不可以嘛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值