useComputeMetrics.ts74 lines · main
1import dayjs from 'dayjs'
2import { useMemo } from 'react'
3
4import {
5 parseConnectionsData,
6 parseInfrastructureMetrics,
7} from '@/components/interfaces/Observability/DatabaseInfrastructureSection.utils'
8import { useInfraMonitoringAttributesQuery } from '@/data/analytics/infra-monitoring-query'
9import { useMaxConnectionsQuery } from '@/data/database/max-connections-query'
10import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject'
11
12export type ComputeMetrics = {
13 cpu: number
14 disk: number
15 memory: number
16 connections: { current: number; max: number }
17 isLoading: boolean
18 isError: boolean
19}
20
21export function useComputeMetrics({ projectRef }: { projectRef?: string }): ComputeMetrics {
22 const { data: project } = useSelectedProjectQuery()
23
24 // Intentionally anchored to mount time so the query key stays stable across re-renders.
25 // React Query's staleTime handles background refresh without shifting the window.
26 // eslint-disable-next-line react-hooks/exhaustive-deps
27 const { startDate, endDate } = useMemo(() => {
28 const now = dayjs()
29 return {
30 startDate: now.subtract(1, 'hour').toISOString(),
31 endDate: now.toISOString(),
32 }
33 }, [])
34
35 const {
36 data: infraData,
37 isLoading: infraLoading,
38 isError,
39 } = useInfraMonitoringAttributesQuery({
40 projectRef,
41 attributes: [
42 'avg_cpu_usage',
43 'ram_usage',
44 'disk_fs_used_system',
45 'disk_fs_used_wal',
46 'pg_database_size',
47 'disk_fs_size',
48 'pg_stat_database_num_backends',
49 ],
50 startDate,
51 endDate,
52 interval: '1h',
53 })
54
55 const { data: maxConnectionsData, isLoading: connectionsLoading } = useMaxConnectionsQuery({
56 projectRef,
57 connectionString: project?.connectionString,
58 })
59
60 const metrics = useMemo(() => parseInfrastructureMetrics(infraData), [infraData])
61 const connections = useMemo(
62 () => parseConnectionsData(infraData, maxConnectionsData),
63 [infraData, maxConnectionsData]
64 )
65
66 return {
67 cpu: metrics?.cpu.current ?? 0,
68 disk: metrics?.disk.current ?? 0,
69 memory: metrics?.ram.current ?? 0,
70 connections,
71 isLoading: infraLoading || connectionsLoading,
72 isError,
73 }
74}