写在前面的话:
首先接触到系统监控是对jeesite平台的研究,关于这个平台这里不做过多的赘述,了解这个平台的都知道,它是一个国内开发的快速开发平台,内置了很多的功能,在这里我们主要了解系统监控功能的实现,此平台其中一个内置功能就是监控服务所在服务器相关的数据,但如果我们的项目前后端,数据库分别部署在不同的服务器,我们不可能把整个项目到每个服务器上都部署一遍,所以必须把系统监控单独剔出来用来监控其他服务器的信息;首先通过平台的项目找寻关于系统监控的实现,由于平台核心代码为开源,几乎一无所获,只能自己去找寻实现方法,出现在脑海中的第一个影子就是System类以及Runtime和RuntimeMXBean;但参考平台页面展示的数据,这三个类(或接口)所能获取到的数据远远不够;于是又开始了对平台的研究,最终让我眼前一亮的是在在maven本地仓库中的jeesite-framework找到了sigar相关的一些东西,因为不认识,姑且叫他东西吧!于是开始向度娘寻求帮助,最终找到了关于sigar的介绍,还找到了一些断断续续的demo,那就开干吧!
代码也贴出来吧:
代码链接://download.youkuaiyun.com/download/weixin_45417573/12103961
一、了解需求
根据jeesite平台页面展示的数据,我们可以知道,我们所需要监控的数据包含CPU信息,内存信息,JVM内存信息,堆和非堆的内存信息,jvm的配置信息,操作系统信息,平台信息,硬盘信息等,其中cpu和内存相关信息是实时刷新的,其他信息是打开页面是加载的;如下图:
二、整理思路
1、首先我们要完成任意一台服务器的监控肯定要新建一个springboot项目,让前端发起一个请求,然后把项目所在的服务器监控信息反馈给前端。于是新建一个springboot项目,该项目只需要简单的依赖lombok(用于简化代码和日志输出),web,sigar;如下:
<dependency>
<groupId>org.fusesource</groupId>
<artifactId>sigar</artifactId>
<version>1.6.4</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
2、接下来就开始我们最擅长的pojo,controller,service层代码的完善,这一部分代码是最简单的,就不做展示了,要注意的一点是controller中要写两个方法对应两个请求,一个返回需要实时加载的数据,一个返回只加载一次的数据。controller中的代码如下:
package com.wwy.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.wwy.entry.APIEntry;
import com.wwy.entry.GetEntry;
import com.wwy.entry.RenovateEntry;
import com.wwy.service.SystemService;
/**
*
* @author wwy
* @date 2019-11-6
*获取系统监控的controller
*/
@RestController
@RequestMapping("system")
public class SystemController {
@Autowired
private SystemService systemService;
/**
*
* @return 封装系统监不变的控信息的实体类
*/
@RequestMapping("get")
public APIEntry get() {
GetEntry entry=systemService.get();
return (entry==null)?new APIEntry(500,"数据获取有误",null):new APIEntry(200,"OK",entry);
}
/**
*
* @return 封装系统监固定的的控信息的实体类
*/
@RequestMapping("renovate")
public APIEntry renovate() {
RenovateEntry entry=systemService.renovate();
return (entry==null)?new APIEntry(500,"数据获取有误",null):new APIEntry(200,"OK",entry);
}
}
三、获取监控数据
1、框架已搭好,接下来就是如何获取监控数据了,首先我们想到一部分系统相关的数据我们可以通过System来获取,另一部分jvm相关的数据我们可以通过runtime或者RuntimeMXBean来获取,至于硬件相关的如磁盘,cpu等信息就需要通过我们的神秘高手sigar来获取了,首先要使用sigar需要到官方下载相关的脚本文件,这里可以百度的到,就不提供了,如下:
2、我们要使用这些脚本主要是借助于sigar的依赖,当然官方的脚本里提供的jar包也是可以的;另外要在程序中指定脚本存储的位置,并加载
这里单独写了一个工具类,如下:
package com.wwy.util;
import java.io.File;
import org.hyperic.sigar.Sigar;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import lombok.extern.slf4j.Slf4j;
/**
*
* @author wwy
* @date 2019-11-5
*sigar工具类
*/
@Slf4j
@Component
public class SigarUtils {
/**
* 获取存放脚本的地址
*/
//将脚本存放位置配置在yml文件中,通过@value读取
@Value("${sigar.path}")
private String path;
/**
*
* @return Sigar
* 初始化,加载脚本文件
*/
public Sigar initSigar() {
try {
File classPath = new File(path);
String path = System.getProperty("java.library.path");
String sigarLibPath = classPath.getCanonicalPath();
//防止java.library.path重复加载
if (!path.contains(sigarLibPath)) {
path += (isOSWin()?(";" + sigarLibPath): (":" + sigarLibPath));
System.setProperty(</