从零开始搭建自己的网站十九:Springboot配置sigar进行系统运行分析

一个运行JavaWeb项目,我们需要知道这个系统运行的状况,这里我选择用sigar来获取本地系统信息。

Sigar是Hyperic-hq产品的基础包,是Hyperic HQ主要的数据收集组件。它用来从许多平台收集系统和处理信息. 这些平台包括:Linux, Windows, Solaris, AIX, HP-UX, FreeBSD and Mac。 OSX.Sigar有C,C#,Java和Perl API,java版的API为sigar.jar。sigar.jar的底层是用C语言编写的,它通过本地方法来调用操作系统API来获取系统相关数据。

1、通过Gradle依赖jar包

compile group: 'org.fusesource', name: 'sigar', version: '1.6.4'

2、添加相应的系统配置文件如win下的sigar-x86-winnt.dll,Linux下的libsigar-x86-linux.so及mac os下的libsigar-universal64-macosx.dylib等文件

在ManagerController添加初始化配置文件代码

//静态代码块
static {
    try {
        initSigar();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
//初始化sigar的配置文件
private static void initSigar() throws IOException {
    SigarLoader loader = new SigarLoader(Sigar.class);
    String lib = null;

    try {
        lib = loader.getLibraryName();
    } catch (ArchNotSupportedException var7) {
        logger.error(var7.getMessage(), var7);
    }
    ResourceLoader resourceLoader = new DefaultResourceLoader();
    Resource resource = resourceLoader.getResource("classpath:/sigar/" + lib);
    if (resource.exists()) {
        InputStream is = resource.getInputStream();
        File tempDir = FileUtil.createTempDirectory();
        BufferedOutputStream os = new BufferedOutputStream(new FileOutputStream(new File(tempDir, lib), false));
        StreamUtil.copy(is, os);
        is.close();
        os.close();
        System.setProperty("org.hyperic.sigar.path", tempDir.getCanonicalPath());
    }
}

3、使用sigar获取系统使用情况

/**
 * 管理台首页
 */
@RequestMapping("/index")
public String index(HttpServletRequest request, Model model) throws IOException {
    String user = (String) request.getAttribute("user");
    model.addAttribute("user", user);
    Sigar sigar;
    try {
        //当前时间
        model.addAttribute("nowTime", DateUtil.getDateTime());
        //应用服务器
        ServletContext servletContext = request.getSession().getServletContext();
        model.addAttribute("servletServer", servletContext.getServerInfo());
        //JDK版本
        model.addAttribute("javaVersion", SystemUtil.getJavaVersion());
        sigar = new Sigar();
        CpuInfo[] cpuInfoList = sigar.getCpuInfoList();
        //CPU信息
        model.addAttribute("cpu", cpuInfoList[0].getVendor() + "(" + cpuInfoList[0].getModel() + ") " + cpuInfoList[0].getMhz() + "MHz x " + cpuInfoList.length + "核");
        //操作系统
        String osname = System.getProperties().getProperty("os.name");
        model.addAttribute("osname", osname);
        //服务器内存
        Mem freeMemory = sigar.getMem();
        model.addAttribute("mem", String.format("%.2fG", new Object[]{Double.valueOf((double) freeMemory.getTotal() / 1.073741824E9D)}));
        //JVM内存
        model.addAttribute("jvmMaxMem", String.format("%.2fM", new Object[]{Float.valueOf((float) Runtime.getRuntime().maxMemory() / 1048576.0F)}));
        //
        model.addAttribute("memUsedPercent", String.format("%.2f", new Object[]{Double.valueOf(freeMemory.getUsedPercent())}));
        //CPU使用
        model.addAttribute("cpuUsed", String.format("%.2f", new Object[]{Double.valueOf(CpuPerc.format(sigar.getCpuPerc().getCombined()).replace("%", ""))}));
        long pid = sigar.getPid();
        long startTime = sigar.getProcTime(pid).getStartTime();
        //系统运行时间
        model.addAttribute("runningTime", DateUtil.friendDuration(System.currentTimeMillis() - startTime));
        //系统内存使用
        long maxMemory2 = Runtime.getRuntime().maxMemory();
        long freeMemory1 = Runtime.getRuntime().freeMemory();
        //JVM内存使用
        model.addAttribute("useableMemeory", String.format("%.2f", new Object[]{Double.valueOf((double) (maxMemory2 - freeMemory1) / ((double) maxMemory2 * 1.0D) * 100.0D)}));
    } catch (SigarException e) {
        logger.error("使用sigar获取服务器信息错误:", e);
    }
    return "manager/index";
}
//时间工具类计算总时间
public static String friendDuration(long ms) {
    short ss = 1000;
    int mi = ss * 60;
    int hh = mi * 60;
    int dd = hh * 24;
    long day = ms / (long) dd;
    long hour = (ms - day * (long) dd) / (long) hh;
    long minute = (ms - day * (long) dd - hour * (long) hh) / (long) mi;
    long second = (ms - day * (long) dd - hour * (long) hh - minute * (long) mi) / (long) ss;
    long milliSecond = ms - day * (long) dd - hour * (long) hh - minute * (long) mi - second * (long) ss;
    StringBuilder str = new StringBuilder();
    if (day > 0L) {
        str.append(day).append("天,");
    }
    if (hour > 0L) {
        str.append(hour).append("小时,");
    }
    if (minute > 0L) {
        str.append(minute).append("分钟,");
    }
    if (second > 0L) {
        str.append(second).append("秒,");
    }
    if (milliSecond > 0L) {
        str.append(milliSecond).append("毫秒,");
    }
    if (str.length() > 0) {
        str = str.deleteCharAt(str.length() - 1);
    }
    return str.toString();
}

4、页面展示

<tr>
  <td>管理员个数:</td>
  <td>1 人</td>
  <td>当前时间:</td>
  <td id="nowTime">${nowTime}</td>
</tr>
<tr>
  <td>CPU:</td>
  <td>${cpu}</td>
  <td>JDK版本:</td>
  <td>${javaVersion}</td>
</tr>
<tr>
  <td>操作系统:</td>
  <td>${osname}</td>
  <td>系统运行时间:</td>
  <td>${runningTime}</td>
</tr>
<tr>
  <td>服务器内存:</td>
  <td>${mem}</td>
  <td>JVM内存:</td>
  <td>${jvmMaxMem}</td>
</tr>
<tr>
  <td>系统内存使用:</td>
  <td>${memUsedPercent}%</td>
  <td>JVM内存使用:</td>
  <td>${useableMemeory}%</td>
</tr>
<tr>
  <td>系统CPU使用:</td>
  <td>${cpuUsed}%</td>
  <td>应用服务器:</td>
  <td>${servletServer}</td>
</tr>

页面情况如下,系统具体使用情况就能看的一目了然。如需其他的数据,可以自行去查看API使用。


评论 抢沙发

表情
  1. #1

    来自匿名的用户(2018-04-17)

    [em_63]

  2. #2

    来自匿名的用户(2018-07-14)

    [em_63]