oshi - 服务器及应用监控库 - 简介与使用

2023-11-04

在这里插入图片描述
by @Claudia

简介

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

特性

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

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

相关资料

github 地址:https://github.com/oshi/oshi
API 文档:http://oshi.github.io/oshi/apidocs/

运行

使用 Java 程序集成 oshi 后,对指标数据进行处理后应用图表如图:
在这里插入图片描述

具体使用

在 Spring Boot 项目中,引入以下依赖:

    <!-- 获取系统信息 -->
    <dependency>
      <groupId>com.github.oshi</groupId>
      <artifactId>oshi-core</artifactId>
      <version>5.3.6</version>
    </dependency>

    <dependency>
      <groupId>net.java.dev.jna</groupId>
      <artifactId>jna</artifactId>
      <version>5.6.0</version>
    </dependency>

    <dependency>
      <groupId>net.java.dev.jna</groupId>
      <artifactId>jna-platform</artifactId>
      <version>5.6.0</version>
    </dependency>

在依赖库(External Libraries)里确认依赖,网上有些人反映 net.java.dev.jna:jna 4.2.2 版本的有问题,建议较新版本的
在这里插入图片描述
在这里插入图片描述
代码实现:
首先引入工具类 ArithDateUtils
然后建立实体类:Cpu(CPU运行信息), Jvm(Java虚拟机运行信息), Mem(内存运行信息), Sys(服务器运行信息), SysFile(系统磁盘状态信息) , Server总类(包含之前实体类的所有数据)
最后调用:只需要调用 Server.copyTo() 方法即可获取到之前的运行效果数据信息,如下图
在这里插入图片描述

源码分析

在这里插入图片描述

SetCpuInfo

获取 CPU 信息:此方法需要 CentralProcessor 类(中央处理器)作为参数,oshi库获取CentralProcessor 类步骤为:

  • 首先实例化内置的SystemInfo类(该类用于访问系统和硬件信息)
  • 然后根据此类的内置方法获取硬件抽象层类HardwareAbstractionLayer类,硬件抽象层是一个编程层,主要用于将硬件抽象化,允许计算机操作系统在逻辑层而不是硬件层与硬件设备交互)
  • 最后根据HardwareAbstractionLayer类内置方法获取CentralProcessor 类,提供setCpuInfo方法参数。
    在这里插入图片描述
    如上代码截图所示,长整型数组 prevTicksticks 为中央处理器类 CentralProcessor 在指定时间间隔前后(OSHI_WAIT_SECOND)获取系统范围的CPU负载计数器结果,它返回一个包含7个元素的数组,分别是CPU在七个状态下花费的毫秒数,枚举类型如下所示:
    在这里插入图片描述
    使用 CentralProcessor.TickType.getIndex() 作为索引检索prevTicks数组和ticks数组。通过测量一个时间间隔内 tick 之间的差异,可以计算该时间间隔内的CPU负载。得到CPU核心数、使用率、等待率、空闲率等信息。
SetMemInfo

获取内存信息:此方法需要硬件抽象层类提供的GlobalMemory类(负责跟踪计算机物理内存(RAM)以及可用虚拟内存使用情况)作为参数。通过GlobalMemory类的内置方法:getTotal(获取以字节为单位的实际内存数量)、getAvailable(获取以字节为单位的当前可用的物理内存量)来获取内存信息。
在这里插入图片描述
在这里插入图片描述

SetSysInfo

获取服务器信息:首先调用Java内置的System类的 getProperties() 方法,获取当前系统属性集,并作为一个Properties对象返回,并通过对该属性集通过传参查询,得到操作系统名称、系统架构、项目路径等信息。服务器名称与服务器IP地址则通过IpUtils包装类返回InetAddress(此类为Java内置类,表示一个Internet协议(IP)地址,或许包含它对应的主机名)的 getHostAddressgetHostName 方法获取主机地址与主机名。
在这里插入图片描述

SetJvmInfo

获取Java虚拟机信息:首先通过System系统类获取当前系统属性集后,使用Properties对象传参查询的得到JDK版本与路径;通过获得Java内置的RunTime对象(每个Java应用程序都有一个单独的Runtime类实例,它允许应用程序与运行应用程序的环境进行接口。当前运行时可以从getRuntime方法中获得)获取Java虚拟机的总内存量、 Java 虚拟机试图使用的最大内存量、Java虚拟机中的可用内存量。
在这里插入图片描述

SetSysFiles

