SpringBoot 服务器监控 监控系统开销 获取服务器系统的信息用户信息 运行信息 保持稳定

介绍

对服务器的硬件、软件和网络进行实时监控和管理,以确保服务器的性能、稳定性和安全性。它涉及到对服务器各个方面的监控,包括但不限于CPU、内存、硬盘、网络、进程、服务等。通过这些监控,可以及时发现和解决潜在问题,从而避免服务器崩溃、性能下降或安全漏洞。

依赖

Oshi是一个免费的基于JNA的获取操作系统和硬件信息的java库,Github地址是:oshi(opens new window)

它的优点是不需要安装任何其他本机库,并且旨在提供一种跨平台的实现来检索系统信息,例如操作系统版本,进程,内存和CPU使用率,磁盘和分区,设备,传感器等。

这个库可以监测的内容包括:

计算机系统和固件,底板

操作系统和版本/内部版本

物理(核心)和逻辑(超线程)CPU,处理器组,NUMA节点

系统和每个处理器的负载百分比和滴答计数器

CPU正常运行时间,进程和线程

进程正常运行时间,CPU,内存使用率,用户/组,命令行

已使用/可用的物理和虚拟内存

挂载的文件系统(类型,可用空间和总空间)

磁盘驱动器(型号,序列号,大小)和分区

网络接口(IP,带宽输入/输出)

电池状态(电量百分比,剩余时间,电量使用情况统计信息)

连接的显示器(带有EDID信息)

USB设备

传感器(温度,风扇速度,电压)

也就是说配合一个前端界面,完全可以搞定系统监控了。

xml 复制代码
<dependency>
    <groupId>com.github.oshi</groupId>
    <artifactId>oshi-core</artifactId>
    <version>6.4.1</version>
</dependency>

<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.8.38</version>
</dependency>

实体类

javascript 复制代码
@Data
public class SystemRuntimeInfo {

    /**
     * java信息
     */
    private JvmSpecInfo jvm;

    /**
     * 系统信息
     */
    private OsInfo systemInfo;

    /**
     * 网络信息
     */
    private List<NetworkIF> networkInfo;

    /**
     * 用户信息
     */
    private UserInfo userInfo;

    /**
     * cpu信息
     */
    private CpuInfo cpuInfo;

    /**
     * 内存信息
     */
    private GlobalMemory memoryInfo;

    /**
     * 磁盘信息
     */
    private List<HWDiskStore> diskList;

}

系统调用

javascript 复制代码
@GetMapping("/info")
public R getInfo(){

    // 创建一个SystemRuntimeInfo对象,用于存储系统运行信息
    SystemRuntimeInfo sys = new SystemRuntimeInfo();

    // 设置网络信息,通过OshiUtil工具类获取网络接口信息
    sys.setNetworkInfo(OshiUtil.getNetworkIFs());

    // 设置用户信息,通过SystemUtil工具类获取当前用户信息
    sys.setUserInfo(SystemUtil.getUserInfo());

    // 设置CPU信息,通过OshiUtil工具类获取CPU相关信息
    sys.setCpuInfo(OshiUtil.getCpuInfo());

    // 设置内存信息,通过OshiUtil工具类获取内存相关信息
    sys.setMemoryInfo(OshiUtil.getMemory());

    // 设置磁盘信息,通过OshiUtil工具类获取磁盘存储相关信息
    sys.setDiskList(OshiUtil.getDiskStores());

    // 设置系统信息,通过SystemUtil工具类获取操作系统相关信息
    sys.setSystemInfo(SystemUtil.getOsInfo());

    // 设置JVM信息,通过SystemUtil工具类获取JVM规格信息
    sys.setJvm(SystemUtil.getJvmSpecInfo());

    // 返回成功的响应,包含系统运行信息
    return R.success("获取成功", sys);
}

返回结果

