Преглед на файлове

Fix GCP out-of-cluster BigQuery query for filter-by-labels

Niko Kovacevic преди 6 години
родител
ревизия
10ad415fd6
променени са 1 файла, в които са добавени 31 реда и са изтрити 18 реда
  1. 31 18
      pkg/cloud/gcpprovider.go

+ 31 - 18
pkg/cloud/gcpprovider.go

@@ -304,6 +304,7 @@ func (gcp *GCP) ExternalAllocations(start string, end string, aggregators []stri
 	if err != nil {
 		return nil, err
 	}
+
 	var s []*OutOfClusterAllocation
 	if c.ServiceKeyName != "" && c.ServiceKeySecret != "" && !crossCluster {
 		aws, err := NewCrossClusterProvider("aws", "gcp.json", gcp.Clientset)
@@ -347,30 +348,42 @@ func (gcp *GCP) ExternalAllocations(start string, end string, aggregators []stri
 		s = append(s, gcpOOC...)
 		qerr = err
 		*/
-		queryString := fmt.Sprintf(`(SELECT
-			service.description as service,
-			TO_JSON_STRING(labels) as keys,
-			SUM(cost) as cost
-		  	FROM  %s
-		 	WHERE
-				EXISTS(SELECT * FROM UNNEST(labels) AS l2 WHERE l2.key IN (%s))
-				AND usage_start_time >= "%s" AND usage_start_time < "%s"
-			GROUP BY  service,keys)`, c.BillingDataDataset, aggregator, start, end)
+		queryString := fmt.Sprintf(`(
+			SELECT
+				service.description as service,
+				TO_JSON_STRING(labels) as keys,
+				SUM(cost) as cost
+			FROM  %s
+			WHERE EXISTS (SELECT * FROM UNNEST(labels) AS l2 WHERE l2.key IN (%s))
+			AND usage_start_time >= "%s" AND usage_start_time < "%s"
+			GROUP BY service, keys
+		)`, c.BillingDataDataset, aggregator, start, end)
 		klog.V(3).Infof("Querying \"%s\" with : %s", c.ProjectID, queryString)
 		gcpOOC, err := gcp.multiLabelQuery(queryString, aggregators)
 		s = append(s, gcpOOC...)
 		qerr = err
 	} else {
-		queryString := fmt.Sprintf(`(SELECT
-			service.description as service,
-			TO_JSON_STRING(labels) as keys,
-			SUM(cost) as cost
+		if filterType == "kubernetes_labels" {
+			fvs := strings.Split(filterValue, "=")
+			if len(fvs) == 2 {
+				filterType = fvs[0]
+				filterValue = fvs[1]
+			} else {
+				klog.V(2).Infof("[Warning] illegal kubernetes_labels filterValue: %s", filterValue)
+			}
+		}
+
+		queryString := fmt.Sprintf(`(
+			SELECT
+				service.description as service,
+				TO_JSON_STRING(labels) as keys,
+				SUM(cost) as cost
 		  	FROM  %s
-		 	WHERE
-				EXISTS (SELECT * FROM UNNEST(labels) AS l WHERE l.key = "%s" AND l.value = "%s")
-				AND EXISTS(SELECT * FROM UNNEST(labels) AS l2 WHERE l2.key IN (%s))
-				AND usage_start_time >= "%s" AND usage_start_time < "%s"
-			GROUP BY  service,keys)`, c.BillingDataDataset, filterType, filterValue, aggregator, start, end)
+		 	WHERE EXISTS (SELECT * FROM UNNEST(labels) AS l2 WHERE l2.key IN (%s))
+			AND EXISTS (SELECT * FROM UNNEST(labels) AS l WHERE l.key = "%s" AND l.value = "%s")
+			AND usage_start_time >= "%s" AND usage_start_time < "%s"
+			GROUP BY service, keys
+		)`, c.BillingDataDataset, aggregator, filterType, filterValue, start, end)
 		klog.V(3).Infof("Querying \"%s\" with : %s", c.ProjectID, queryString)
 		gcpOOC, err := gcp.multiLabelQuery(queryString, aggregators)
 		s = append(s, gcpOOC...)