AgileBoot系统监控功能:CPU、内存、磁盘实时监控实现
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、进程信息等),可以:
- 在ServerInfo类中添加新的信息封装类
- 实现对应的信息采集方法
- 在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作为一个面向生产的项目(非玩具项目),其监控模块的设计充分考虑了实际生产环境的需求,为开发者提供了开箱即用的系统监控能力,同时保持了良好的可扩展性,方便根据实际项目需求进行二次开发。
Kimi-K2.5Kimi K2.5 是一款开源的原生多模态智能体模型,它在 Kimi-K2-Base 的基础上,通过对约 15 万亿混合视觉和文本 tokens 进行持续预训练构建而成。该模型将视觉与语言理解、高级智能体能力、即时模式与思考模式,以及对话式与智能体范式无缝融合。Python00
GLM-4.7-FlashGLM-4.7-Flash 是一款 30B-A3B MoE 模型。作为 30B 级别中的佼佼者,GLM-4.7-Flash 为追求性能与效率平衡的轻量化部署提供了全新选择。Jinja00
new-apiAI模型聚合管理中转分发系统,一个应用管理您的所有AI模型,支持将多种大模型转为统一格式调用,支持OpenAI、Claude、Gemini等格式,可供个人或者企业内部管理与分发渠道使用。🍥 A Unified AI Model Management & Distribution System. Aggregate all your LLMs into one app and access them via an OpenAI-compatible API, with native support for Claude (Messages) and Gemini formats.JavaScript01
idea-claude-code-gui一个功能强大的 IntelliJ IDEA 插件,为开发者提供 Claude Code 和 OpenAI Codex 双 AI 工具的可视化操作界面,让 AI 辅助编程变得更加高效和直观。Java00
KuiklyUI基于KMP技术的高性能、全平台开发框架,具备统一代码库、极致易用性和动态灵活性。 Provide a high-performance, full-platform development framework with unified codebase, ultimate ease of use, and dynamic flexibility.Kotlin06
ebook-to-mindmapepub、pdf 拆书 AI 总结TSX00