diff --git a/pkg/tsdb/influxdb/model_parser.go b/pkg/tsdb/influxdb/model_parser.go index f1113511bae..94f37904eee 100644 --- a/pkg/tsdb/influxdb/model_parser.go +++ b/pkg/tsdb/influxdb/model_parser.go @@ -16,6 +16,7 @@ func (qp *InfluxdbQueryParser) Parse(model *simplejson.Json, dsInfo *models.Data rawQuery := model.Get("query").MustString("") useRawQuery := model.Get("rawQuery").MustBool(false) alias := model.Get("alias").MustString("") + tz := model.Get("tz").MustString("") measurement := model.Get("measurement").MustString("") @@ -55,6 +56,7 @@ func (qp *InfluxdbQueryParser) Parse(model *simplejson.Json, dsInfo *models.Data Interval: parsedInterval, Alias: alias, UseRawQuery: useRawQuery, + Tz: tz, }, nil } diff --git a/pkg/tsdb/influxdb/model_parser_test.go b/pkg/tsdb/influxdb/model_parser_test.go index 7be9cae9702..e620b0c631d 100644 --- a/pkg/tsdb/influxdb/model_parser_test.go +++ b/pkg/tsdb/influxdb/model_parser_test.go @@ -41,6 +41,7 @@ func TestInfluxdbQueryParser(t *testing.T) { } ], "measurement": "logins.count", + "tz": "Europe/Paris", "policy": "default", "refId": "B", "resultFormat": "time_series", @@ -115,6 +116,7 @@ func TestInfluxdbQueryParser(t *testing.T) { So(len(res.GroupBy), ShouldEqual, 3) So(len(res.Selects), ShouldEqual, 3) So(len(res.Tags), ShouldEqual, 2) + So(res.Tz, ShouldEqual, "Europe/Paris") So(res.Interval, ShouldEqual, time.Second*20) So(res.Alias, ShouldEqual, "serie alias") }) diff --git a/pkg/tsdb/influxdb/models.go b/pkg/tsdb/influxdb/models.go index 82ed72c2a18..cbe82e5e2ef 100644 --- a/pkg/tsdb/influxdb/models.go +++ b/pkg/tsdb/influxdb/models.go @@ -13,6 +13,7 @@ type Query struct { UseRawQuery bool Alias string Interval time.Duration + Tz string } type Tag struct { diff --git a/pkg/tsdb/influxdb/query.go b/pkg/tsdb/influxdb/query.go index 7cb8f0ecd82..f1a8c745956 100644 --- a/pkg/tsdb/influxdb/query.go +++ b/pkg/tsdb/influxdb/query.go @@ -26,6 +26,7 @@ func (query *Query) Build(queryContext *tsdb.TsdbQuery) (string, error) { res += query.renderWhereClause() res += query.renderTimeFilter(queryContext) res += query.renderGroupBy(queryContext) + res += query.renderTz() } calculator := tsdb.NewIntervalCalculator(&tsdb.IntervalOptions{}) @@ -154,3 +155,12 @@ func (query *Query) renderGroupBy(queryContext *tsdb.TsdbQuery) string { return groupBy } + +func (query *Query) renderTz() string { + tz := query.Tz + if tz == "" { + return "" + } else { + return fmt.Sprintf(" tz('%s')", tz) + } +} diff --git a/pkg/tsdb/influxdb/query_test.go b/pkg/tsdb/influxdb/query_test.go index cc1358a72d7..f85419c8ae2 100644 --- a/pkg/tsdb/influxdb/query_test.go +++ b/pkg/tsdb/influxdb/query_test.go @@ -47,6 +47,20 @@ func TestInfluxdbQueryBuilder(t *testing.T) { So(rawQuery, ShouldEqual, `SELECT mean("value") FROM "policy"."cpu" WHERE time > now() - 5m GROUP BY time(10s) fill(null)`) }) + Convey("can build query with tz", func() { + query := &Query{ + Selects: []*Select{{*qp1, *qp2}}, + Measurement: "cpu", + GroupBy: []*QueryPart{groupBy1}, + Tz: "Europe/Paris", + Interval: time.Second * 5, + } + + rawQuery, err := query.Build(queryContext) + So(err, ShouldBeNil) + So(rawQuery, ShouldEqual, `SELECT mean("value") FROM "cpu" WHERE time > now() - 5m GROUP BY time(5s) tz('Europe/Paris')`) + }) + Convey("can build query with group bys", func() { query := &Query{ Selects: []*Select{{*qp1, *qp2}}, diff --git a/public/app/plugins/datasource/influxdb/influx_query.ts b/public/app/plugins/datasource/influxdb/influx_query.ts index 60eac1d3f2b..3ee9d703c54 100644 --- a/public/app/plugins/datasource/influxdb/influx_query.ts +++ b/public/app/plugins/datasource/influxdb/influx_query.ts @@ -256,6 +256,10 @@ export default class InfluxQuery { query += ' SLIMIT ' + target.slimit; } + if (target.tz) { + query += " tz('" + target.tz + "')"; + } + return query; } diff --git a/public/app/plugins/datasource/influxdb/partials/query.editor.html b/public/app/plugins/datasource/influxdb/partials/query.editor.html index e1c35d77115..658cf18daee 100644 --- a/public/app/plugins/datasource/influxdb/partials/query.editor.html +++ b/public/app/plugins/datasource/influxdb/partials/query.editor.html @@ -119,6 +119,16 @@ +
+
+ + +
+
+
+
+
+
diff --git a/public/app/plugins/datasource/influxdb/query_ctrl.ts b/public/app/plugins/datasource/influxdb/query_ctrl.ts index f531fe6c4d9..57460ec4d2a 100644 --- a/public/app/plugins/datasource/influxdb/query_ctrl.ts +++ b/public/app/plugins/datasource/influxdb/query_ctrl.ts @@ -100,6 +100,9 @@ export class InfluxQueryCtrl extends QueryCtrl { if (!this.target.slimit) { options.push(this.uiSegmentSrv.newSegment({ value: 'SLIMIT' })); } + if (!this.target.tz) { + options.push(this.uiSegmentSrv.newSegment({ value: 'tz' })); + } if (this.target.orderByTime === 'ASC') { options.push(this.uiSegmentSrv.newSegment({ value: 'ORDER BY time DESC' })); } @@ -124,6 +127,10 @@ export class InfluxQueryCtrl extends QueryCtrl { this.target.slimit = 10; break; } + case 'tz': { + this.target.tz = 'UTC'; + break; + } case 'ORDER BY time DESC': { this.target.orderByTime = 'DESC'; break;