fix metricconfig pointer copy, add disabled metric card in jobView

- skips disabled metrics in backend, see cc-backend tries to retrieve "removed" metrics #377
This commit is contained in:
Christoph Kluge 2025-04-16 18:36:12 +02:00
parent a6784b5549
commit 29ae2423f8
4 changed files with 70 additions and 15 deletions

View File

@ -302,6 +302,20 @@ func (ccms *CCMetricStore) buildQueries(
continue continue
} }
// Skip if metric is removed for subcluster
if len(mc.SubClusters) != 0 {
isRemoved := false
for _, scConfig := range mc.SubClusters {
if scConfig.Name == job.SubCluster && scConfig.Remove == true {
isRemoved = true
break
}
}
if isRemoved {
continue
}
}
// Avoid duplicates... // Avoid duplicates...
handledScopes := make([]schema.MetricScope, 0, 3) handledScopes := make([]schema.MetricScope, 0, 3)
@ -985,6 +999,20 @@ func (ccms *CCMetricStore) buildNodeQueries(
continue continue
} }
// Skip if metric is removed for subcluster
if mc.SubClusters != nil {
isRemoved := false
for _, scConfig := range mc.SubClusters {
if scConfig.Name == subCluster && scConfig.Remove == true {
isRemoved = true
break
}
}
if isRemoved {
continue
}
}
// Avoid duplicates... // Avoid duplicates...
handledScopes := make([]schema.MetricScope, 0, 3) handledScopes := make([]schema.MetricScope, 0, 3)

View File

@ -68,8 +68,23 @@ func initClusterConfig() error {
} }
for _, sc := range cluster.SubClusters { for _, sc := range cluster.SubClusters {
newMetric := mc newMetric := &schema.MetricConfig{
newMetric.SubClusters = nil Unit: mc.Unit,
Energy: mc.Energy,
Name: mc.Name,
Scope: mc.Scope,
Aggregation: mc.Aggregation,
Peak: mc.Peak,
Caution: mc.Caution,
Alert: mc.Alert,
Timestep: mc.Timestep,
Normal: mc.Normal,
LowerIsBetter: mc.LowerIsBetter,
}
if mc.Footprint != "" {
newMetric.Footprint = mc.Footprint
}
if cfg, ok := scLookup[sc.Name]; ok { if cfg, ok := scLookup[sc.Name]; ok {
if !cfg.Remove { if !cfg.Remove {

View File

@ -129,13 +129,12 @@
ccconfig[`job_view_selectedMetrics:${job.cluster}:${job.subCluster}`] || ccconfig[`job_view_selectedMetrics:${job.cluster}:${job.subCluster}`] ||
ccconfig[`job_view_selectedMetrics:${job.cluster}`] ccconfig[`job_view_selectedMetrics:${job.cluster}`]
) || ) ||
$initq.data.globalMetrics $initq.data.globalMetrics.reduce((names, gm) => {
.reduce((names, gm) => { if (gm.availability.find((av) => av.cluster === job.cluster && av.subClusters.includes(job.subCluster))) {
if (gm.availability.find((av) => av.cluster === job.cluster && av.subClusters.includes(job.subCluster))) { names.push(gm.name);
names.push(gm.name); }
} return names;
return names; }, [])
}, [])
// Select default Scopes to load: Check before if any metric has accelerator scope by default // Select default Scopes to load: Check before if any metric has accelerator scope by default
const accScopeDefault = [...pendingMetrics].some(function (m) { const accScopeDefault = [...pendingMetrics].some(function (m) {
@ -338,10 +337,25 @@
scopes={item.data.map((x) => x.scope)} scopes={item.data.map((x) => x.scope)}
isShared={$initq.data.job.exclusive != 1} isShared={$initq.data.job.exclusive != 1}
/> />
{:else if item.disabled == true}
<Card color="info">
<CardHeader class="mb-0">
<b>Disabled Metric</b>
</CardHeader>
<CardBody>
<p>Metric <b>{item.metric}</b> is disabled for subcluster <b>{$initq.data.job.subCluster}</b>.</p>
<p class="mb-1">To remove this card, open metric selection and press "Close and Apply".</p>
</CardBody>
</Card>
{:else} {:else}
<Card body color="warning" class="mt-2" <Card color="warning" class="mt-2">
>No dataset returned for <code>{item.metric}</code></Card <CardHeader class="mb-0">
> <b>Missing Metric</b>
</CardHeader>
<CardBody>
<p class="mb-1">No dataset returned for <b>{item.metric}</b>.</p>
</CardBody>
</Card>
{/if} {/if}
</PlotGrid> </PlotGrid>
{/if} {/if}

View File

@ -14,7 +14,6 @@
<script> <script>
import { import {
getContext, getContext,
createEventDispatcher
} from "svelte"; } from "svelte";
import { import {
queryStore, queryStore,
@ -56,7 +55,6 @@
let pendingZoomState = null; let pendingZoomState = null;
let thresholdState = null; let thresholdState = null;
const dispatch = createEventDispatcher();
const statsPattern = /(.*)-stat$/; const statsPattern = /(.*)-stat$/;
const unit = (metricUnit?.prefix ? metricUnit.prefix : "") + (metricUnit?.base ? metricUnit.base : ""); const unit = (metricUnit?.prefix ? metricUnit.prefix : "") + (metricUnit?.base ? metricUnit.base : "");
const client = getContextClient(); const client = getContextClient();