From 898fd44ecacfc5adea96e7cff495c4accc81a468 Mon Sep 17 00:00:00 2001 From: Joshen Lim Date: Thu, 6 Feb 2025 14:26:48 +0800 Subject: [PATCH] Support resetting query performance report on read replica (#33346) --- .../QueryPerformance/QueryPerformance.tsx | 47 ++++++++++++++----- 1 file changed, 34 insertions(+), 13 deletions(-) diff --git a/apps/studio/components/interfaces/QueryPerformance/QueryPerformance.tsx b/apps/studio/components/interfaces/QueryPerformance/QueryPerformance.tsx index c9fdfb6778a..ed45378c08c 100644 --- a/apps/studio/components/interfaces/QueryPerformance/QueryPerformance.tsx +++ b/apps/studio/components/interfaces/QueryPerformance/QueryPerformance.tsx @@ -6,10 +6,12 @@ import { toast } from 'sonner' import { useParams } from 'common' import { useProjectContext } from 'components/layouts/ProjectLayout/ProjectContext' +import { useReadReplicasQuery } from 'data/read-replicas/replicas-query' +import { formatDatabaseID } from 'data/read-replicas/replicas.utils' import { executeSql } from 'data/sql/execute-sql-query' import { DbQueryHook } from 'hooks/analytics/useDbQuery' import { useLocalStorageQuery } from 'hooks/misc/useLocalStorage' -import { LOCAL_STORAGE_KEYS } from 'lib/constants' +import { IS_PLATFORM, LOCAL_STORAGE_KEYS } from 'lib/constants' import { useDatabaseSelectorStateSnapshot } from 'state/database-selector' import { Button, @@ -22,7 +24,7 @@ import { TooltipTrigger, cn, } from 'ui' -import ConfirmModal from 'ui-patterns/Dialogs/ConfirmDialog' +import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal' import ShimmeringLoader from 'ui-patterns/ShimmeringLoader' import { Markdown } from '../Markdown' import { useQueryPerformanceQuery } from '../Reports/Reports.queries' @@ -46,6 +48,8 @@ export const QueryPerformance = ({ const state = useDatabaseSelectorStateSnapshot() const { isLoading, isRefetching } = queryPerformanceQuery + const isPrimaryDatabase = state.selectedDatabaseId === ref + const formattedDatabaseId = formatDatabaseID(state.selectedDatabaseId ?? '') const [page, setPage] = useState( (preset as QUERY_PERFORMANCE_REPORT_TYPES) ?? QUERY_PERFORMANCE_REPORT_TYPES.MOST_TIME_CONSUMING @@ -62,6 +66,8 @@ export const QueryPerformance = ({ queryHitRate.runQuery() } + const { data: databases } = useReadReplicasQuery({ projectRef: ref }) + const { data: mostTimeConsumingQueries, isLoading: isLoadingMTC } = useQueryPerformanceQuery({ preset: 'mostTimeConsuming', }) @@ -246,21 +252,27 @@ export const QueryPerformance = ({ - setShowResetgPgStatStatements(false)} - onSelectConfirm={async () => { + confirmLabel="Reset report" + confirmLabelLoading="Resetting report" + onCancel={() => setShowResetgPgStatStatements(false)} + onConfirm={async () => { + const connectionString = databases?.find( + (db) => db.identifier === state.selectedDatabaseId + )?.connectionString + + if (IS_PLATFORM && !connectionString) { + return toast.error('Unable to run query: Connection string is missing') + } + try { await executeSql({ projectRef: project?.ref, - connectionString: project?.connectionString, + connectionString, sql: `SELECT pg_stat_statements_reset();`, }) handleRefresh() @@ -269,7 +281,16 @@ export const QueryPerformance = ({ toast.error(`Failed to reset analysis: ${error.message}`) } }} - /> + > +

+ This will reset the pg_stat_statements table in the extensions schema on your{' '} + + {isPrimaryDatabase ? 'primary database' : `read replica (ID: ${formattedDatabaseId})`} + + , which is used to calculate query performance. This data will repopulate immediately + after. +

+ ) }