package com.ruben.utils.server;
import oshi.SystemInfo; import oshi.hardware.CentralProcessor; import oshi.hardware.GlobalMemory; import oshi.hardware.HardwareAbstractionLayer; import oshi.software.os.FileSystem; import oshi.software.os.OSFileStore; import oshi.software.os.OperatingSystem; import oshi.util.Util;
import java.math.BigDecimal; import java.math.RoundingMode; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.ArrayList; import java.util.List; import java.util.Properties;
public class ServerOsInfo {
public static ServerInfo getInfo() { ServerInfo info = new ServerInfo(); SystemInfo si = new SystemInfo(); HardwareAbstractionLayer hal = si.getHardware(); CentralProcessor processor = hal.getProcessor(); info.setCpu(setCpuInfo(processor)); GlobalMemory memory = hal.getMemory(); info.setMem(setMemInfo(memory)); info.setSys(setSysInfo()); info.setJvm(setJvmInfo()); OperatingSystem op = si.getOperatingSystem(); info.setFile(setSysFiles(op)); info.setIp(getHostIp()); info.setHostname(getHostName()); return info; }
private static ServerInfo.Cpu setCpuInfo(CentralProcessor processor) { long[] prevTicks = processor.getSystemCpuLoadTicks(); Util.sleep(1000); long[] ticks = processor.getSystemCpuLoadTicks(); double nice = ticks[CentralProcessor.TickType.NICE.getIndex()] - prevTicks[CentralProcessor.TickType.NICE.getIndex()]; double irq = ticks[CentralProcessor.TickType.IRQ.getIndex()] - prevTicks[CentralProcessor.TickType.IRQ.getIndex()]; double softirq = ticks[CentralProcessor.TickType.SOFTIRQ.getIndex()] - prevTicks[CentralProcessor.TickType.SOFTIRQ.getIndex()]; double steal = ticks[CentralProcessor.TickType.STEAL.getIndex()] - prevTicks[CentralProcessor.TickType.STEAL.getIndex()];
double sys = ticks[CentralProcessor.TickType.SYSTEM.getIndex()] - prevTicks[CentralProcessor.TickType.SYSTEM.getIndex()];
double used = ticks[CentralProcessor.TickType.USER.getIndex()] - prevTicks[CentralProcessor.TickType.USER.getIndex()];
double iowait = ticks[CentralProcessor.TickType.IOWAIT.getIndex()] - prevTicks[CentralProcessor.TickType.IOWAIT.getIndex()];
double free = ticks[CentralProcessor.TickType.IDLE.getIndex()] - prevTicks[CentralProcessor.TickType.IDLE.getIndex()];
double total = used + nice + sys + free + iowait + irq + softirq + steal;
int cpuNum = processor.getLogicalProcessorCount();
ServerInfo.Cpu cpu = new ServerInfo.Cpu(); cpu.setCpucard(processor); cpu.setNum(cpuNum); cpu.setUsed(round(mul((sys + used) / total, 100), 2)); cpu.setFree(round(mul(free / total, 100), 2)); return cpu; }
private static ServerInfo.MemoryInfo setMemInfo(GlobalMemory memory) {
double total = +memory.getTotal();
double used = memory.getTotal() - memory.getAvailable();
double free = memory.getAvailable(); ServerInfo.MemoryInfo mem = new ServerInfo.MemoryInfo(); mem.setTotal(div(total, (1024 * 1024 * 1024), 2)); mem.setUsedMem(div(used, (1024 * 1024 * 1024), 2)); mem.setFree(round(mul(free / total, 100), 2)); mem.setUsed(round(mul(used / total, 100), 2)); return mem; }
private static Properties setSysInfo() { return System.getProperties(); }
private static ServerInfo.Jvm setJvmInfo() { ServerInfo.Jvm jvm = new ServerInfo.Jvm(); jvm.setTotal(div(Runtime.getRuntime().totalMemory(), 1024 * 1024, 2)); jvm.setMaxTotal(div(Runtime.getRuntime().maxMemory(), 1024 * 1024, 2)); jvm.setUsedMem(div((Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()), 1024 * 1024, 2)); jvm.setUsed(round(mul((Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) * 1.0 / Runtime.getRuntime().totalMemory(), 100), 2)); return jvm; }
private static List<ServerInfo.FileItem> setSysFiles(OperatingSystem os) { FileSystem fileSystem = os.getFileSystem(); OSFileStore[] fsArray = fileSystem.getFileStores(); List<ServerInfo.FileItem> list = new ArrayList<>(); for (OSFileStore fs : fsArray) { long free = fs.getUsableSpace(); long total = fs.getTotalSpace(); long used = total - free; ServerInfo.FileItem fileItem = new ServerInfo.FileItem(); fileItem.setPath(fs.getMount()); fileItem.setType(fs.getType()); fileItem.setName(fs.getName()); fileItem.setTotal(convertFileSize(total)); fileItem.setFree(convertFileSize(free)); fileItem.setUsed(convertFileSize(used)); fileItem.setRate(div(used, total, 4) * 100); list.add(fileItem); } return list; }
public static 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); } }
public static double div(double v1, double v2, int scale) { return ((double) ((int) (v1 / v2 * Math.pow(10, scale)))) / Math.pow(10, scale);
}
public static double round(double v, int scale) { if (scale < 0) { throw new IllegalArgumentException( "The scale must be a positive integer or zero"); } BigDecimal b = new BigDecimal(Double.toString(v)); BigDecimal one = new BigDecimal("1"); return b.divide(one, scale, RoundingMode.HALF_UP).doubleValue(); }
public static double mul(double v1, double v2) { BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.multiply(b2).doubleValue(); }
public static String getHostIp() { try { return InetAddress.getLocalHost().getHostAddress(); } catch (UnknownHostException ignored) { } return "127.0.0.1"; }
public static String getHostName() { try { return InetAddress.getLocalHost().getHostName(); } catch (UnknownHostException ignored) { } return "未知"; }
public static void main(String[] args) { System.out.println(div(19, 7, 4)); System.out.println(getInfo()); } }
|