mirror of https://github.com/grafana/grafana
parent
ab8751767c
commit
d8aa38fafe
@ -0,0 +1,115 @@ |
||||
package influxdb |
||||
|
||||
import ( |
||||
"testing" |
||||
|
||||
"github.com/grafana/grafana/pkg/components/simplejson" |
||||
. "github.com/smartystreets/goconvey/convey" |
||||
) |
||||
|
||||
func TestInfluxdbQueryParser(t *testing.T) { |
||||
Convey("Influxdb query parser", t, func() { |
||||
|
||||
parser := &InfluxdbQueryParser{} |
||||
|
||||
Convey("can parse influxdb json model", func() { |
||||
json := ` |
||||
{ |
||||
"dsType": "influxdb", |
||||
"groupBy": [ |
||||
{ |
||||
"params": [ |
||||
"$interval" |
||||
], |
||||
"type": "time" |
||||
}, |
||||
{ |
||||
"params": [ |
||||
"datacenter" |
||||
], |
||||
"type": "tag" |
||||
}, |
||||
{ |
||||
"params": [ |
||||
"none" |
||||
], |
||||
"type": "fill" |
||||
} |
||||
], |
||||
"measurement": "logins.count", |
||||
"policy": "default", |
||||
"refId": "B", |
||||
"resultFormat": "time_series", |
||||
"select": [ |
||||
[ |
||||
{ |
||||
"type": "field", |
||||
"params": [ |
||||
"value" |
||||
] |
||||
}, |
||||
{ |
||||
"type": "count", |
||||
"params": [] |
||||
} |
||||
], |
||||
[ |
||||
{ |
||||
"type": "field", |
||||
"params": [ |
||||
"value" |
||||
] |
||||
}, |
||||
{ |
||||
"type": "bottom", |
||||
"params": [ |
||||
3 |
||||
] |
||||
} |
||||
], |
||||
[ |
||||
{ |
||||
"type": "field", |
||||
"params": [ |
||||
"value" |
||||
] |
||||
}, |
||||
{ |
||||
"type": "mean", |
||||
"params": [] |
||||
}, |
||||
{ |
||||
"type": "math", |
||||
"params": [ |
||||
" / 100" |
||||
] |
||||
} |
||||
] |
||||
], |
||||
"tags": [ |
||||
{ |
||||
"key": "datacenter", |
||||
"operator": "=", |
||||
"value": "America" |
||||
}, |
||||
{ |
||||
"condition": "OR", |
||||
"key": "hostname", |
||||
"operator": "=", |
||||
"value": "server1" |
||||
} |
||||
] |
||||
} |
||||
` |
||||
|
||||
modelJson, err := simplejson.NewJson([]byte(json)) |
||||
So(err, ShouldBeNil) |
||||
|
||||
res, err := parser.Parse(modelJson) |
||||
So(err, ShouldBeNil) |
||||
So(len(res.GroupBy), ShouldEqual, 3) |
||||
So(len(res.Selects), ShouldEqual, 3) |
||||
So(len(res.Tags), ShouldEqual, 2) |
||||
}) |
||||
}) |
||||
} |
||||
@ -1,115 +0,0 @@ |
||||
package influxdb |
||||
|
||||
import ( |
||||
"testing" |
||||
|
||||
"github.com/grafana/grafana/pkg/components/simplejson" |
||||
. "github.com/smartystreets/goconvey/convey" |
||||
) |
||||
|
||||
func TestInfluxdbQueryParser(t *testing.T) { |
||||
Convey("Influxdb query parser", t, func() { |
||||
|
||||
parser := &InfluxdbQueryParser{} |
||||
|
||||
Convey("converting metric name", func() { |
||||
json := ` |
||||
{ |
||||
"dsType": "influxdb", |
||||
"groupBy": [ |
||||
{ |
||||
"params": [ |
||||
"$interval" |
||||
], |
||||
"type": "time" |
||||
}, |
||||
{ |
||||
"params": [ |
||||
"datacenter" |
||||
], |
||||
"type": "tag" |
||||
}, |
||||
{ |
||||
"params": [ |
||||
"none" |
||||
], |
||||
"type": "fill" |
||||
} |
||||
], |
||||
"measurement": "logins.count", |
||||
"policy": "default", |
||||
"refId": "B", |
||||
"resultFormat": "time_series", |
||||
"select": [ |
||||
[ |
||||
{ |
||||
"type": "field", |
||||
"params": [ |
||||
"value" |
||||
] |
||||
}, |
||||
{ |
||||
"type": "count", |
||||
"params": [] |
||||
} |
||||
], |
||||
[ |
||||
{ |
||||
"type": "field", |
||||
"params": [ |
||||
"value" |
||||
] |
||||
}, |
||||
{ |
||||
"type": "bottom", |
||||
"params": [ |
||||
3 |
||||
] |
||||
} |
||||
], |
||||
[ |
||||
{ |
||||
"type": "field", |
||||
"params": [ |
||||
"value" |
||||
] |
||||
}, |
||||
{ |
||||
"type": "mean", |
||||
"params": [] |
||||
}, |
||||
{ |
||||
"type": "math", |
||||
"params": [ |
||||
" / 100" |
||||
] |
||||
} |
||||
] |
||||
], |
||||
"tags": [ |
||||
{ |
||||
"key": "datacenter", |
||||
"operator": "=", |
||||
"value": "America" |
||||
}, |
||||
{ |
||||
"condition": "OR", |
||||
"key": "hostname", |
||||
"operator": "=", |
||||
"value": "server1" |
||||
} |
||||
] |
||||
} |
||||
` |
||||
|
||||
modelJson, err := simplejson.NewJson([]byte(json)) |
||||
So(err, ShouldBeNil) |
||||
|
||||
res, err := parser.Parse(modelJson) |
||||
So(err, ShouldBeNil) |
||||
So(len(res.GroupBy), ShouldEqual, 3) |
||||
So(len(res.Selects), ShouldEqual, 3) |
||||
So(len(res.Tags), ShouldEqual, 2) |
||||
}) |
||||
}) |
||||
} |
||||
@ -0,0 +1,49 @@ |
||||
package influxdb |
||||
|
||||
import ( |
||||
"encoding/json" |
||||
|
||||
"github.com/grafana/grafana/pkg/tsdb" |
||||
"gopkg.in/guregu/null.v3" |
||||
) |
||||
|
||||
func ParseQueryResult(response *Response) *tsdb.QueryResult { |
||||
queryRes := tsdb.NewQueryResult() |
||||
|
||||
for _, v := range response.Results { |
||||
for _, r := range v.Series { |
||||
serie := tsdb.TimeSeries{Name: r.Name} |
||||
var points tsdb.TimeSeriesPoints |
||||
|
||||
for _, k := range r.Values { |
||||
var value null.Float |
||||
var err error |
||||
num, ok := k[1].(json.Number) |
||||
if !ok { |
||||
value = null.FloatFromPtr(nil) |
||||
} else { |
||||
fvalue, err := num.Float64() |
||||
if err == nil { |
||||
value = null.FloatFrom(fvalue) |
||||
} |
||||
} |
||||
|
||||
pos0, ok := k[0].(json.Number) |
||||
timestamp, err := pos0.Float64() |
||||
if err == nil && ok { |
||||
points = append(points, tsdb.NewTimePoint(value, timestamp)) |
||||
} else { |
||||
//glog.Error("Failed to convert response", "err1", err, "ok", ok, "timestamp", timestamp, "value", value.Float64)
|
||||
} |
||||
serie.Points = points |
||||
} |
||||
queryRes.Series = append(queryRes.Series, &serie) |
||||
} |
||||
} |
||||
|
||||
for _, v := range queryRes.Series { |
||||
glog.Info("result", "name", v.Name, "points", v.Points) |
||||
} |
||||
|
||||
return queryRes |
||||
} |
||||
@ -0,0 +1,49 @@ |
||||
package influxdb |
||||
|
||||
import ( |
||||
"encoding/json" |
||||
"testing" |
||||
|
||||
"github.com/grafana/grafana/pkg/setting" |
||||
. "github.com/smartystreets/goconvey/convey" |
||||
) |
||||
|
||||
func TestInfluxdbResponseParser(t *testing.T) { |
||||
Convey("Influxdb response parser", t, func() { |
||||
|
||||
setting.NewConfigContext(&setting.CommandLineArgs{ |
||||
HomePath: "../../../", |
||||
}) |
||||
|
||||
response := &Response{ |
||||
Results: []Result{ |
||||
Result{ |
||||
Series: []Row{ |
||||
{ |
||||
Name: "cpu", |
||||
Columns: []string{"time", "mean", "sum"}, |
||||
Values: [][]interface{}{ |
||||
{json.Number("123"), json.Number("123"), json.Number("123")}, |
||||
{json.Number("123"), json.Number("123"), json.Number("123")}, |
||||
{json.Number("123"), json.Number("123"), json.Number("123")}, |
||||
{json.Number("123"), json.Number("123"), json.Number("123")}, |
||||
{json.Number("123"), json.Number("123"), json.Number("123")}, |
||||
{json.Number("123"), json.Number("123"), json.Number("123")}, |
||||
{json.Number("123"), json.Number("123"), json.Number("123")}, |
||||
{json.Number("123"), json.Number("123"), json.Number("123")}, |
||||
{json.Number("123"), json.Number("123"), json.Number("123")}, |
||||
{json.Number("123"), json.Number("123"), json.Number("123")}, |
||||
}, |
||||
}, |
||||
}, |
||||
}, |
||||
}, |
||||
} |
||||
|
||||
Convey("can parse response", func() { |
||||
result := ParseQueryResult(response) |
||||
So(len(result.Series), ShouldEqual, 1) |
||||
So(len(result.Series[0].Points), ShouldEqual, 10) |
||||
}) |
||||
}) |
||||
} |
||||
Loading…
Reference in new issue