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
繁體地址,請注明出處:http://hk.pswp.cn/news/909007.shtml
英文地址,請注明出處:http://en.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分布式光伏運…