获取系统文件相关信息:首先通过 SystemInfo类获取当前平台操作系统的新实例,再根据 OperatingSystem.getFileSystem()方法实例化FileSystem对象,再通过 getFileStores() 获取本机上文件存储实例化OSFileStore对象列表,表示存储池、设备、分区、卷、具体的文件系统或其他实现特定的文件存储方法信息,该方法会返回OSFileStore对象列表。最后遍历此集合获取磁盘状态信息。
在这里插入图片描述

Why oshi?
竞品分析

目前 Java 获取系统CPU和内存使用率大致有三种方法,准确率与适用性分析如下:

方法 准确率 适用Linux系统
oshi 获取的内存数据准确,CPU相对于其他两种方法差距最小 适用
sigar 获取的内存数据稍微有点差距,CPU相对OSMXB好一点 适用
OperatingSystemMXBean 获取的内存数据准确,CPU差距较大 不适用

三种主流方法具体实现方式对比如下:

方法 实现方式 复杂程度
oshi 1 添加项目Maven依赖,实例化Server类,调用Server.copyTo() 方法获取CPU,内存信运行等信息。 适中
sigar 1 使用此方法需要用到外部组件:如果是Windows系统需要将sigar-amd64-winnt.dll文件放到到 C:\Windows\System32 目录下;如果是 Linux 系统需要将libsigar-amd64-linux.so文件放到/usr/lib64目录下 2 添加项目Maven依赖,实例化Sigar类,通过其内置方法getCpuInfoList()获取内置的CpuInfo类列表,以及通过内置getCpuPerc()获取Cpu实例类,根据相关方法再获得Cpu运行信息。 最复杂
OperatingSystemMXBean 1 使用Java内置的ManagementFactory获取目标OperatingSystemMXBean类 2 通过OperatingSystemMXBean类的getSystemCpuLoad(),getTotalPhysicalMemorySize() 等方法获取CPU和内存使用率等信息。 最简单

竞品分析转载自 https://blog.csdn.net/qq_41866138/article/details/105386832,在此感谢原作者

总结

综合考虑使用 oshi方法 最佳,不用使用外部组件,准确率也是最高的。

以上,谢谢浏览。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

