diff --git a/public/index.html b/public/index.html index fbb2715..e86d453 100644 --- a/public/index.html +++ b/public/index.html @@ -392,11 +392,12 @@ 磁盘 网络 ↓ 网络 ↑ + 24h 流量 - 暂无数据 - 请先配置 Prometheus 数据源 + 暂无数据 - 请先配置 Prometheus 数据源 diff --git a/public/js/app.js b/public/js/app.js index 1eb1e36..670dfa8 100644 --- a/public/js/app.js +++ b/public/js/app.js @@ -1482,6 +1482,10 @@ valA = a.netTx ?? 0; valB = b.netTx ?? 0; break; + case 'traffic24h': + valA = (a.traffic24hRx ?? 0) + (a.traffic24hTx ?? 0); + valB = (b.traffic24hRx ?? 0) + (b.traffic24hTx ?? 0); + break; default: valA = (a.job || '').toLowerCase(); valB = (b.job || '').toLowerCase(); @@ -1607,7 +1611,7 @@ if (!servers || servers.length === 0) { dom.serverTableBody.innerHTML = ` - 暂无数据 - 请先配置 Prometheus 数据源 + 暂无数据 - 请先配置 Prometheus 数据源 `; return; @@ -1652,6 +1656,10 @@ ${formatBandwidth(server.netRx)} ${formatBandwidth(server.netTx)} + +
${formatBytes((server.traffic24hRx || 0) + (server.traffic24hTx || 0))}
+
↓${formatBytes(server.traffic24hRx || 0)} / ↑${formatBytes(server.traffic24hTx || 0)}
+ `; }).join(''); diff --git a/server/prometheus-service.js b/server/prometheus-service.js index f8e25b0..91d7141 100644 --- a/server/prometheus-service.js +++ b/server/prometheus-service.js @@ -204,6 +204,8 @@ async function getOverviewMetrics(url, sourceName) { diskFreeResult, netRxResult, netTxResult, + netRx24hResult, + netTx24hResult, targetsResult ] = await Promise.all([ // CPU usage per instance: 1 - avg idle @@ -222,6 +224,10 @@ async function getOverviewMetrics(url, sourceName) { query(url, 'sum by (instance, job) (rate(node_network_receive_bytes_total{device!~"lo|veth.*|docker.*|br-.*"}[1m]))').catch(() => []), // Network transmit rate (bytes/sec) query(url, 'sum by (instance, job) (rate(node_network_transmit_bytes_total{device!~"lo|veth.*|docker.*|br-.*"}[1m]))').catch(() => []), + // 24h Network receive total (bytes) + query(url, 'sum by (instance, job) (increase(node_network_receive_bytes_total{device!~"lo|veth.*|docker.*|br-.*"}[24h]))').catch(() => []), + // 24h Network transmit total (bytes) + query(url, 'sum by (instance, job) (increase(node_network_transmit_bytes_total{device!~"lo|veth.*|docker.*|br-.*"}[24h]))').catch(() => []), // Targets status from /api/v1/targets getTargets(url).catch(() => []) ]); @@ -254,6 +260,8 @@ async function getOverviewMetrics(url, sourceName) { diskUsed: 0, netRx: 0, netTx: 0, + traffic24hRx: 0, + traffic24hTx: 0, up: false, memPercent: 0, diskPercent: 0 @@ -322,6 +330,16 @@ async function getOverviewMetrics(url, sourceName) { inst.netTx = parseFloat(r.value[1]) || 0; } + // Parse 24h traffic + for (const r of netRx24hResult) { + const inst = getOrCreate(r.metric); + inst.traffic24hRx = parseFloat(r.value[1]) || 0; + } + for (const r of netTx24hResult) { + const inst = getOrCreate(r.metric); + inst.traffic24hTx = parseFloat(r.value[1]) || 0; + } + for (const inst of instances.values()) { if (!inst.up && (inst.cpuPercent > 0 || inst.memTotal > 0)) { inst.up = true;