use promise.allsettled to stop docker chart from populating later

This commit is contained in:
Henry Dollman
2024-08-04 21:51:11 -04:00
parent 8ef30e0733
commit c6b9f1ab77
2 changed files with 47 additions and 53 deletions

View File

@@ -73,8 +73,8 @@ export default function CpuChart({
stroke="hsl(var(--chart-1))" stroke="hsl(var(--chart-1))"
isAnimationActive={false} isAnimationActive={false}
// animationEasing="ease-out" // animationEasing="ease-out"
animationDuration={700} // animationDuration={1200}
animateNewValues={true} // animateNewValues={true}
/> />
</AreaChart> </AreaChart>
</ChartContainer> </ChartContainer>

View File

@@ -27,25 +27,32 @@ export default function ServerDetail({ name }: { name: string }) {
const [ticks, setTicks] = useState([] as number[]) const [ticks, setTicks] = useState([] as number[])
const [server, setServer] = useState({} as SystemRecord) const [server, setServer] = useState({} as SystemRecord)
const [systemStats, setSystemStats] = useState([] as SystemStatsRecord[]) const [systemStats, setSystemStats] = useState([] as SystemStatsRecord[])
const [dockerCpuChartData, setDockerCpuChartData] = useState<Record<string, number | string>[]>() const [hasDockerStats, setHasDocker] = useState(false)
const [dockerMemChartData, setDockerMemChartData] = useState<Record<string, number | string>[]>() const [dockerCpuChartData, setDockerCpuChartData] = useState<Record<string, number | string>[]>(
const [dockerNetChartData, setDockerNetChartData] = []
useState<Record<string, number | number[]>[]>() )
const [dockerMemChartData, setDockerMemChartData] = useState<Record<string, number | string>[]>(
[]
)
const [dockerNetChartData, setDockerNetChartData] = useState<Record<string, number | number[]>[]>(
[]
)
useEffect(() => { useEffect(() => {
document.title = `${name} / Beszel` document.title = `${name} / Beszel`
return () => { return () => {
resetCharts() resetCharts()
$chartTime.set('1h') $chartTime.set('1h')
setHasDocker(false)
} }
}, [name]) }, [name])
const resetCharts = useCallback(() => { function resetCharts() {
setSystemStats([]) setSystemStats([])
setDockerCpuChartData(undefined) setDockerCpuChartData([])
setDockerMemChartData(undefined) setDockerMemChartData([])
setDockerNetChartData(undefined) setDockerNetChartData([])
}, []) }
useEffect(resetCharts, [chartTime]) useEffect(resetCharts, [chartTime])
@@ -66,13 +73,8 @@ export default function ServerDetail({ name }: { name: string }) {
} }
}, [updatedSystem]) }, [updatedSystem])
// get stats async function getStats<T>(collection: string): Promise<T[]> {
useEffect(() => { return await pb.collection<T>(collection).getFullList({
if (!server.id || !chartTime) {
return
}
pb.collection<SystemStatsRecord>('system_stats')
.getFullList({
filter: pb.filter('system={:id} && created > {:created} && type={:type}', { filter: pb.filter('system={:id} && created > {:created} && type={:type}', {
id: server.id, id: server.id,
created: getPbTimestamp(chartTime), created: getPbTimestamp(chartTime),
@@ -81,12 +83,27 @@ export default function ServerDetail({ name }: { name: string }) {
fields: 'created,stats', fields: 'created,stats',
sort: 'created', sort: 'created',
}) })
.then((records) => { }
// convert created time to ms value
for (const record of records) { // get stats
useEffect(() => {
if (!server.id || !chartTime) {
return
}
Promise.allSettled([
getStats<SystemStatsRecord>('system_stats'),
getStats<ContainerStatsRecord>('container_stats'),
]).then(([systemStats, containerStats]) => {
if (containerStats.status === 'fulfilled' && containerStats.value.length) {
setHasDocker(true)
makeContainerData(containerStats.value)
}
if (systemStats.status === 'fulfilled') {
for (const record of systemStats.value) {
record.created = new Date(record.created).getTime() record.created = new Date(record.created).getTime()
} }
setSystemStats(records) setSystemStats(systemStats.value)
}
}) })
}, [server, chartTime]) }, [server, chartTime])
@@ -100,30 +117,7 @@ export default function ServerDetail({ name }: { name: string }) {
setTicks(scale.ticks(chartTimeData[chartTime].ticks).map((d) => d.getTime())) setTicks(scale.ticks(chartTimeData[chartTime].ticks).map((d) => d.getTime()))
}, [chartTime, systemStats]) }, [chartTime, systemStats])
// get container stats // make container stats for charts
useEffect(() => {
if (!server.id || !chartTime) {
return
}
pb.collection<ContainerStatsRecord>('container_stats')
.getFullList({
filter: pb.filter('system={:id} && created > {:created} && type={:type}', {
id: server.id,
created: getPbTimestamp(chartTime),
type: chartTimeData[chartTime].type,
}),
fields: 'created,stats',
sort: 'created',
})
.then((records) => {
if (records.length) {
makeContainerData(records)
}
// setContainers(records)
})
}, [server, chartTime])
// container stats for charts
const makeContainerData = useCallback((containers: ContainerStatsRecord[]) => { const makeContainerData = useCallback((containers: ContainerStatsRecord[]) => {
// console.log('containers', containers) // console.log('containers', containers)
const dockerCpuData = [] const dockerCpuData = []
@@ -221,7 +215,7 @@ export default function ServerDetail({ name }: { name: string }) {
<CpuChart ticks={ticks} systemData={systemStats} /> <CpuChart ticks={ticks} systemData={systemStats} />
</ChartCard> </ChartCard>
{dockerCpuChartData && ( {hasDockerStats && (
<ChartCard title="Docker CPU Usage" description="CPU utilization of docker containers"> <ChartCard title="Docker CPU Usage" description="CPU utilization of docker containers">
<ContainerCpuChart chartData={dockerCpuChartData} ticks={ticks} /> <ContainerCpuChart chartData={dockerCpuChartData} ticks={ticks} />
</ChartCard> </ChartCard>
@@ -231,7 +225,7 @@ export default function ServerDetail({ name }: { name: string }) {
<MemChart ticks={ticks} systemData={systemStats} /> <MemChart ticks={ticks} systemData={systemStats} />
</ChartCard> </ChartCard>
{dockerMemChartData && ( {hasDockerStats && (
<ChartCard title="Docker Memory Usage" description="Memory usage of docker containers"> <ChartCard title="Docker Memory Usage" description="Memory usage of docker containers">
<ContainerMemChart chartData={dockerMemChartData} ticks={ticks} /> <ContainerMemChart chartData={dockerMemChartData} ticks={ticks} />
</ChartCard> </ChartCard>
@@ -252,7 +246,7 @@ export default function ServerDetail({ name }: { name: string }) {
<BandwidthChart ticks={ticks} systemData={systemStats} /> <BandwidthChart ticks={ticks} systemData={systemStats} />
</ChartCard> </ChartCard>
{dockerNetChartData && ( {hasDockerStats && (
<ChartCard <ChartCard
title="Docker Network I/O" title="Docker Network I/O"
description="Includes traffic between internal services" description="Includes traffic between internal services"