query($memoryTotalQuery); $memoryTotal = $memoryTotalResult['data']['result'][0]['value'][1] ?? 0; // 获取已用内存 $memoryAvailableQuery = 'node_memory_MemAvailable_bytes'; $memoryAvailableResult = $prometheus->query($memoryAvailableQuery); $memoryAvailable = $memoryAvailableResult['data']['result'][0]['value'][1] ?? 0; $memoryUsed = $memoryTotal - $memoryAvailable; $memoryDisplay = round($memoryUsed / (1024 * 1024 * 1024), 2) . ' GB / ' . round($memoryTotal / (1024 * 1024 * 1024), 2) . ' GB'; // 获取硬盘总量 $diskTotalQuery = 'node_filesystem_size_bytes{fstype!="rootfs",fstype!="tmpfs",fstype!="squashfs"}'; $diskTotalResult = $prometheus->query($diskTotalQuery); $diskTotal = array_sum(array_map(function ($item) { return $item['value'][1] ?? 0; }, $diskTotalResult['data']['result'])); // 获取已用硬盘 $diskFreeQuery = 'node_filesystem_free_bytes{fstype!="rootfs",fstype!="tmpfs",fstype!="squashfs"}'; $diskFreeResult = $prometheus->query($diskFreeQuery); $diskFree = array_sum(array_map(function ($item) { return $item['value'][1] ?? 0; }, $diskFreeResult['data']['result'])); $diskUsed = $diskTotal - $diskFree; $diskDisplay = round($diskUsed / (1024 * 1024 * 1024), 2) . ' GB / ' . round($diskTotal / (1024 * 1024 * 1024), 2) . ' GB'; // 获取网络上下行流量 $networkTransmitQuery = 'rate(node_network_transmit_bytes_total[1m])'; $networkTransmitResult = $prometheus->query($networkTransmitQuery); $networkTransmit = round(array_sum(array_map(function ($item) { return $item['value'][1] ?? 0; }, $networkTransmitResult['data']['result'])) / (1024 * 1024), 2); $networkReceiveQuery = 'rate(node_network_receive_bytes_total[1m])'; $networkReceiveResult = $prometheus->query($networkReceiveQuery); $networkReceive = round(array_sum(array_map(function ($item) { return $item['value'][1] ?? 0; }, $networkReceiveResult['data']['result'])) / (1024 * 1024), 2); $networkDisplay = "上行: {$networkTransmit} MB/s\n下行: {$networkReceive} MB/s"; return [ BaseWidget\Stat::make('内存占用', $memoryDisplay), BaseWidget\Stat::make('硬盘占用', $diskDisplay), BaseWidget\Stat::make('网络流量', $networkDisplay), ]; } protected function getPollingInterval(): ?string { return "1s"; } }