mirror of
				https://github.com/ClusterCockpit/cc-backend
				synced 2025-11-04 01:25:06 +01:00 
			
		
		
		
	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:
		@@ -302,6 +302,20 @@ func (ccms *CCMetricStore) buildQueries(
 | 
			
		||||
			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...
 | 
			
		||||
		handledScopes := make([]schema.MetricScope, 0, 3)
 | 
			
		||||
 | 
			
		||||
@@ -985,6 +999,20 @@ func (ccms *CCMetricStore) buildNodeQueries(
 | 
			
		||||
			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...
 | 
			
		||||
		handledScopes := make([]schema.MetricScope, 0, 3)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -68,8 +68,23 @@ func initClusterConfig() error {
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			for _, sc := range cluster.SubClusters {
 | 
			
		||||
				newMetric := mc
 | 
			
		||||
				newMetric.SubClusters = nil
 | 
			
		||||
				newMetric := &schema.MetricConfig{
 | 
			
		||||
					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.Remove {
 | 
			
		||||
 
 | 
			
		||||
@@ -128,14 +128,13 @@
 | 
			
		||||
    const pendingMetrics = (
 | 
			
		||||
      ccconfig[`job_view_selectedMetrics:${job.cluster}:${job.subCluster}`] ||
 | 
			
		||||
      ccconfig[`job_view_selectedMetrics:${job.cluster}`]
 | 
			
		||||
    ) ||
 | 
			
		||||
    $initq.data.globalMetrics
 | 
			
		||||
      .reduce((names, gm) => {
 | 
			
		||||
        if (gm.availability.find((av) => av.cluster === job.cluster && av.subClusters.includes(job.subCluster))) {
 | 
			
		||||
          names.push(gm.name);
 | 
			
		||||
        }
 | 
			
		||||
        return names;
 | 
			
		||||
      }, [])
 | 
			
		||||
    ) || 
 | 
			
		||||
    $initq.data.globalMetrics.reduce((names, gm) => {
 | 
			
		||||
      if (gm.availability.find((av) => av.cluster === job.cluster && av.subClusters.includes(job.subCluster))) {
 | 
			
		||||
        names.push(gm.name);
 | 
			
		||||
      }
 | 
			
		||||
      return names;
 | 
			
		||||
    }, [])
 | 
			
		||||
 | 
			
		||||
    // Select default Scopes to load: Check before if any metric has accelerator scope by default
 | 
			
		||||
    const accScopeDefault = [...pendingMetrics].some(function (m) {
 | 
			
		||||
@@ -338,10 +337,25 @@
 | 
			
		||||
            scopes={item.data.map((x) => x.scope)}
 | 
			
		||||
            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}
 | 
			
		||||
          <Card body color="warning" class="mt-2"
 | 
			
		||||
            >No dataset returned for <code>{item.metric}</code></Card
 | 
			
		||||
          >
 | 
			
		||||
          <Card color="warning" class="mt-2">
 | 
			
		||||
            <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}
 | 
			
		||||
      </PlotGrid>
 | 
			
		||||
    {/if}
 | 
			
		||||
 
 | 
			
		||||
@@ -14,7 +14,6 @@
 | 
			
		||||
<script>
 | 
			
		||||
  import { 
 | 
			
		||||
    getContext,
 | 
			
		||||
    createEventDispatcher 
 | 
			
		||||
  } from "svelte";
 | 
			
		||||
  import { 
 | 
			
		||||
    queryStore,
 | 
			
		||||
@@ -56,7 +55,6 @@
 | 
			
		||||
  let pendingZoomState = null;
 | 
			
		||||
  let thresholdState = null;
 | 
			
		||||
 | 
			
		||||
  const dispatch = createEventDispatcher();
 | 
			
		||||
  const statsPattern = /(.*)-stat$/;
 | 
			
		||||
  const unit = (metricUnit?.prefix ? metricUnit.prefix : "") + (metricUnit?.base ? metricUnit.base : "");
 | 
			
		||||
  const client = getContextClient();
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user