mirror of
				https://github.com/ClusterCockpit/cc-backend
				synced 2025-11-04 09:35:07 +01:00 
			
		
		
		
	Adapt svelte to new schema, add removed metric box
- Moved 'scope' field to parent jobMetric
- Implemented unit { prefix, base } where necessary
- SubCluster Metric Config 'remove' option implemented in Joblists
			
			
This commit is contained in:
		@@ -101,9 +101,11 @@
 | 
			
		||||
                            {#if $initialized}
 | 
			
		||||
                                ({clusters
 | 
			
		||||
                                    .map(cluster => cluster.metricConfig.find(m => m.name == metric))
 | 
			
		||||
                                    .filter(m => m != null).map(m => m.unit)
 | 
			
		||||
                                    .reduce((arr, unit) => arr.includes(unit) ? arr : [...arr, unit], [])
 | 
			
		||||
                                    .join(', ')})
 | 
			
		||||
                                    .filter(m => m != null)
 | 
			
		||||
                                    .map(m => (m.unit?.prefix?m.unit?.prefix:'') + (m.unit?.base?m.unit?.base:'')) // Build unitStr
 | 
			
		||||
                                    .reduce((arr, unitStr) => arr.includes(unitStr) ? arr : [...arr, unitStr], []) // w/o this, output would be [unitStr, unitStr]
 | 
			
		||||
                                    .join(', ')
 | 
			
		||||
                                })
 | 
			
		||||
                            {/if}
 | 
			
		||||
                        </th>
 | 
			
		||||
                    {/each}
 | 
			
		||||
 
 | 
			
		||||
