|
|
@@ -0,0 +1,73 @@
|
|
|
+package com.etotem.cfc.controller.admin;
|
|
|
+
|
|
|
+import com.etotem.cfc.common.Result;
|
|
|
+import io.swagger.v3.oas.annotations.Operation;
|
|
|
+import org.springframework.web.bind.annotation.PostMapping;
|
|
|
+import org.springframework.web.bind.annotation.RequestMapping;
|
|
|
+import org.springframework.web.bind.annotation.RestController;
|
|
|
+
|
|
|
+import java.lang.management.ManagementFactory;
|
|
|
+import java.lang.management.MemoryMXBean;
|
|
|
+import java.lang.management.OperatingSystemMXBean;
|
|
|
+import java.lang.management.RuntimeMXBean;
|
|
|
+import java.util.HashMap;
|
|
|
+import java.util.Map;
|
|
|
+
|
|
|
+@RestController
|
|
|
+@RequestMapping("/api/system")
|
|
|
+public class AdminSystemController {
|
|
|
+
|
|
|
+ @Operation(summary = "服务器运行状态")
|
|
|
+ @PostMapping("/health")
|
|
|
+ public Result<Map<String, Object>> health() {
|
|
|
+ Map<String, Object> data = new HashMap<>();
|
|
|
+
|
|
|
+ // JVM uptime
|
|
|
+ RuntimeMXBean runtimeMXBean = ManagementFactory.getRuntimeMXBean();
|
|
|
+ long uptimeMs = runtimeMXBean.getUptime();
|
|
|
+ data.put("uptime", formatUptime(uptimeMs));
|
|
|
+
|
|
|
+ // JVM start time
|
|
|
+ data.put("startTime", new java.util.Date(runtimeMXBean.getStartTime()).toString());
|
|
|
+
|
|
|
+ // Memory
|
|
|
+ MemoryMXBean memoryMXBean = ManagementFactory.getMemoryMXBean();
|
|
|
+ long heapUsed = memoryMXBean.getHeapMemoryUsage().getUsed();
|
|
|
+ long heapMax = memoryMXBean.getHeapMemoryUsage().getMax();
|
|
|
+ data.put("memUsed", formatBytes(heapUsed));
|
|
|
+ data.put("memMax", formatBytes(heapMax));
|
|
|
+ data.put("memUsagePercent", heapMax > 0 ? String.format("%.1f", (double) heapUsed / heapMax * 100) : "0");
|
|
|
+
|
|
|
+ // OS info
|
|
|
+ OperatingSystemMXBean osMXBean = ManagementFactory.getOperatingSystemMXBean();
|
|
|
+ int cpuCores = osMXBean.getAvailableProcessors();
|
|
|
+ double systemLoadAvg = osMXBean.getSystemLoadAverage();
|
|
|
+ data.put("cpuCores", cpuCores);
|
|
|
+ data.put("cpuLoad", systemLoadAvg >= 0 ? String.format("%.2f", systemLoadAvg) : "N/A");
|
|
|
+ data.put("cpuUsagePercent", systemLoadAvg >= 0 && cpuCores > 0 ? String.format("%.1f", systemLoadAvg / cpuCores * 100) : "N/A");
|
|
|
+
|
|
|
+ // Java version
|
|
|
+ data.put("javaVersion", System.getProperty("java.version"));
|
|
|
+ data.put("osName", osMXBean.getName() + " " + osMXBean.getArch());
|
|
|
+ data.put("osVersion", osMXBean.getVersion());
|
|
|
+
|
|
|
+ return Result.success(data);
|
|
|
+ }
|
|
|
+
|
|
|
+ private String formatUptime(long ms) {
|
|
|
+ long seconds = ms / 1000;
|
|
|
+ long days = seconds / 86400;
|
|
|
+ long hours = (seconds % 86400) / 3600;
|
|
|
+ long minutes = (seconds % 3600) / 60;
|
|
|
+ if (days > 0) return days + "天" + hours + "小时" + minutes + "分钟";
|
|
|
+ if (hours > 0) return hours + "小时" + minutes + "分钟";
|
|
|
+ return minutes + "分钟";
|
|
|
+ }
|
|
|
+
|
|
|
+ private String formatBytes(long bytes) {
|
|
|
+ if (bytes < 1024) return bytes + "B";
|
|
|
+ if (bytes < 1024 * 1024) return String.format("%.1fKB", bytes / 1024.0);
|
|
|
+ if (bytes < 1024 * 1024 * 1024) return String.format("%.1fMB", bytes / (1024.0 * 1024));
|
|
|
+ return String.format("%.2fGB", bytes / (1024.0 * 1024 * 1024));
|
|
|
+ }
|
|
|
+}
|