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

原创 2018年04月17日 00:32:13

一个运行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使用。​


欢迎转载,转载请注明出处 http://www.dingyinwu.com/article/62.html 

如果文章中有任何问题或者可以改进的地方,请大家多提提意见,我会非常感激。




版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/juewang_love/article/details/79968882

从零开始搭建自己的网站五:登录功能编写

在之前的文章中,我们已经完成网站的整个框架,今天我们就来实现登录功能。登录功能我会把全部代码都贴出来 1、代码如下,分别是对应LoginController,UserService,UserServ...
  • juewang_love
  • juewang_love
  • 2018年02月01日 16:28
  • 171

从零开始搭建自己的网站一:整体步骤

之前我的博客内容都是写在CSDN上(博客地址),后来玩过GitHub(博客地址)。今天我们从零开始搭建一个属于自己的博客网站,包括服务器,数据库等。 步骤分别为: 1、购买一台...
  • juewang_love
  • juewang_love
  • 2018年01月04日 16:16
  • 390

如何从零开始搭建一个网站

一共就四步 1.注册域名 2.购买空间 3.代码部署 4.提交备案 下面我就以我构建木头的收藏夹http://www.mutou888.com这个网站的为例子讲一下过程 服务器选用阿里云,为什么选择阿...
  • kongzhonghu
  • kongzhonghu
  • 2016年01月24日 00:31
  • 15457

从零开始搭建自己的网站二:Springboot项目框架搭建

上一篇文章中,讲的第一、二步购买服务器和绑定域名,我就不细细讲了。本文中会讲解如何构建一个基本的Springboot+freemarker+mybatis项目框架 1、先创建Gradle项目,用Gr...
  • juewang_love
  • juewang_love
  • 2018年01月10日 13:27
  • 296

sigar在Centos和Windows下使用java系统软硬件配置信息

背景本来这个网上一大堆实在没什么想写的,但是好像大多数都是互相抄袭的,在centos根本上用不了,因此我整理下自己具体实现的步骤。使用环境sigar版本:hyperic-sigar-1.6.4 依赖...
  • zjcjava
  • zjcjava
  • 2017年07月01日 17:25
  • 515

从零开始搭建个人网站

从零开始搭建个人网站
  • u012755393
  • u012755393
  • 2017年05月06日 21:10
  • 428

从零开始写一个框架的详细步骤

定位 所谓定位就是回答几个问题,我出于什么目的要写一个框架,我的这个框架是干什么的,有什么特性适用于什么场景,我的这个框架的用户对象是谁,他们会怎么使用,框架由谁维护将来怎么发展等等。 如果你...
  • liu88010988
  • liu88010988
  • 2016年05月31日 17:28
  • 28313

spring boot 中配置文件的读取和多环境配置

配置文件中如果配置项很多的话,最好是写一个或者多个配置对象来读取配置。建议使用yml格式来写配置文件。这种格式更加面向对象一点。比如person: name: zhangsan age: 45...
  • sddh1988
  • sddh1988
  • 2017年05月20日 22:16
  • 485

vue单页面组件工程创建

1.cmd 安装cnpm    百度cnpm npm install -g cnpm --registry=https://registry.npm.taobao.org 2.安装vue ...
  • meilididiao
  • meilididiao
  • 2017年10月31日 12:49
  • 117

从零开始搭建高可用IM系统

此文根据【QCON高可用架构群】分享内容,由群内【编辑组】志愿整理,转发请注明出处。 沈剑,目前任58同城技术委员会主席,高级架构师,优秀讲师。负责过百度hi,58帮帮等im系统...
  • langwang2
  • langwang2
  • 2015年09月24日 18:56
  • 1834
收藏助手
不良信息举报
您举报文章:从零开始搭建自己的网站十九:Springboot配置sigar进行系统运行分析
举报原因:
原因补充:

(最多只允许输入30个字)