Parcourir la source

Fix CDMR param parsing

Niko Kovacevic il y a 5 ans
Parent
commit
69777d3699
3 fichiers modifiés avec 37 ajouts et 7 suppressions
  1. 3 1
      pkg/costmodel/aggregation.go
  2. 26 6
      pkg/costmodel/router.go
  3. 8 0
      pkg/kubecost/window.go

+ 3 - 1
pkg/costmodel/aggregation.go

@@ -1051,7 +1051,9 @@ func (a *Accesses) ComputeAggregateCostModel(promClient prometheusClient.Client,
 	// of data being computed.
 	durMins := int64(math.Trunc(window.Minutes()))
 	if durMins < 24*60 { // less than 1d
-		if durMins%60 != 0 { // not divisible by 1h
+		// TODO should we have additional options for going by
+		// e.g. 30m? 10m? 5m?
+		if durMins%60 != 0 || durMins < 3*60 { // not divisible by 1h or less than 3h
 			resolution = time.Minute
 		}
 	} else { // greater than 1d

+ 26 - 6
pkg/costmodel/router.go

@@ -472,19 +472,40 @@ func (a *Accesses) CostDataModelRange(w http.ResponseWriter, r *http.Request, ps
 	w.Header().Set("Content-Type", "application/json")
 	w.Header().Set("Access-Control-Allow-Origin", "*")
 
-	start := r.URL.Query().Get("start")
-	end := r.URL.Query().Get("end")
+	startStr := r.URL.Query().Get("start")
+	endStr := r.URL.Query().Get("end")
+	windowStr := r.URL.Query().Get("window")
 	fields := r.URL.Query().Get("filterFields")
 	namespace := r.URL.Query().Get("namespace")
 	cluster := r.URL.Query().Get("cluster")
 	remote := r.URL.Query().Get("remote")
 
-	wStr := fmt.Sprintf("%s,%s", start, end)
-	window, err := kubecost.ParseWindowUTC(wStr)
+	layout := "2006-01-02T15:04:05.000Z"
+	start, err := time.Parse(layout, startStr)
 	if err != nil {
-		http.Error(w, fmt.Sprintf("invalid date range: %s", wStr), http.StatusBadRequest)
+		http.Error(w, fmt.Sprintf("invalid start date: %s", startStr), http.StatusBadRequest)
+		return
+	}
+	end, err := time.Parse(layout, endStr)
+	if err != nil {
+		http.Error(w, fmt.Sprintf("invalid end date: %s", endStr), http.StatusBadRequest)
+		return
+	}
+
+	window := kubecost.NewWindow(&start, &end)
+	if window.IsOpen() || window.IsEmpty() || window.IsNegative() {
+		http.Error(w, fmt.Sprintf("invalid date range: %s", window), http.StatusBadRequest)
+		return
 	}
 
+	resolution := time.Hour
+	if resDur, err := time.ParseDuration(windowStr); err == nil {
+		resolution = resDur
+	}
+
+	// TODO remove after testing
+	log.Infof("CostDataModelRangeHandler: window=%s, resolution=%s", window, resolution)
+
 	// Use Thanos Client if it exists (enabled) and remote flag set
 	var pClient prometheusClient.Client
 	if remote != "false" && a.ThanosClient != nil {
@@ -493,7 +514,6 @@ func (a *Accesses) CostDataModelRange(w http.ResponseWriter, r *http.Request, ps
 		pClient = a.PrometheusClient
 	}
 
-	resolution := time.Hour
 	data, err := a.Model.ComputeCostDataRange(pClient, a.CloudProvider, window, resolution, namespace, cluster)
 	if err != nil {
 		w.Write(WrapData(nil, err))

+ 8 - 0
pkg/kubecost/window.go

@@ -402,6 +402,14 @@ func (w Window) Hours() float64 {
 	return w.end.Sub(*w.start).Hours()
 }
 
+func (w Window) IsEmpty() bool {
+	return !w.IsOpen() && w.end.Equal(*w.Start())
+}
+
+func (w Window) IsNegative() bool {
+	return !w.IsOpen() && w.end.Before(*w.Start())
+}
+
 func (w Window) IsOpen() bool {
 	return w.start == nil || w.end == nil
 }