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