Ver Fonte

stackdriver: make sure distinct labels are returned. also added test

Erik Sundell há 7 anos atrás
pai
commit
5763d3cae2

+ 19 - 3
pkg/tsdb/stackdriver/stackdriver.go

@@ -212,7 +212,7 @@ func (e *StackdriverExecutor) unmarshalResponse(res *http.Response) (StackDriver
 
 func (e *StackdriverExecutor) parseResponse(queryRes *tsdb.QueryResult, data StackDriverResponse) error {
 	metricLabels := make(map[string][]string)
-	// resourceLabels := make(map[string][]string)
+	resourceLabels := make(map[string][]string)
 
 	for _, series := range data.TimeSeries {
 		points := make([]tsdb.TimePoint, 0)
@@ -225,11 +225,17 @@ func (e *StackdriverExecutor) parseResponse(queryRes *tsdb.QueryResult, data Sta
 		metricName := series.Metric.Type
 
 		for key, value := range series.Metric.Labels {
-			metricLabels[key] = append(metricLabels[key], value)
+			if !containsLabel(metricLabels[key], value) {
+				metricLabels[key] = append(metricLabels[key], value)
+			}
 			metricName += " " + value
 		}
 
-		// queryRes.Meta.Set("resourceLabels", series.Resource.Labels)
+		for key, value := range series.Resource.Labels {
+			if !containsLabel(resourceLabels[key], value) {
+				resourceLabels[key] = append(resourceLabels[key], value)
+			}
+		}
 
 		queryRes.Series = append(queryRes.Series, &tsdb.TimeSeries{
 			Name:   metricName,
@@ -237,11 +243,21 @@ func (e *StackdriverExecutor) parseResponse(queryRes *tsdb.QueryResult, data Sta
 		})
 	}
 
+	queryRes.Meta.Set("resourceLabels", resourceLabels)
 	queryRes.Meta.Set("metricLabels", metricLabels)
 
 	return nil
 }
 
+func containsLabel(labels []string, newLabel string) bool {
+	for _, val := range labels {
+		if val == newLabel {
+			return true
+		}
+	}
+	return false
+}
+
 func (e *StackdriverExecutor) createRequest(ctx context.Context, dsInfo *models.DataSource) (*http.Request, error) {
 	u, _ := url.Parse(dsInfo.Url)
 	u.Path = path.Join(u.Path, "render")

+ 16 - 2
pkg/tsdb/stackdriver/stackdriver_test.go

@@ -152,8 +152,22 @@ func TestStackdriver(t *testing.T) {
 				})
 
 				Convey("Should add meta for labels to the response", func() {
-					instanceName := res.Meta.Get("metricLabels").MustMap()["instance_name"]
-					So(instanceName, ShouldNotBeNil)
+					metricLabels := res.Meta.Get("metricLabels").Interface().(map[string][]string)
+					So(metricLabels, ShouldNotBeNil)
+					So(len(metricLabels["instance_name"]), ShouldEqual, 3)
+					So(metricLabels["instance_name"][0], ShouldEqual, "collector-asia-east-1")
+					So(metricLabels["instance_name"][1], ShouldEqual, "collector-europe-west-1")
+					So(metricLabels["instance_name"][2], ShouldEqual, "collector-us-east-1")
+
+					resourceLabels := res.Meta.Get("resourceLabels").Interface().(map[string][]string)
+					So(resourceLabels, ShouldNotBeNil)
+					So(len(resourceLabels["zone"]), ShouldEqual, 3)
+					So(resourceLabels["zone"][0], ShouldEqual, "asia-east1-a")
+					So(resourceLabels["zone"][1], ShouldEqual, "europe-west1-b")
+					So(resourceLabels["zone"][2], ShouldEqual, "us-east1-b")
+
+					So(len(resourceLabels["project_id"]), ShouldEqual, 1)
+					So(resourceLabels["project_id"][0], ShouldEqual, "grafana-prod")
 				})
 			})
 		})