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

oshi - 服务器及应用监控库 - 简介与使用_第1张图片
by @Claudia

文章目录

        • 简介
        • 特性
        • 相关资料
        • 运行
        • 具体使用
        • 源码分析
          • SetCpuInfo
          • SetMemInfo
          • SetSysInfo
          • SetJvmInfo
          • SetSysFiles
        • Why oshi?
        • 竞品分析
        • 总结

简介

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 后,对指标数据进行处理后应用图表如图:
oshi - 服务器及应用监控库 - 简介与使用_第2张图片

具体使用

在 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 版本的有问题,建议较新版本的
oshi - 服务器及应用监控库 - 简介与使用_第3张图片
oshi - 服务器及应用监控库 - 简介与使用_第4张图片
代码实现:
首先引入工具类 ArithDateUtils
然后建立实体类:Cpu(CPU运行信息), Jvm(Java虚拟机运行信息), Mem(内存运行信息), Sys(服务器运行信息), SysFile(系统磁盘状态信息) , Server总类(包含之前实体类的所有数据)
最后调用:只需要调用 Server.copyTo() 方法即可获取到之前的运行效果数据信息,如下图
oshi - 服务器及应用监控库 - 简介与使用_第5张图片

源码分析

oshi - 服务器及应用监控库 - 简介与使用_第6张图片

SetCpuInfo

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

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

获取内存信息:此方法需要硬件抽象层类提供的GlobalMemory类(负责跟踪计算机物理内存(RAM)以及可用虚拟内存使用情况)作为参数。通过GlobalMemory类的内置方法:getTotal(获取以字节为单位的实际内存数量)、getAvailable(获取以字节为单位的当前可用的物理内存量)来获取内存信息。
oshi - 服务器及应用监控库 - 简介与使用_第9张图片
oshi - 服务器及应用监控库 - 简介与使用_第10张图片

SetSysInfo

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

SetJvmInfo

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

SetSysFiles

获取系统文件相关信息:首先通过 SystemInfo类获取当前平台操作系统的新实例,再根据 OperatingSystem.getFileSystem()方法实例化FileSystem对象,再通过 getFileStores() 获取本机上文件存储实例化OSFileStore对象列表,表示存储池、设备、分区、卷、具体的文件系统或其他实现特定的文件存储方法信息,该方法会返回OSFileStore对象列表。最后遍历此集合获取磁盘状态信息。
oshi - 服务器及应用监控库 - 简介与使用_第13张图片

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方法 最佳,不用使用外部组件,准确率也是最高的。

以上,谢谢浏览。

你可能感兴趣的:(Java,后端,Widget,java,oshi,服务器及应用监控)