Sigar java 服务器信息探针、监控

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 map = new HashMap();
        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 map = new HashMap();
        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 map = new HashMap();
        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 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;
    }

}
 ,>,object>,object>,object>,object>,object>,object>

Original: https://www.cnblogs.com/m17054598469/p/15873602.html
Author: m17054598469
Title: Sigar java 服务器信息探针、监控

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/580296/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • mysql毫秒数引发的问题

    &#x8D77;&#x56E0;&#xFF1A;最近同事在做定时打卡的东西,遇到一个诡异的问题,端只是传了一个开始时间跟打卡周期,剩下的打卡时间都是由服务端…

    Java 2023年6月5日
    076
  • Netty源码解读(二)-服务端源码讲解

    简单Echo案例 代码是netty的源码,我添加了自己理解的中文注释。 了解了Netty的线程模型和组件之后,我们先看看如何写一个简单的Echo案例,后续的源码讲解都基于此案例。以…

    Java 2023年6月16日
    098
  • JPA 入门实战(4)–Spring Data JPA 使用

    本文主要介绍 Spring Boot 中如何使用 Sping Data JPA,相关的环境及软件信息如下:Spring Boot 2.6.10。 1、Sping Data JPA …

    Java 2023年6月16日
    076
  • Java 获取对象全部属性 包括 父类属性

    先看下反射机制是如何获取类的方法的: Class clazz = object.getClass(); clazz.getDeclaredFields(); clazz.getFi…

    Java 2023年5月29日
    074
  • JDK自带线程池学习

    JDK自带线程池 线程池的状态 线程有如下状态 RUNNING状态:Accept new tasks and process queued tasks SHUTDOWN状态:Don…

    Java 2023年6月16日
    083
  • Java lambda date排序

    使用lambda表达式,使用对象的时间字段将list排序。 不多说,直接上代码, Demo对象: 测试list: lambda排序: v 源码地址 Original: https:…

    Java 2023年6月8日
    0185
  • Scanner

    Math:数学类 pow 幂次方计算 字符串连接符 ” “+1+2 = 12 字符串后面都会按照字符串来计算 如果加上括号” “+1…

    Java 2023年6月6日
    073
  • 2 工具系统规划和实现的功能

    一:工具系统规划和实现的功能 主要技术点攻克: 1 :程序间调用和参数传递。 2 :数据文件对应多结构和内部变量定义多结构。 3 :调用程序间的同数据文件的数据结构。 4 :共通程…

    Java 2023年6月8日
    062
  • 二进制转换与位运算

    在应用程序常用的进制包含 &#x4E8C;&#x8FDB;&#x5236; &#x516B;&#x8FDB;&#x5236; &am…

    Java 2023年6月16日
    079
  • This application has no explicit mapping for /error, so you are seeing this as a fallback.

    描述:项目可以通过启动类正常启动,但是访问路径时报错。 原因:启动类放的位置不对,启动类要放在所有包的最前面。 Original: https://www.cnblogs.com/…

    Java 2023年6月5日
    0113
  • 2.5W 字详解线程与锁了,面试随便问

    在 java 并发编程中,线程和锁永远是最重要的概念。语言规范虽然是规范描述,但是其中也有非常多的知识和最佳实践是值得学习的,相信这篇文章还是可以给很多读者提供学习参考的。 本文主…

    Java 2023年6月5日
    087
  • 泛型

    在JDK 1.5 之前,编译器允许我们向容器插入不同类据的数据。例 /* * 现在有一批 Apple * 需求:对这一批产品核对 id 再出仓 */ class Apple{ pr…

    Java 2023年6月5日
    081
  • 权限管理系统之项目框架搭建并集成日志、mybatis和分页

    前一篇博客中使用LayUI实现了列表页面和编辑页面的显示交互,但列表页面table渲染的数据是固定数据,本篇博客主要是将固定数据变成数据库数据。 一、项目框架 首先要解决的是项目框…

    Java 2023年5月30日
    070
  • 为什么会有996

    从发展阶段来看,国内的互联网公司大多都处于 原始积累阶段,大家都是 &#x4F60;&#x6709;&#x4EC0;&#x4E48;&#x5…

    Java 2023年6月15日
    069
  • dubbo源码分析2(jdk原生spi机制)

    jdk中有一个spi的机制,可能很多人听都没听过,我以前也没有听说过,我擦(╯—﹏—)╯(┷━━━┷ 因为一个接口可以有很多个不同的实现类嘛,而spi机制的作用就是使用配置文件可以…

    Java 2023年6月6日
    0115
  • 戏说领域驱动设计(十八)——内验

    验证在我们现实的生活中非常常见,比如您找工作得先整个面试验证你的能力是否靠谱;找对象得先验证下对方的颜值和升值空间。有些工程师写代码从不验证,我觉得是有三个原因,一是意识不够,过于…

    Java 2023年6月7日
    078
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球