SpringBoot使用oshi获取服务器相关信息

概念

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

使用OSHI我们可以对应用程序进行监控,可以对应用程序所在的服务器资源进行监控,可以监控到很多的指标,如下:

1、计算机系统和固件,底板
2、操作系统和版本/内部版本
3、物理(核心)和逻辑(超线程)CPU,处理器组,NUMA节点
4、系统和每个处理器的负载百分比和滴答计数器
5、CPU正常运行时间,进程和线程
6、进程正常运行时间,CPU,内存使用率,用户/组,命令行
7、已使用/可用的物理和虚拟内存
8、挂载的文件系统(类型,可用空间和总空间)
9、磁盘驱动器(型号,序列号,大小)和分区
10、网络接口(IP,带宽输入/输出)
11、电池状态(电量百分比,剩余时间,电量使用情况统计信息)
12、连接的显示器(带有EDID信息)
13、USB设备
14、传感器(温度,风扇速度,电压)

项目结构

在这里插入图片描述

使用

pom.xml

       <!-- 获取系统信息 --><dependency><groupId>com.github.oshi</groupId><artifactId>oshi-core</artifactId><version>3.9.1</version></dependency><!-- 项目中用到了 --><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.5</version></dependency>

domain依次导入实体

package com.wcbtest.oshi.domain;import cn.hutool.core.util.NumberUtil;
import io.swagger.annotations.ApiModel;
import lombok.Data;import java.io.Serializable;@ApiModel(value="CPU信息")
@Data
public class Cpu implements Serializable {private static final long serialVersionUID = 1L;/*** 核心数*/private int cpuNum;/*** CPU总的使用率*/private double total;/*** CPU系统使用率*/private double sys;/*** CPU用户使用率*/private double used;/*** CPU当前等待率*/private double wait;/*** CPU当前空闲率*/private double free;public double getTotal() {return NumberUtil.round(NumberUtil.mul(total, 100), 2).doubleValue();}public double getSys() {return NumberUtil.round(NumberUtil.mul(sys / total, 100), 2).doubleValue();}public double getUsed() {return NumberUtil.round(NumberUtil.mul(used / total, 100), 2).doubleValue();}public double getWait() {return NumberUtil.round(NumberUtil.mul(wait / total, 100), 2).doubleValue();}public double getFree() {return NumberUtil.round(NumberUtil.mul(free / total, 100), 2).doubleValue();}
}package com.wcbtest.oshi.domain;import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.NumberUtil;
import io.swagger.annotations.ApiModel;
import lombok.Data;import java.io.Serializable;
import java.lang.management.ManagementFactory;
import java.util.Date;@ApiModel(value="Jvm信息")
@Data
public class Jvm implements Serializable {private static final long serialVersionUID = 1L;/*** 当前JVM占用的内存总数(M)*/private double total;/*** JVM最大可用内存总数(M)*/private double max;/*** JVM空闲内存(M)*/private double free;/*** JDK版本*/private String version;/*** JDK路径*/private String home;public double getTotal() {return NumberUtil.div(total, (1024 * 1024), 2);}public double getMax() {return NumberUtil.div(max, (1024 * 1024), 2);}public double getFree() {return NumberUtil.div(free, (1024 * 1024), 2);}public double getUsed() {return NumberUtil.div(total - free, (1024 * 1024), 2);}public String getVersion() {return version;}public String getHome() {return home;}public double getUsage() {return NumberUtil.mul(NumberUtil.div(total - free, total, 4), 100);}/*** 获取JDK名称*/public String getName() {return ManagementFactory.getRuntimeMXBean().getVmName();}/*** JDK启动时间*/public String getStartTime() {long time = ManagementFactory.getRuntimeMXBean().getStartTime();Date date = new Date(time);return DateUtil.formatDateTime(date);}/*** JDK运行时间*/public String getRunTime() {long time = ManagementFactory.getRuntimeMXBean().getStartTime();Date date = new Date(time);//运行多少分钟long runMS = DateUtil.between(date, new Date(), DateUnit.MS);long nd = 1000 * 24 * 60 * 60;long nh = 1000 * 60 * 60;long nm = 1000 * 60;long day = runMS / nd;long hour = runMS % nd / nh;long min = runMS % nd % nh / nm;return day + "天" + hour + "小时" + min + "分钟";}
}package com.wcbtest.oshi.domain;import cn.hutool.core.util.NumberUtil;
import io.swagger.annotations.ApiModel;
import lombok.Data;import java.io.Serializable;@ApiModel(value="内存信息")
@Data
public class Mem implements Serializable {private static final long serialVersionUID = 1L;/*** 内存总量*/private double total;/*** 已用内存*/private double used;/*** 剩余内存*/private double free;public double getTotal() {return NumberUtil.div(total, (1024 * 1024 * 1024), 2);}public double getUsed() {return NumberUtil.div(used, (1024 * 1024 * 1024), 2);}public double getFree() {return NumberUtil.div(free, (1024 * 1024 * 1024), 2);}public double getUsage() {return NumberUtil.mul(NumberUtil.div(used, total, 4), 100);}
}package com.wcbtest.oshi.domain;import io.swagger.annotations.ApiModel;
import lombok.Data;import java.io.Serializable;@ApiModel(value="服务器相关信息")
@Data
public class Sys implements Serializable {private static final long serialVersionUID = 1L;/*** 服务器名称*/private String computerName;/*** 服务器Ip*/private String computerIp;/*** 项目路径*/private String userDir;/*** 操作系统*/private String osName;/*** 系统架构*/private String osArch;
}package com.wcbtest.oshi.domain;import io.swagger.annotations.ApiModel;
import lombok.Data;import java.io.Serializable;
@ApiModel(value="磁盘相关信息")
@Data
public class SysFile implements Serializable {private static final long serialVersionUID = 1L;/*** 盘符路径*/private String dirName;/*** 盘符类型*/private String sysTypeName;/*** 文件类型*/private String typeName;/*** 总大小*/private String total;/*** 剩余大小*/private String free;/*** 已经使用量*/private String used;/*** 资源的使用率*/private double usage;
}package com.wcbtest.oshi.domain;import cn.hutool.core.net.NetUtil;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.system.HostInfo;
import cn.hutool.system.SystemUtil;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import oshi.SystemInfo;
import oshi.hardware.CentralProcessor;
import oshi.hardware.CentralProcessor.TickType;
import oshi.hardware.GlobalMemory;
import oshi.software.os.FileSystem;
import oshi.software.os.OSFileStore;
import oshi.software.os.OperatingSystem;
import oshi.util.Util;import java.io.Serializable;
import java.util.LinkedList;
import java.util.List;
import java.util.Properties;@ApiModel(value = "获取系统硬件信息(所有信息)")
@Data
public class SystemHardwareInfo implements Serializable {private static final long serialVersionUID = 1L;private static final int OSHI_WAIT_SECOND = 1000;/*** CPU相关信息*/private Cpu cpu = new Cpu();/*** 內存相关信息*/private Mem mem = new Mem();/*** JVM相关信息*/private Jvm jvm = new Jvm();/*** 服务器相关信息*/private Sys sys = new Sys();/*** 磁盘相关信息*/private List<SysFile> sysFiles = new LinkedList<SysFile>();/*** 调用此方法初始化数据** @throws Exception*/public void initData() {String type = null;SystemInfo si = new SystemInfo();setCpuInfo(si.getHardware().getProcessor());setJvmInfo();setMemInfo(si.getHardware().getMemory());setSysInfo();setSysFiles(si.getOperatingSystem());}/*** 设置CPU信息*/private void setCpuInfo(CentralProcessor processor) {// CPU信息long[] prevTicks = processor.getSystemCpuLoadTicks();Util.sleep(OSHI_WAIT_SECOND);long[] ticks = processor.getSystemCpuLoadTicks();long nice = ticks[TickType.NICE.getIndex()] - prevTicks[TickType.NICE.getIndex()];long irq = ticks[TickType.IRQ.getIndex()] - prevTicks[TickType.IRQ.getIndex()];long softirq = ticks[TickType.SOFTIRQ.getIndex()] - prevTicks[TickType.SOFTIRQ.getIndex()];long steal = ticks[TickType.STEAL.getIndex()] - prevTicks[TickType.STEAL.getIndex()];long cSys = ticks[TickType.SYSTEM.getIndex()] - prevTicks[TickType.SYSTEM.getIndex()];long user = ticks[TickType.USER.getIndex()] - prevTicks[TickType.USER.getIndex()];long iowait = ticks[TickType.IOWAIT.getIndex()] - prevTicks[TickType.IOWAIT.getIndex()];long idle = ticks[TickType.IDLE.getIndex()] - prevTicks[TickType.IDLE.getIndex()];long totalCpu = user + nice + cSys + idle + iowait + irq + softirq + steal;cpu.setCpuNum(processor.getLogicalProcessorCount());cpu.setTotal(totalCpu);cpu.setSys(cSys);cpu.setUsed(user);cpu.setWait(iowait);cpu.setFree(idle);}/*** 设置内存信息*/private void setMemInfo(GlobalMemory memory) {mem.setTotal(memory.getTotal());mem.setUsed(memory.getTotal() - memory.getAvailable());mem.setFree(memory.getAvailable());}/*** 设置服务器信息*/private void setSysInfo() {Properties props = System.getProperties();HostInfo hostInfo = SystemUtil.getHostInfo();String name = hostInfo.getName();sys.setComputerName(name);//sys.setComputerName(IpUtil.getHostName());sys.setComputerIp(NetUtil.getLocalhostStr());sys.setOsName(props.getProperty("os.name"));sys.setOsArch(props.getProperty("os.arch"));sys.setUserDir(props.getProperty("user.dir"));}/*** 设置Java虚拟机*/private void setJvmInfo() {Properties props = System.getProperties();jvm.setTotal(Runtime.getRuntime().totalMemory());jvm.setMax(Runtime.getRuntime().maxMemory());jvm.setFree(Runtime.getRuntime().freeMemory());jvm.setVersion(props.getProperty("java.version"));jvm.setHome(props.getProperty("java.home"));}/*** 设置磁盘信息*/private void setSysFiles(OperatingSystem os) {FileSystem fileSystem = os.getFileSystem();OSFileStore[] fsArray = fileSystem.getFileStores();for (OSFileStore fs : fsArray) {long free = fs.getUsableSpace();long total = fs.getTotalSpace();long used = total - free;SysFile sysFile = new SysFile();sysFile.setDirName(fs.getMount());sysFile.setSysTypeName(fs.getType());sysFile.setTypeName(fs.getName());sysFile.setTotal(convertFileSize(total));sysFile.setFree(convertFileSize(free));sysFile.setUsed(convertFileSize(used));sysFile.setUsage(NumberUtil.round(NumberUtil.mul(used, total, 4), 100).doubleValue());//sysFile.setUsage(NumberUtil.round(NumberUtil.mul((float)used/(float)total, 100), 2).doubleValue());sysFiles.add(sysFile);}}/*** 字节转换** @param size 字节大小* @return 转换后值*/public String convertFileSize(long size) {long kb = 1024;long mb = kb * 1024;long gb = mb * 1024;if (size >= gb) {return String.format("%.1f GB", (float) size / gb);} else if (size >= mb) {float f = (float) size / mb;return String.format(f > 100 ? "%.0f MB" : "%.1f MB", f);} else if (size >= kb) {float f = (float) size / kb;return String.format(f > 100 ? "%.0f KB" : "%.1f KB", f);} else {return String.format("%d B", size);}}
}

controller测试

package com.wcbtest.oshi.controller;import com.wcbtest.oshi.domain.SystemHardwareInfo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@Api(tags = "硬件信息基础接口")
@RequestMapping("/oshi")
public class OshiController {@ApiOperation(value = "获取硬件信息信息")@GetMapping("/sysInfo")public Object all() {SystemHardwareInfo systemHardwareInfo = new SystemHardwareInfo();systemHardwareInfo.initData();return systemHardwareInfo;}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/news/909007.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Boot 3 集成 MyBatis 连接 MySQL 数据库

Spring Boot 3 集成 MyBatis 连接 MySQL 数据库的步骤&#xff1a; 以下是集成 Spring Boot 3、MyBatis、HikariCP 连接池并操作 MySQL 数据库的完整步骤和代码&#xff1a; 一、创建 Spring Boot 项目 添加以下依赖&#xff1a; <dependencies><!-- Spring Web --…

基于React + FastAPI + LangChain + 通义千问的智能医疗问答系统

&#x1f4cc; 文章摘要&#xff1a; 本文详细介绍了如何在前端通过 Fetch 实现与 FastAPI 后端的 流式响应通信&#xff0c;并支持图文多模态数据上传。通过构建 multipart/form-data 请求&#xff0c;配合 ReadableStream 实时读取 AI 回复内容&#xff0c;实现类似 ChatGPT…

YOLOv8 升级之路:主干网络嵌入 SCINet,优化黑暗环境目标检测

文章目录 引言1. 低照度图像检测的挑战1.1 低照度环境对目标检测的影响1.2 传统解决方案的局限性2. SCINet网络原理2.1 SCINet核心思想2.2 网络架构3. YOLOv8与SCINet的集成方案3.1 总体架构设计3.2 关键集成代码3.3 训练策略4. 实验结果与分析4.1 实验设置4.2 性能对比4.3 可视…

所有的Linux桌面环境

Linux操作系统提供了多种桌面环境&#xff0c;每种都有其独特的特点和适用场景。以下是一些常见的Linux桌面环境&#xff1a; 轻量级桌面环境 Xfce&#xff1a;广泛使用的轻量级桌面环境&#xff0c;适合资源有限的设备。Xfce 4.18带来了性能改进和新功能&#xff0c;如Thuna…

@component、@bean、@Configuration的区别

详细解析Spring框架中这三个最核心、也最容易混淆的注解&#xff1a;Component、Bean和Configuration。 为了快速理解&#xff0c;我们先看一个总结性的表格&#xff1a; 注解应用级别作用使用场景Component类级别将类标识为Spring组件&#xff0c;让Spring自动扫描并创建实例…

Android多媒体——音/视同步数据处理(二十)

在多媒体播放过程中,音频数据的处理不仅要保证其解码和输出的连续性,还需要与视频帧保持时间上的严格对齐,以实现良好的观看体验。Android 多媒体框架中的 NuPlayerRenderer 是负责最终渲染音视频数据的核心组件之一。 一、Audio数据处理 NuPlayerRenderer 是 Android 原生…

MYSQL 使用命令mysqldump备份数据库的时候需要用户具备什么权限

背景 之前都是使用数据库root用户备份数据库&#xff0c;没有权限问题&#xff0c;今天使用一个数据库基本用户备份数据库&#xff0c;提示一直没有权限&#xff0c;提示的很明显 mysqldump: Error: Access denied; you need (at least one of) the PROCESS privilege(s) for …

WebRTC源码线程-1

1、概述 本篇主要是简单介绍WebRTC中的线程&#xff0c;WebRTC源码对线程做了很多的封装。 1.1 WebRTC中线程的种类 1.1.1 信令线程 用于与应用层的交互&#xff0c;比如创建offer&#xff0c;answer&#xff0c;candidate等绝大多数的操作 1.1.2 工作线程 负责内部的处理逻辑&…

spring:使用标签xml静态工厂方法获取bean

在spring可以直接通过配置文件获取bean对象&#xff0c;如果获取的bean对象还有若干设置&#xff0c;需要自动完成&#xff0c;可以通过工厂方法获取bean对象。 静态工厂类&#xff0c;其中InterfaceUserDao和InterfaceUserService都是自定义的接口&#xff0c;可以自己替换。…

linux 用户态时间性能优化工具perf/strace/gdb/varlind/gprof

1. perf top -g或者top分析卡顿(cpu占用比较高的函数) gdb 是 GNU 调试器,可以用于分析程序的时间性能。虽然 info time 不是直接用于性能分析的命令,但 gdb 提供了与时间相关的功能,例如通过 timer 命令设置计时器或通过 info proc 查看进程的时间信息。 #include <…

客户端和服务器已成功建立 TCP 连接【输出解析】

文章目录 图片**1. 连接状态解析****第一条记录&#xff08;服务器监听&#xff09;****第二条记录&#xff08;客户端 → 服务器&#xff09;****第三条记录&#xff08;服务器 → 客户端&#xff09;** **2. 关键概念澄清****(1) 0.0.0.0 的含义****(2) 端口号的分配规则** *…

Win系统下的Linux系统——WSL 使用手册

我们在复现一些项目的时候&#xff0c;有些依赖包只能在 linux 环境下使用&#xff0c;还不打算使用远程服务器&#xff0c;那么此时我们可以使用 WSL 创建一个 ubutu 系统&#xff0c;在这个系统里创建虚拟环境、下载依赖包。然后&#xff0c;我们就可以在 windows 下的 vscod…

电脑同时连接内网和外网的方法,附外网连接局域网的操作设置

对于工作一般都设置在内网网段中&#xff0c;而同时由于需求需要连接外网&#xff0c;一般只能通过内网和外网的不断切换进行设置&#xff0c;如果可以同时连接内网和外网会更加便利&#xff0c;同时连接内网和外网方法具体如下。 一、电脑怎么弄可以同时连接内网和外网&#…

C++11:原子操作与内存顺序:从理论到实践的无锁并发实现

文章目录 0.简介1.并发编程需要保证的特性2.原子操作2.1 原子操作的特性 3.内存顺序3.1 顺序一致性3.2 释放-获取&#xff08;Release-Acquire)3.3 宽松顺序&#xff08;Relaxed)3.4 内存顺序 4.无锁并发5. 使用建议 0.简介 在并发编程中&#xff0c;原子性、可见性和有序性是…

oracle 归档日志与RECOVERY_FILE_DEST 视图

1. RECOVERY_FILE_DEST 视图的作用 RECOVERY_FILE_DEST 是 Oracle 数据库用于 管理快速恢复区&#xff08;Fast Recovery Area, FRA&#xff09; 的一个视图。FRA 是 Oracle 提供的一种集中存储恢复相关文件&#xff08;如归档日志、备份文件、闪回日志等&#xff09;的区域。…

零基础玩转物联网-串口转以太网模块如何快速实现与MQTT服务器通信

目录 1 前言 2 环境搭建 2.1 硬件准备 2.2 软件准备 2.3 驱动检查 3 MQTT服务器通信配置与交互 3.1 硬件连接 3.2 开启MQTT服务器 3.3 打开配置工具读取基本信息 3.4 填写连接参数进行连接 3.5 通信测试 4 总结 1 前言 MQTT&#xff1a;全称为消息队列遥测传输协议&#xff08;…

六、Sqoop 导出

作者&#xff1a;IvanCodes 日期&#xff1a;2025年6月7日 专栏&#xff1a;Sqoop教程 Apache Sqoop 不仅擅长从关系型数据库 (RDBMS) 向 Hadoop (HDFS, Hive, HBase) 导入数据&#xff0c;同样也强大地支持反向操作——将存储在 Hadoop 中的数据导出 (Export) 回关系型数据库。…

数据结构-如果将堆结构应用到TOP-K问题上会怎样?

数据结构的应用-如何用堆解决TOP-K问题 前言一、TOP-K问题是什么&#xff1f;二、如何用堆解决TOP-K问题1.怎么建堆&#xff0c;建大堆还是小堆&#xff1f;2.代码实现 总结 前言 本篇文章进行如何用堆结构解决TOP-K问题的讲解 一、TOP-K问题是什么&#xff1f; TOP-k问题&am…

Elasticsearch的索引

正向索引和倒排索引 什么是正向索引&#xff1f; 传统的数据库采用正向索引&#xff0c;如MySQL将表中的id创建索引&#xff0c;正向索引在进行不是id为索引进行搜索的时候&#xff0c;会逐条进行查询&#xff0c;比方说 上图的表格&#xff0c;数据库进行逐条查询&#xff0c;…

分散电站,集中掌控,安科瑞光伏云平台助力企业绿色转型

本项目位于香港全境共计52个分布式光伏站&#xff0c;总装机容量8.6MW。发电模式自发自用&#xff0c;余电上网&#xff0c;逆变器采用阳光电源SG100CX、SG20RT等12种型号共计103台&#xff0c;其余型号共计15台。每个站点均配置气象站。 项目采用AcrelCloud-1200分布式光伏运…