Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions extensions/ql-vscode/src/common/interface-types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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);

Expand Down Expand Up @@ -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 !== "",
});
}
Expand Down
18 changes: 1 addition & 17 deletions extensions/ql-vscode/src/extension.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1226,23 +1226,7 @@ async function showPerformanceComparison(
from: CompletedLocalQueryInfo,
to: CompletedLocalQueryInfo | undefined,
): Promise<void> {
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() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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],
);
Expand Down Expand Up @@ -695,6 +695,13 @@ function ComparePerformanceWithData(props: {
return (
<>
<ViewTitle>Performance comparison</ViewTitle>
<div>
{comparison ? "Comparing query runs" : "Showing query run"}:
<ul>
{comparison && <li>{data.from.name}</li>}
<li>{data.to.name}</li>
</ul>
</div>
{comparison && hasCacheHitMismatch.current && (
<label>
<input
Expand Down