useComputeMetrics.ts74 lines · main
| 1 | import dayjs from 'dayjs' |
| 2 | import { useMemo } from 'react' |
| 3 | |
| 4 | import { |
| 5 | parseConnectionsData, |
| 6 | parseInfrastructureMetrics, |
| 7 | } from '@/components/interfaces/Observability/DatabaseInfrastructureSection.utils' |
| 8 | import { useInfraMonitoringAttributesQuery } from '@/data/analytics/infra-monitoring-query' |
| 9 | import { useMaxConnectionsQuery } from '@/data/database/max-connections-query' |
| 10 | import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' |
| 11 | |
| 12 | export 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 | |
| 21 | export 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 | } |