Преглед изворни кода

Fix: CSV export data query failures with missing metrics (#3284)

Signed-off-by: Saurav Teli <telisaurav44@gmail.com>
Saurav Teli пре 5 месеци
родитељ
комит
de03827176

+ 9 - 1
modules/collector-source/pkg/collector/collectorprovider.go

@@ -81,7 +81,15 @@ func (r *repoStoreProvider) GetDailyDataCoverage(limitDays int) (time.Time, time
 		return time.Time{}, time.Time{}, fmt.Errorf("daily resolution is not configured")
 	}
 	if len(dailyCoverage) == 0 {
-		return time.Time{}, time.Time{}, fmt.Errorf("daily coverage not available")
+		// If daily coverage is not available, fallback to a reasonable time range
+		// This prevents CSV export from failing when the metric doesn't exist yet
+		log.Warnf("GetDailyDataCoverage: daily coverage not available, using fallback time range")
+
+		// Use a reasonable fallback: start from 1 day ago to account for metric collection delay
+		fallbackEnd := time.Now().UTC().Truncate(timeutil.Day)
+		fallbackStart := fallbackEnd.AddDate(0, 0, -1) // 1 day ago
+
+		return fallbackStart, fallbackEnd, nil
 	}
 	start := dailyCoverage[0]
 	end := dailyCoverage[0]

+ 13 - 2
modules/prometheus-source/pkg/prom/metricsquerier.go

@@ -1800,7 +1800,15 @@ func (pds *PrometheusMetricsQuerier) QueryDataCoverage(limitDays int) (time.Time
 		return time.Time{}, time.Time{}, fmt.Errorf("querying oldest sample: %w", err)
 	}
 	if len(resOldest) == 0 || len(resOldest[0].Values) == 0 {
-		return time.Time{}, time.Time{}, fmt.Errorf("querying oldest sample: %w", err)
+		// If node_cpu_hourly_cost metric is not available, fallback to a reasonable time range
+		// This prevents CSV export from failing when the metric doesn't exist yet
+		log.Warnf("QueryDataCoverage: node_cpu_hourly_cost metric not available, using fallback time range")
+		
+		// Use a reasonable fallback: start from 1 day ago to account for metric collection delay
+		fallbackEnd := time.Now().UTC().Truncate(timeutil.Day)
+		fallbackStart := fallbackEnd.AddDate(0, 0, -1) // 1 day ago
+		
+		return fallbackStart, fallbackEnd, nil
 	}
 
 	oldest := time.Unix(int64(resOldest[0].Values[0].Value), 0)
@@ -1815,7 +1823,10 @@ func (pds *PrometheusMetricsQuerier) QueryDataCoverage(limitDays int) (time.Time
 		return time.Time{}, time.Time{}, fmt.Errorf("querying newest sample: %w", err)
 	}
 	if len(resNewest) == 0 || len(resNewest[0].Values) == 0 {
-		return time.Time{}, time.Time{}, fmt.Errorf("querying newest sample: %w", err)
+		// If newest query fails but oldest succeeded, use oldest as both start and end
+		// This allows CSV export to proceed with at least some time range
+		log.Warnf("QueryDataCoverage: newest sample query returned no results, using oldest timestamp")
+		return oldest, oldest, nil
 	}
 
 	newest := time.Unix(int64(resNewest[0].Values[0].Value), 0)

+ 3 - 1
pkg/costmodel/csv_export.go

@@ -330,7 +330,8 @@ func (e *csvExporter) writeCSVToWriter(ctx context.Context, w io.Writer, dates [
 		end := start.AddDate(0, 0, 1)
 		data, err := e.Model.ComputeAllocation(start, end)
 		if err != nil {
-			return err
+			log.Warnf("Failed to compute allocation for %s: %v - skipping this date", date.Format("2006-01-02"), err)
+			continue // Skip this date instead of failing the entire export
 		}
 		log.Infof("fetched %d records for %s", len(data.Allocations), date.Format("2006-01-02"))
 		for _, alloc := range data.Allocations {
@@ -351,6 +352,7 @@ func (e *csvExporter) writeCSVToWriter(ctx context.Context, w io.Writer, dates [
 	}
 
 	if lines == 0 {
+		log.Warnf("CSV export completed but no allocation data was found for the requested date range")
 		return errNoData
 	}