mirror of
https://github.com/fankes/beszel.git
synced 2025-10-19 17:59:28 +08:00
add null values to create gaps in chart if expected interval is exceeded. closes #100
This commit is contained in:
@@ -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<T extends SystemStatsRecord | ContainerStatsRecord>(
|
||||||
|
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
|
// get stats
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (!server.id || !chartTime) {
|
if (!server.id || !chartTime) {
|
||||||
@@ -95,15 +119,13 @@ export default function ServerDetail({ name }: { name: string }) {
|
|||||||
getStats<SystemStatsRecord>('system_stats'),
|
getStats<SystemStatsRecord>('system_stats'),
|
||||||
getStats<ContainerStatsRecord>('container_stats'),
|
getStats<ContainerStatsRecord>('container_stats'),
|
||||||
]).then(([systemStats, containerStats]) => {
|
]).then(([systemStats, containerStats]) => {
|
||||||
|
const expectedInterval = chartTimeData[chartTime].expectedInterval
|
||||||
if (containerStats.status === 'fulfilled' && containerStats.value.length) {
|
if (containerStats.status === 'fulfilled' && containerStats.value.length) {
|
||||||
|
makeContainerData(addEmptyValues(containerStats.value, expectedInterval))
|
||||||
setHasDocker(true)
|
setHasDocker(true)
|
||||||
makeContainerData(containerStats.value)
|
|
||||||
}
|
}
|
||||||
if (systemStats.status === 'fulfilled') {
|
if (systemStats.status === 'fulfilled') {
|
||||||
for (const record of systemStats.value) {
|
setSystemStats(addEmptyValues(systemStats.value, expectedInterval))
|
||||||
record.created = new Date(record.created).getTime()
|
|
||||||
}
|
|
||||||
setSystemStats(systemStats.value)
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}, [server, chartTime])
|
}, [server, chartTime])
|
||||||
@@ -125,6 +147,13 @@ export default function ServerDetail({ name }: { name: string }) {
|
|||||||
const dockerMemData = []
|
const dockerMemData = []
|
||||||
const dockerNetData = []
|
const dockerNetData = []
|
||||||
for (let { created, stats } of containers) {
|
for (let { created, stats } of containers) {
|
||||||
|
if (!created) {
|
||||||
|
let nullData = { time: null } as unknown
|
||||||
|
dockerCpuData.push(nullData as Record<string, number | string>)
|
||||||
|
dockerMemData.push(nullData as Record<string, number | string>)
|
||||||
|
dockerNetData.push(nullData as Record<string, number | number[]>)
|
||||||
|
continue
|
||||||
|
}
|
||||||
const time = new Date(created).getTime()
|
const time = new Date(created).getTime()
|
||||||
let cpuData = { time } as Record<string, number | string>
|
let cpuData = { time } as Record<string, number | string>
|
||||||
let memData = { time } as Record<string, number | string>
|
let memData = { time } as Record<string, number | string>
|
||||||
@@ -138,7 +167,6 @@ export default function ServerDetail({ name }: { name: string }) {
|
|||||||
dockerMemData.push(memData)
|
dockerMemData.push(memData)
|
||||||
dockerNetData.push(netData)
|
dockerNetData.push(netData)
|
||||||
}
|
}
|
||||||
// console.log('dockerMemData', dockerMemData)
|
|
||||||
setDockerCpuChartData(dockerCpuData)
|
setDockerCpuChartData(dockerCpuData)
|
||||||
setDockerMemChartData(dockerMemData)
|
setDockerMemChartData(dockerMemData)
|
||||||
setDockerNetChartData(dockerNetData)
|
setDockerNetChartData(dockerNetData)
|
||||||
|
@@ -159,6 +159,7 @@ export function getPbTimestamp(timeString: ChartTimes) {
|
|||||||
export const chartTimeData: ChartTimeData = {
|
export const chartTimeData: ChartTimeData = {
|
||||||
'1h': {
|
'1h': {
|
||||||
type: '1m',
|
type: '1m',
|
||||||
|
expectedInterval: 60_000,
|
||||||
label: '1 hour',
|
label: '1 hour',
|
||||||
// ticks: 12,
|
// ticks: 12,
|
||||||
format: (timestamp: string) => hourWithMinutes(timestamp),
|
format: (timestamp: string) => hourWithMinutes(timestamp),
|
||||||
@@ -166,6 +167,7 @@ export const chartTimeData: ChartTimeData = {
|
|||||||
},
|
},
|
||||||
'12h': {
|
'12h': {
|
||||||
type: '10m',
|
type: '10m',
|
||||||
|
expectedInterval: 60_000 * 10,
|
||||||
label: '12 hours',
|
label: '12 hours',
|
||||||
ticks: 12,
|
ticks: 12,
|
||||||
format: (timestamp: string) => hourWithMinutes(timestamp),
|
format: (timestamp: string) => hourWithMinutes(timestamp),
|
||||||
@@ -173,12 +175,14 @@ export const chartTimeData: ChartTimeData = {
|
|||||||
},
|
},
|
||||||
'24h': {
|
'24h': {
|
||||||
type: '20m',
|
type: '20m',
|
||||||
|
expectedInterval: 60_000 * 20,
|
||||||
label: '24 hours',
|
label: '24 hours',
|
||||||
format: (timestamp: string) => hourWithMinutes(timestamp),
|
format: (timestamp: string) => hourWithMinutes(timestamp),
|
||||||
getOffset: (endTime: Date) => timeHour.offset(endTime, -24),
|
getOffset: (endTime: Date) => timeHour.offset(endTime, -24),
|
||||||
},
|
},
|
||||||
'1w': {
|
'1w': {
|
||||||
type: '120m',
|
type: '120m',
|
||||||
|
expectedInterval: 60_000 * 120,
|
||||||
label: '1 week',
|
label: '1 week',
|
||||||
ticks: 7,
|
ticks: 7,
|
||||||
format: (timestamp: string) => formatShortDate(timestamp),
|
format: (timestamp: string) => formatShortDate(timestamp),
|
||||||
@@ -186,6 +190,7 @@ export const chartTimeData: ChartTimeData = {
|
|||||||
},
|
},
|
||||||
'30d': {
|
'30d': {
|
||||||
type: '480m',
|
type: '480m',
|
||||||
|
expectedInterval: 60_000 * 480,
|
||||||
label: '30 days',
|
label: '30 days',
|
||||||
ticks: 30,
|
ticks: 30,
|
||||||
format: (timestamp: string) => formatDay(timestamp),
|
format: (timestamp: string) => formatDay(timestamp),
|
||||||
|
1
beszel/site/src/types.d.ts
vendored
1
beszel/site/src/types.d.ts
vendored
@@ -96,6 +96,7 @@ export type ChartTimes = '1h' | '12h' | '24h' | '1w' | '30d'
|
|||||||
export interface ChartTimeData {
|
export interface ChartTimeData {
|
||||||
[key: string]: {
|
[key: string]: {
|
||||||
type: '1m' | '10m' | '20m' | '120m' | '480m'
|
type: '1m' | '10m' | '20m' | '120m' | '480m'
|
||||||
|
expectedInterval: number
|
||||||
label: string
|
label: string
|
||||||
ticks?: number
|
ticks?: number
|
||||||
format: (timestamp: string) => string
|
format: (timestamp: string) => string
|
||||||
|
Reference in New Issue
Block a user