diff --git a/public/index.html b/public/index.html index fb0994c..d21f96e 100644 --- a/public/index.html +++ b/public/index.html @@ -465,6 +465,22 @@
+ +
CPU 核心总数 @@ -479,11 +495,6 @@ 0天 0小时
- - diff --git a/public/js/app.js b/public/js/app.js index a715d96..bacde3a 100644 --- a/public/js/app.js +++ b/public/js/app.js @@ -85,7 +85,9 @@ sourceFilter: document.getElementById('sourceFilter'), btnResetSort: document.getElementById('btnResetSort'), detailPartitionsContainer: document.getElementById('detailPartitionsContainer'), - detailPartitionsList: document.getElementById('detailPartitionsList') + detailPartitionsList: document.getElementById('detailPartitionsList'), + partitionSummary: document.getElementById('partitionSummary'), + partitionHeader: document.getElementById('partitionHeader') }; // ---- State ---- @@ -876,6 +878,14 @@ // Render partitions list if any if (data.partitions && data.partitions.length > 0) { dom.detailPartitionsContainer.style.display = 'block'; + dom.partitionSummary.textContent = `${data.partitions.length} 个本地分区`; + + // Remove old listener if any and add new toggle listener + dom.partitionHeader.onclick = (e) => { + e.stopPropagation(); + dom.detailPartitionsContainer.classList.toggle('active'); + }; + dom.detailPartitionsList.innerHTML = data.partitions.map(p => `
diff --git a/server/prometheus-service.js b/server/prometheus-service.js index ee2b705..e242dfc 100644 --- a/server/prometheus-service.js +++ b/server/prometheus-service.js @@ -198,10 +198,10 @@ async function getOverviewMetrics(url, sourceName) { query(url, 'node_memory_MemTotal_bytes').catch(() => []), // Memory available per instance query(url, 'node_memory_MemAvailable_bytes').catch(() => []), - // Disk total per instance (excluding virtual fs and restricted paths) - query(url, 'sum by (instance, job) (node_filesystem_size_bytes{fstype!~"tmpfs|overlay|autofs|binfmt_misc|configfs|debugfs|fusectl|hugetlbfs|mqueue|proc|pstore|securityfs|sysfs|devpts|devtmpfs|nsfs|rpc_pipefs|selinuxfs|squashfs|tracefs", mountpoint!~"/tmp.*|/var/lib/docker/.*|/run/.*|/sys/.*|/dev/.*"})').catch(() => []), + // Disk total per instance (excluding virtual fs, restricted paths and FUSE/rclone mounts) + query(url, 'sum by (instance, job) (node_filesystem_size_bytes{fstype!~"tmpfs|overlay|autofs|binfmt_misc|configfs|debugfs|fusectl|hugetlbfs|mqueue|proc|pstore|securityfs|sysfs|devpts|devtmpfs|nsfs|rpc_pipefs|selinuxfs|squashfs|tracefs|fuse\\..*", mountpoint!~"/tmp.*|/var/lib/docker/.*|/run/.*|/sys/.*|/dev/.*"})').catch(() => []), // Disk free per instance - query(url, 'sum by (instance, job) (node_filesystem_free_bytes{fstype!~"tmpfs|overlay|autofs|binfmt_misc|configfs|debugfs|fusectl|hugetlbfs|mqueue|proc|pstore|securityfs|sysfs|devpts|devtmpfs|nsfs|rpc_pipefs|selinuxfs|squashfs|tracefs", mountpoint!~"/tmp.*|/var/lib/docker/.*|/run/.*|/sys/.*|/dev/.*"})').catch(() => []), + query(url, 'sum by (instance, job) (node_filesystem_free_bytes{fstype!~"tmpfs|overlay|autofs|binfmt_misc|configfs|debugfs|fusectl|hugetlbfs|mqueue|proc|pstore|securityfs|sysfs|devpts|devtmpfs|nsfs|rpc_pipefs|selinuxfs|squashfs|tracefs|fuse\\..*", mountpoint!~"/tmp.*|/var/lib/docker/.*|/run/.*|/sys/.*|/dev/.*"})').catch(() => []), // Network receive rate (bytes/sec) query(url, 'sum by (instance, job) (rate(node_network_receive_bytes_total{device!~"lo|veth.*|docker.*|br-.*"}[1m]))').catch(() => []), // Network transmit rate (bytes/sec) @@ -541,9 +541,9 @@ async function getServerDetails(baseUrl, instance, job) { netTx: `sum(rate(node_network_transmit_bytes_total{instance="${node}",job="${job}",device!~'tap.*|veth.*|br.*|docker.*|virbr*|podman.*|lo.*|vmbr.*|fwbr.|ip.*|gre.*|virbr.*|vnet.*'}[1m]))`, sockstatTcp: `node_sockstat_TCP_inuse{instance="${node}",job="${job}"}`, sockstatTcpMem: `node_sockstat_TCP_mem{instance="${node}",job="${job}"} * 4096`, - // Get individual partitions - partitions_size: `node_filesystem_size_bytes{instance="${node}", job="${job}", fstype!~"tmpfs|overlay|autofs|binfmt_misc|configfs|debugfs|fusectl|hugetlbfs|mqueue|proc|pstore|securityfs|sysfs|devpts|devtmpfs|nsfs|rpc_pipefs|selinuxfs|squashfs|tracefs", mountpoint!~"/tmp.*|/var/lib/docker/.*|/run/.*|/sys/.*|/dev/.*"}`, - partitions_free: `node_filesystem_free_bytes{instance="${node}", job="${job}", fstype!~"tmpfs|overlay|autofs|binfmt_misc|configfs|debugfs|fusectl|hugetlbfs|mqueue|proc|pstore|securityfs|sysfs|devpts|devtmpfs|nsfs|rpc_pipefs|selinuxfs|squashfs|tracefs", mountpoint!~"/tmp.*|/var/lib/docker/.*|/run/.*|/sys/.*|/dev/.*"}` + // Get individual partitions (excluding FUSE/Google Drive) + partitions_size: `node_filesystem_size_bytes{instance="${node}", job="${job}", fstype!~"tmpfs|overlay|autofs|binfmt_misc|configfs|debugfs|fusectl|hugetlbfs|mqueue|proc|pstore|securityfs|sysfs|devpts|devtmpfs|nsfs|rpc_pipefs|selinuxfs|squashfs|tracefs|fuse\\..*", mountpoint!~"/tmp.*|/var/lib/docker/.*|/run/.*|/sys/.*|/dev/.*"}`, + partitions_free: `node_filesystem_free_bytes{instance="${node}", job="${job}", fstype!~"tmpfs|overlay|autofs|binfmt_misc|configfs|debugfs|fusectl|hugetlbfs|mqueue|proc|pstore|securityfs|sysfs|devpts|devtmpfs|nsfs|rpc_pipefs|selinuxfs|squashfs|tracefs|fuse\\..*", mountpoint!~"/tmp.*|/var/lib/docker/.*|/run/.*|/sys/.*|/dev/.*"}` }; const results = {};