diff --git a/pkg/tsdb/influxdb/query_part.go b/pkg/tsdb/influxdb/query_part.go index ec24efa0057..d634bc5c817 100644 --- a/pkg/tsdb/influxdb/query_part.go +++ b/pkg/tsdb/influxdb/query_part.go @@ -3,6 +3,7 @@ package influxdb import ( "fmt" "strings" + "time" "github.com/grafana/grafana/pkg/tsdb" ) @@ -92,12 +93,27 @@ func fieldRenderer(query *Query, queryContext *tsdb.QueryContext, part *QueryPar return fmt.Sprintf(`"%s"`, part.Params[0]) } +func getDefinedInterval(query *Query, queryContext *tsdb.QueryContext) string { + setInterval := strings.Replace(strings.Replace(query.Interval, "<", "", 1), ">", "", 1) + defaultInterval := tsdb.CalculateInterval(queryContext.TimeRange) + + if strings.Contains(query.Interval, ">") { + parsedDefaultInterval, err := time.ParseDuration(defaultInterval) + parsedSetInterval, err2 := time.ParseDuration(setInterval) + + if err == nil && err2 == nil && parsedDefaultInterval > parsedSetInterval { + return defaultInterval + } + } + + return setInterval +} + func functionRenderer(query *Query, queryContext *tsdb.QueryContext, part *QueryPart, innerExpr string) string { - for i, v := range part.Params { - if v == "$interval" { + for i, param := range part.Params { + if param == "$interval" { if query.Interval != "" { - interval := strings.Replace(strings.Replace(query.Interval, "<", "", 1), ">", "", 1) - part.Params[i] = interval + part.Params[i] = getDefinedInterval(query, queryContext) } else { part.Params[i] = tsdb.CalculateInterval(queryContext.TimeRange) } diff --git a/pkg/tsdb/influxdb/query_part_test.go b/pkg/tsdb/influxdb/query_part_test.go index 51107a774e0..456a7fb8d59 100644 --- a/pkg/tsdb/influxdb/query_part_test.go +++ b/pkg/tsdb/influxdb/query_part_test.go @@ -45,6 +45,27 @@ func TestInfluxdbQueryPart(t *testing.T) { So(res, ShouldEqual, "time(200ms)") }) + Convey("render time interval >10s", func() { + part, err := NewQueryPart("time", []string{"$interval"}) + So(err, ShouldBeNil) + + query.Interval = ">10s" + + res := part.Render(query, queryContext, "") + So(res, ShouldEqual, "time(10s)") + }) + + Convey("render time interval >1s and higher interval calculation", func() { + part, err := NewQueryPart("time", []string{"$interval"}) + queryContext := &tsdb.QueryContext{TimeRange: tsdb.NewTimeRange("1y", "now")} + So(err, ShouldBeNil) + + query.Interval = ">1s" + + res := part.Render(query, queryContext, "") + So(res, ShouldEqual, "time(168h)") + }) + Convey("render spread", func() { part, err := NewQueryPart("spread", []string{}) So(err, ShouldBeNil)