Browse Source

feat(influxdb): choose highest interval value

bergquist 9 năm trước cách đây
mục cha
commit
f4e0a9245e
2 tập tin đã thay đổi với 41 bổ sung4 xóa
  1. 20 4
      pkg/tsdb/influxdb/query_part.go
  2. 21 0
      pkg/tsdb/influxdb/query_part_test.go

+ 20 - 4
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)
 			}

+ 21 - 0
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)