diff --git a/extensions/ql-vscode/src/common/interface-types.ts b/extensions/ql-vscode/src/common/interface-types.ts index eca0779966a..7d18d4db93c 100644 --- a/extensions/ql-vscode/src/common/interface-types.ts +++ b/extensions/ql-vscode/src/common/interface-types.ts @@ -420,8 +420,8 @@ export type ToComparePerformanceViewMessage = SetPerformanceComparisonQueries; export interface SetPerformanceComparisonQueries { readonly t: "setPerformanceComparison"; - readonly from: PerformanceComparisonDataFromLog; - readonly to: PerformanceComparisonDataFromLog; + readonly from: { name: string; data: PerformanceComparisonDataFromLog }; + readonly to: { name: string; data: PerformanceComparisonDataFromLog }; readonly comparison: boolean; } diff --git a/extensions/ql-vscode/src/compare-performance/compare-performance-view.ts b/extensions/ql-vscode/src/compare-performance/compare-performance-view.ts index a59367ea135..17d0399f3ac 100644 --- a/extensions/ql-vscode/src/compare-performance/compare-performance-view.ts +++ b/extensions/ql-vscode/src/compare-performance/compare-performance-view.ts @@ -19,6 +19,7 @@ import { PerformanceOverviewScanner } from "../log-insights/performance-comparis import type { ResultsView } from "../local-queries"; import { readJsonlFile } from "../common/jsonl-reader"; import type { SummaryEvent } from "../log-insights/log-summary"; +import type { CompletedLocalQueryInfo } from "../query-results"; export class ComparePerformanceView extends AbstractWebview< ToComparePerformanceViewMessage, @@ -33,7 +34,35 @@ export class ComparePerformanceView extends AbstractWebview< super(app); } - async showResults(fromJsonLog: string, toJsonLog: string) { + async showResults( + from: CompletedLocalQueryInfo, + to: CompletedLocalQueryInfo | undefined, + ) { + if (to === undefined) { + // For single-run comparisons, the performance viewer considers the 'from' side to be missing. + return this.showResultsAux(undefined, from); + } else { + return this.showResultsAux(from, to); + } + } + + private async showResultsAux( + from: CompletedLocalQueryInfo | undefined, + to: CompletedLocalQueryInfo, + ) { + const fromJsonLog = + from === undefined ? "" : from.evaluatorLogPaths?.jsonSummary; + const toJsonLog = to.evaluatorLogPaths?.jsonSummary; + + if (fromJsonLog === undefined || toJsonLog === undefined) { + return extLogger.showWarningMessage( + `Cannot compare performance as the structured logs are missing. Did the queries complete normally?`, + ); + } + await extLogger.log( + `Comparing performance of ${from?.getQueryName() ?? "baseline"} and ${to?.getQueryName()}`, + ); + const panel = await this.getPanel(); panel.reveal(undefined, false); @@ -75,10 +104,14 @@ export class ComparePerformanceView extends AbstractWebview< scanLogWithProgress(toJsonLog, fromJsonLog === "" ? "1/1" : "2/2"), ]); + const fromName = + from === undefined ? "" : this.labelProvider.getLabel(from); + const toName = this.labelProvider.getLabel(to); + await this.postMessage({ t: "setPerformanceComparison", - from: fromPerf.getData(), - to: toPerf.getData(), + from: { name: fromName, data: fromPerf.getData() }, + to: { name: toName, data: toPerf.getData() }, comparison: fromJsonLog !== "", }); } diff --git a/extensions/ql-vscode/src/extension.ts b/extensions/ql-vscode/src/extension.ts index bd73929ad63..5790a0b5dfb 100644 --- a/extensions/ql-vscode/src/extension.ts +++ b/extensions/ql-vscode/src/extension.ts @@ -1226,23 +1226,7 @@ async function showPerformanceComparison( from: CompletedLocalQueryInfo, to: CompletedLocalQueryInfo | undefined, ): Promise { - let fromLog = from.evaluatorLogPaths?.jsonSummary; - let toLog = to?.evaluatorLogPaths?.jsonSummary; - - if (to === undefined) { - toLog = fromLog; - fromLog = ""; - } - if (fromLog === undefined || toLog === undefined) { - return extLogger.showWarningMessage( - `Cannot compare performance as the structured logs are missing. Did they queries complete normally?`, - ); - } - await extLogger.log( - `Comparing performance of ${from.getQueryName()} and ${to?.getQueryName() ?? "baseline"}`, - ); - - await view.showResults(fromLog, toLog); + await view.showResults(from, to); } function addUnhandledRejectionListener() { diff --git a/extensions/ql-vscode/src/view/compare-performance/ComparePerformance.tsx b/extensions/ql-vscode/src/view/compare-performance/ComparePerformance.tsx index c9fac0a09dc..b983ea420cc 100644 --- a/extensions/ql-vscode/src/view/compare-performance/ComparePerformance.tsx +++ b/extensions/ql-vscode/src/view/compare-performance/ComparePerformance.tsx @@ -552,8 +552,8 @@ function ComparePerformanceWithData(props: { const { from, to } = useMemo( () => ({ - from: new ComparisonDataset(data.from), - to: new ComparisonDataset(data.to), + from: new ComparisonDataset(data.from.data), + to: new ComparisonDataset(data.to.data), }), [data], ); @@ -695,6 +695,13 @@ function ComparePerformanceWithData(props: { return ( <> Performance comparison +
+ {comparison ? "Comparing query runs" : "Showing query run"}: + +
{comparison && hasCacheHitMismatch.current && (