From 57dcad38ffaa159638f1c45e42aec74a6c9c19a2 Mon Sep 17 00:00:00 2001 From: Cloud User Date: Tue, 17 Mar 2026 12:59:09 +0900 Subject: [PATCH] feat: add disk avg/min to node table, add NAS/Ingress/Istio detail tables - NodeTable: disk now shows avg, max, min (was max only) - NasTable: mountpoint-based avg/max/min - NetworkTable: RX/TX avg/max/min for Ingress and Istio Co-Authored-By: Claude Opus 4.6 --- src/app/page.tsx | 25 ++++++++++++ src/components/report/NasTable.tsx | 37 ++++++++++++++++++ src/components/report/NetworkTable.tsx | 53 ++++++++++++++++++++++++++ src/components/report/NodeTable.tsx | 6 +++ 4 files changed, 121 insertions(+) create mode 100644 src/components/report/NasTable.tsx create mode 100644 src/components/report/NetworkTable.tsx diff --git a/src/app/page.tsx b/src/app/page.tsx index 00c2824..e3bedc6 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -7,6 +7,8 @@ import SummaryCards from '@/components/report/SummaryCards'; import TimeSeriesChart from '@/components/charts/TimeSeriesChart'; import NetworkChart from '@/components/charts/NetworkChart'; import NodeTable from '@/components/report/NodeTable'; +import NasTable from '@/components/report/NasTable'; +import NetworkTable from '@/components/report/NetworkTable'; import AlertSection from '@/components/report/AlertSection'; import ErrorBoundary from '@/components/ErrorBoundary'; @@ -180,6 +182,29 @@ export default function Home() { + {data.metrics.nas && data.metrics.nas.length > 0 && ( + +
+

NAS 사용률 상세

+ +
+
+ )} + + +
+

Ingress Network 상세

+ +
+
+ + +
+

Istio Network 상세

+ +
+
+

주의 구간

diff --git a/src/components/report/NasTable.tsx b/src/components/report/NasTable.tsx new file mode 100644 index 0000000..ed0437c --- /dev/null +++ b/src/components/report/NasTable.tsx @@ -0,0 +1,37 @@ +'use client'; + +import type { MetricInstance } from '@/types/metrics'; +import { formatPercent } from '@/lib/formatters'; + +interface NasTableProps { + nas: MetricInstance[]; +} + +export default function NasTable({ nas }: NasTableProps) { + if (!nas || nas.length === 0) return null; + + return ( +
+ + + + + + + + + + + {nas.map((inst) => ( + + + + + + + ))} + +
MountpointAvgMaxMin
{inst.instance || '-'}{formatPercent(inst.stats.avg)}{formatPercent(inst.stats.max)}{formatPercent(inst.stats.min)}
+
+ ); +} diff --git a/src/components/report/NetworkTable.tsx b/src/components/report/NetworkTable.tsx new file mode 100644 index 0000000..acc6fad --- /dev/null +++ b/src/components/report/NetworkTable.tsx @@ -0,0 +1,53 @@ +'use client'; + +import type { NetworkMetrics } from '@/types/metrics'; +import { formatBytesPerSec } from '@/lib/formatters'; + +interface NetworkTableProps { + title: string; + data: NetworkMetrics; +} + +export default function NetworkTable({ title, data }: NetworkTableProps) { + const hasData = data.receive.length > 0 || data.transmit.length > 0; + if (!hasData) return null; + + return ( +
+ + + + + + + + + + + {data.receive.map((inst, idx) => ( + + + + + + + ))} + {data.transmit.map((inst, idx) => ( + + + + + + + ))} + +
{title}AvgMaxMin
+ RX + {inst.instance || 'total'} + {formatBytesPerSec(inst.stats.avg)}{formatBytesPerSec(inst.stats.max)}{formatBytesPerSec(inst.stats.min)}
+ TX + {inst.instance || 'total'} + {formatBytesPerSec(inst.stats.avg)}{formatBytesPerSec(inst.stats.max)}{formatBytesPerSec(inst.stats.min)}
+
+ ); +} diff --git a/src/components/report/NodeTable.tsx b/src/components/report/NodeTable.tsx index fcc49a9..62c8847 100644 --- a/src/components/report/NodeTable.tsx +++ b/src/components/report/NodeTable.tsx @@ -31,7 +31,9 @@ export default function NodeTable({ nodes, cpu, memory, disk }: NodeTableProps) MEM avg MEM max MEM min + DISK avg DISK max + DISK min @@ -70,9 +72,13 @@ export default function NodeTable({ nodes, cpu, memory, disk }: NodeTableProps) {memStats ? formatPercent(memStats.min) : '-'} + {diskStats ? formatPercent(diskStats.avg) : '-'} {diskStats ? formatPercent(diskStats.max) : '-'} + + {diskStats ? formatPercent(diskStats.min) : '-'} + ); })}