From 2590f5612c329bc5e8b769142b6c4b9f96252ac6 Mon Sep 17 00:00:00 2001 From: Henry Dollman Date: Tue, 20 Aug 2024 17:10:32 -0400 Subject: [PATCH] add null values to create gaps in chart if expected interval is exceeded. closes #100 --- beszel/site/src/components/routes/system.tsx | 40 +++++++++++++++++--- beszel/site/src/lib/utils.ts | 5 +++ beszel/site/src/types.d.ts | 1 + 3 files changed, 40 insertions(+), 6 deletions(-) diff --git a/beszel/site/src/components/routes/system.tsx b/beszel/site/src/components/routes/system.tsx index 87ee304..2e65f23 100644 --- a/beszel/site/src/components/routes/system.tsx +++ b/beszel/site/src/components/routes/system.tsx @@ -86,6 +86,30 @@ export default function ServerDetail({ name }: { name: string }) { }) } + // add empty values between records to make gaps if interval is too large + function addEmptyValues( + records: T[], + expectedInterval: number + ) { + const modifiedRecords: T[] = [] + let prevTime = 0 + for (let i = 0; i < records.length; i++) { + const record = records[i] + record.created = new Date(record.created).getTime() + if (prevTime) { + const interval = record.created - prevTime + // if interval is too large, add a null record + if (interval - interval * 0.5 > expectedInterval) { + // @ts-ignore + modifiedRecords.push({ created: null, stats: null }) + } + } + prevTime = record.created + modifiedRecords.push(record) + } + return modifiedRecords + } + // get stats useEffect(() => { if (!server.id || !chartTime) { @@ -95,15 +119,13 @@ export default function ServerDetail({ name }: { name: string }) { getStats('system_stats'), getStats('container_stats'), ]).then(([systemStats, containerStats]) => { + const expectedInterval = chartTimeData[chartTime].expectedInterval if (containerStats.status === 'fulfilled' && containerStats.value.length) { + makeContainerData(addEmptyValues(containerStats.value, expectedInterval)) setHasDocker(true) - makeContainerData(containerStats.value) } if (systemStats.status === 'fulfilled') { - for (const record of systemStats.value) { - record.created = new Date(record.created).getTime() - } - setSystemStats(systemStats.value) + setSystemStats(addEmptyValues(systemStats.value, expectedInterval)) } }) }, [server, chartTime]) @@ -125,6 +147,13 @@ export default function ServerDetail({ name }: { name: string }) { const dockerMemData = [] const dockerNetData = [] for (let { created, stats } of containers) { + if (!created) { + let nullData = { time: null } as unknown + dockerCpuData.push(nullData as Record) + dockerMemData.push(nullData as Record) + dockerNetData.push(nullData as Record) + continue + } const time = new Date(created).getTime() let cpuData = { time } as Record let memData = { time } as Record @@ -138,7 +167,6 @@ export default function ServerDetail({ name }: { name: string }) { dockerMemData.push(memData) dockerNetData.push(netData) } - // console.log('dockerMemData', dockerMemData) setDockerCpuChartData(dockerCpuData) setDockerMemChartData(dockerMemData) setDockerNetChartData(dockerNetData) diff --git a/beszel/site/src/lib/utils.ts b/beszel/site/src/lib/utils.ts index 85d537b..3844fb1 100644 --- a/beszel/site/src/lib/utils.ts +++ b/beszel/site/src/lib/utils.ts @@ -159,6 +159,7 @@ export function getPbTimestamp(timeString: ChartTimes) { export const chartTimeData: ChartTimeData = { '1h': { type: '1m', + expectedInterval: 60_000, label: '1 hour', // ticks: 12, format: (timestamp: string) => hourWithMinutes(timestamp), @@ -166,6 +167,7 @@ export const chartTimeData: ChartTimeData = { }, '12h': { type: '10m', + expectedInterval: 60_000 * 10, label: '12 hours', ticks: 12, format: (timestamp: string) => hourWithMinutes(timestamp), @@ -173,12 +175,14 @@ export const chartTimeData: ChartTimeData = { }, '24h': { type: '20m', + expectedInterval: 60_000 * 20, label: '24 hours', format: (timestamp: string) => hourWithMinutes(timestamp), getOffset: (endTime: Date) => timeHour.offset(endTime, -24), }, '1w': { type: '120m', + expectedInterval: 60_000 * 120, label: '1 week', ticks: 7, format: (timestamp: string) => formatShortDate(timestamp), @@ -186,6 +190,7 @@ export const chartTimeData: ChartTimeData = { }, '30d': { type: '480m', + expectedInterval: 60_000 * 480, label: '30 days', ticks: 30, format: (timestamp: string) => formatDay(timestamp), diff --git a/beszel/site/src/types.d.ts b/beszel/site/src/types.d.ts index d2db153..2f078c1 100644 --- a/beszel/site/src/types.d.ts +++ b/beszel/site/src/types.d.ts @@ -96,6 +96,7 @@ export type ChartTimes = '1h' | '12h' | '24h' | '1w' | '30d' export interface ChartTimeData { [key: string]: { type: '1m' | '10m' | '20m' | '120m' | '480m' + expectedInterval: number label: string ticks?: number format: (timestamp: string) => string