prometheus: alerting: respect datasource.scrapeInterval (#37799)

This commit is contained in:
Gábor Farkas
2021-08-11 20:34:51 +02:00
committed by GitHub
parent 45754edfbc
commit 4afa74232f
2 changed files with 33 additions and 13 deletions

View File

@ -38,6 +38,7 @@ type DatasourceInfo struct {
HTTPClientOpts sdkhttpclient.Options HTTPClientOpts sdkhttpclient.Options
URL string URL string
HTTPMethod string HTTPMethod string
TimeInterval string
} }
func init() { func init() {
@ -84,11 +85,17 @@ func newInstanceSettings() datasource.InstanceFactoryFunc {
return nil, errors.New("no http method provided") return nil, errors.New("no http method provided")
} }
timeInterval, ok := jsonData["timeInterval"].(string)
if !ok {
return nil, errors.New("invalid time-interval provided")
}
mdl := DatasourceInfo{ mdl := DatasourceInfo{
ID: settings.ID, ID: settings.ID,
URL: settings.URL, URL: settings.URL,
HTTPClientOpts: httpCliOpts, HTTPClientOpts: httpCliOpts,
HTTPMethod: httpMethod, HTTPMethod: httpMethod,
TimeInterval: timeInterval,
} }
return mdl, nil return mdl, nil
} }
@ -123,7 +130,7 @@ func (s *Service) QueryData(ctx context.Context, req *backend.QueryDataRequest)
Responses: backend.Responses{}, Responses: backend.Responses{},
} }
queries, err := s.parseQuery(req.Queries) queries, err := s.parseQuery(req.Queries, dsInfo)
if err != nil { if err != nil {
return &result, err return &result, err
} }
@ -217,7 +224,7 @@ func formatLegend(metric model.Metric, query *PrometheusQuery) string {
return string(result) return string(result)
} }
func (s *Service) parseQuery(queries []backend.DataQuery) ( func (s *Service) parseQuery(queries []backend.DataQuery, dsInfo *DatasourceInfo) (
[]*PrometheusQuery, error) { []*PrometheusQuery, error) {
var intervalMode string var intervalMode string
var adjustedInterval time.Duration var adjustedInterval time.Duration
@ -239,7 +246,7 @@ func (s *Service) parseQuery(queries []backend.DataQuery) (
end := queryModel.TimeRange.To end := queryModel.TimeRange.To
queryInterval := jsonModel.Get("interval").MustString("") queryInterval := jsonModel.Get("interval").MustString("")
dsInterval, err := tsdb.GetIntervalFrom(queryInterval, "", 0, 15*time.Second) foundInterval, err := tsdb.GetIntervalFrom(dsInfo.TimeInterval, queryInterval, 0, 15*time.Second)
hasQueryInterval := queryInterval != "" hasQueryInterval := queryInterval != ""
// Only use stepMode if we have interval in query, otherwise use "min" // Only use stepMode if we have interval in query, otherwise use "min"
if hasQueryInterval { if hasQueryInterval {
@ -253,7 +260,7 @@ func (s *Service) parseQuery(queries []backend.DataQuery) (
return nil, err return nil, err
} }
calculatedInterval, err := s.intervalCalculator.Calculate(queries[0].TimeRange, dsInterval, tsdb.IntervalMode(intervalMode)) calculatedInterval, err := s.intervalCalculator.Calculate(queries[0].TimeRange, foundInterval, tsdb.IntervalMode(intervalMode))
if err != nil { if err != nil {
return nil, err return nil, err
} }

View File

@ -56,7 +56,7 @@ func TestPrometheus(t *testing.T) {
To: now.Add(12 * time.Hour), To: now.Add(12 * time.Hour),
} }
query.TimeRange = timeRange query.TimeRange = timeRange
models, err := service.parseQuery([]backend.DataQuery{query}) models, err := service.parseQuery([]backend.DataQuery{query}, &DatasourceInfo{})
require.NoError(t, err) require.NoError(t, err)
require.Equal(t, time.Second*30, models[0].Step) require.Equal(t, time.Second*30, models[0].Step)
}) })
@ -74,7 +74,7 @@ func TestPrometheus(t *testing.T) {
To: now.Add(12 * time.Hour), To: now.Add(12 * time.Hour),
} }
query.TimeRange = timeRange query.TimeRange = timeRange
models, err := service.parseQuery([]backend.DataQuery{query}) models, err := service.parseQuery([]backend.DataQuery{query}, &DatasourceInfo{})
require.NoError(t, err) require.NoError(t, err)
require.Equal(t, time.Second*7, models[0].Step) require.Equal(t, time.Second*7, models[0].Step)
}) })
@ -92,7 +92,7 @@ func TestPrometheus(t *testing.T) {
To: now.Add(12 * time.Hour), To: now.Add(12 * time.Hour),
} }
query.TimeRange = timeRange query.TimeRange = timeRange
models, err := service.parseQuery([]backend.DataQuery{query}) models, err := service.parseQuery([]backend.DataQuery{query}, &DatasourceInfo{})
require.NoError(t, err) require.NoError(t, err)
require.Equal(t, time.Second*6, models[0].Step) require.Equal(t, time.Second*6, models[0].Step)
}) })
@ -110,7 +110,7 @@ func TestPrometheus(t *testing.T) {
To: now.Add(12 * time.Hour), To: now.Add(12 * time.Hour),
} }
query.TimeRange = timeRange query.TimeRange = timeRange
models, err := service.parseQuery([]backend.DataQuery{query}) models, err := service.parseQuery([]backend.DataQuery{query}, &DatasourceInfo{})
require.NoError(t, err) require.NoError(t, err)
require.Equal(t, time.Second*30, models[0].Step) require.Equal(t, time.Second*30, models[0].Step)
}) })
@ -128,7 +128,7 @@ func TestPrometheus(t *testing.T) {
To: now.Add(12 * time.Hour), To: now.Add(12 * time.Hour),
} }
query.TimeRange = timeRange query.TimeRange = timeRange
models, err := service.parseQuery([]backend.DataQuery{query}) models, err := service.parseQuery([]backend.DataQuery{query}, &DatasourceInfo{})
require.NoError(t, err) require.NoError(t, err)
require.Equal(t, time.Second*5, models[0].Step) require.Equal(t, time.Second*5, models[0].Step)
}) })
@ -140,7 +140,7 @@ func TestPrometheus(t *testing.T) {
"intervalFactor": 1, "intervalFactor": 1,
"refId": "A" "refId": "A"
}`) }`)
models, err := service.parseQuery([]backend.DataQuery{query}) models, err := service.parseQuery([]backend.DataQuery{query}, &DatasourceInfo{})
require.NoError(t, err) require.NoError(t, err)
require.Equal(t, time.Minute*2, models[0].Step) require.Equal(t, time.Minute*2, models[0].Step)
@ -149,7 +149,7 @@ func TestPrometheus(t *testing.T) {
To: now.Add(1 * time.Hour), To: now.Add(1 * time.Hour),
} }
query.TimeRange = timeRange query.TimeRange = timeRange
models, err = service.parseQuery([]backend.DataQuery{query}) models, err = service.parseQuery([]backend.DataQuery{query}, &DatasourceInfo{})
require.NoError(t, err) require.NoError(t, err)
require.Equal(t, time.Second*15, models[0].Step) require.Equal(t, time.Second*15, models[0].Step)
}) })
@ -160,7 +160,7 @@ func TestPrometheus(t *testing.T) {
"format": "time_series", "format": "time_series",
"intervalFactor": 10, "intervalFactor": 10,
"refId": "A" "refId": "A"
}`)}) }`)}, &DatasourceInfo{})
require.NoError(t, err) require.NoError(t, err)
require.Equal(t, time.Minute*20, models[0].Step) require.Equal(t, time.Minute*20, models[0].Step)
}) })
@ -171,10 +171,23 @@ func TestPrometheus(t *testing.T) {
"format": "time_series", "format": "time_series",
"intervalFactor": 1, "intervalFactor": 1,
"refId": "A" "refId": "A"
}`)}) }`)}, &DatasourceInfo{})
require.NoError(t, err) require.NoError(t, err)
require.Equal(t, time.Minute*2, models[0].Step) require.Equal(t, time.Minute*2, models[0].Step)
}) })
t.Run("parsing query model specified scrape-interval in the data source", func(t *testing.T) {
models, err := service.parseQuery([]backend.DataQuery{queryContext(`{
"expr": "go_goroutines",
"format": "time_series",
"intervalFactor": 1,
"refId": "A"
}`)}, &DatasourceInfo{
TimeInterval: "240s",
})
require.NoError(t, err)
require.Equal(t, time.Minute*4, models[0].Step)
})
} }
func queryContext(json string) backend.DataQuery { func queryContext(json string) backend.DataQuery {