mirror of
https://github.com/grafana/grafana.git
synced 2025-09-28 05:44:12 +08:00
prometheus: alerting: respect datasource.scrapeInterval (#37799)
This commit is contained in:
@ -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
|
||||||
}
|
}
|
||||||
|
@ -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 {
|
||||||
|
Reference in New Issue
Block a user