首页
/ AgileBoot系统监控功能:CPU、内存、磁盘实时监控实现

AgileBoot系统监控功能:CPU、内存、磁盘实时监控实现

2026-01-29 11:57:37作者:吴年前Myrtle

AgileBoot是一款规范易于二开的全栈基础快速开发脚手架,采用Springboot + Vue 3 + Typescript + Mybatis Plus + Redis等技术栈构建。本文将详细介绍AgileBoot后端系统中CPU、内存、磁盘实时监控功能的实现方式,帮助开发者快速了解系统监控模块的核心设计与使用方法。

🖥️ 系统监控核心组件

AgileBoot的系统监控功能主要通过以下核心组件实现:

1. 监控数据模型设计

监控模块的数据模型集中定义在agileboot-domain/src/main/java/com/agileboot/domain/system/monitor/dto/ServerInfo.java文件中,该类包含了系统监控所需的各类信息:

  • CPU信息:通过CpuInfo类封装CPU核心数、使用率、系统占用等指标
  • 内存信息:通过MemoryInfo类记录总内存、已使用内存和可用内存
  • 磁盘信息:通过DiskInfo列表存储各磁盘分区的使用情况
  • JVM信息:通过JvmInfo类监控Java虚拟机的内存使用状态
  • 系统信息:通过SystemInfo类记录服务器名称、IP地址、操作系统等基础信息

2. 监控数据采集实现

ServerInfo类中的fillInfo()方法是数据采集的入口点,它使用oshi库(一个跨平台的系统信息获取库)来收集硬件和操作系统信息:

public static ServerInfo fillInfo() {
    ServerInfo serverInfo = new ServerInfo();
    oshi.SystemInfo si = new oshi.SystemInfo();
    HardwareAbstractionLayer hal = si.getHardware();
    
    serverInfo.fillCpuInfo(hal.getProcessor());
    serverInfo.fillMemoryInfo(hal.getMemory());
    serverInfo.fillSystemInfo();
    serverInfo.fillJvmInfo();
    serverInfo.fillDiskInfos(si.getOperatingSystem());
    
    return serverInfo;
}

CPU监控实现

CPU信息采集通过fillCpuInfo()方法实现,该方法使用oshi的CentralProcessor类获取CPU负载数据:

private void fillCpuInfo(CentralProcessor processor) {
    long[] prevTicks = processor.getSystemCpuLoadTicks();
    Util.sleep(OSHI_WAIT_SECOND); // 等待1秒获取CPU负载变化
    long[] ticks = processor.getSystemCpuLoadTicks();
    
    // 计算各类CPU时间占比
    long totalCpu = user + nice + cSys + idle + ioWait + irq + softIrq + steal;
    cpuInfo.setCpuNum(processor.getLogicalProcessorCount());
    cpuInfo.setTotal(totalCpu);
    cpuInfo.setSys(cSys);
    cpuInfo.setUsed(user);
    cpuInfo.setWait(ioWait);
    cpuInfo.setFree(idle);
}

内存监控实现

内存信息采集通过fillMemoryInfo()方法实现,使用oshi的GlobalMemory类获取系统内存信息:

private void fillMemoryInfo(GlobalMemory memory) {
    memoryInfo.setTotal(memory.getTotal());
    memoryInfo.setUsed(memory.getTotal() - memory.getAvailable());
    memoryInfo.setFree(memory.getAvailable());
}

磁盘监控实现

磁盘信息采集通过fillDiskInfos()方法实现,遍历系统文件系统获取各分区使用情况:

private void fillDiskInfos(OperatingSystem os) {
    FileSystem fileSystem = os.getFileSystem();
    List<OSFileStore> fsArray = fileSystem.getFileStores();
    for (OSFileStore fs : fsArray) {
        long free = fs.getUsableSpace();
        long total = fs.getTotalSpace();
        long used = total - free;
        // 封装磁盘信息到DiskInfo对象
        // ...
    }
}

3. 监控服务层实现

监控数据的获取逻辑在应用服务层MonitorApplicationService.java中实现:

public ServerInfo getServerInfo() {
    return ServerInfo.fillInfo();
}

4. 监控接口暴露

最后,通过MonitorController.java将监控数据以RESTful接口形式暴露:

@GetMapping("/server")
public ResponseDTO<ServerInfo> getServerInfo() {
    ServerInfo serverInfo = monitorApplicationService.getServerInfo();
    return ResponseDTO.ok(serverInfo);
}

🚀 快速使用监控功能

1. 接口调用方式

前端可以通过发送GET请求到/monitor/server接口获取系统监控数据,接口返回格式如下:

{
  "code": 200,
  "message": "success",
  "data": {
    "cpuInfo": {
      "cpuNum": 8,
      "used": 123456,
      "sys": 45678,
      "wait": 1234,
      "free": 987654,
      "total": 1234567
    },
    "memoryInfo": {
      "total": 17179869184,
      "used": 8589934592,
      "free": 8589934592
    },
    "diskInfos": [
      {
        "dirName": "/",
        "sysTypeName": "ext4",
        "typeName": "/dev/sda1",
        "total": "476.9 GB",
        "used": "238.5 GB",
        "free": "238.4 GB",
        "usage": 50.0
      }
    ],
    // 其他监控信息...
  }
}

2. 数据格式转换

ServerInfo类提供了convertFileSize()方法,用于将字节单位的原始数据转换为人类可读的格式(KB/MB/GB):

public String convertFileSize(long size) {
    float castedSize = (float) size;
    if (size >= Constants.GB) {
        return String.format("%.1f GB", castedSize / Constants.GB);
    }
    if (size >= Constants.MB) {
        return String.format("%.1f MB", castedSize / Constants.MB);
    }
    return String.format("%.1f KB", castedSize / Constants.KB);
}

🔧 自定义扩展建议

1. 增加监控指标

如果需要增加更多监控指标(如网络IO、进程信息等),可以:

  1. 在ServerInfo类中添加新的信息封装类
  2. 实现对应的信息采集方法
  3. 在fillInfo()方法中调用新的采集方法

2. 调整采样频率

可以通过修改OSHI_WAIT_SECOND常量调整CPU负载采样的等待时间,默认值为1000毫秒:

private static final int OSHI_WAIT_SECOND = 1000; // 采样等待时间,单位毫秒

3. 添加历史数据存储

如需实现历史数据查询功能,可以扩展MonitorApplicationService.java,将采集到的监控数据定期保存到数据库中。

📊 监控功能总结

AgileBoot的系统监控模块通过清晰的分层设计,将数据采集、数据处理和接口暴露分离,实现了对CPU、内存、磁盘等系统资源的全面监控。核心优势包括:

  • 跨平台兼容性:基于oshi库实现,支持Windows、Linux、macOS等多种操作系统
  • 低侵入设计:采用面向对象的业务建模,不影响其他模块功能
  • 易于扩展:模块化设计使添加新的监控指标变得简单
  • 实时性强:通过定时采样机制保证监控数据的实时性

通过本文的介绍,相信开发者已经对AgileBoot系统监控功能的实现有了全面了解。如需进一步深入学习,可以查看监控模块的单元测试代码ServerInfoTest.java,了解更多测试场景和使用示例。

AgileBoot作为一个面向生产的项目(非玩具项目),其监控模块的设计充分考虑了实际生产环境的需求,为开发者提供了开箱即用的系统监控能力,同时保持了良好的可扩展性,方便根据实际项目需求进行二次开发。

登录后查看全文
热门项目推荐
相关项目推荐