useComputeMetrics.ts 2.1 KB

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