Files
windmill/benchmarks/benchmark_graphs.ts
Ruben Fiszel 9e235937ce add WAC v2 benchmarks and improve benchmark infrastructure (#8550)
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-27 08:53:46 +00:00

94 lines
2.7 KiB
TypeScript

import { Command } from "https://deno.land/x/cliffy@v0.25.7/command/mod.ts";
import { UpgradeCommand } from "https://deno.land/x/cliffy@v0.25.7/command/upgrade/upgrade_command.ts";
import { DenoLandProvider } from "https://deno.land/x/cliffy@v0.25.7/command/upgrade/mod.ts";
import { drawGraph, drawGraphMulti } from "./graph.ts";
import { VERSION, loadJsonConfig } from "./lib.ts";
type GraphsConfig = {
graph_title: string;
benchmarks: {
kind: string;
workers: number;
label: string;
}[];
}[];
async function main({ configPath }: { configPath: string }) {
try {
const config = await loadJsonConfig<GraphsConfig>(configPath);
for (const graphConfig of config || []) {
const data: {
value: number;
ts: number;
date: Date;
kind: string;
}[] = [];
for (const benchmark of graphConfig.benchmarks) {
const benchmarkName =
benchmark.kind +
(benchmark.workers > 1 ? `_${benchmark.workers}workers` : "");
try {
const existing = await Deno.readTextFile(
`${benchmarkName}_benchmark.json`
);
const existingData = JSON.parse(existing)
.map((d: { value: number; ts: number }) => ({
...d,
date: new Date(d.ts),
kind: benchmark.label,
}))
.slice(-10);
data.push(...existingData);
} catch (err) {
console.log(
"Error while loading",
benchmark.kind,
benchmark.workers > 1
? `(${benchmark.workers} workers)`
: "(single worker)",
"benchmark data",
err
);
}
}
const svg =
graphConfig.benchmarks.length > 1
? drawGraphMulti(data, graphConfig.graph_title)
: drawGraph(data, graphConfig.graph_title);
const fileName = graphConfig.graph_title.replace(/ /g, "_");
await Deno.writeTextFile(`${fileName}.svg`, svg);
}
Deno.exit(0); // JSDOM from drawGraph doesn't exit cleanly
} catch (err) {
console.error(`Failed to read config file ${configPath}: ${err}`);
Deno.exit(0); // JSDOM from drawGraph doesn't exit cleanly
}
}
await new Command()
.name("wmillbenchgraphs")
.description("Create and save graphs from benchmark data.")
.version(VERSION)
.option("-c --config-path <config:string>", "The path of the config file", {
required: true,
})
.action(main)
.command(
"upgrade",
new UpgradeCommand({
main: "main.ts",
args: [
"--allow-net",
"--allow-read",
"--allow-write",
"--allow-env",
"--unstable",
],
provider: new DenoLandProvider({ name: "wmillbench" }),
})
)
.parse();