Control graph with metric list

This commit is contained in:
Joscha 2023-08-15 23:46:02 +02:00
parent 678d3f391b
commit 4b55f5364a
2 changed files with 90 additions and 29 deletions

View file

@ -1,43 +1,102 @@
import uPlot from "./uPlot.js"; import uPlot from "./uPlot.js";
// https://sashamaps.net/docs/resources/20-colors/
// Related: https://en.wikipedia.org/wiki/Help:Distinguishable_colors
const COLORS = [
"#e6194B", // Red
"#3cb44b", // Green
"#ffe119", // Yellow
"#4363d8", // Blue
"#f58231", // Orange
// "#911eb4", // Purple
"#42d4f4", // Cyan
"#f032e6", // Magenta
// "#bfef45", // Lime
"#fabed4", // Pink
"#469990", // Teal
"#dcbeff", // Lavender
"#9A6324", // Brown
"#fffac8", // Beige
"#800000", // Maroon
"#aaffc3", // Mint
// "#808000", // Olive
"#ffd8b1", // Apricot
"#000075", // Navy
"#a9a9a9", // Grey
// "#ffffff", // White
"#000000", // Black
];
interface GraphData { interface GraphData {
hashes: string[]; hashes: string[];
times: number[]; times: number[];
measurements: { [key: string]: (number | null)[]; }; measurements: { [key: string]: (number | null)[]; };
} }
let opts = { function update_plot_with_data(data: GraphData) {
title: "HEHE", let series: uPlot.Series[] = [{}];
width: 600, let values: uPlot.AlignedData = [data.times];
height: 400,
series: [ for (const [i, metric] of Object.keys(data.measurements).sort().entries()) {
{}, series.push({
{ label: metric,
label: "wall-clock/build",
spanGaps: true, spanGaps: true,
stroke: "blue", stroke: COLORS[i % COLORS.length],
width: 1, });
values.push(data.measurements[metric]!);
}
const opts: uPlot.Options = {
title: "Measurements",
width: 600,
height: 400,
series,
};
plot?.destroy();
plot = new uPlot(opts, values, plot_div);
}
async function update_plot_with_metrics(metrics: string[]) {
const url = "data?" + new URLSearchParams(metrics.map(m => ["metric", m]));
const response = await fetch(url);
const data: GraphData = await response.json();
update_plot_with_data(data);
}
function find_selected_metrics(): string[] {
const inputs = metrics_div.querySelectorAll<HTMLInputElement>('input[type="checkbox"]');
let metrics: string[] = [];
for (const input of inputs) {
if (input.checked) {
metrics.push(input.name);
} }
], }
return metrics;
}; };
let plot = new uPlot(opts, [], document.body); async function update_plot() {
const metrics = find_selected_metrics();
if (metrics.length > 0) {
await update_plot_with_metrics(metrics);
} else {
update_plot_with_data({
hashes: [],
times: [],
measurements: {},
});
}
}
fetch("data?metric=wall-clock/build") // Initialization
.then(r => r.json() as Promise<GraphData>)
.then(data => {
console.log(data);
plot.setData([
data.times,
data.measurements["wall-clock/build"]!,
]);
});
// function display(metrics: string[]) { const plot_div = document.getElementById("plot")!;
// let url = "data" + new URLSearchParams(metrics.map(m => ["metric", m])); const metrics_div = document.getElementById("metrics")!;
// fetch(url) let plot: uPlot | null = null;
// .then(r => r.json() as Promise<GraphData>)
// .then(data => {
// }) for (const input of metrics_div.querySelectorAll<HTMLInputElement>('input[type="checkbox"]')) {
// } input.addEventListener("change", update_plot);
}
update_plot();

View file

@ -33,6 +33,8 @@
<div id="plot"></div> <div id="plot"></div>
{{ metrics|safe }} <div id="metrics">
{{ metrics|safe }}
</div>
{% endblock %} {% endblock %}