oshi - 服务器及应用监控库 - 简介与使用 的相关文章

  • Java 7 默认语言环境

    我刚刚安装了 jre7 我很惊讶地发现我的默认区域设置现在是 en US 对于jre6 它是de CH 与jre7有什么不同 默认区域设置不再是操作系统之一吗 顺便说一句 我使用的是Windows7 谢谢你的回答 编辑 我已经看到了语言环境
  • Oracle Java 教程 - 回答问题时可能出现错误

    我是 Java 新手 正在阅读 Oracle 教程 每个部分之后都有问题和答案 我不明白一个答案中的一句话 见下面的粗体线 来源是https docs oracle com javase tutorial java javaOO QandE
  • 将SQL数据引入jquery availabletag

    我正在尝试制作自动完成文本框 但如何将 SQL 数据包含到 jquery 可用标记并循环它 我无法根据以下代码执行该功能 任何帮助 将不胜感激 谢谢 这是我的预期输出 预期结果演示 http jsfiddle net VvETA 71 jq
  • 埃拉托色尼筛法 - 实现返回一些非质数值?

    我用 Java 实现了埃拉托斯特尼筛法 通过伪代码 public static void sieveofEratosthenes int n boolean numArray numArray new boolean n for int i
  • Android 中 localTime 和 localDate 的替代类有哪些? [复制]

    这个问题在这里已经有答案了 我想使用从 android API 获得的长值 该值将日期返回为长值 表示为自纪元以来的毫秒数 我需要使用像 isBefore plusDays isAfter 这样的方法 Cursor managedCurso
  • FileNotFoundException - Struts2 文件上传

    Strange FileNotFoundException使用Struts2上传文件时 这是 JSP 的一部分
  • Android蓝牙java.io.IOException:bt套接字已关闭,读取返回:-1

    我正在尝试编写一个代码 仅连接到运行 Android 5 0 KitKat 的设备上的 目前 唯一配对的设备 无论我尝试了多少方法 我仍然会收到此错误 这是我尝试过的最后一个代码 它似乎完成了我看到人们报告为成功的所有事情 有人能指出我做错
  • 如何使用正则表达式验证 1-99 范围?

    我需要验证一些用户输入 以确保输入的数字在 1 99 范围内 含 这些必须是整数 Integer 值 允许前面加 0 但可选 有效值 1 01 10 99 09 无效值 0 007 100 10 5 010 到目前为止 我已经制定了以下正则
  • org/codehaus/plexus/archiver/jar/JarArchiver(不支持的major.minor版本49.0)-Maven构建错误

    下午大家 我在尝试构建项目时收到上述错误 我很确定这与使用 Java 1 6 编译的 Maven 最新更新有关 而我们尝试构建的项目是 1 4 项目 在此之前的插件工作没有问题 因此我将以下内容添加到 POM xml 文件中以尝试强制使用现
  • 添加到列表时有没有办法避免循环?

    我想知道这样的代码 List
  • 用于缓存的 Servlet 过滤器

    我正在创建一个用于缓存的 servlet 过滤器 这个想法是将响应主体缓存到memcached 响应正文由以下方式生成 结果是一个字符串 response getWriter print result 我的问题是 由于响应正文将不加修改地放
  • 寻找局部最小值

    下面的代码正确地找到了数组的局部最大值 但未能找到局部最小值 我已经进行了网络搜索 以找到找到最小值的最佳方法 并且根据这些搜索 我认为我正在使用下面的正确方法 但是 在几天的时间里多次检查每一行之后 下面的代码中有一些我仍然没有看到的错误
  • 无法在 Java/Apache HttpClient 中处理带有垂直/管道栏的 url

    例如 如果我想处理这个网址 post new HttpPost http testurl com lists lprocess action LoadList 401814 1 Java Apache 不允许我这么做 因为它说竖线 是非法的
  • JAVA中遍历JSON数据

    我是 JSON 新手 我使用 HTTPUrlConnections 并在 JAVA 程序中获得一些响应 响应数据将类似于 data id 1 userId 1 name ABC modified 2014 12 04 created 201
  • 避免 Java 中的重复导入:继承导入?

    有没有办法 继承 导入 Example 常见枚举 public enum Constant ONE TWO THREE 使用此枚举的基类 public class Base protected void register Constant
  • 无需登录即可直接从 Alfresco 访问文件/内容

    我的场景是这样的 我有一个使用 ALFRESCO CMS 来显示文件或图像的 Web 应用程序 我正在做的是在 Java servlet 中使用用户名和密码登录 alfresco 并且我可以获得该登录的票证 但我无法使用该票证直接从浏览器访
  • 我可以限制分布式应用程序发出的请求吗?

    我的应用程序发出 Web 服务请求 提供商处理的请求有最大速率 因此我需要限制它们 当应用程序在单个服务器上运行时 我曾经在应用程序级别执行此操作 一个对象跟踪到目前为止已发出的请求数量 并在当前请求超出允许的最大负载时等待 现在 我们正在
  • 记录类名、方法名和行号的性能影响

    我正在我的 java 应用程序中实现日志记录 以便我可以调试应用程序投入生产后可能出现的潜在问题 考虑到在这种情况下 人们不会奢侈地使用 IDE 开发工具 以调试模式运行事物或单步执行完整代码 因此在每条消息中记录类名 方法名和行号将非常有
  • 将对象从手机共享到 Android Wear

    我创建了一个应用程序 在此应用程序中 您拥有包含 2 个字符串 姓名和年龄 和一个位图 头像 的对象 所有内容都保存到 sqlite 数据库中 现在我希望可以在我的智能手表上访问这些对象 所以我想实现的是你可以去启动 启动应用程序并向左和向
  • try-with-resources 中出现死代码警告,但翻译后的 try-catch-finally 中没有出现死代码警告

    以下代码使用try 有资源 https docs oracle com javase specs jls se7 html jls 14 html jls 14 20 3Java 8 中引入的构造 偶尔抛出 方法被声明为抛出一个偶尔的异常

