Spring Boot项目里,用oshi-core 6.3.0做个服务器健康监控面板(附完整代码)
Spring Boot集成oshi-core 6.3.0构建企业级服务器监控面板实战在微服务架构盛行的今天系统监控已成为保障服务稳定性的关键环节。对于Java开发者而言如何在Spring Boot项目中快速搭建一套轻量级、低侵入的服务器健康监控系统是提升运维效率的重要课题。本文将带你从零开始基于oshi-core 6.3.0打造一个完整的监控解决方案涵盖数据采集、API封装、可视化展示全流程。1. 监控系统架构设计1.1 技术选型与核心组件现代监控系统通常需要关注四个维度的指标硬件指标CPU、内存、磁盘使用率系统指标OS版本、网络状态JVM指标堆内存、线程数、GC情况应用指标Spring Bean状态、请求量我们采用以下技术栈构建监控系统组件作用优势oshi-core 6.3.0硬件信息采集跨平台、无额外依赖Spring Boot Actuator提供监控端点原生集成、标准协议ECharts数据可视化丰富的图表类型、响应式设计1.2 监控数据流设计完整的监控数据流应包含以下环节数据采集层通过oshi-core获取原始指标数据处理层格式化、聚合原始数据数据存储层时序数据库存储历史数据可选数据展示层前端图表实时渲染// 示例基础监控领域模型 public class ServerMetrics { private CpuStats cpu; private MemoryStats memory; private ListDiskStats disks; private SystemInfo system; private JvmStats jvm; // 嵌套静态类定义各指标结构 Data public static class CpuStats { private int logicalCores; private double systemLoad; private double userLoad; } }2. 核心监控功能实现2.1 依赖配置与基础封装首先在pom.xml中添加必要依赖dependencies dependency groupIdcom.github.oshi/groupId artifactIdoshi-core/artifactId version6.3.0/version /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-actuator/artifactId /dependency /dependencies建议采用分层架构设计监控服务com.example.monitor ├── service │ ├── HardwareCollector.java # 数据采集 ├── model │ ├── MetricDTO.java # 数据传输对象 ├── controller │ ├── MonitorEndpoint.java # REST接口2.2 CPU监控实现进阶oshi-core提供的CPU指标需要二次计算才能得到直观的使用率public CpuStats collectCpuMetrics() { SystemInfo si new SystemInfo(); CentralProcessor cpu si.getHardware().getProcessor(); // 第一次采样 long[] prevTicks cpu.getSystemCpuLoadTicks(); Util.sleep(1000); // 等待1秒间隔 // 第二次采样 long[] ticks cpu.getSystemCpuLoadTicks(); // 计算各状态时间差 long user ticks[CentralProcessor.TickType.USER.getIndex()] - prevTicks[CentralProcessor.TickType.USER.getIndex()]; long system ticks[CentralProcessor.TickType.SYSTEM.getIndex()] - prevTicks[CentralProcessor.TickType.SYSTEM.getIndex()]; long idle ticks[CentralProcessor.TickType.IDLE.getIndex()] - prevTicks[CentralProcessor.TickType.IDLE.getIndex()]; long total user system idle; // 总时间 CpuStats stats new CpuStats(); stats.setLogicalCores(cpu.getLogicalProcessorCount()); stats.setSystemLoad(system * 100.0 / total); stats.setUserLoad(user * 100.0 / total); return stats; }注意Windows和Linux系统获取CPU负载的方式存在差异oshi-core已做好平台适配2.3 内存与磁盘监控优化内存监控需要关注交换分区(swap)的使用情况public MemoryStats collectMemoryMetrics() { GlobalMemory memory new SystemInfo().getHardware().getMemory(); MemoryStats stats new MemoryStats(); stats.setTotal(formatBytes(memory.getTotal())); stats.setAvailable(formatBytes(memory.getAvailable())); stats.setSwapUsed(formatBytes(memory.getVirtualMemory().getSwapUsed())); return stats; } private String formatBytes(long bytes) { return String.format(%.1f GB, bytes / 1024.0 / 1024 / 1024); }磁盘监控建议增加以下增强功能分区inode使用率监控Linux磁盘IOPS和吞吐量监控关键目录使用率告警阈值3. Spring Boot集成方案3.1 Actuator自定义端点扩展Actuator提供监控端点Endpoint(id server-metrics) Component public class ServerMetricsEndpoint { private final HardwareCollector collector; ReadOperation public MapString, Object metrics() { MapString, Object metrics new LinkedHashMap(); metrics.put(cpu, collector.collectCpuMetrics()); metrics.put(memory, collector.collectMemoryMetrics()); metrics.put(disks, collector.collectDiskMetrics()); return metrics; } }在application.yml中配置端点暴露management: endpoints: web: exposure: include: health,info,server-metrics endpoint: server-metrics: cache: time-to-live: 5s # 5秒缓存防止频繁采集3.2 监控数据缓存策略为避免频繁采集带来的性能开销推荐采用以下缓存方案Caffeine缓存适用于单实例部署Redis缓存适用于集群环境定时刷新通过Scheduled定期更新Cacheable(value serverMetrics, key current, cacheManager metricsCacheManager) public ServerMetrics getServerMetrics() { // 采集所有指标 return buildCompleteMetrics(); }4. 可视化仪表板实现4.1 前端工程搭建推荐使用Vue3 ECharts构建监控面板// 安装必要依赖 npm install echarts vue-echarts axios创建核心监控组件template div classmonitor-dashboard v-chart classcpu-chart :optioncpuOption / v-chart classmemory-chart :optionmemoryOption / /div /template script import { use } from echarts/core import { CanvasRenderer } from echarts/renderers import { LineChart } from echarts/charts import { TitleComponent, TooltipComponent } from echarts/components use([CanvasRenderer, LineChart, TitleComponent, TooltipComponent]) export default { data() { return { cpuOption: { title: { text: CPU使用率 }, tooltip: { trigger: axis }, xAxis: { type: category }, yAxis: { type: value }, series: [{ data: [], type: line }] } } }, mounted() { this.fetchData() this.timer setInterval(this.fetchData, 5000) }, methods: { async fetchData() { const res await axios.get(/actuator/server-metrics) this.updateCharts(res.data) } } } /script4.2 ECharts高级配置实现动态实时更新的CPU监控图表const createRealtimeChart () { const option { animation: false, grid: { top: 40, right: 30, bottom: 30, left: 40 }, xAxis: { type: category, boundaryGap: false, data: [] }, yAxis: { max: 100, min: 0 }, series: [ { name: 系统负载, type: line, showSymbol: false, data: [] } ] }; const chart echarts.init(document.getElementById(chart)); chart.setOption(option); // 每5秒更新数据 setInterval(() { fetchMetrics().then(data { const now new Date().toLocaleTimeString(); option.xAxis.data.push(now); option.series[0].data.push(data.cpu.systemLoad); // 保持最近20个数据点 if (option.xAxis.data.length 20) { option.xAxis.data.shift(); option.series[0].data.shift(); } chart.setOption(option); }); }, 5000); };5. 生产环境增强建议5.1 监控指标持久化对于需要历史数据分析的场景建议将监控数据存入时序数据库// InfluxDB写入示例 Scheduled(fixedRate 60000) public void saveMetrics() { ServerMetrics metrics collector.collectAll(); Point point Point.measurement(server_metrics) .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) .addField(cpu_load, metrics.getCpu().getSystemLoad()) .addField(mem_used, metrics.getMemory().getUsed()) .build(); influxDB.write(point); }5.2 告警规则配置通过Spring Boot的ApplicationEvent实现阈值告警EventListener public void checkCpuAlert(ServerMetrics metrics) { if (metrics.getCpu().getSystemLoad() 90) { alertService.sendAlert( CPU告警, String.format(当前CPU负载 %.1f%%, metrics.getCpu().getSystemLoad()) ); } }推荐监控阈值参考值指标警告阈值严重阈值检测频率CPU使用率80%90%1分钟内存使用率85%95%1分钟磁盘使用率90%98%5分钟在实际项目部署时建议将监控面板集成到内部运维平台与日志系统、链路追踪系统联动形成完整的可观测性体系。对于Kubernetes环境可以结合Prometheus实现更全面的监控方案。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2517176.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!