From 8b72853d36c193756a51a3fbe96c39304962c7d1 Mon Sep 17 00:00:00 2001 From: Daniel Lee Date: Fri, 14 Sep 2018 16:20:51 +0200 Subject: [PATCH] stackdriver: add support for filtering to backend --- pkg/tsdb/stackdriver/stackdriver.go | 16 +++++++++++++++- pkg/tsdb/stackdriver/stackdriver_test.go | 13 +++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/pkg/tsdb/stackdriver/stackdriver.go b/pkg/tsdb/stackdriver/stackdriver.go index 4796278fe76..ce53d88c72e 100644 --- a/pkg/tsdb/stackdriver/stackdriver.go +++ b/pkg/tsdb/stackdriver/stackdriver.go @@ -10,6 +10,7 @@ import ( "net/url" "path" "regexp" + "strings" "time" "golang.org/x/net/context/ctxhttp" @@ -98,11 +99,24 @@ func (e *StackdriverExecutor) buildQueries(tsdbQuery *tsdb.TsdbQuery) ([]*Stackd } metricType := query.Model.Get("metricType").MustString() + filterParts := query.Model.Get("filters").MustArray() + + filterString := "" + for i, part := range filterParts { + mod := i % 4 + if part == "AND" { + filterString += " " + } else if mod == 2 { + filterString += fmt.Sprintf(`"%s"`, part) + } else { + filterString += part.(string) + } + } params := url.Values{} params.Add("interval.startTime", startTime.UTC().Format(time.RFC3339)) params.Add("interval.endTime", endTime.UTC().Format(time.RFC3339)) - params.Add("filter", "metric.type=\""+metricType+"\"") + params.Add("filter", strings.Trim(fmt.Sprintf(`metric.type="%s" %s`, metricType, filterString), " ")) params.Add("view", query.Model.Get("view").MustString()) setAggParams(¶ms, query) diff --git a/pkg/tsdb/stackdriver/stackdriver_test.go b/pkg/tsdb/stackdriver/stackdriver_test.go index d08553c7daf..29c886d4513 100644 --- a/pkg/tsdb/stackdriver/stackdriver_test.go +++ b/pkg/tsdb/stackdriver/stackdriver_test.go @@ -51,6 +51,19 @@ func TestStackdriver(t *testing.T) { So(queries[0].Params["view"][0], ShouldEqual, "FULL") }) + Convey("and query has filters", func() { + tsdbQuery.Queries[0].Model = simplejson.NewFromAny(map[string]interface{}{ + "target": "target", + "metricType": "a/metric/type", + "filters": []interface{}{"key", "=", "value", "AND", "key2", "=", "value2"}, + }) + + queries, err := executor.buildQueries(tsdbQuery) + So(err, ShouldBeNil) + So(len(queries), ShouldEqual, 1) + So(queries[0].Params["filter"][0], ShouldEqual, `metric.type="a/metric/type" key="value" key2="value2"`) + }) + Convey("and query has aggregation mean set", func() { tsdbQuery.Queries[0].Model = simplejson.NewFromAny(map[string]interface{}{ "target": "target",