随机推荐

  • Prism 框架项目应用篇 - 导航

    Prism 框架项目应用篇 导航 在Prism中 使用Navigation来进行页面之间的跳转通常需要一下几步 创建新页面 并且实现INavigationAware接口 使用IRegionManager注册页面 使用NavigationPa
  • gradle 碰到这样的问题

    gradle 碰到这样的问题 Could not HEAD https repo spring io plugins release com github librepdf openpdf 1 3 30 jaspersoft 2 openp
  • ubuntu安装mysql并远程连接

    ubuntu安装mysql并远程连接 环境 MySQL安装 连接MySQL 一些坑 环境 阿里云轻量级云服务器 ubuntu20 04 MySQL 8 0 27 0ubuntu0 20 04 1 MySQL安装 1 更新源 sudo apt
  • 把本地文件上传到git上面

    1 首先在码云上新建一个项目 记录下仓库项目地址 2 打开本地项目文件的根目录 右击选择git bash here 进入命令控制台 3 窗口输入命令 git init 初始化 会创建出一个 git文件夹 如果看不到可能隐藏 自行更改文件不可
  • 4.9 luogu_p1424

    循环取余 判定周几 include
  • 2021-06-03 类的属性操作__dict__

    1 类属性 公有的 attr 私有的 attr 类里面在定义这个属性的时候 python给它改了名字 class MyClass attr 100 公有属性 类外面可以访问 attr 200 obj MyClass print obj at
  • 有字符csv文件导入matlab_Matlab:如何读取CSV文件以及如何读取带有字符串数据项的CSV文件...

    CSV 逗号分开的文件 如果能快速的读取这些文件中的数据 无疑会帮助我们解决很多问题 1 只有数据的CSV文件 CSV file that includes only numbers As an example create a text
  • java--使用jdbcTemplate进行增删改查

    一 设置数据库连接信息 文件名 jdbc propries jdbc url jdbc mysql 10 0 2 4 63306 test1111111 useUnicode true characterEncoding utf 8 use
  • docker介绍+docker安装

    三问 为什么要用docker docker优势在哪 docker基础操作 一 docker介绍 1 容器就是一种沙盒技术 集装箱子 把应用装起来 容器的本质 进程 容器镜像就是系统里的 exe 安装包 2 docker介绍 1 docker
  • neo4j--Cypher语法练习(WITH、 FOREACH、Aggregation、UNWIND、UNION、CALL)

    1 15 WITH WITH语句将分段的查询部分连接在一起 查询结果从一部分以管道形式传递给另外一部分作为开始点 使用WITH可以在将结果传递到后续查询之前对结果进行操作 操作可以是改变结果的形式或者数量 WITH的一个常见用法就是限制传递
  • [Microsoft][SQLServer 2000 Driver for JDBC]Error establishing socket

    在通过jdbc连接SQL Server经常回出现 Microsoft SQLServer 2000 Driver for JDBC Error establishing socket 原因如下 1 通过url连接的时候指定的服务器名称或者服
  • Python 计算机视觉(十二)—— OpenCV 进行图像分割

    参考的一些文章以及论文我都会给大家分享出来 链接就贴在原文 论文我上传到资源中去 大家可以免费下载学习 如果当天资源区找不到论文 那就等等 可能正在审核 审核完后就可以下载了 大家一起学习 一起进步 加油 目录 前言 1 图像分割 2 读取
  • C++题库

    文章目录 1 求最大值 2 求圆面积 3 编写重载函数来打印字符串 4 设计带构造函数的Dog类 5 定义一个带重载构造函数的日期类 6 C 第三章 指针 动态生成Person类的对象 7 编写一个小小的计算器 能够计算两个浮点数的加 减
  • 使用Myeclipse插件将wsdl生成java客户端代码

    使用环境 MyEclipse9 0 本教程使用Myeclipse内置插件生成java代码 网上说这是xfire插件 不管怎样 生成和调用客户端代码都十分简单 1 在项目上右键 选择New gt Other gt Web Service gt
  • Mysql常用命令行

    Mysql常用命令行 第一招 mysql服务的启动和停止 net stop mysql net start mysql 第二招 登陆mysql 语法如下 mysql u用户名 p用户密码 键入命令mysql uroot p 回车后提示你输入
  • 如何用python调用webservice接口

    最近项目需要去调用其他平台接口 接口类型为webservice接口 跟经常用的http请求还不一样 然后就找到python的suds三方包 以下为根据号码查询归属地接口进行测试和举例 安装suds三方包 命令行 pip3 install s
  • VSCode 的 Local History插件使用

    VSCode 的 Local History 插件使用 在使用vscode编写代码的时候 往往需要查看历史的修改记录 这时可以安装 Local History 插件 安装成功之后 关闭 vscode 然后重新启动就可使用 在左下角可以看到
  • linux 查找安装包路径,查看yum安装软件包的路径

    Linux系统下查找安装包所在目录的方法 linux中查看软件文件安装路径 Linux查看软件安装路径 linux查找安装包路径 rpm查找安装包路径 rpm rpm qa grep php fpm rpm ql php73 php fpm
  • python的struct模块

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 了解c语言的人 一定会知道struct结构体在c语言中的作用 它定义了一种结构 里面包含不同类型的数据 int char bool等等 方便对某一结构对象进行处理 而在网络
  • oshi - 服务器及应用监控库 - 简介与使用

    by Claudia 文章目录 简介 特性 相关资料 运行 具体使用 源码分析 SetCpuInfo SetMemInfo SetSysInfo SetJvmInfo SetSysFiles Why oshi 竞品分析 总结 简介 oshi