我想使用 OSHI 来监控我的远程 Linux 服务器的性能状态,但官方 api 似乎只监控机器的性能状态。
我是否必须将 java 代码放在服务器上才能获得服务器的性能状态? 我可以使用自己的机器来监控远程服务器的性能状态吗?
如您所指出的,OSHI 仅用于从本地计算机读取信息。 您必须使用 OSHI 在远程计算机上运行程序才能获取统计信息。
OSHI 项目的第 249 期概述了一些选项,包括 Dropwizard 指标库,您可以使用该库启用包含数据的 JMX 端口。 但是,以这种方式捕获大量指标可能会增加比所需更多的开销。
或者,Jackson的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.rnWaiting 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 OKrn" + "Content-Type: application/jsonrn"
+ "Accept: application/jsonrn"
// end header
+ "rn"
// 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
,您将获得所有 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"
} ]
},
显然,您希望设置比Web浏览器JSON更好的机制,并且可能将响应范围缩小到仅关注的对象。 但希望这表明将OSHI包含在任何现有的基于Java的网络响应中是多么容易。