Total cost of query
-Currently:
-- {typeof currentCost === 'number' && !isNaN(currentCost) && isFinite(currentCost) - ? currentCost.toFixed(2) - : 'N/A'} -
-With index:
-{improvedCost.toFixed(2)}
- {improvement && - typeof improvement === 'number' && - !isNaN(improvement) && - isFinite(improvement) && ( -↓ {improvement.toFixed(1)}%
- )} -{value}
+ ) : ( +–
+ )} +{formattedValue}
diff --git a/apps/studio/components/interfaces/QueryPerformance/WithMonitor/WithMonitor.utils.ts b/apps/studio/components/interfaces/QueryPerformance/WithMonitor/WithMonitor.utils.ts deleted file mode 100644 index f65cfb3093..0000000000 --- a/apps/studio/components/interfaces/QueryPerformance/WithMonitor/WithMonitor.utils.ts +++ /dev/null @@ -1,301 +0,0 @@ -import dayjs from 'dayjs' -import utc from 'dayjs/plugin/utc' -import { transformLogsToJSON } from '../QueryPerformance.utils' -import { QueryPerformanceRow } from '../QueryPerformance.types' - -dayjs.extend(utc) - -export interface ParsedLogEntry { - bucket_start_time?: string - bucket?: string - timestamp?: string - ts?: string - mean_time?: number - mean_exec_time?: number - mean_query_time?: number - min_time?: number - min_exec_time?: number - min_query_time?: number - max_time?: number - max_exec_time?: number - max_query_time?: number - stddev_time?: number - stddev_exec_time?: number - stddev_query_time?: number - rows?: number - calls?: number - shared_blks_hit?: number - shared_blks_read?: number - query?: string - userid?: string - rolname?: string - resp_calls?: number[] - [key: string]: any -} - -export interface ChartDataPoint { - period_start: number - timestamp: string - query_latency: number - mean_time: number - min_time: number - max_time: number - stddev_time: number - p50_time: number - p95_time: number - rows_read: number - calls: number - cache_hits: number - cache_misses: number -} - -export const parsePgStatMonitorLogs = (logData: any[]): ParsedLogEntry[] => { - if (!logData || logData.length === 0) return [] - - const validParsedLogs = logData - .map((log) => ({ - ...log, - parsedEventMessage: transformLogsToJSON(log.event_message), - })) - .filter((log) => log.parsedEventMessage !== null) - .filter((log) => log.parsedEventMessage?.event === 'bucket_query') - - return validParsedLogs.map((log) => log.parsedEventMessage) -} - -export const transformLogsToChartData = (parsedLogs: ParsedLogEntry[]): ChartDataPoint[] => { - if (!parsedLogs || parsedLogs.length === 0) return [] - - // [kemal]: here for debugging - // if (parsedLogs.length > 0) { - // console.log('🟡 Parsed logs:', parsedLogs) - // } - - return parsedLogs - .map((log: ParsedLogEntry) => { - const possibleTimestamps = [log.bucket_start_time, log.bucket, log.timestamp, log.ts] - - let periodStart: number | null = null - - for (const ts of possibleTimestamps) { - if (ts) { - const date = new Date(ts) - const time = date.getTime() - if (!isNaN(time) && time > 0 && time > 946684800000) { - periodStart = time - break - } - } - } - - if (!periodStart) { - return null - } - - const percentiles = - log.resp_calls && Array.isArray(log.resp_calls) - ? calculatePercentilesFromHistogram(log.resp_calls) - : { p50: 0, p95: 0 } - - return { - period_start: periodStart, - timestamp: possibleTimestamps.find((t) => t) || '', - query_latency: parseFloat( - String(log.mean_time ?? log.mean_exec_time ?? log.mean_query_time ?? 0) - ), - mean_time: parseFloat( - String(log.mean_time ?? log.mean_exec_time ?? log.mean_query_time ?? 0) - ), - min_time: parseFloat(String(log.min_time ?? log.min_exec_time ?? log.min_query_time ?? 0)), - max_time: parseFloat(String(log.max_time ?? log.max_exec_time ?? log.max_query_time ?? 0)), - stddev_time: parseFloat( - String(log.stddev_time ?? log.stddev_exec_time ?? log.stddev_query_time ?? 0) - ), - p50_time: percentiles.p50, - p95_time: percentiles.p95, - rows_read: parseInt(String(log.rows ?? 0), 10), - calls: parseInt(String(log.calls ?? 0), 10), - cache_hits: parseFloat(String(log.shared_blks_hit ?? 0)), - cache_misses: parseFloat(String(log.shared_blks_read ?? 0)), - } - }) - .filter((item): item is NonNullable