javascript 复制代码
{
  "msg": "获取成功",  // 获取数据的消息,表示成功
  "code": 200,  // 状态码,200表示请求成功
  "data": {
    "jvm": {  // JVM 信息(Java 虚拟机)
      "name": "Java Virtual Machine Specification",  // JVM 名称
      "version": "1.8",  // JVM 版本
      "vendor": "Oracle Corporation"  // JVM 供应商
    },
    "systemInfo": {  // 系统信息
      "name": "Windows 10",  // 操作系统名称
      "pathSeparator": ";",  // 系统路径分隔符
      "version": "10.0",  // 操作系统版本
      "windows": true,  // 是否为 Windows 操作系统
      "mac": false,  // 是否为 Mac 操作系统
      "linux": false,  // 是否为 Linux 操作系统
      "solaris": false,  // 是否为 Solaris 操作系统
      "macOsX": false,  // 是否为 MacOSX 操作系统
      "windows10": true,  // 是否为 Windows 10 操作系统
      "fileSeparator": "\\",  // 文件分隔符
      "arch": "amd64",  // 系统架构
      "lineSeparator": "\r\n",  // 换行符
      "irix": false,  // 是否为 IRIX 操作系统
      "windowsXP": false,  // 是否为 Windows XP 操作系统
      "windows95": false,  // 是否为 Windows 95 操作系统
      "windowsNT": false,  // 是否为 Windows NT 操作系统
      "windows8": false,  // 是否为 Windows 8 操作系统
      "windows8_1": false,  // 是否为 Windows 8.1 操作系统
      "windowsME": false,  // 是否为 Windows ME 操作系统
      "windows2000": false,  // 是否为 Windows 2000 操作系统
      "windows7": false  // 是否为 Windows 7 操作系统
    },
    "networkInfo": [  // 网络信息
      {
        "name": "wlan0",  // 网络接口名称
        "displayName": "Microsoft Wi-Fi Direct Virtual Adapter #3",  // 显示的适配器名称
        "index": 6,  // 网络接口的索引
        "mtu": 1500,  // 最大传输单元
        "ifType": 71,  // 接口类型
        "macaddr": "10:5f:ad:ea:44:ef",  // MAC 地址
        "ipv6addr": ["fe80:0:0:0:b61d:ae2f:9575:d731"],  // IPv6 地址
        "ifAlias": "本地连接* 11",  // 网络接口的别名
        "ifOperStatus": "DOWN"  // 接口状态,DOWN表示未启用
      },
      {
        "name": "wlan1",  // 网络接口名称
        "displayName": "Microsoft Wi-Fi Direct Virtual Adapter #4",  // 显示的适配器名称
        "index": 10,  // 网络接口的索引
        "mtu": 1500,  // 最大传输单元
        "ifType": 71,  // 接口类型
        "macaddr": "12:5f:ad:ea:44:ee",  // MAC 地址
        "ipv6addr": ["fe80:0:0:0:bf9c:7f64:1b03:fac2"],  // IPv6 地址
        "ifAlias": "本地连接* 12",  // 网络接口的别名
        "ifOperStatus": "DOWN"  // 接口状态,DOWN表示未启用
      },
      {
        "name": "eth5",  // 网络接口名称
        "displayName": "VMware Virtual Ethernet Adapter for VMnet8",  // 显示的适配器名称
        "index": 17,  // 网络接口的索引
        "mtu": 1500,  // 最大传输单元
        "subnetMasks": [24],  // 子网掩码
        "ipv4addr": ["172.23.4.1"],  // IPv4 地址
        "ipv6addr": ["fe80:0:0:0:317b:6964:e456:cf2e"],  // IPv6 地址
        "ifAlias": "VMware Network Adapter VMnet8",  // 网络接口的别名
        "ifOperStatus": "UP"  // 接口状态,UP表示已启用
      },
      {
        "name": "wlan3",  // 网络接口名称
        "displayName": "Intel(R) Wi-Fi 6 AX101 #2",  // 显示的适配器名称
        "index": 18,  // 网络接口的索引
        "mtu": 1500,  // 最大传输单元
        "ipv4addr": ["192.168.1.101"],  // IPv4 地址
        "ipv6addr": ["fe80:0:0:0:5877:550d:1ad8:ec56"],  // IPv6 地址
        "ifAlias": "WLAN 2",  // 网络接口的别名
        "ifOperStatus": "UP"  // 接口状态,UP表示已启用
      }
    ],
    "userInfo": {  // 用户信息
      "name": "13169",  // 用户名
      "language": "zh",  // 语言
      "country": "CN",  // 国家
      "tempDir": "C:\\Users\\13169\\AppData\\Local\\Temp\\",  // 临时目录
      "homeDir": "C:\\Users\\13169\\",  // 用户主目录
      "currentDir": "C:\\Users\\13169\\Desktop\\r-test\\"  // 当前工作目录
    },
    "cpuInfo": {  // CPU 信息
      "cpuNum": 16,  // CPU 核心数量
      "cpuModel": "13th Gen Intel(R) Core(TM) i7-13620H\n 1 physical CPU package(s)\n 10 physical CPU core(s) (6 performance + 4 efficiency)\n 16 logical CPU(s)",  // CPU 型号
      "used": 1.33,  // CPU 使用率
      "free": 98.67,  // 剩余空闲CPU百分比
      "sys": 0.57,  // 系统占用CPU百分比
      "user": 0.76  // 用户占用CPU百分比
    },
    "memoryInfo": {  // 内存信息
      "total": 34075996160,  // 总内存(字节)
      "available": 19033587712,  // 可用内存(字节)
      "virtualMemory": {  // 虚拟内存信息
        "swapTotal": 2147483648,  // 交换区总量
        "swapUsed": 98865152,  // 已使用的交换区
        "swapPagesIn": 51135606,  // 交换页面输入次数
        "swapPagesOut": 254378  // 交换页面输出次数
      },
      "physicalMemory": [  // 物理内存信息
        {
          "bankLabel": "BANK 0",  // 内存槽标签
          "capacity": 17179869184,  // 内存容量(字节)
          "clockSpeed": 5600000000,  // 内存时钟频率(赫兹)
          "manufacturer": "Crucial Technology",  // 内存制造商
          "memoryType": "Unknown"  // 内存类型
        },
        {
          "bankLabel": "BANK 0",  // 内存槽标签
          "capacity": 17179869184,  // 内存容量(字节)
          "clockSpeed": 4800000000,  // 内存时钟频率(赫兹)
          "manufacturer": "Samsung",  // 内存制造商
          "memoryType": "Unknown"  // 内存类型
        }
      ]
    },
    "diskList": [  // 硬盘信息
      {
        "name": "\\\\.\\PHYSICALDRIVE0",  // 硬盘名称
        "model": "YMTC PC41Q-512GB-B (标准磁盘驱动器)",  // 硬盘型号
        "size": 512105932800,  // 硬盘总大小(字节)
        "reads": 3909972,  // 读取操作次数
        "writes": 12091183,  // 写入操作次数
        "writeBytes": 343877037056,  // 写入的字节数
        "readBytes": 159831356928,  // 读取的字节数
        "partitions": [  // 硬盘分区信息
          {
            "name": "GPT: Basic Data",  // 分区名称
            "size": 107381522432,  // 分区大小(字节)
            "mountPoint": "C:\\"  // 挂载点
          },
          {
            "name": "GPT: Basic Data",  // 分区名称
            "size": 403661914112,  // 分区大小(字节)
            "mountPoint": "D:\\"  // 挂载点
          }
        ]
      }
    ]
  }
}
相关推荐
uzong2 小时前
技术故障复盘模版
后端
GetcharZp2 小时前
基于 Dify + 通义千问的多模态大模型 搭建发票识别 Agent
后端·llm·agent
桦说编程2 小时前
Java 中如何创建不可变类型
java·后端·函数式编程
IT毕设实战小研3 小时前
基于Spring Boot 4s店车辆管理系统 租车管理系统 停车位管理系统 智慧车辆管理系统
java·开发语言·spring boot·后端·spring·毕业设计·课程设计
wyiyiyi3 小时前
【Web后端】Django、flask及其场景——以构建系统原型为例
前端·数据库·后端·python·django·flask
玩转以太网3 小时前
基于W55MH32Q-EVB 实现 HTTP 服务器配置 OLED 滚动显示信息
服务器·网络协议·http
一只爱撸猫的程序猿3 小时前
使用Spring AI配合MCP(Model Context Protocol)构建一个"智能代码审查助手"
spring boot·aigc·ai编程
甄超锋4 小时前
Java ArrayList的介绍及用法
java·windows·spring boot·python·spring·spring cloud·tomcat
阿华的代码王国4 小时前
【Android】RecyclerView复用CheckBox的异常状态
android·xml·java·前端·后端
Jimmy4 小时前
AI 代理是什么,其有助于我们实现更智能编程
前端·后端·ai编程