finalize compareplot prototype, move formattime to units.js

This commit is contained in:
Christoph Kluge 2025-05-06 10:46:30 +02:00
parent 33ecfe88ef
commit d3d752f90c
5 changed files with 37 additions and 57 deletions

View File

@ -22,6 +22,7 @@
// mutationStore, // mutationStore,
} from "@urql/svelte"; } from "@urql/svelte";
import { Row, Col, Card, Spinner } from "@sveltestrap/sveltestrap"; import { Row, Col, Card, Spinner } from "@sveltestrap/sveltestrap";
import { formatTime } from "./units.js";
import Comparogram from "./plots/Comparogram.svelte"; import Comparogram from "./plots/Comparogram.svelte";
const ccconfig = getContext("cc-config"), const ccconfig = getContext("cc-config"),
@ -195,7 +196,8 @@
{#each $compareData.data.jobsMetricStats as job, jindex (job.jobId)} {#each $compareData.data.jobsMetricStats as job, jindex (job.jobId)}
<Row> <Row>
<Col><b>{jindex}: <i>{job.jobId}</i></b></Col> <Col><b>{jindex}: <i>{job.jobId}</i></b></Col>
<Col><i>{new Date(job.startTime * 1000)}</i></Col> <Col><i>{new Date(job.startTime * 1000).toISOString()}</i></Col>
<Col><i>{formatTime(job.duration)}</i></Col>
{#each job.stats as stat (stat.name)} {#each job.stats as stat (stat.name)}
<Col><b>{stat.name}</b></Col> <Col><b>{stat.name}</b></Col>
<Col>Min {stat.data.min}</Col> <Col>Min {stat.data.min}</Col>

View File

@ -14,7 +14,7 @@
<script> <script>
import uPlot from "uplot"; import uPlot from "uplot";
import { formatNumber } from "../units.js"; import { roundTwoDigits, formatTime } from "../units.js";
import { getContext, onMount, onDestroy } from "svelte"; import { getContext, onMount, onDestroy } from "svelte";
import { Card } from "@sveltestrap/sveltestrap"; import { Card } from "@sveltestrap/sveltestrap";
@ -30,32 +30,12 @@
// export let cluster = ""; // export let cluster = "";
// export let subCluster = ""; // export let subCluster = "";
$: console.log('LABEL:', metric, yunit)
$: console.log('DATA:', data)
$: console.log('XTICKS:', xticks)
const metricConfig = null // DEBUG FILLER const metricConfig = null // DEBUG FILLER
// const metricConfig = getContext("getMetricConfig")(cluster, subCluster, metric); // Args woher // const metricConfig = getContext("getMetricConfig")(cluster, subCluster, metric); // Args woher
const clusterCockpitConfig = getContext("cc-config"); const clusterCockpitConfig = getContext("cc-config");
const lineWidth = clusterCockpitConfig.plot_general_lineWidth / window.devicePixelRatio; const lineWidth = clusterCockpitConfig.plot_general_lineWidth / window.devicePixelRatio;
const cbmode = clusterCockpitConfig?.plot_general_colorblindMode || false; const cbmode = clusterCockpitConfig?.plot_general_colorblindMode || false;
// Format Seconds to hh:mm
function formatTime(t) {
if (t !== null) {
if (isNaN(t)) {
return t;
} else {
const tAbs = Math.abs(t);
const h = Math.floor(tAbs / 3600);
const m = Math.floor((tAbs % 3600) / 60);
if (h == 0) return `${m}m`;
else if (m == 0) return `${h}h`;
else return `${h}:${m}h`;
}
}
}
// UPLOT PLUGIN // converts the legend into a simple tooltip // UPLOT PLUGIN // converts the legend into a simple tooltip
function legendAsTooltipPlugin({ function legendAsTooltipPlugin({
className, className,
@ -160,18 +140,27 @@
scale: "y", scale: "y",
width: lineWidth, width: lineWidth,
stroke: cbmode ? "rgb(0,255,0)" : "red", stroke: cbmode ? "rgb(0,255,0)" : "red",
value: (u, ts, sidx, didx) => {
return `${roundTwoDigits(ts)} ${yunit}`;
},
}, },
{ {
label: "Avg", label: "Avg",
scale: "y", scale: "y",
width: lineWidth, width: lineWidth,
stroke: "black", stroke: "black",
value: (u, ts, sidx, didx) => {
return `${roundTwoDigits(ts)} ${yunit}`;
},
}, },
{ {
label: "Max", label: "Max",
scale: "y", scale: "y",
width: lineWidth, width: lineWidth,
stroke: cbmode ? "rgb(0,0,255)" : "green", stroke: cbmode ? "rgb(0,0,255)" : "green",
value: (u, ts, sidx, didx) => {
return `${roundTwoDigits(ts)} ${yunit}`;
},
} }
]; ];
@ -209,7 +198,7 @@
scale: "y", scale: "y",
grid: { show: true }, grid: { show: true },
labelFont: "sans-serif", labelFont: "sans-serif",
label: ylabel + ' (' + yunit + ')' label: ylabel + (yunit ? ` (${yunit})` : '')
}, },
], ],
bands: plotBands, bands: plotBands,
@ -218,7 +207,7 @@
draw: [ draw: [
(u) => { (u) => {
// Draw plot type label: // Draw plot type label:
let textl = "Metric Min/Avg/Max in Duration"; let textl = "Metric Min/Avg/Max for Job Duration";
let textr = "Earlier <- StartTime -> Later"; let textr = "Earlier <- StartTime -> Later";
u.ctx.save(); u.ctx.save();
u.ctx.textAlign = "start"; // 'end' u.ctx.textAlign = "start"; // 'end'

View File

@ -16,7 +16,7 @@
<script> <script>
import uPlot from "uplot"; import uPlot from "uplot";
import { onMount, onDestroy } from "svelte"; import { onMount, onDestroy } from "svelte";
import { formatNumber } from "../units.js"; import { formatNumber, formatTime } from "../units.js";
import { Card } from "@sveltestrap/sveltestrap"; import { Card } from "@sveltestrap/sveltestrap";
export let data; export let data;
@ -36,21 +36,6 @@
points: 2, points: 2,
}; };
function formatTime(t) {
if (t !== null) {
if (isNaN(t)) {
return t;
} else {
const tAbs = Math.abs(t);
const h = Math.floor(tAbs / 3600);
const m = Math.floor((tAbs % 3600) / 60);
if (h == 0) return `${m}m`;
else if (m == 0) return `${h}h`;
else return `${h}:${m}h`;
}
}
}
function paths(u, seriesIdx, idx0, idx1, extendGap, buildClip) { function paths(u, seriesIdx, idx0, idx1, extendGap, buildClip) {
let s = u.series[seriesIdx]; let s = u.series[seriesIdx];
let style = s.drawStyle; let style = s.drawStyle;

View File

@ -21,22 +21,6 @@
--> -->
<script context="module"> <script context="module">
function formatTime(t, forNode = false) {
if (t !== null) {
if (isNaN(t)) {
return t;
} else {
const tAbs = Math.abs(t);
const h = Math.floor(tAbs / 3600);
const m = Math.floor((tAbs % 3600) / 60);
// Re-Add "negativity" to time ticks only as string, so that if-cases work as intended
if (h == 0) return `${forNode && m != 0 ? "-" : ""}${m}m`;
else if (m == 0) return `${forNode ? "-" : ""}${h}h`;
else return `${forNode ? "-" : ""}${h}:${m}h`;
}
}
}
function timeIncrs(timestep, maxX, forNode) { function timeIncrs(timestep, maxX, forNode) {
if (forNode === true) { if (forNode === true) {
return [60, 120, 240, 300, 360, 480, 600, 900, 1800, 3600, 7200, 14400, 21600]; // forNode fixed increments return [60, 120, 240, 300, 360, 480, 600, 900, 1800, 3600, 7200, 14400, 21600]; // forNode fixed increments
@ -118,7 +102,7 @@
<script> <script>
import uPlot from "uplot"; import uPlot from "uplot";
import { formatNumber } from "../units.js"; import { formatNumber, formatTime } from "../units.js";
import { getContext, onMount, onDestroy, createEventDispatcher } from "svelte"; import { getContext, onMount, onDestroy, createEventDispatcher } from "svelte";
import { Card } from "@sveltestrap/sveltestrap"; import { Card } from "@sveltestrap/sveltestrap";

View File

@ -17,6 +17,10 @@ export function formatNumber(x) {
} }
} }
export function roundTwoDigits(x) {
return Math.round(x * 100) / 100
}
export function scaleNumbers(x, y , p = '') { export function scaleNumbers(x, y , p = '') {
const oldPower = power[prefix.indexOf(p)] const oldPower = power[prefix.indexOf(p)]
const rawXValue = x * oldPower const rawXValue = x * oldPower
@ -31,4 +35,20 @@ export function scaleNumbers(x, y , p = '') {
return Math.abs(rawYValue) >= 1000 ? `${rawXValue.toExponential()} / ${rawYValue.toExponential()}` : `${rawYValue.toString()} / ${rawYValue.toString()}` return Math.abs(rawYValue) >= 1000 ? `${rawXValue.toExponential()} / ${rawYValue.toExponential()}` : `${rawYValue.toString()} / ${rawYValue.toString()}`
} }
export function formatTime(t, forNode = false) {
if (t !== null) {
if (isNaN(t)) {
return t;
} else {
const tAbs = Math.abs(t);
const h = Math.floor(tAbs / 3600);
const m = Math.floor((tAbs % 3600) / 60);
// Re-Add "negativity" to time ticks only as string, so that if-cases work as intended
if (h == 0) return `${forNode && m != 0 ? "-" : ""}${m}m`;
else if (m == 0) return `${forNode ? "-" : ""}${h}h`;
else return `${forNode ? "-" : ""}${h}:${m}h`;
}
}
}
// export const dateToUnixEpoch = (rfc3339) => Math.floor(Date.parse(rfc3339) / 1000); // export const dateToUnixEpoch = (rfc3339) => Math.floor(Date.parse(rfc3339) / 1000);