@@ -24,12 +24,14 @@
 | 
			
		||||
    let scopes = [job.numNodes == 1 ? 'core' : 'node']
 | 
			
		||||
 | 
			
		||||
    const cluster = getContext('clusters').find(c => c.name == job.cluster)
 | 
			
		||||
 | 
			
		||||
    // Get all MetricConfs which include subCluster-specific settings for this job
 | 
			
		||||
    const metricConfig = getContext('metrics')
 | 
			
		||||
    const metricsQuery = operationStore(`query($id: ID!, $metrics: [String!]!, $scopes: [MetricScope!]!) {
 | 
			
		||||
        jobMetrics(id: $id, metrics: $metrics, scopes: $scopes) {
 | 
			
		||||
            name
 | 
			
		||||
            scope
 | 
			
		||||
            metric {
 | 
			
		||||
                unit, scope, timestep
 | 
			
		||||
                unit { prefix, base }, timestep
 | 
			
		||||
                statisticsSeries { min, mean, max }
 | 
			
		||||
                series {
 | 
			
		||||
                    hostname, id, data
 | 
			
		||||
@@ -44,13 +46,64 @@
 | 
			
		||||
    })
 | 
			
		||||
 | 
			
		||||
    const selectScope = (jobMetrics) => jobMetrics.reduce(
 | 
			
		||||
        (a, b) => maxScope([a.metric.scope, b.metric.scope]) == a.metric.scope
 | 
			
		||||
        (a, b) => maxScope([a.scope, b.scope]) == a.scope
 | 
			
		||||
            ? (job.numNodes > 1 ? a : b)
 | 
			
		||||
            : (job.numNodes > 1 ? b : a), jobMetrics[0])
 | 
			
		||||
 | 
			
		||||
    const sortAndSelectScope = (jobMetrics) => metrics
 | 
			
		||||
        .map(name => jobMetrics.filter(jobMetric => jobMetric.name == name))
 | 
			
		||||
        .map(jobMetrics => jobMetrics.length > 0 ? selectScope(jobMetrics) : null)
 | 
			
		||||
        .map(function(name) {
 | 
			
		||||
            // Get MetricConf for this selected/requested metric
 | 
			
		||||
            let thisConfig = metricConfig(cluster, name)
 | 
			
		||||
            let thisSCIndex = thisConfig.subClusters.findIndex(sc => sc.name == job.subCluster)
 | 
			
		||||
            // Check if Subcluster has MetricConf: If not found (index == -1), no further remove flag check required
 | 
			
		||||
            if (thisSCIndex >= 0) {
 | 
			
		||||
                // SubCluster Config present: Check if remove flag is set
 | 
			
		||||
                if (thisConfig.subClusters[thisSCIndex].remove == true) {
 | 
			
		||||
                    // Return null data and informational flag
 | 
			
		||||
                    // console.log('Case 1.1 -> Returned')
 | 
			
		||||
                    // console.log({removed: true, data: null})
 | 
			
		||||
                    return {removed: true, data: null}
 | 
			
		||||
                } else {
 | 
			
		||||
                    // load and return metric, if data available
 | 
			
		||||
                    let thisMetric = jobMetrics.filter(jobMetric => jobMetric.name == name) // Returns Array
 | 
			
		||||
                    if (thisMetric.length > 0) {
 | 
			
		||||
                        // console.log('Case 1.2.1 -> Returned')
 | 
			
		||||
                        // console.log({removed: false, data: thisMetric})
 | 
			
		||||
                        return {removed: false, data: thisMetric}
 | 
			
		||||
                    } else {
 | 
			
		||||
                        // console.log('Case 1.2.2 -> Returned:')
 | 
			
		||||
                        // console.log({removed: false, data: null})
 | 
			
		||||
                        return {removed: false, data: null}
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            } else {
 | 
			
		||||
                // No specific subCluster config: 'remove' flag not set, deemed false -> load and return metric, if data available
 | 
			
		||||
                let thisMetric = jobMetrics.filter(jobMetric => jobMetric.name == name) // Returns Array
 | 
			
		||||
                if (thisMetric.length > 0) {
 | 
			
		||||
                    // console.log('Case 2.1 -> Returned')
 | 
			
		||||
                    // console.log({removed: false, data: thisMetric})
 | 
			
		||||
                    return {removed: false, data: thisMetric}
 | 
			
		||||
                } else {
 | 
			
		||||
                    // console.log('Case 2.2 -> Returned')
 | 
			
		||||
                    // console.log({removed: false, data: null})
 | 
			
		||||
                    return {removed: false, data: null}
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        })
 | 
			
		||||
        .map(function(jobMetrics) {
 | 
			
		||||
            if (jobMetrics.data != null && jobMetrics.data.length > 0) {
 | 
			
		||||
                // console.log('Before')
 | 
			
		||||
                // console.log(jobMetrics.data)
 | 
			
		||||
                // console.log('After')
 | 
			
		||||
                // console.log(selectScope(jobMetrics.data))
 | 
			
		||||
                let res = {removed: jobMetrics.removed, data: selectScope(jobMetrics.data)}
 | 
			
		||||
                // console.log('Packed')
 | 
			
		||||
                // console.log(res)
 | 
			
		||||
                return res
 | 
			
		||||
            } else {
 | 
			
		||||
                return jobMetrics
 | 
			
		||||
            }
 | 
			
		||||
        })
 | 
			
		||||
 | 
			
		||||
    $: metricsQuery.variables = { id: job.id, metrics, scopes }
 | 
			
		||||
 | 
			
		||||
@@ -81,17 +134,20 @@
 | 
			
		||||
    {:else}
 | 
			
		||||
        {#each sortAndSelectScope($metricsQuery.data.jobMetrics) as metric, i (metric || i)}
 | 
			
		||||
            <td>
 | 
			
		||||
            {#if metric != null}
 | 
			
		||||
            <!-- Subluster Metricconfig remove keyword for jobtables (joblist main, user joblist, project joblist) to be used here as toplevel case-->
 | 
			
		||||
            {#if metric.removed == false && metric.data != null}
 | 
			
		||||
                <MetricPlot
 | 
			
		||||
                    width={plotWidth}
 | 
			
		||||
                    height={plotHeight}
 | 
			
		||||
                    timestep={metric.metric.timestep}
 | 
			
		||||
                    scope={metric.metric.scope}
 | 
			
		||||
                    series={metric.metric.series}
 | 
			
		||||
                    statisticsSeries={metric.metric.statisticsSeries}
 | 
			
		||||
                    metric={metric.name}
 | 
			
		||||
                    timestep={metric.data.metric.timestep}
 | 
			
		||||
                    scope={metric.data.scope}
 | 
			
		||||
                    series={metric.data.metric.series}
 | 
			
		||||
                    statisticsSeries={metric.data.metric.statisticsSeries}
 | 
			
		||||
                    metric={metric.data.name}
 | 
			
		||||
                    cluster={cluster}
 | 
			
		||||
                    subCluster={job.subCluster} />
 | 
			
		||||
            {:else if metric.removed == true && metric.data == null}
 | 
			
		||||
                <Card body color="info">Metric disabled for subcluster '{ job.subCluster }'</Card>
 | 
			
		||||
            {:else}
 | 
			
		||||
                <Card body color="warning">Missing Data</Card>
 | 
			
		||||
            {/if}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user