fix: keep dashboard aggregate metrics visible

This commit is contained in:
admin committed 2026-08-20 09:47:39 +08:00
1 parent 38824a0055
commit 1e87be31da
2 files changed
+34 -19

No files matched your search

+6 -5
View File
@@ -98,6 +98,7 @@ export default function LiveBoard() {
const activeSessions = sessions.filter(item => Date.now() - new Date(item.last_heartbeat).getTime() < 30000) const activeSessions = sessions.filter(item => Date.now() - new Date(item.last_heartbeat).getTime() < 30000)
const buffering = activeSessions.filter(item => item.playback_state === 'buffering' || Number(item.buffered_seconds || 0) < 1) const buffering = activeSessions.filter(item => item.playback_state === 'buffering' || Number(item.buffered_seconds || 0) < 1)
const totalCardsLoading = !systemMetrics
return ( return (
<div> <div>
@@ -127,11 +128,11 @@ export default function LiveBoard() {
</Row> </Row>
<Row gutter={[16, 16]}> <Row gutter={[16, 16]}>
<Col xs={24} md={8}><Card><Statistic title="CPU 使用率" value={systemMetrics?.cpu_percent ?? 0} precision={1} suffix="%" prefix={<DashboardOutlined />} /></Card></Col> <Col xs={24} md={8}><Card><Statistic title="CPU 使用率" value={systemMetrics?.cpu_percent ?? 0} precision={1} suffix="%" loading={totalCardsLoading} prefix={<DashboardOutlined />} /></Card></Col>
<Col xs={24} md={8}><Card><Statistic title="内存使用率" value={systemMetrics?.memory_percent ?? 0} precision={1} suffix="%" prefix={<DatabaseOutlined />} /><Text type="secondary">{formatBytes(systemMetrics?.memory_used_bytes)} / {formatBytes(systemMetrics?.memory_total_bytes)}</Text></Card></Col> <Col xs={24} md={8}><Card><Statistic title="内存使用率" value={systemMetrics?.memory_percent ?? 0} precision={1} suffix="%" loading={totalCardsLoading} prefix={<DatabaseOutlined />} /><Text type="secondary">{formatBytes(systemMetrics?.memory_used_bytes)} / {formatBytes(systemMetrics?.memory_total_bytes)}</Text></Card></Col>
<Col xs={24} md={8}><Card><Statistic title="存储使用率" value={systemMetrics?.disk_percent ?? 0} precision={1} suffix="%" prefix={<DatabaseOutlined />} /><Text type="secondary">{formatBytes(systemMetrics?.disk_used_bytes)} / {formatBytes(systemMetrics?.disk_total_bytes)}</Text></Card></Col> <Col xs={24} md={8}><Card><Statistic title="存储使用率" value={systemMetrics?.disk_percent ?? 0} precision={1} suffix="%" loading={totalCardsLoading} prefix={<DatabaseOutlined />} /><Text type="secondary">{formatBytes(systemMetrics?.disk_used_bytes)} / {formatBytes(systemMetrics?.disk_total_bytes)}</Text></Card></Col>
<Col xs={24} md={12}><Card><Statistic title="NET I/O 下载总量" value={formatBytes(systemMetrics?.network_received_bytes)} /></Card></Col> <Col xs={24} md={12}><Card><Statistic title="NET I/O 下载总量" value={formatBytes(systemMetrics?.network_received_bytes)} loading={totalCardsLoading} /></Card></Col>
<Col xs={24} md={12}><Card><Statistic title="NET I/O 上传总量" value={formatBytes(systemMetrics?.network_sent_bytes)} /></Card></Col> <Col xs={24} md={12}><Card><Statistic title="NET I/O 上传总量" value={formatBytes(systemMetrics?.network_sent_bytes)} loading={totalCardsLoading} /></Card></Col>
</Row> </Row>
<Card title="节点实时指标"> <Card title="节点实时指标">
+28 -14
View File
@@ -13,23 +13,37 @@ export interface SystemMetrics {
} }
interface SystemMetricsResponse { interface SystemMetricsResponse {
cpu: { load_percent: number } cpu?: { load_percent?: number }
memory: { total: number; available: number; used_percent: number } memory?: { total?: number; available?: number; used_percent?: number }
disk: { total: number; free: number; used_percent: number } disk?: { total?: number; free?: number; used_percent?: number }
network: { bytes_recv: number; bytes_sent: number } network?: { bytes_recv?: number; bytes_sent?: number }
cpu_percent?: number
memory_percent?: number
disk_percent?: number
disk_total_bytes?: number
disk_used_bytes?: number
network_received_bytes?: number
network_sent_bytes?: number
} }
const numberOrZero = (value: unknown) => Number.isFinite(Number(value)) ? Number(value) : 0
export async function getSystemMetrics(): Promise<SystemMetrics> { export async function getSystemMetrics(): Promise<SystemMetrics> {
const { data } = await api.get<SystemMetricsResponse>('/settings/system-metrics') const { data } = await api.get<SystemMetricsResponse>('/settings/system-metrics')
const memoryTotal = numberOrZero(data.memory?.total)
const memoryAvailable = numberOrZero(data.memory?.available)
const diskTotal = numberOrZero(data.disk?.total ?? data.disk_total_bytes)
const diskUsed = numberOrZero(data.disk_used_bytes ?? (diskTotal - numberOrZero(data.disk?.free)))
return { return {
cpu_percent: data.cpu.load_percent, cpu_percent: numberOrZero(data.cpu?.load_percent ?? data.cpu_percent),
memory_percent: data.memory.used_percent, memory_percent: numberOrZero(data.memory?.used_percent ?? data.memory_percent),
memory_total_bytes: data.memory.total, memory_total_bytes: memoryTotal,
memory_used_bytes: Math.max(0, data.memory.total - data.memory.available), memory_used_bytes: Math.max(0, memoryTotal - memoryAvailable),
disk_percent: data.disk.used_percent, disk_percent: numberOrZero(data.disk?.used_percent ?? data.disk_percent),
disk_total_bytes: data.disk.total, disk_total_bytes: diskTotal,
disk_used_bytes: Math.max(0, data.disk.total - data.disk.free), disk_used_bytes: Math.max(0, diskUsed),
network_received_bytes: data.network.bytes_recv, network_received_bytes: numberOrZero(data.network?.bytes_recv ?? data.network_received_bytes),
network_sent_bytes: data.network.bytes_sent, network_sent_bytes: numberOrZero(data.network?.bytes_sent ?? data.network_sent_bytes),
} }
} }