import { Info } from 'lucide-react' import { parseAsJson, useQueryStates } from 'nuqs' import React, { useMemo } from 'react' import { cn, Skeleton, Tooltip, TooltipContent, TooltipTrigger } from 'ui' import { useQueryPerformanceQuery } from './useQueryPerformanceQuery' import { NumericFilter } from '@/components/interfaces/Reports/v2/ReportsNumericFilter' export const QueryPerformanceMetrics = () => { const { data: queryMetrics, isLoading } = useQueryPerformanceQuery({ preset: 'queryMetrics' }) const [, setSearchParams] = useQueryStates({ totalTimeFilter: parseAsJson((value) => value === null || value === undefined ? null : (value as NumericFilter) ), }) const stats = useMemo(() => { const slowQueriesTitle = queryMetrics?.[0]?.slow_queries === 1 ? 'Slow Query' : 'Slow Queries' const slowQueriesValue = queryMetrics?.[0]?.slow_queries || '0' return [ { title: slowQueriesTitle, value: slowQueriesValue, onClick: () => { setSearchParams({ totalTimeFilter: { operator: '>', value: 1000, } as NumericFilter, }) }, }, { title: 'Cache Hit Rate', value: queryMetrics?.[0]?.cache_hit_rate || '0%', tooltip: 'Percentage of data read from cache vs disk. Higher is better - it means faster queries and less database load.', }, { title: 'Avg. Rows Per Call', value: queryMetrics?.[0]?.avg_rows_per_call || '0', tooltip: 'Average number of rows returned per query execution. Helps identify queries that return too much or too little data.', }, ] }, [queryMetrics, setSearchParams]) return (
{stats.map((card, i) => (
{isLoading ? ( ) : ( <> {card.value} {card.title} {(card.title === 'Slow Queries' || card.title === 'Slow Query') && ( Slow queries are those with total execution time (execution time + planning time) greater than 1000ms. )} {card.tooltip && ( {card.tooltip} )} )}
{i < stats.length - 1 && /}
))}
) }