From 4deec9a17071b017d50396c3b14e6f4f6283c10f Mon Sep 17 00:00:00 2001 From: Christoph Kluge Date: Thu, 29 Jan 2026 15:18:50 +0100 Subject: [PATCH] no append if ErrNoHostOrMetric fired --- pkg/metricstore/api.go | 17 +++++++---------- pkg/metricstore/query.go | 26 ++++++++++++++++++++++++-- 2 files changed, 31 insertions(+), 12 deletions(-) diff --git a/pkg/metricstore/api.go b/pkg/metricstore/api.go index f0f3bb3c..a37dfff9 100644 --- a/pkg/metricstore/api.go +++ b/pkg/metricstore/api.go @@ -13,6 +13,7 @@ import ( "fmt" "math" + cclog "github.com/ClusterCockpit/cc-lib/v2/ccLogger" "github.com/ClusterCockpit/cc-lib/v2/schema" "github.com/ClusterCockpit/cc-lib/v2/util" ) @@ -280,20 +281,16 @@ func FetchData(req APIQueryRequest) (*APIQueryResponse, error) { data.Data, data.From, data.To, data.Resolution, err = ms.Read(sel, query.Metric, req.From, req.To, query.Resolution) if err != nil { - // Check a special case where only the metric or host. - // Dont send errors, instead just send empty array - // where frontend already renders error for empty array. - if err == ErrNoHostOrMetric { - data.Data = make([]schema.Float, 0) - data.From = req.From - data.To = req.To - data.Resolution = query.Resolution - } else { + // Skip Error If Just Missing Host or Metric, Continue + // Empty Return For Metric Handled Gracefully By Frontend + if err != ErrNoHostOrMetric { msg := err.Error() data.Error = &msg res = append(res, data) - continue + } else { + cclog.Warnf("failed to fetch '%s' from host '%s' (cluster: %s): %s", query.Metric, query.Hostname, req.Cluster, err.Error()) } + continue } if req.WithStats { diff --git a/pkg/metricstore/query.go b/pkg/metricstore/query.go index 62216e59..e5a49af3 100644 --- a/pkg/metricstore/query.go +++ b/pkg/metricstore/query.go @@ -104,6 +104,11 @@ func (ccms *InternalMetricStore) LoadData( var errors []string jobData := make(schema.JobData) for i, row := range resBody.Results { + if len(row) == 0 { + // No Data Found For Metric, Logged in FetchData to Warn + continue + } + query := req.Queries[i] metric := query.Metric scope := assignedScope[i] @@ -229,7 +234,7 @@ func buildQueries( for _, metric := range metrics { mc := archive.GetMetricConfig(job.Cluster, metric) if mc == nil { - cclog.Infof("metric '%s' is not specified for cluster '%s'", metric, job.Cluster) + cclog.Warnf("metric '%s' is not specified for cluster '%s'", metric, job.Cluster) continue } @@ -535,11 +540,15 @@ func (ccms *InternalMetricStore) LoadStats( stats := make(map[string]map[string]schema.MetricStatistics, len(metrics)) for i, res := range resBody.Results { + if len(res) == 0 { + // No Data Found For Metric, Logged in FetchData to Warn + continue + } query := req.Queries[i] metric := query.Metric data := res[0] if data.Error != nil { - cclog.Errorf("fetching %s for node %s failed: %s", metric, query.Hostname, *data.Error) + cclog.Warnf("fetching %s for node %s failed: %s", metric, query.Hostname, *data.Error) continue } @@ -609,6 +618,10 @@ func (ccms *InternalMetricStore) LoadScopedStats( scopedJobStats := make(schema.ScopedJobStats) for i, row := range resBody.Results { + if len(row) == 0 { + // No Data Found For Metric, Logged in FetchData to Warn + continue + } query := req.Queries[i] metric := query.Metric scope := assignedScope[i] @@ -717,6 +730,11 @@ func (ccms *InternalMetricStore) LoadNodeData( var errors []string data := make(map[string]map[string][]*schema.JobMetric) for i, res := range resBody.Results { + if len(res) == 0 { + // No Data Found For Metric, Logged in FetchData to Warn + continue + } + var query APIQuery if resBody.Queries != nil { query = resBody.Queries[i] @@ -816,6 +834,10 @@ func (ccms *InternalMetricStore) LoadNodeListData( var errors []string data := make(map[string]schema.JobData) for i, row := range resBody.Results { + if len(row) == 0 { + // No Data Found For Metric, Logged in FetchData to Warn + continue + } var query APIQuery if resBody.Queries != nil { query = resBody.Queries[i]