From d405d8f255ac2bd1f2a561a5491f8f5a778ebc23 Mon Sep 17 00:00:00 2001 From: Daniel Lee Date: Wed, 26 Sep 2018 18:19:30 +0200 Subject: [PATCH 1/2] stackdriver: publish docs to v5.3 (not root) --- docs/sources/features/datasources/stackdriver.md | 6 ++++-- docs/versions.json | 1 + 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/docs/sources/features/datasources/stackdriver.md b/docs/sources/features/datasources/stackdriver.md index ef85de435c7..934e8ec2378 100644 --- a/docs/sources/features/datasources/stackdriver.md +++ b/docs/sources/features/datasources/stackdriver.md @@ -61,9 +61,11 @@ Click on the links above and click the `Enable` button: ![Choose role](/img/docs/v54/stackdriver_service_account_choose_role.png) 5. Click the Create button. A JSON key file will be created and downloaded to your computer. Store this file in a secure place as it allows access to your Stackdriver data. 6. Upload it to Grafana on the datasource Configuration page. You can either upload the file or paste in the contents of the file. - ![Choose role](/img/docs/v54/stackdriver_grafana_upload_key.png) + + ![Choose role](/img/docs/v54/stackdriver_grafana_upload_key.png) 7. The file contents will be encrypted and saved in the Grafana database. Don't forget to save after uploading the file! - ![Choose role](/img/docs/v54/stackdriver_grafana_key_uploaded.png) + + ![Choose role](/img/docs/v54/stackdriver_grafana_key_uploaded.png) ## Metric Query Editor diff --git a/docs/versions.json b/docs/versions.json index caefbe198d6..34e9c2150e1 100644 --- a/docs/versions.json +++ b/docs/versions.json @@ -1,4 +1,5 @@ [ + { "version": "v5.3", "path": "/v5.3", "archived": false, "current": false }, { "version": "v5.2", "path": "/", "archived": false, "current": true }, { "version": "v5.1", "path": "/v5.1", "archived": true }, { "version": "v5.0", "path": "/v5.0", "archived": true }, From 6358d3f314dc35f452a08f7080368350e7e73654 Mon Sep 17 00:00:00 2001 From: Daniel Lee Date: Thu, 27 Sep 2018 10:13:32 +0200 Subject: [PATCH 2/2] stackdriver: set target to be raw query --- pkg/tsdb/stackdriver/stackdriver.go | 51 +++++++++--------------- pkg/tsdb/stackdriver/stackdriver_test.go | 12 ++---- 2 files changed, 21 insertions(+), 42 deletions(-) diff --git a/pkg/tsdb/stackdriver/stackdriver.go b/pkg/tsdb/stackdriver/stackdriver.go index e6f9ddf6c56..66691714ce4 100644 --- a/pkg/tsdb/stackdriver/stackdriver.go +++ b/pkg/tsdb/stackdriver/stackdriver.go @@ -121,34 +121,18 @@ func (e *StackdriverExecutor) buildQueries(tsdbQuery *tsdb.TsdbQuery) ([]*Stackd for _, query := range tsdbQuery.Queries { var target string - if fullTarget, err := query.Model.Get("targetFull").String(); err == nil { - target = fixIntervalFormat(fullTarget) - } else { - target = fixIntervalFormat(query.Model.Get("target").MustString()) - } - 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", strings.Trim(fmt.Sprintf(`metric.type="%s" %s`, metricType, filterString), " ")) + params.Add("filter", buildFilterString(metricType, filterParts)) params.Add("view", query.Model.Get("view").MustString()) setAggParams(¶ms, query, durationSeconds) + target = params.Encode() + if setting.Env == setting.DEV { slog.Debug("Stackdriver request", "params", params) } @@ -173,6 +157,21 @@ func (e *StackdriverExecutor) buildQueries(tsdbQuery *tsdb.TsdbQuery) ([]*Stackd return stackdriverQueries, nil } +func buildFilterString(metricType string, filterParts []interface{}) string { + 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) + } + } + return strings.Trim(fmt.Sprintf(`metric.type="%s" %s`, metricType, filterString), " ") +} + func setAggParams(params *url.Values, query *tsdb.Query, durationSeconds int) { primaryAggregation := query.Model.Get("primaryAggregation").MustString() perSeriesAligner := query.Model.Get("perSeriesAligner").MustString() @@ -457,17 +456,3 @@ func (e *StackdriverExecutor) createRequest(ctx context.Context, dsInfo *models. return req, nil } - -func fixIntervalFormat(target string) string { - rMinute := regexp.MustCompile(`'(\d+)m'`) - rMin := regexp.MustCompile("m") - target = rMinute.ReplaceAllStringFunc(target, func(m string) string { - return rMin.ReplaceAllString(m, "min") - }) - rMonth := regexp.MustCompile(`'(\d+)M'`) - rMon := regexp.MustCompile("M") - target = rMonth.ReplaceAllStringFunc(target, func(M string) string { - return rMon.ReplaceAllString(M, "mon") - }) - return target -} diff --git a/pkg/tsdb/stackdriver/stackdriver_test.go b/pkg/tsdb/stackdriver/stackdriver_test.go index 28aeef2b153..fdd71dd9438 100644 --- a/pkg/tsdb/stackdriver/stackdriver_test.go +++ b/pkg/tsdb/stackdriver/stackdriver_test.go @@ -27,7 +27,6 @@ func TestStackdriver(t *testing.T) { Queries: []*tsdb.Query{ { Model: simplejson.NewFromAny(map[string]interface{}{ - "target": "target", "metricType": "a/metric/type", "view": "FULL", "aliasBy": "testalias", @@ -44,7 +43,7 @@ func TestStackdriver(t *testing.T) { So(len(queries), ShouldEqual, 1) So(queries[0].RefID, ShouldEqual, "A") - So(queries[0].Target, ShouldEqual, "target") + So(queries[0].Target, ShouldEqual, "aggregation.alignmentPeriod=%2B60s&aggregation.crossSeriesReducer=REDUCE_NONE&aggregation.perSeriesAligner=ALIGN_MEAN&filter=metric.type%3D%22a%2Fmetric%2Ftype%22&interval.endTime=2018-03-15T13%3A34%3A00Z&interval.startTime=2018-03-15T13%3A00%3A00Z&view=FULL") So(len(queries[0].Params), ShouldEqual, 7) So(queries[0].Params["interval.startTime"][0], ShouldEqual, "2018-03-15T13:00:00Z") So(queries[0].Params["interval.endTime"][0], ShouldEqual, "2018-03-15T13:34:00Z") @@ -56,7 +55,6 @@ func TestStackdriver(t *testing.T) { 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"}, }) @@ -71,7 +69,6 @@ func TestStackdriver(t *testing.T) { Convey("and IntervalMs is larger than 60", func() { tsdbQuery.Queries[0].IntervalMs = 1000000 tsdbQuery.Queries[0].Model = simplejson.NewFromAny(map[string]interface{}{ - "target": "target", "alignmentPeriod": "grafana-auto", "filters": []interface{}{"key", "=", "value", "AND", "key2", "=", "value2"}, }) @@ -83,7 +80,6 @@ func TestStackdriver(t *testing.T) { Convey("and IntervalMs is less than 60", func() { tsdbQuery.Queries[0].IntervalMs = 30 tsdbQuery.Queries[0].Model = simplejson.NewFromAny(map[string]interface{}{ - "target": "target", "alignmentPeriod": "grafana-auto", "filters": []interface{}{"key", "=", "value", "AND", "key2", "=", "value2"}, }) @@ -120,7 +116,6 @@ func TestStackdriver(t *testing.T) { Convey("and query has aggregation mean set", func() { tsdbQuery.Queries[0].Model = simplejson.NewFromAny(map[string]interface{}{ - "target": "target", "metricType": "a/metric/type", "primaryAggregation": "REDUCE_MEAN", "view": "FULL", @@ -131,7 +126,7 @@ func TestStackdriver(t *testing.T) { So(len(queries), ShouldEqual, 1) So(queries[0].RefID, ShouldEqual, "A") - So(queries[0].Target, ShouldEqual, "target") + So(queries[0].Target, ShouldEqual, "aggregation.alignmentPeriod=%2B60s&aggregation.crossSeriesReducer=REDUCE_MEAN&aggregation.perSeriesAligner=ALIGN_MEAN&filter=metric.type%3D%22a%2Fmetric%2Ftype%22&interval.endTime=2018-03-15T13%3A34%3A00Z&interval.startTime=2018-03-15T13%3A00%3A00Z&view=FULL") So(len(queries[0].Params), ShouldEqual, 7) So(queries[0].Params["interval.startTime"][0], ShouldEqual, "2018-03-15T13:00:00Z") So(queries[0].Params["interval.endTime"][0], ShouldEqual, "2018-03-15T13:34:00Z") @@ -144,7 +139,6 @@ func TestStackdriver(t *testing.T) { Convey("and query has group bys", func() { tsdbQuery.Queries[0].Model = simplejson.NewFromAny(map[string]interface{}{ - "target": "target", "metricType": "a/metric/type", "primaryAggregation": "REDUCE_NONE", "groupBys": []interface{}{"metric.label.group1", "metric.label.group2"}, @@ -156,7 +150,7 @@ func TestStackdriver(t *testing.T) { So(len(queries), ShouldEqual, 1) So(queries[0].RefID, ShouldEqual, "A") - So(queries[0].Target, ShouldEqual, "target") + So(queries[0].Target, ShouldEqual, "aggregation.alignmentPeriod=%2B60s&aggregation.crossSeriesReducer=REDUCE_NONE&aggregation.groupByFields=metric.label.group1&aggregation.groupByFields=metric.label.group2&aggregation.perSeriesAligner=ALIGN_MEAN&filter=metric.type%3D%22a%2Fmetric%2Ftype%22&interval.endTime=2018-03-15T13%3A34%3A00Z&interval.startTime=2018-03-15T13%3A00%3A00Z&view=FULL") So(len(queries[0].Params), ShouldEqual, 8) So(queries[0].Params["interval.startTime"][0], ShouldEqual, "2018-03-15T13:00:00Z") So(queries[0].Params["interval.endTime"][0], ShouldEqual, "2018-03-15T13:34:00Z")