From 1bdda76ba90398ef13b96180123fd54a8e1f99ce Mon Sep 17 00:00:00 2001 From: bergquist Date: Mon, 14 Nov 2016 14:49:58 +0100 Subject: [PATCH] tests(mqe): parse mqe query model --- pkg/tsdb/mqe/model_parser.go | 29 ++++++++++++++- pkg/tsdb/mqe/model_parser_test.go | 59 +++++++++++++++++++++++++++---- pkg/tsdb/mqe/response_handler.go | 6 ++++ pkg/tsdb/mqe/token_client.go | 25 +++++++++++-- pkg/tsdb/mqe/token_client_test.go | 7 ++-- pkg/tsdb/mqe/types.go | 12 ++++++- 6 files changed, 124 insertions(+), 14 deletions(-) create mode 100644 pkg/tsdb/mqe/response_handler.go diff --git a/pkg/tsdb/mqe/model_parser.go b/pkg/tsdb/mqe/model_parser.go index 9c9b877f7a4..26bafb6c055 100644 --- a/pkg/tsdb/mqe/model_parser.go +++ b/pkg/tsdb/mqe/model_parser.go @@ -8,5 +8,32 @@ import ( type MQEQueryParser struct{} func (qp *MQEQueryParser) Parse(model *simplejson.Json, dsInfo *tsdb.DataSourceInfo) (*MQEQuery, error) { - return nil, nil + query := &MQEQuery{} + + query.AddAppToAlias = model.Get("addAppToAlias").MustBool(false) + query.AddHostToAlias = model.Get("addHostToAlias").MustBool(false) + query.UseRawQuery = model.Get("rawQuery").MustBool(false) + query.RawQuery = model.Get("query").MustString("") + + query.Apps = model.Get("apps").MustStringArray([]string{}) + query.Hosts = model.Get("hosts").MustStringArray([]string{}) + + var metrics []MQEMetric + var err error + for _, metricsObj := range model.Get("metrics").MustArray() { + metricJson := simplejson.NewFromAny(metricsObj) + var m MQEMetric + + m.Alias = metricJson.Get("alias").MustString("") + m.Metric, err = metricJson.Get("metric").String() + if err != nil { + return nil, err + } + + metrics = append(metrics, m) + } + + query.Metrics = metrics + + return query, nil } diff --git a/pkg/tsdb/mqe/model_parser_test.go b/pkg/tsdb/mqe/model_parser_test.go index b88698cdbb9..60b83914a5c 100644 --- a/pkg/tsdb/mqe/model_parser_test.go +++ b/pkg/tsdb/mqe/model_parser_test.go @@ -16,8 +16,6 @@ func TestMQEQueryParser(t *testing.T) { JsonData: simplejson.New(), } - queryContext := &tsdb.QueryContext{} - Convey("can parse simple mqe model", func() { json := ` { @@ -39,15 +37,19 @@ func TestMQEQueryParser(t *testing.T) { query, err := parser.Parse(modelJson, dsInfo) So(err, ShouldBeNil) + So(query.UseRawQuery, ShouldBeFalse) - rawQuery := query.Build(queryContext) - So(rawQuery, ShouldEqual, "") + So(len(query.Apps), ShouldEqual, 0) + So(query.Hosts[0], ShouldEqual, "staples-lab-1") + So(query.Metrics[0].Metric, ShouldEqual, "os.cpu.all*") }) Convey("can parse multi serie mqe model", func() { json := ` { - "apps": [], + "apps": [ + "demoapp" + ], "hosts": [ "staples-lab-1" ], @@ -65,8 +67,53 @@ func TestMQEQueryParser(t *testing.T) { "addHostToAlias": true } ` + modelJson, err := simplejson.NewJson([]byte(json)) + So(err, ShouldBeNil) - So(json, ShouldNotBeNil) + query, err := parser.Parse(modelJson, dsInfo) + So(err, ShouldBeNil) + So(query.UseRawQuery, ShouldBeFalse) + So(query.Apps[0], ShouldEqual, "demoapp") + So(query.Metrics[0].Metric, ShouldEqual, "os.cpu.all.active_percentage") + So(query.Metrics[1].Metric, ShouldEqual, "os.disk.sda.io_time") + }) + + Convey("can parse raw query", func() { + json := ` + { + "addAppToAlias": true, + "addHostToAlias": true, + "apps": [], + "hosts": [ + "staples-lab-1" + ], + "metrics": [ + { + "alias": "cpu active", + "metric": "os.cpu.all.active_percentage" + }, + { + "alias": "disk sda time", + "metric": "os.disk.sda.io_time" + } + ], + "rawQuery": true, + "query": "raw-query", + "refId": "A", + "addAppToAlias": true, + "addHostToAlias": true + } + ` + modelJson, err := simplejson.NewJson([]byte(json)) + So(err, ShouldBeNil) + + query, err := parser.Parse(modelJson, dsInfo) + So(err, ShouldBeNil) + + So(query.UseRawQuery, ShouldBeTrue) + So(query.RawQuery, ShouldEqual, "raw-query") + So(query.AddAppToAlias, ShouldBeTrue) + So(query.AddHostToAlias, ShouldBeTrue) }) }) } diff --git a/pkg/tsdb/mqe/response_handler.go b/pkg/tsdb/mqe/response_handler.go new file mode 100644 index 00000000000..c8551ac7a3f --- /dev/null +++ b/pkg/tsdb/mqe/response_handler.go @@ -0,0 +1,6 @@ +package mqe + +// wildcard as alias +// add host to alias +// add app to alias +// regular alias diff --git a/pkg/tsdb/mqe/token_client.go b/pkg/tsdb/mqe/token_client.go index 618ce671bb2..19e05954dc0 100644 --- a/pkg/tsdb/mqe/token_client.go +++ b/pkg/tsdb/mqe/token_client.go @@ -25,7 +25,24 @@ func NewTokenClient() *TokenClient { } } -func (client *TokenClient) GetTokenData(ctx context.Context, datasource *tsdb.DataSourceInfo) (*TokenResponse, error) { +var cache map[int64]*TokenBody = map[int64]*TokenBody{} + +//Replace this stupid cache with internal cache from grafana master before merging +func (client *TokenClient) GetTokenData(ctx context.Context, datasource *tsdb.DataSourceInfo) (*TokenBody, error) { + _, excist := cache[datasource.Id] + if !excist { + b, err := client.RequestTokenData(ctx, datasource) + if err != nil { + return nil, err + } + + cache[datasource.Id] = b + } + + return cache[datasource.Id], nil +} + +func (client *TokenClient) RequestTokenData(ctx context.Context, datasource *tsdb.DataSourceInfo) (*TokenBody, error) { u, _ := url.Parse(datasource.Url) u.Path = path.Join(u.Path, "token") @@ -57,5 +74,9 @@ func (client *TokenClient) GetTokenData(ctx context.Context, datasource *tsdb.Da return nil, err } - return result, nil + if !result.Success { + return nil, fmt.Errorf("Request failed for unknown reason.") + } + + return &result.Body, nil } diff --git a/pkg/tsdb/mqe/token_client_test.go b/pkg/tsdb/mqe/token_client_test.go index 5265a64e513..4b68b067362 100644 --- a/pkg/tsdb/mqe/token_client_test.go +++ b/pkg/tsdb/mqe/token_client_test.go @@ -18,11 +18,10 @@ func TestTokenClient(t *testing.T) { client := NewTokenClient() - body, err := client.GetTokenData(context.TODO(), dsInfo) + body, err := client.RequestTokenData(context.TODO(), dsInfo) So(err, ShouldBeNil) - So(len(body.Body.Functions), ShouldBeGreaterThan, 1) - So(len(body.Body.Metrics), ShouldBeGreaterThan, 1) - So(body.Success, ShouldBeTrue) + So(len(body.Functions), ShouldBeGreaterThan, 1) + So(len(body.Metrics), ShouldBeGreaterThan, 1) }) } diff --git a/pkg/tsdb/mqe/types.go b/pkg/tsdb/mqe/types.go index 1c53ae62c5b..ca273a57e94 100644 --- a/pkg/tsdb/mqe/types.go +++ b/pkg/tsdb/mqe/types.go @@ -4,10 +4,20 @@ import ( "github.com/grafana/grafana/pkg/tsdb" ) +type MQEMetric struct { + Metric string + Alias string +} + type MQEQuery struct { - Metrics []string + Metrics []MQEMetric Hosts []string Apps []string + + AddAppToAlias bool + AddHostToAlias bool + UseRawQuery bool + RawQuery string } func (q *MQEQuery) Build(queryContext *tsdb.QueryContext) string {