mirror of
https://github.com/ClusterCockpit/cc-backend
synced 2025-12-16 20:26:16 +01:00
cleanup, adapt internalDash, remove debug query value
This commit is contained in:
@@ -16,19 +16,14 @@
|
|||||||
} from "@urql/svelte";
|
} from "@urql/svelte";
|
||||||
import {
|
import {
|
||||||
init,
|
init,
|
||||||
scramble,
|
|
||||||
scrambleNames,
|
|
||||||
convert2uplot
|
|
||||||
} from "./generic/utils.js";
|
} from "./generic/utils.js";
|
||||||
import {
|
import {
|
||||||
formatDurationTime,
|
|
||||||
formatNumber,
|
formatNumber,
|
||||||
} from "./generic/units.js";
|
} from "./generic/units.js";
|
||||||
import {
|
import {
|
||||||
Row,
|
Row,
|
||||||
Col,
|
Col,
|
||||||
Card,
|
Card,
|
||||||
CardTitle,
|
|
||||||
CardHeader,
|
CardHeader,
|
||||||
CardBody,
|
CardBody,
|
||||||
Spinner,
|
Spinner,
|
||||||
@@ -39,9 +34,10 @@
|
|||||||
import Roofline from "./generic/plots/Roofline.svelte";
|
import Roofline from "./generic/plots/Roofline.svelte";
|
||||||
import Pie, { colors } from "./generic/plots/Pie.svelte";
|
import Pie, { colors } from "./generic/plots/Pie.svelte";
|
||||||
import Stacked from "./generic/plots/Stacked.svelte";
|
import Stacked from "./generic/plots/Stacked.svelte";
|
||||||
// import Histogram from "./generic/plots/Histogram.svelte";
|
|
||||||
import DoubleMetric from "./generic/plots/DoubleMetricPlot.svelte";
|
import DoubleMetric from "./generic/plots/DoubleMetricPlot.svelte";
|
||||||
|
|
||||||
|
// Todo: Refresher-Tick
|
||||||
|
|
||||||
/* Svelte 5 Props */
|
/* Svelte 5 Props */
|
||||||
let {
|
let {
|
||||||
presetCluster,
|
presetCluster,
|
||||||
@@ -53,7 +49,6 @@
|
|||||||
const useCbColors = getContext("cc-config")?.plotConfiguration_colorblindMode || false
|
const useCbColors = getContext("cc-config")?.plotConfiguration_colorblindMode || false
|
||||||
|
|
||||||
/* States */
|
/* States */
|
||||||
let pagingState = $state({page: 1, itemsPerPage: 10}) // Top 10
|
|
||||||
let from = $state(new Date(Date.now() - (5 * 60 * 1000)));
|
let from = $state(new Date(Date.now() - (5 * 60 * 1000)));
|
||||||
let clusterFrom = $state(new Date(Date.now() - (8 * 60 * 60 * 1000)));
|
let clusterFrom = $state(new Date(Date.now() - (8 * 60 * 60 * 1000)));
|
||||||
let to = $state(new Date(Date.now()));
|
let to = $state(new Date(Date.now()));
|
||||||
@@ -68,13 +63,8 @@
|
|||||||
const statesTimed = $derived(queryStore({
|
const statesTimed = $derived(queryStore({
|
||||||
client: client,
|
client: client,
|
||||||
query: gql`
|
query: gql`
|
||||||
query ($filter: [NodeFilter!], $typeNode: String!, $typeHealth: String!) {
|
query ($filter: [NodeFilter!], $type: String!) {
|
||||||
nodeStates: nodeStatesTimed(filter: $filter, type: $typeNode) {
|
nodeStatesTimed(filter: $filter, type: $type) {
|
||||||
state
|
|
||||||
counts
|
|
||||||
times
|
|
||||||
}
|
|
||||||
healthStates: nodeStatesTimed(filter: $filter, type: $typeHealth) {
|
|
||||||
state
|
state
|
||||||
counts
|
counts
|
||||||
times
|
times
|
||||||
@@ -82,9 +72,8 @@
|
|||||||
}
|
}
|
||||||
`,
|
`,
|
||||||
variables: {
|
variables: {
|
||||||
filter: { cluster: { eq: presetCluster }, timeStart: stackedFrom}, // DEBUG VALUE 1760096999, use StackedFrom
|
filter: { cluster: { eq: presetCluster }, timeStart: stackedFrom},
|
||||||
typeNode: "node",
|
type: "node",
|
||||||
typeHealth: "health"
|
|
||||||
},
|
},
|
||||||
requestPolicy: "network-only"
|
requestPolicy: "network-only"
|
||||||
}));
|
}));
|
||||||
@@ -97,7 +86,6 @@
|
|||||||
query (
|
query (
|
||||||
$cluster: String!
|
$cluster: String!
|
||||||
$metrics: [String!]
|
$metrics: [String!]
|
||||||
# $nmetrics: [String!]
|
|
||||||
$from: Time!
|
$from: Time!
|
||||||
$to: Time!
|
$to: Time!
|
||||||
$clusterFrom: Time!
|
$clusterFrom: Time!
|
||||||
@@ -207,7 +195,6 @@
|
|||||||
variables: {
|
variables: {
|
||||||
cluster: presetCluster,
|
cluster: presetCluster,
|
||||||
metrics: ["flops_any", "mem_bw"], // Metrics For Cluster Plot and Roofline
|
metrics: ["flops_any", "mem_bw"], // Metrics For Cluster Plot and Roofline
|
||||||
// nmetrics: ["cpu_load", "acc_utilization"], // Metrics for Node Graph
|
|
||||||
from: from.toISOString(),
|
from: from.toISOString(),
|
||||||
clusterFrom: clusterFrom.toISOString(),
|
clusterFrom: clusterFrom.toISOString(),
|
||||||
to: to.toISOString(),
|
to: to.toISOString(),
|
||||||
@@ -219,31 +206,6 @@
|
|||||||
requestPolicy: "network-only"
|
requestPolicy: "network-only"
|
||||||
}));
|
}));
|
||||||
|
|
||||||
const topJobsQuery = $derived(queryStore({
|
|
||||||
client: client,
|
|
||||||
query: gql`
|
|
||||||
query (
|
|
||||||
$filter: [JobFilter!]!
|
|
||||||
$paging: PageRequest!
|
|
||||||
) {
|
|
||||||
jobsStatistics(
|
|
||||||
filter: $filter
|
|
||||||
page: $paging
|
|
||||||
sortBy: TOTALJOBS
|
|
||||||
groupBy: PROJECT
|
|
||||||
) {
|
|
||||||
id
|
|
||||||
totalJobs
|
|
||||||
}
|
|
||||||
}
|
|
||||||
`,
|
|
||||||
variables: {
|
|
||||||
filter: [{ state: ["running"] }, { cluster: { eq: presetCluster} }],
|
|
||||||
paging: pagingState // Top 10
|
|
||||||
},
|
|
||||||
requestPolicy: "network-only"
|
|
||||||
}));
|
|
||||||
|
|
||||||
// Note: nodeMetrics are requested on configured $timestep resolution
|
// Note: nodeMetrics are requested on configured $timestep resolution
|
||||||
const nodeStatusQuery = $derived(queryStore({
|
const nodeStatusQuery = $derived(queryStore({
|
||||||
client: client,
|
client: client,
|
||||||
@@ -351,19 +313,6 @@
|
|||||||
});
|
});
|
||||||
|
|
||||||
/* Functions */
|
/* Functions */
|
||||||
// function legendColors(targetIdx, useAltColors) {
|
|
||||||
// // Reuses first color if targetIdx overflows
|
|
||||||
// let c;
|
|
||||||
// if (useCbColors) {
|
|
||||||
// c = [...colors['colorblind']];
|
|
||||||
// } else if (useAltColors) {
|
|
||||||
// c = [...colors['alternative']];
|
|
||||||
// } else {
|
|
||||||
// c = [...colors['default']];
|
|
||||||
// }
|
|
||||||
// return c[(c.length + targetIdx) % c.length];
|
|
||||||
// }
|
|
||||||
|
|
||||||
function transformNodesStatsToData(subclusterData) {
|
function transformNodesStatsToData(subclusterData) {
|
||||||
let data = null
|
let data = null
|
||||||
const x = [], y = []
|
const x = [], y = []
|
||||||
@@ -415,30 +364,18 @@
|
|||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Inspect */
|
|
||||||
$inspect(clusterInfo).with((type, clusterInfo) => {
|
|
||||||
console.log(type, 'clusterInfo', clusterInfo)
|
|
||||||
});
|
|
||||||
|
|
||||||
$inspect($statusQuery?.data?.clusterMetrics).with((type, clusterMetrics) => {
|
|
||||||
console.log(type, 'clusterMetrics', clusterMetrics)
|
|
||||||
});
|
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<Card style="height: 98vh;">
|
<Card style="height: 98vh;">
|
||||||
<!-- <CardHeader class="text-center">
|
|
||||||
<h3 class="mb-0">{presetCluster.charAt(0).toUpperCase() + presetCluster.slice(1)} Dashboard</h3>
|
|
||||||
</CardHeader> -->
|
|
||||||
<CardBody class="align-content-center">
|
<CardBody class="align-content-center">
|
||||||
{#if $statusQuery.fetching || $statesTimed.fetching || $topJobsQuery.fetching || $nodeStatusQuery.fetching}
|
{#if $statusQuery.fetching || $statesTimed.fetching || $nodeStatusQuery.fetching}
|
||||||
<Row class="justify-content-center">
|
<Row class="justify-content-center">
|
||||||
<Col xs="auto">
|
<Col xs="auto">
|
||||||
<Spinner />
|
<Spinner />
|
||||||
</Col>
|
</Col>
|
||||||
</Row>
|
</Row>
|
||||||
|
|
||||||
{:else if $statusQuery.error || $statesTimed.error || $topJobsQuery.error || $nodeStatusQuery.error}
|
{:else if $statusQuery.error || $statesTimed.error || $nodeStatusQuery.error}
|
||||||
<Row cols={{xs:1, md:2}}>
|
<Row cols={{xs:1, md:2}}>
|
||||||
{#if $statusQuery.error}
|
{#if $statusQuery.error}
|
||||||
<Col>
|
<Col>
|
||||||
@@ -450,11 +387,6 @@
|
|||||||
<Card color="danger">Error Requesting StatesTimed: {$statesTimed.error.message}</Card>
|
<Card color="danger">Error Requesting StatesTimed: {$statesTimed.error.message}</Card>
|
||||||
</Col>
|
</Col>
|
||||||
{/if}
|
{/if}
|
||||||
{#if $topJobsQuery.error}
|
|
||||||
<Col>
|
|
||||||
<Card color="danger">Error Requesting TopJobsQuery: {$topJobsQuery.error.message}</Card>
|
|
||||||
</Col>
|
|
||||||
{/if}
|
|
||||||
{#if $nodeStatusQuery.error}
|
{#if $nodeStatusQuery.error}
|
||||||
<Col>
|
<Col>
|
||||||
<Card color="danger">Error Requesting NodeStatusQuery: {$nodeStatusQuery.error.message}</Card>
|
<Card color="danger">Error Requesting NodeStatusQuery: {$nodeStatusQuery.error.message}</Card>
|
||||||
@@ -477,10 +409,6 @@
|
|||||||
|
|
||||||
<Col> <!-- Utilization Info Card -->
|
<Col> <!-- Utilization Info Card -->
|
||||||
<Card class="h-100">
|
<Card class="h-100">
|
||||||
<!-- <CardHeader>
|
|
||||||
<CardTitle class="mb-0">Cluster "{presetCluster.charAt(0).toUpperCase() + presetCluster.slice(1)}"</CardTitle>
|
|
||||||
<span>{[...clusterInfo?.processorTypes].toString()}</span>
|
|
||||||
</CardHeader> -->
|
|
||||||
<CardBody>
|
<CardBody>
|
||||||
<Table borderless>
|
<Table borderless>
|
||||||
<tr class="py-2">
|
<tr class="py-2">
|
||||||
@@ -559,7 +487,7 @@
|
|||||||
</Card>
|
</Card>
|
||||||
</Col>
|
</Col>
|
||||||
|
|
||||||
<Col> <!-- Resources/Job Histogram OR Total Cluster Metric in Time SUMS-->
|
<Col> <!-- Total Cluster Metric in Time SUMS-->
|
||||||
<div bind:clientWidth={colWidthTotals}>
|
<div bind:clientWidth={colWidthTotals}>
|
||||||
<DoubleMetric
|
<DoubleMetric
|
||||||
width={colWidthTotals}
|
width={colWidthTotals}
|
||||||
@@ -570,29 +498,6 @@
|
|||||||
fixLinewidth={2}
|
fixLinewidth={2}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<!-- {#if clusterInfo?.totalAccs == 0}
|
|
||||||
<Histogram
|
|
||||||
data={convert2uplot($nodeStatusQuery.data.jobsStatistics[0].histNumCores)}
|
|
||||||
title="Number of Cores Distribution"
|
|
||||||
xlabel="Allocated Cores"
|
|
||||||
xunit="Nodes"
|
|
||||||
ylabel="Number of Jobs"
|
|
||||||
yunit="Jobs"
|
|
||||||
height="275"
|
|
||||||
enableFlip
|
|
||||||
/>
|
|
||||||
{:else}
|
|
||||||
<Histogram
|
|
||||||
data={convert2uplot($nodeStatusQuery.data.jobsStatistics[0].histNumAccs)}
|
|
||||||
title="Number of Accelerators Distribution"
|
|
||||||
xlabel="Allocated Accs"
|
|
||||||
xunit="Accs"
|
|
||||||
ylabel="Number of Jobs"
|
|
||||||
yunit="Jobs"
|
|
||||||
height="275"
|
|
||||||
enableFlip
|
|
||||||
/>
|
|
||||||
{/if} -->
|
|
||||||
</Col>
|
</Col>
|
||||||
|
|
||||||
<Col> <!-- Nodes Roofline -->
|
<Col> <!-- Nodes Roofline -->
|
||||||
@@ -620,9 +525,6 @@
|
|||||||
<Col class="px-3 mt-2 mt-lg-0">
|
<Col class="px-3 mt-2 mt-lg-0">
|
||||||
<div bind:clientWidth={colWidthStates}>
|
<div bind:clientWidth={colWidthStates}>
|
||||||
{#key refinedStateData}
|
{#key refinedStateData}
|
||||||
<!-- <h4 class="text-center">
|
|
||||||
Cluster Status
|
|
||||||
</h4> -->
|
|
||||||
<Pie
|
<Pie
|
||||||
canvasId="hpcpie-slurm"
|
canvasId="hpcpie-slurm"
|
||||||
size={colWidthStates * 0.66}
|
size={colWidthStates * 0.66}
|
||||||
@@ -663,9 +565,9 @@
|
|||||||
|
|
||||||
<Col> <!-- Stacked SchedState -->
|
<Col> <!-- Stacked SchedState -->
|
||||||
<div bind:clientWidth={colWidthStacked}>
|
<div bind:clientWidth={colWidthStacked}>
|
||||||
{#key $statesTimed?.data?.nodeStates}
|
{#key $statesTimed?.data?.nodeStatesTimed}
|
||||||
<Stacked
|
<Stacked
|
||||||
data={$statesTimed?.data?.nodeStates}
|
data={$statesTimed?.data?.nodeStatesTimed}
|
||||||
width={colWidthStacked * 0.95}
|
width={colWidthStacked * 0.95}
|
||||||
xlabel="Time"
|
xlabel="Time"
|
||||||
ylabel="Nodes"
|
ylabel="Nodes"
|
||||||
|
|||||||
@@ -687,13 +687,6 @@
|
|||||||
const originY = u.valToPos(yMinimum ? yMinimum : 0.01, "y", true);
|
const originY = u.valToPos(yMinimum ? yMinimum : 0.01, "y", true);
|
||||||
|
|
||||||
const outerX = u.valToPos(1000, "x", true); // rightmost x in plot coords
|
const outerX = u.valToPos(1000, "x", true); // rightmost x in plot coords
|
||||||
const outerY = u.valToPos(
|
|
||||||
subCluster?.flopRateSimd?.value
|
|
||||||
? nearestThousand(subCluster.flopRateSimd.value)
|
|
||||||
: 10000,
|
|
||||||
"y",
|
|
||||||
true
|
|
||||||
);
|
|
||||||
|
|
||||||
const scalarKneeX = u.valToPos(scalarKnee, "x", true) // Value, axis, toCanvasPixels
|
const scalarKneeX = u.valToPos(scalarKnee, "x", true) // Value, axis, toCanvasPixels
|
||||||
const simdKneeX = u.valToPos(simdKnee, "x", true)
|
const simdKneeX = u.valToPos(simdKnee, "x", true)
|
||||||
|
|||||||
@@ -18,7 +18,6 @@
|
|||||||
init,
|
init,
|
||||||
scramble,
|
scramble,
|
||||||
scrambleNames,
|
scrambleNames,
|
||||||
convert2uplot
|
|
||||||
} from "../generic/utils.js";
|
} from "../generic/utils.js";
|
||||||
import {
|
import {
|
||||||
formatDurationTime,
|
formatDurationTime,
|
||||||
@@ -39,7 +38,7 @@
|
|||||||
import Roofline from "../generic/plots/Roofline.svelte";
|
import Roofline from "../generic/plots/Roofline.svelte";
|
||||||
import Pie, { colors } from "../generic/plots/Pie.svelte";
|
import Pie, { colors } from "../generic/plots/Pie.svelte";
|
||||||
import Stacked from "../generic/plots/Stacked.svelte";
|
import Stacked from "../generic/plots/Stacked.svelte";
|
||||||
import Histogram from "../generic/plots/Histogram.svelte";
|
import DoubleMetric from "../generic/plots/DoubleMetricPlot.svelte";
|
||||||
|
|
||||||
/* Svelte 5 Props */
|
/* Svelte 5 Props */
|
||||||
let {
|
let {
|
||||||
@@ -54,10 +53,12 @@
|
|||||||
/* States */
|
/* States */
|
||||||
let pagingState = $state({page: 1, itemsPerPage: 10}) // Top 10
|
let pagingState = $state({page: 1, itemsPerPage: 10}) // Top 10
|
||||||
let from = $state(new Date(Date.now() - 5 * 60 * 1000));
|
let from = $state(new Date(Date.now() - 5 * 60 * 1000));
|
||||||
|
let clusterFrom = $state(new Date(Date.now() - (8 * 60 * 60 * 1000)));
|
||||||
let to = $state(new Date(Date.now()));
|
let to = $state(new Date(Date.now()));
|
||||||
let stackedFrom = $state(Math.floor(Date.now() / 1000) - 14400);
|
let stackedFrom = $state(Math.floor(Date.now() / 1000) - 14400);
|
||||||
let colWidthJobs = $state(0);
|
let colWidthJobs = $state(0);
|
||||||
let colWidthRoof = $state(0);
|
let colWidthRoof = $state(0);
|
||||||
|
let colWidthTotals =$state(0);
|
||||||
let colWidthStacked1 = $state(0);
|
let colWidthStacked1 = $state(0);
|
||||||
let colWidthStacked2 = $state(0);
|
let colWidthStacked2 = $state(0);
|
||||||
|
|
||||||
@@ -80,7 +81,7 @@
|
|||||||
}
|
}
|
||||||
`,
|
`,
|
||||||
variables: {
|
variables: {
|
||||||
filter: { cluster: { eq: presetCluster }, timeStart: 1760096999}, // DEBUG VALUE, use StackedFrom
|
filter: { cluster: { eq: presetCluster }, timeStart: stackedFrom},
|
||||||
typeNode: "node",
|
typeNode: "node",
|
||||||
typeHealth: "health"
|
typeHealth: "health"
|
||||||
},
|
},
|
||||||
@@ -97,6 +98,7 @@
|
|||||||
$metrics: [String!]
|
$metrics: [String!]
|
||||||
$from: Time!
|
$from: Time!
|
||||||
$to: Time!
|
$to: Time!
|
||||||
|
$clusterFrom: Time!
|
||||||
$jobFilter: [JobFilter!]!
|
$jobFilter: [JobFilter!]!
|
||||||
$paging: PageRequest!
|
$paging: PageRequest!
|
||||||
$sorting: OrderByInput!
|
$sorting: OrderByInput!
|
||||||
@@ -164,6 +166,24 @@
|
|||||||
totalCores
|
totalCores
|
||||||
totalAccs
|
totalAccs
|
||||||
}
|
}
|
||||||
|
# ClusterMetrics for doubleMetricPlot
|
||||||
|
clusterMetrics(
|
||||||
|
cluster: $cluster
|
||||||
|
metrics: $metrics
|
||||||
|
from: $clusterFrom
|
||||||
|
to: $to
|
||||||
|
) {
|
||||||
|
nodeCount
|
||||||
|
metrics {
|
||||||
|
name
|
||||||
|
unit {
|
||||||
|
prefix
|
||||||
|
base
|
||||||
|
}
|
||||||
|
timestep
|
||||||
|
data
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
`,
|
`,
|
||||||
variables: {
|
variables: {
|
||||||
@@ -171,6 +191,7 @@
|
|||||||
metrics: ["flops_any", "mem_bw"], // Fixed names for roofline and status bars
|
metrics: ["flops_any", "mem_bw"], // Fixed names for roofline and status bars
|
||||||
from: from.toISOString(),
|
from: from.toISOString(),
|
||||||
to: to.toISOString(),
|
to: to.toISOString(),
|
||||||
|
clusterFrom: clusterFrom.toISOString(),
|
||||||
jobFilter: [{ state: ["running"] }, { cluster: { eq: presetCluster } }],
|
jobFilter: [{ state: ["running"] }, { cluster: { eq: presetCluster } }],
|
||||||
paging: { itemsPerPage: -1, page: 1 }, // Get all: -1
|
paging: { itemsPerPage: -1, page: 1 }, // Get all: -1
|
||||||
sorting: { field: "startTime", type: "col", order: "DESC" }
|
sorting: { field: "startTime", type: "col", order: "DESC" }
|
||||||
@@ -360,18 +381,10 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Inspect */
|
|
||||||
$inspect(clusterInfo).with((type, clusterInfo) => {
|
|
||||||
console.log(type, 'clusterInfo', clusterInfo)
|
|
||||||
});
|
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<Card>
|
<Card style="height: 88vh;">
|
||||||
<CardHeader class="text-center">
|
<CardBody class="align-content-center">
|
||||||
<h3 class="mb-0">{presetCluster.charAt(0).toUpperCase() + presetCluster.slice(1)} Dashboard</h3>
|
|
||||||
</CardHeader>
|
|
||||||
<CardBody>
|
|
||||||
{#if $statusQuery.fetching || $statesTimed.fetching || $topJobsQuery.fetching || $nodeStatusQuery.fetching}
|
{#if $statusQuery.fetching || $statesTimed.fetching || $topJobsQuery.fetching || $nodeStatusQuery.fetching}
|
||||||
<Row class="justify-content-center">
|
<Row class="justify-content-center">
|
||||||
<Col xs="auto">
|
<Col xs="auto">
|
||||||
@@ -409,7 +422,7 @@
|
|||||||
<Card class="h-auto mt-1">
|
<Card class="h-auto mt-1">
|
||||||
<CardHeader>
|
<CardHeader>
|
||||||
<CardTitle class="mb-0">Cluster "{presetCluster.charAt(0).toUpperCase() + presetCluster.slice(1)}"</CardTitle>
|
<CardTitle class="mb-0">Cluster "{presetCluster.charAt(0).toUpperCase() + presetCluster.slice(1)}"</CardTitle>
|
||||||
<span>{[...clusterInfo?.processorTypes].toString()}</span>
|
<span>{[...clusterInfo?.processorTypes].join(', ')}</span>
|
||||||
</CardHeader>
|
</CardHeader>
|
||||||
<CardBody>
|
<CardBody>
|
||||||
<Table borderless>
|
<Table borderless>
|
||||||
@@ -488,6 +501,7 @@
|
|||||||
</CardBody>
|
</CardBody>
|
||||||
</Card>
|
</Card>
|
||||||
</Col>
|
</Col>
|
||||||
|
|
||||||
<Col> <!-- Pie Jobs -->
|
<Col> <!-- Pie Jobs -->
|
||||||
<Row cols={{xs:1, md:2}}>
|
<Row cols={{xs:1, md:2}}>
|
||||||
<Col class="p-2">
|
<Col class="p-2">
|
||||||
@@ -529,6 +543,7 @@
|
|||||||
</Col>
|
</Col>
|
||||||
</Row>
|
</Row>
|
||||||
</Col>
|
</Col>
|
||||||
|
|
||||||
<Col> <!-- Job Roofline -->
|
<Col> <!-- Job Roofline -->
|
||||||
<div bind:clientWidth={colWidthRoof}>
|
<div bind:clientWidth={colWidthRoof}>
|
||||||
{#key $statusQuery?.data?.jobsMetricStats}
|
{#key $statusQuery?.data?.jobsMetricStats}
|
||||||
@@ -544,31 +559,20 @@
|
|||||||
{/key}
|
{/key}
|
||||||
</div>
|
</div>
|
||||||
</Col>
|
</Col>
|
||||||
<Col> <!-- Resources/Job Histogram -->
|
|
||||||
{#if clusterInfo?.totalAccs == 0}
|
<Col> <!-- Total Cluster Metric in Time SUMS-->
|
||||||
<Histogram
|
<div bind:clientWidth={colWidthTotals}>
|
||||||
data={convert2uplot($nodeStatusQuery.data.jobsStatistics[0].histNumCores)}
|
<DoubleMetric
|
||||||
title="Number of Cores Distribution"
|
width={colWidthTotals}
|
||||||
xlabel="Allocated Cores"
|
timestep={$statusQuery?.data?.clusterMetrics[0]?.timestep || 60}
|
||||||
xunit="Nodes"
|
numNodes={$statusQuery?.data?.clusterMetrics?.nodeCount || 0}
|
||||||
ylabel="Number of Jobs"
|
metricData={$statusQuery?.data?.clusterMetrics?.metrics || []}
|
||||||
yunit="Jobs"
|
cluster={presetCluster}
|
||||||
height="275"
|
fixLinewidth={2}
|
||||||
enableFlip
|
|
||||||
/>
|
/>
|
||||||
{:else}
|
</div>
|
||||||
<Histogram
|
|
||||||
data={convert2uplot($nodeStatusQuery.data.jobsStatistics[0].histNumAccs)}
|
|
||||||
title="Number of Accelerators Distribution"
|
|
||||||
xlabel="Allocated Accs"
|
|
||||||
xunit="Accs"
|
|
||||||
ylabel="Number of Jobs"
|
|
||||||
yunit="Jobs"
|
|
||||||
height="275"
|
|
||||||
enableFlip
|
|
||||||
/>
|
|
||||||
{/if}
|
|
||||||
</Col>
|
</Col>
|
||||||
|
|
||||||
<Col> <!-- Stacked SchedState -->
|
<Col> <!-- Stacked SchedState -->
|
||||||
<div bind:clientWidth={colWidthStacked1}>
|
<div bind:clientWidth={colWidthStacked1}>
|
||||||
{#key $statesTimed?.data?.nodeStates}
|
{#key $statesTimed?.data?.nodeStates}
|
||||||
@@ -584,6 +588,7 @@
|
|||||||
{/key}
|
{/key}
|
||||||
</div>
|
</div>
|
||||||
</Col>
|
</Col>
|
||||||
|
|
||||||
<Col> <!-- Stacked Healthstate -->
|
<Col> <!-- Stacked Healthstate -->
|
||||||
<div bind:clientWidth={colWidthStacked2}>
|
<div bind:clientWidth={colWidthStacked2}>
|
||||||
{#key $statesTimed?.data?.healthStates}
|
{#key $statesTimed?.data?.healthStates}
|
||||||
|
|||||||
@@ -83,7 +83,7 @@
|
|||||||
}
|
}
|
||||||
`,
|
`,
|
||||||
variables: {
|
variables: {
|
||||||
filter: { cluster: { eq: cluster }, timeStart: 1760096999},
|
filter: { cluster: { eq: cluster }, timeStart: stackedFrom},
|
||||||
typeNode: "node",
|
typeNode: "node",
|
||||||
typeHealth: "health"
|
typeHealth: "health"
|
||||||
},
|
},
|
||||||
|
|||||||
Reference in New Issue
Block a user