Merge branch 'dev' of github.com:ClusterCockpit/cc-backend into dev

This commit is contained in:
2026-02-12 07:34:26 +01:00
3 changed files with 33 additions and 27 deletions

View File

@@ -824,6 +824,7 @@ func (r *queryResolver) NodeMetricsList(ctx context.Context, cluster string, sub
} }
nodeRepo := repository.GetNodeRepository() nodeRepo := repository.GetNodeRepository()
// nodes -> array hostname
nodes, stateMap, countNodes, hasNextPage, nerr := nodeRepo.GetNodesForList(ctx, cluster, subCluster, stateFilter, nodeFilter, page) nodes, stateMap, countNodes, hasNextPage, nerr := nodeRepo.GetNodesForList(ctx, cluster, subCluster, stateFilter, nodeFilter, page)
if nerr != nil { if nerr != nil {
return nil, errors.New("could not retrieve node list required for resolving NodeMetricsList") return nil, errors.New("could not retrieve node list required for resolving NodeMetricsList")
@@ -835,6 +836,7 @@ func (r *queryResolver) NodeMetricsList(ctx context.Context, cluster string, sub
} }
} }
// data -> map hostname:jobdata
data, err := metricdispatch.LoadNodeListData(cluster, subCluster, nodes, metrics, scopes, *resolution, from, to, ctx) data, err := metricdispatch.LoadNodeListData(cluster, subCluster, nodes, metrics, scopes, *resolution, from, to, ctx)
if err != nil { if err != nil {
cclog.Warn("error while loading node data (Resolver.NodeMetricsList") cclog.Warn("error while loading node data (Resolver.NodeMetricsList")
@@ -842,18 +844,18 @@ func (r *queryResolver) NodeMetricsList(ctx context.Context, cluster string, sub
} }
nodeMetricsList := make([]*model.NodeMetrics, 0, len(data)) nodeMetricsList := make([]*model.NodeMetrics, 0, len(data))
for hostname, metrics := range data { for _, hostname := range nodes {
host := &model.NodeMetrics{ host := &model.NodeMetrics{
Host: hostname, Host: hostname,
State: stateMap[hostname], State: stateMap[hostname],
Metrics: make([]*model.JobMetricWithName, 0, len(metrics)*len(scopes)), Metrics: make([]*model.JobMetricWithName, 0),
} }
host.SubCluster, err = archive.GetSubClusterByNode(cluster, hostname) host.SubCluster, err = archive.GetSubClusterByNode(cluster, hostname)
if err != nil { if err != nil {
cclog.Warnf("error in nodeMetrics resolver: %s", err) cclog.Warnf("error in nodeMetrics resolver: %s", err)
} }
for metric, scopedMetrics := range metrics { for metric, scopedMetrics := range data[hostname] {
for scope, scopedMetric := range scopedMetrics { for scope, scopedMetric := range scopedMetrics {
host.Metrics = append(host.Metrics, &model.JobMetricWithName{ host.Metrics = append(host.Metrics, &model.JobMetricWithName{
Name: metric, Name: metric,

View File

@@ -263,14 +263,16 @@ func (r *NodeRepository) QueryNodes(
if f.SchedulerState != nil { if f.SchedulerState != nil {
query = query.Where("node_state = ?", f.SchedulerState) query = query.Where("node_state = ?", f.SchedulerState)
// Requires Additional time_stamp Filter: Else the last (past!) time_stamp with queried state will be returned // Requires Additional time_stamp Filter: Else the last (past!) time_stamp with queried state will be returned
// TODO: Hardcoded TimeDiff Suboptimal - Use Config Option?
now := time.Now().Unix() now := time.Now().Unix()
query = query.Where(sq.Gt{"time_stamp": (now - 60)}) query = query.Where(sq.Gt{"time_stamp": (now - 300)})
} }
if f.HealthState != nil { if f.HealthState != nil {
query = query.Where("health_state = ?", f.HealthState) query = query.Where("health_state = ?", f.HealthState)
// Requires Additional time_stamp Filter: Else the last (past!) time_stamp with queried state will be returned // Requires Additional time_stamp Filter: Else the last (past!) time_stamp with queried state will be returned
// TODO: Hardcoded TimeDiff Suboptimal - Use Config Option?
now := time.Now().Unix() now := time.Now().Unix()
query = query.Where(sq.Gt{"time_stamp": (now - 60)}) query = query.Where(sq.Gt{"time_stamp": (now - 300)})
} }
} }
@@ -331,14 +333,16 @@ func (r *NodeRepository) CountNodes(
if f.SchedulerState != nil { if f.SchedulerState != nil {
query = query.Where("node_state = ?", f.SchedulerState) query = query.Where("node_state = ?", f.SchedulerState)
// Requires Additional time_stamp Filter: Else the last (past!) time_stamp with queried state will be returned // Requires Additional time_stamp Filter: Else the last (past!) time_stamp with queried state will be returned
// TODO: Hardcoded TimeDiff Suboptimal - Use Config Option?
now := time.Now().Unix() now := time.Now().Unix()
query = query.Where(sq.Gt{"time_stamp": (now - 60)}) query = query.Where(sq.Gt{"time_stamp": (now - 300)})
} }
if f.HealthState != nil { if f.HealthState != nil {
query = query.Where("health_state = ?", f.HealthState) query = query.Where("health_state = ?", f.HealthState)
// Requires Additional time_stamp Filter: Else the last (past!) time_stamp with queried state will be returned // Requires Additional time_stamp Filter: Else the last (past!) time_stamp with queried state will be returned
// TODO: Hardcoded TimeDiff Suboptimal - Use Config Option?
now := time.Now().Unix() now := time.Now().Unix()
query = query.Where(sq.Gt{"time_stamp": (now - 60)}) query = query.Where(sq.Gt{"time_stamp": (now - 300)})
} }
} }

View File

@@ -151,6 +151,7 @@
{/if} {/if}
</td> </td>
{#each refinedData as metricData, i (metricData?.data?.name || i)} {#each refinedData as metricData, i (metricData?.data?.name || i)}
{#key metricData}
<td> <td>
{#if metricData?.availability == "none"} {#if metricData?.availability == "none"}
<Card body class="mx-2" color="light"> <Card body class="mx-2" color="light">
@@ -183,7 +184,6 @@
forNode forNode
/> />
<div class="my-2"></div> <div class="my-2"></div>
{#key extendedLegendData}
<MetricPlot <MetricPlot
{cluster} {cluster}
subCluster={nodeData.subCluster} subCluster={nodeData.subCluster}
@@ -196,7 +196,6 @@
{plotSync} {plotSync}
forNode forNode
/> />
{/key}
{:else} {:else}
<MetricPlot <MetricPlot
{cluster} {cluster}
@@ -210,5 +209,6 @@
/> />
{/if} {/if}
</td> </td>
{/key}
{/each} {/each}
</tr> </tr>