java - 如何使用oshi远程监控Linux服务器的性能状态?

标签 java server-monitoring oshi

我想使用OSHI监控我的远程Linux服务器的性能状态,但是官方的api似乎只能监控 native 的性能状态。

我是否必须将java代码放在服务器上才能获取服务器的性能状态?我可以使用自己的机器来监控远程服务器的性能状态吗?

最佳答案

正如您所指出的,OSHI 仅设计用于从本地计算机读取信息。您必须使用 OSHI 在远程计算机上运行程序来获取统计信息。

Issue 249 on the OSHI project概述了一些选项,包括 Dropwizard Metrics 库,您可以使用该库启用数据的 JMX 端口。但是,以这种方式捕获大量指标可能会增加比所需更多的开销。

或者Jackson's ObjectMapper 能够处理 OSHI 的任何对象。您可以轻松设置 Web 服务器来提供 JSON(或 XML 或 CSV 等)。下面是转储整个 SystemInfo 对象的快速示例:

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
import java.security.NoSuchAlgorithmException;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import com.fasterxml.jackson.databind.ObjectMapper;

import oshi.SystemInfo;

public class WebSocket {
    public static void main(String[] args) throws IOException, NoSuchAlgorithmException {
        ServerSocket server = new ServerSocket(80);
        try {
            System.out.println("Server has started on 127.0.0.1:80.\r\nWaiting for a connection...");
            Socket client = server.accept();
            System.out.println("A client connected.");
            InputStream in = client.getInputStream();
            OutputStream out = client.getOutputStream();
            Scanner s = new Scanner(in, "UTF-8");
            try {
                String data = s.useDelimiter("\\r\\n\\r\\n").next();
                Matcher get = Pattern.compile("^GET").matcher(data);
                if (get.find()) {
                    SystemInfo si = new SystemInfo();
                    ObjectMapper mapper = new ObjectMapper();
                    byte[] response = ("HTTP/1.1 200 OK\r\n" + "Content-Type: application/json\r\n"
                            + "Accept: application/json\r\n"
                            // end header
                            + "\r\n"
                            // write JSON
                            + mapper.writerWithDefaultPrettyPrinter().writeValueAsString(si))
                                    .getBytes(StandardCharsets.UTF_8);
                    out.write(response, 0, response.length);
                }
            } finally {
                s.close();
            }
        } finally {
            server.close();
        }
    }
}

在您的 Linux 服务器上执行上述类,然后通过 Web 浏览器通过 http://yourserver 连接到它,您将获得漂亮的 JSON 格式的所有 OSHI 统计信息。

{
  "hardware" : {
    "computerSystem" : {
      "firmware" : {
        "manufacturer" : "Apple Inc.",
        "version" : "1037.40.124.0.0 (iBridge: 17.16.11081.0.0,0)",
        "description" : "EFI64",
        "name" : "boot.efi",
        "releaseDate" : "10/17/2019"
      },

      <snip>

    "processor" : {
      "maxFreq" : 2300000000,
      "currentFreq" : [ 2300000000, 2300000000, 2300000000, 2300000000, 2300000000, 2300000000, 2300000000, 2300000000, 2300000000, 2300000000, 2300000000, 2300000000, 2300000000, 2300000000, 2300000000, 2300000000 ],
      "contextSwitches" : 156099,
      "interrupts" : 1836212,
      "systemCpuLoadTicks" : [ 37060587, 0, 22431664, -1856553863, 0, 0, 0, 0 ],
      "processorCpuLoadTicks" : [ [ 8458566, 0, 7386132, 140274450, 0, 0, 0, 0 ], [ 120919, 0, 109162, 155889021, 0, 0, 0, 0 ], [ 7848726, 0, 4826688, 143443690, 0, 0, 0, 0 ], [ 117655, 0, 116672, 155884776, 0, 0, 0, 0 ], [ 5675383, 0, 3300677, 147143043, 0, 0, 0, 0 ], [ 116186, 0, 111427, 155891490, 0, 0, 0, 0 ], [ 4235682, 0, 2440832, 149442588, 0, 0, 0, 0 ], [ 114003, 0, 111121, 155893978, 0, 0, 0, 0 ], [ 3471025, 0, 1700387, 150947690, 0, 0, 0, 0 ], [ 111883, 0, 101912, 155905307, 0, 0, 0, 0 ], [ 2713535, 0, 962449, 152443118, 0, 0, 0, 0 ], [ 109036, 0, 73592, 155936474, 0, 0, 0, 0 ], [ 2023118, 0, 626887, 153469097, 0, 0, 0, 0 ], [ 104912, 0, 50922, 155963268, 0, 0, 0, 0 ], [ 1738287, 0, 472098, 153908718, 0, 0, 0, 0 ], [ 101671, 0, 40706, 155976725, 0, 0, 0, 0 ] ],
      "physicalPackageCount" : 1,
      "physicalProcessorCount" : 8,
      "logicalProcessorCount" : 16,

      <snip>

      "identifier" : "Intel64 Family 6 Model 158 Stepping 13",
      "model" : "158",
      "processorIdentifier" : {
        "processorID" : "BFEBFBFF000906ED",
        "cpu64bit" : true,
        "identifier" : "Intel64 Family 6 Model 158 Stepping 13",
        "model" : "158",
        "vendor" : "GenuineIntel",
        "stepping" : "13",
        "vendorFreq" : 2300000000,
        "family" : "6",
        "name" : "Intel(R) Core(TM) i9-9880H CPU @ 2.30GHz"
      },
      "vendor" : "GenuineIntel",
      "stepping" : "13",
      "processorID" : "BFEBFBFF000906ED",
      "cpu64bit" : true,
      "vendorFreq" : 2300000000,
      "family" : "6",
      "name" : "Intel(R) Core(TM) i9-9880H CPU @ 2.30GHz"
    },
    "memory" : {
      "available" : 13347446784,
      "total" : 34359738368,
      "pageSize" : 4096,
      "virtualMemory" : {
        "swapTotal" : 7516192768,
        "swapUsed" : 5921832960,
        "swapPagesIn" : 71667220,
        "swapPagesOut" : 809694
      },
      "physicalMemory" : [ {
        "bankLabel" : "BANK 0/ChannelA-DIMM",
        "capacity" : 17179869184,
        "clockSpeed" : 2400000000,
        "manufacturer" : "Micron",
        "memoryType" : "DDR4"
      }, {
        "bankLabel" : "BANK 2/ChannelB-DIMM",
        "capacity" : 17179869184,
        "clockSpeed" : 2400000000,
        "manufacturer" : "Micron",
        "memoryType" : "DDR4"
      } ]
    },

显然,您希望建立一个比网络浏览器 JSON 更好的机制,并且可能将您的响应范围缩小到仅您关心的对象。但希望这表明将 OSHI 纳入任何现有的基于 Java 的网络响应是多么容易。

关于java - 如何使用oshi远程监控Linux服务器的性能状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58966282/

相关文章:

java - 使用 OSHI lib 计算进程(作业)占用的内存

java - Neo4j OGM 关系仅在一个实体中

java - 如何根据深层嵌套对象内的字段对 Realm 进行排序?

linux - 如何添加 Nagios 自定义状态

java - 如何使用 check_jmx4perl 和 nagios 在一个命令中检查堆内存使用情况和 tomcat 版本

java - 使用 Oshi Java 库获取 Windows PE 的硬件和操作系统信息

java - 使用 Eclipse 获取 NoClassDefFoundError -> com/sun/jna/platform/win32/Psapi

java - 是什么导致速度Template.merge()失败?如何避免呢?

java - Java中转到文件行号