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

简介: 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<String,Object> map = new HashMap<String,Object>();
    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<String,Object> map = new HashMap<String,Object>();
    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<String,Object> map = new HashMap<String,Object>();
    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<String, String> 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;
  }
}

 

目录
相关文章
|
18天前
|
监控 安全 Java
在 Java 中使用线程池监控以及动态调整线程池时需要注意什么?
【10月更文挑战第22天】在进行线程池的监控和动态调整时,要综合考虑多方面的因素,谨慎操作,以确保线程池能够高效、稳定地运行,满足业务的需求。
96 38
|
14天前
|
SQL 监控 Java
Java连接池技术的最新发展,包括高性能与低延迟、智能化管理与监控、扩展性与兼容性等方面
本文探讨了Java连接池技术的最新发展,包括高性能与低延迟、智能化管理与监控、扩展性与兼容性等方面。同时,结合最佳实践,介绍了如何选择合适的连接池库、合理配置参数、使用监控工具及优化数据库操作,以实现高效稳定的数据库访问。示例代码展示了如何使用HikariCP连接池。
9 2
|
15天前
|
存储 关系型数据库 MySQL
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
187 1
|
18天前
|
Prometheus 监控 Cloud Native
JAVA线程池监控以及动态调整线程池
【10月更文挑战第22天】在 Java 中,线程池的监控和动态调整是非常重要的,它可以帮助我们更好地管理系统资源,提高应用的性能和稳定性。
54 4
|
18天前
|
Prometheus 监控 Cloud Native
在 Java 中,如何使用线程池监控以及动态调整线程池?
【10月更文挑战第22天】线程池的监控和动态调整是一项重要的任务,需要我们结合具体的应用场景和需求,选择合适的方法和策略,以确保线程池始终处于最优状态,提高系统的性能和稳定性。
80 2
|
1月前
|
运维 Java Linux
【运维基础知识】Linux服务器下手写启停Java程序脚本start.sh stop.sh及详细说明
### 启动Java程序脚本 `start.sh` 此脚本用于启动一个Java程序,设置JVM字符集为GBK,最大堆内存为3000M,并将程序的日志输出到`output.log`文件中,同时在后台运行。 ### 停止Java程序脚本 `stop.sh` 此脚本用于停止指定名称的服务(如`QuoteServer`),通过查找并终止该服务的Java进程,输出操作结果以确认是否成功。
34 1
|
1月前
|
SQL 分布式计算 Hadoop
Hadoop-37 HBase集群 JavaAPI 操作3台云服务器 POM 实现增删改查调用操作 列族信息 扫描全表
Hadoop-37 HBase集群 JavaAPI 操作3台云服务器 POM 实现增删改查调用操作 列族信息 扫描全表
32 3
|
1月前
|
分布式计算 资源调度 Hadoop
大数据-01-基础环境搭建 超详细 Hadoop Java 环境变量 3节点云服务器 2C4G XML 集群配置 HDFS Yarn MapRedece
大数据-01-基础环境搭建 超详细 Hadoop Java 环境变量 3节点云服务器 2C4G XML 集群配置 HDFS Yarn MapRedece
72 4
|
1月前
|
存储 数据采集 分布式计算
Hadoop-17 Flume 介绍与环境配置 实机云服务器测试 分布式日志信息收集 海量数据 实时采集引擎 Source Channel Sink 串行复制负载均衡
Hadoop-17 Flume 介绍与环境配置 实机云服务器测试 分布式日志信息收集 海量数据 实时采集引擎 Source Channel Sink 串行复制负载均衡
42 1
|
16天前
|
缓存 监控 Linux
Python 实时获取Linux服务器信息
Python 实时获取Linux服务器信息