Răsfoiți Sursa

Agg API: fix caching

Niko Kovacevic 5 ani în urmă
părinte
comite
64439bb429
2 a modificat fișierele cu 13 adăugiri și 4 ștergeri
  1. 5 2
      pkg/costmodel/aggregation.go
  2. 8 2
      pkg/costmodel/costmodel.go

+ 5 - 2
pkg/costmodel/aggregation.go

@@ -1547,6 +1547,10 @@ func GenerateAggKey(window kubecost.Window, field string, subfields []string, op
 		opts = DefaultAggregateQueryOpts()
 	}
 
+	// Covert to duration, offset so that cache hits occur, even when timestamps have
+	// shifted slightly.
+	duration, offset := window.ToDurationOffset()
+
 	// parse, trim, and sort podprefix filters
 	podPrefixFilters := []string{}
 	if ppfs, ok := opts.Filters["podprefix"]; ok && ppfs != "" {
@@ -1613,8 +1617,7 @@ func GenerateAggKey(window kubecost.Window, field string, subfields []string, op
 	sort.Strings(subfields)
 	fieldStr := fmt.Sprintf("%s:%s", field, strings.Join(subfields, ","))
 
-	// TODO convert window back to 1d
-	return fmt.Sprintf("%s:%s:%s:%s:%s:%s:%s:%t:%t:%t", window, filterStr, fieldStr, opts.Rate,
+	return fmt.Sprintf("%s:%s:%s:%s:%s:%s:%s:%t:%t:%t", duration, offset, filterStr, fieldStr, opts.Rate,
 		opts.SharedResources, opts.ShareSplit, opts.AllocateIdle, opts.IncludeTimeSeries,
 		opts.IncludeEfficiency)
 }

+ 8 - 2
pkg/costmodel/costmodel.go

@@ -1492,12 +1492,18 @@ func (cm *CostModel) costDataRange(cli prometheusClient.Client, cp costAnalyzerC
 	}
 	resolution = time.Duration(resMins) * time.Minute
 
+	// Warn if resolution does not evenly divide window
+	if int64(window.Minutes())%int64(resolution.Minutes()) != 0 {
+		log.Warningf("CostDataRange: window should be divisible by resolution or else samples may be missed: %s %% %s = %dm", window, resolution, int64(window.Minutes())%int64(resolution.Minutes()))
+	}
+
 	// Convert to Prometheus-style duration string in terms of m or h
-	resStr := fmt.Sprintf("%sm", resMins)
+	resStr := fmt.Sprintf("%dm", resMins)
 	if resMins%60 == 0 {
-		resStr = fmt.Sprintf("%sh", resMins/60)
+		resStr = fmt.Sprintf("%dh", resMins/60)
 	}
 
+	// TODO remove after testing
 	log.Infof("CostDataRange(%s, %s, %f)", window, resStr, resolution.Hours())
 
 	scrapeIntervalSeconds := cm.ScrapeInterval.Seconds()