useSlowQueriesCount.ts 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. import { safeSql, type SafeSqlFragment } from '@supabase/pg-meta'
  2. import { useMemo } from 'react'
  3. import useDbQuery from '@/hooks/analytics/useDbQuery'
  4. export function buildSlowQueriesCountSql(): SafeSqlFragment {
  5. return safeSql`
  6. -- observability-slow-queries-count
  7. set search_path to public, extensions;
  8. SELECT
  9. CASE
  10. WHEN EXISTS (
  11. SELECT 1 FROM pg_extension WHERE extname = 'pg_stat_statements'
  12. )
  13. THEN (
  14. SELECT count(*)::int
  15. FROM pg_stat_statements
  16. WHERE total_exec_time + total_plan_time > 1000
  17. )
  18. ELSE 0
  19. END AS slow_queries_count;
  20. `
  21. }
  22. export const useSlowQueriesCount = (_projectRef?: string, refreshKey: number = 0) => {
  23. // refreshKey is used in useMemo to force recomputation when refresh is triggered
  24. const sql = useMemo(
  25. () => buildSlowQueriesCountSql(),
  26. // eslint-disable-next-line react-hooks/exhaustive-deps
  27. [refreshKey]
  28. )
  29. const { data, isLoading, error } = useDbQuery({
  30. sql,
  31. })
  32. const slowQueriesCount = useMemo(() => {
  33. if (!data || !Array.isArray(data) || data.length === 0) {
  34. return 0
  35. }
  36. return data[0]?.slow_queries_count ?? 0
  37. }, [data])
  38. return {
  39. slowQueriesCount,
  40. isLoading,
  41. error,
  42. }
  43. }