mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
Alerting: Simplify eval.Evaluator interface (#51463)
* remove ExpressionService from argument list of Evaluator's methods
This commit is contained in:
parent
bf255965a2
commit
94e709fdcb
@ -120,12 +120,11 @@ func (api *API) RegisterAPIEndpoints(m *metrics.API) {
|
|||||||
), m)
|
), m)
|
||||||
api.RegisterTestingApiEndpoints(NewForkedTestingApi(
|
api.RegisterTestingApiEndpoints(NewForkedTestingApi(
|
||||||
&TestingApiSrv{
|
&TestingApiSrv{
|
||||||
AlertingProxy: proxy,
|
AlertingProxy: proxy,
|
||||||
ExpressionService: api.ExpressionService,
|
DatasourceCache: api.DatasourceCache,
|
||||||
DatasourceCache: api.DatasourceCache,
|
log: logger,
|
||||||
log: logger,
|
accessControl: api.AccessControl,
|
||||||
accessControl: api.AccessControl,
|
evaluator: eval.NewEvaluator(api.Cfg, log.New("ngalert.eval"), api.DatasourceCache, api.SecretsService, api.ExpressionService),
|
||||||
evaluator: eval.NewEvaluator(api.Cfg, log.New("ngalert.eval"), api.DatasourceCache, api.SecretsService),
|
|
||||||
}), m)
|
}), m)
|
||||||
api.RegisterConfigurationApiEndpoints(NewForkedConfiguration(
|
api.RegisterConfigurationApiEndpoints(NewForkedConfiguration(
|
||||||
&AdminSrv{
|
&AdminSrv{
|
||||||
|
@ -11,7 +11,6 @@ import (
|
|||||||
"github.com/grafana/grafana-plugin-sdk-go/data"
|
"github.com/grafana/grafana-plugin-sdk-go/data"
|
||||||
|
|
||||||
"github.com/grafana/grafana/pkg/api/response"
|
"github.com/grafana/grafana/pkg/api/response"
|
||||||
"github.com/grafana/grafana/pkg/expr"
|
|
||||||
"github.com/grafana/grafana/pkg/infra/log"
|
"github.com/grafana/grafana/pkg/infra/log"
|
||||||
"github.com/grafana/grafana/pkg/models"
|
"github.com/grafana/grafana/pkg/models"
|
||||||
"github.com/grafana/grafana/pkg/services/accesscontrol"
|
"github.com/grafana/grafana/pkg/services/accesscontrol"
|
||||||
@ -24,11 +23,10 @@ import (
|
|||||||
|
|
||||||
type TestingApiSrv struct {
|
type TestingApiSrv struct {
|
||||||
*AlertingProxy
|
*AlertingProxy
|
||||||
ExpressionService *expr.Service
|
DatasourceCache datasources.CacheService
|
||||||
DatasourceCache datasources.CacheService
|
log log.Logger
|
||||||
log log.Logger
|
accessControl accesscontrol.AccessControl
|
||||||
accessControl accesscontrol.AccessControl
|
evaluator eval.Evaluator
|
||||||
evaluator eval.Evaluator
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (srv TestingApiSrv) RouteTestGrafanaRuleConfig(c *models.ReqContext, body apimodels.TestRulePayload) response.Response {
|
func (srv TestingApiSrv) RouteTestGrafanaRuleConfig(c *models.ReqContext, body apimodels.TestRulePayload) response.Response {
|
||||||
@ -57,7 +55,7 @@ func (srv TestingApiSrv) RouteTestGrafanaRuleConfig(c *models.ReqContext, body a
|
|||||||
now = timeNow()
|
now = timeNow()
|
||||||
}
|
}
|
||||||
|
|
||||||
evalResults, err := srv.evaluator.ConditionEval(&evalCond, now, srv.ExpressionService)
|
evalResults, err := srv.evaluator.ConditionEval(&evalCond, now)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return ErrResp(http.StatusBadRequest, err, "Failed to evaluate conditions")
|
return ErrResp(http.StatusBadRequest, err, "Failed to evaluate conditions")
|
||||||
}
|
}
|
||||||
@ -123,7 +121,7 @@ func (srv TestingApiSrv) RouteEvalQueries(c *models.ReqContext, cmd apimodels.Ev
|
|||||||
return ErrResp(http.StatusBadRequest, err, "invalid queries or expressions")
|
return ErrResp(http.StatusBadRequest, err, "invalid queries or expressions")
|
||||||
}
|
}
|
||||||
|
|
||||||
evalResults, err := srv.evaluator.QueriesAndExpressionsEval(c.SignedInUser.OrgId, cmd.Data, now, srv.ExpressionService)
|
evalResults, err := srv.evaluator.QueriesAndExpressionsEval(c.SignedInUser.OrgId, cmd.Data, now)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return ErrResp(http.StatusBadRequest, err, "Failed to evaluate queries and expressions")
|
return ErrResp(http.StatusBadRequest, err, "Failed to evaluate queries and expressions")
|
||||||
}
|
}
|
||||||
|
@ -69,7 +69,7 @@ func TestRouteTestGrafanaRuleConfig(t *testing.T) {
|
|||||||
|
|
||||||
evaluator := &eval.FakeEvaluator{}
|
evaluator := &eval.FakeEvaluator{}
|
||||||
var result []eval.Result
|
var result []eval.Result
|
||||||
evaluator.EXPECT().ConditionEval(mock.Anything, mock.Anything, mock.Anything).Return(result, nil)
|
evaluator.EXPECT().ConditionEval(mock.Anything, mock.Anything).Return(result, nil)
|
||||||
|
|
||||||
srv := createTestingApiSrv(ds, ac, evaluator)
|
srv := createTestingApiSrv(ds, ac, evaluator)
|
||||||
|
|
||||||
@ -109,7 +109,7 @@ func TestRouteTestGrafanaRuleConfig(t *testing.T) {
|
|||||||
|
|
||||||
evaluator := &eval.FakeEvaluator{}
|
evaluator := &eval.FakeEvaluator{}
|
||||||
var result []eval.Result
|
var result []eval.Result
|
||||||
evaluator.EXPECT().ConditionEval(mock.Anything, mock.Anything, mock.Anything).Return(result, nil)
|
evaluator.EXPECT().ConditionEval(mock.Anything, mock.Anything).Return(result, nil)
|
||||||
|
|
||||||
srv := createTestingApiSrv(ds, ac, evaluator)
|
srv := createTestingApiSrv(ds, ac, evaluator)
|
||||||
|
|
||||||
@ -197,7 +197,7 @@ func TestRouteEvalQueries(t *testing.T) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
evaluator.EXPECT().QueriesAndExpressionsEval(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(result, nil)
|
evaluator.EXPECT().QueriesAndExpressionsEval(mock.Anything, mock.Anything, mock.Anything).Return(result, nil)
|
||||||
|
|
||||||
srv := createTestingApiSrv(ds, ac, evaluator)
|
srv := createTestingApiSrv(ds, ac, evaluator)
|
||||||
|
|
||||||
@ -240,7 +240,7 @@ func TestRouteEvalQueries(t *testing.T) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
evaluator.EXPECT().QueriesAndExpressionsEval(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(result, nil)
|
evaluator.EXPECT().QueriesAndExpressionsEval(mock.Anything, mock.Anything, mock.Anything).Return(result, nil)
|
||||||
|
|
||||||
srv := createTestingApiSrv(ds, ac, evaluator)
|
srv := createTestingApiSrv(ds, ac, evaluator)
|
||||||
|
|
||||||
|
@ -28,28 +28,31 @@ import (
|
|||||||
//go:generate mockery --name Evaluator --structname FakeEvaluator --inpackage --filename evaluator_mock.go --with-expecter
|
//go:generate mockery --name Evaluator --structname FakeEvaluator --inpackage --filename evaluator_mock.go --with-expecter
|
||||||
type Evaluator interface {
|
type Evaluator interface {
|
||||||
// ConditionEval executes conditions and evaluates the result.
|
// ConditionEval executes conditions and evaluates the result.
|
||||||
ConditionEval(condition *models.Condition, now time.Time, expressionService *expr.Service) (Results, error)
|
ConditionEval(condition *models.Condition, now time.Time) (Results, error)
|
||||||
// QueriesAndExpressionsEval executes queries and expressions and returns the result.
|
// QueriesAndExpressionsEval executes queries and expressions and returns the result.
|
||||||
QueriesAndExpressionsEval(orgID int64, data []models.AlertQuery, now time.Time, expressionService *expr.Service) (*backend.QueryDataResponse, error)
|
QueriesAndExpressionsEval(orgID int64, data []models.AlertQuery, now time.Time) (*backend.QueryDataResponse, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
type evaluatorImpl struct {
|
type evaluatorImpl struct {
|
||||||
cfg *setting.Cfg
|
cfg *setting.Cfg
|
||||||
log log.Logger
|
log log.Logger
|
||||||
dataSourceCache datasources.CacheService
|
dataSourceCache datasources.CacheService
|
||||||
secretsService secrets.Service
|
secretsService secrets.Service
|
||||||
|
expressionService *expr.Service
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewEvaluator(
|
func NewEvaluator(
|
||||||
cfg *setting.Cfg,
|
cfg *setting.Cfg,
|
||||||
log log.Logger,
|
log log.Logger,
|
||||||
datasourceCache datasources.CacheService,
|
datasourceCache datasources.CacheService,
|
||||||
secretsService secrets.Service) Evaluator {
|
secretsService secrets.Service,
|
||||||
|
expressionService *expr.Service) Evaluator {
|
||||||
return &evaluatorImpl{
|
return &evaluatorImpl{
|
||||||
cfg: cfg,
|
cfg: cfg,
|
||||||
log: log,
|
log: log,
|
||||||
dataSourceCache: datasourceCache,
|
dataSourceCache: datasourceCache,
|
||||||
secretsService: secretsService,
|
secretsService: secretsService,
|
||||||
|
expressionService: expressionService,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -588,26 +591,26 @@ func (evalResults Results) AsDataFrame() data.Frame {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ConditionEval executes conditions and evaluates the result.
|
// ConditionEval executes conditions and evaluates the result.
|
||||||
func (e *evaluatorImpl) ConditionEval(condition *models.Condition, now time.Time, expressionService *expr.Service) (Results, error) {
|
func (e *evaluatorImpl) ConditionEval(condition *models.Condition, now time.Time) (Results, error) {
|
||||||
alertCtx, cancelFn := context.WithTimeout(context.Background(), e.cfg.UnifiedAlerting.EvaluationTimeout)
|
alertCtx, cancelFn := context.WithTimeout(context.Background(), e.cfg.UnifiedAlerting.EvaluationTimeout)
|
||||||
defer cancelFn()
|
defer cancelFn()
|
||||||
|
|
||||||
alertExecCtx := AlertExecCtx{OrgID: condition.OrgID, Ctx: alertCtx, ExpressionsEnabled: e.cfg.ExpressionsEnabled, Log: e.log}
|
alertExecCtx := AlertExecCtx{OrgID: condition.OrgID, Ctx: alertCtx, ExpressionsEnabled: e.cfg.ExpressionsEnabled, Log: e.log}
|
||||||
|
|
||||||
execResult := executeCondition(alertExecCtx, condition, now, expressionService, e.dataSourceCache, e.secretsService)
|
execResult := executeCondition(alertExecCtx, condition, now, e.expressionService, e.dataSourceCache, e.secretsService)
|
||||||
|
|
||||||
evalResults := evaluateExecutionResult(execResult, now)
|
evalResults := evaluateExecutionResult(execResult, now)
|
||||||
return evalResults, nil
|
return evalResults, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// QueriesAndExpressionsEval executes queries and expressions and returns the result.
|
// QueriesAndExpressionsEval executes queries and expressions and returns the result.
|
||||||
func (e *evaluatorImpl) QueriesAndExpressionsEval(orgID int64, data []models.AlertQuery, now time.Time, expressionService *expr.Service) (*backend.QueryDataResponse, error) {
|
func (e *evaluatorImpl) QueriesAndExpressionsEval(orgID int64, data []models.AlertQuery, now time.Time) (*backend.QueryDataResponse, error) {
|
||||||
alertCtx, cancelFn := context.WithTimeout(context.Background(), e.cfg.UnifiedAlerting.EvaluationTimeout)
|
alertCtx, cancelFn := context.WithTimeout(context.Background(), e.cfg.UnifiedAlerting.EvaluationTimeout)
|
||||||
defer cancelFn()
|
defer cancelFn()
|
||||||
|
|
||||||
alertExecCtx := AlertExecCtx{OrgID: orgID, Ctx: alertCtx, ExpressionsEnabled: e.cfg.ExpressionsEnabled, Log: e.log}
|
alertExecCtx := AlertExecCtx{OrgID: orgID, Ctx: alertCtx, ExpressionsEnabled: e.cfg.ExpressionsEnabled, Log: e.log}
|
||||||
|
|
||||||
execResult, err := executeQueriesAndExpressions(alertExecCtx, data, now, expressionService, e.dataSourceCache, e.secretsService)
|
execResult, err := executeQueriesAndExpressions(alertExecCtx, data, now, e.expressionService, e.dataSourceCache, e.secretsService)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("failed to execute conditions: %w", err)
|
return nil, fmt.Errorf("failed to execute conditions: %w", err)
|
||||||
}
|
}
|
||||||
|
@ -4,8 +4,6 @@ package eval
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
backend "github.com/grafana/grafana-plugin-sdk-go/backend"
|
backend "github.com/grafana/grafana-plugin-sdk-go/backend"
|
||||||
expr "github.com/grafana/grafana/pkg/expr"
|
|
||||||
|
|
||||||
mock "github.com/stretchr/testify/mock"
|
mock "github.com/stretchr/testify/mock"
|
||||||
|
|
||||||
models "github.com/grafana/grafana/pkg/services/ngalert/models"
|
models "github.com/grafana/grafana/pkg/services/ngalert/models"
|
||||||
@ -26,13 +24,13 @@ func (_m *FakeEvaluator) EXPECT() *FakeEvaluator_Expecter {
|
|||||||
return &FakeEvaluator_Expecter{mock: &_m.Mock}
|
return &FakeEvaluator_Expecter{mock: &_m.Mock}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ConditionEval provides a mock function with given fields: condition, now, expressionService
|
// ConditionEval provides a mock function with given fields: condition, now
|
||||||
func (_m *FakeEvaluator) ConditionEval(condition *models.Condition, now time.Time, expressionService *expr.Service) (Results, error) {
|
func (_m *FakeEvaluator) ConditionEval(condition *models.Condition, now time.Time) (Results, error) {
|
||||||
ret := _m.Called(condition, now, expressionService)
|
ret := _m.Called(condition, now)
|
||||||
|
|
||||||
var r0 Results
|
var r0 Results
|
||||||
if rf, ok := ret.Get(0).(func(*models.Condition, time.Time, *expr.Service) Results); ok {
|
if rf, ok := ret.Get(0).(func(*models.Condition, time.Time) Results); ok {
|
||||||
r0 = rf(condition, now, expressionService)
|
r0 = rf(condition, now)
|
||||||
} else {
|
} else {
|
||||||
if ret.Get(0) != nil {
|
if ret.Get(0) != nil {
|
||||||
r0 = ret.Get(0).(Results)
|
r0 = ret.Get(0).(Results)
|
||||||
@ -40,8 +38,8 @@ func (_m *FakeEvaluator) ConditionEval(condition *models.Condition, now time.Tim
|
|||||||
}
|
}
|
||||||
|
|
||||||
var r1 error
|
var r1 error
|
||||||
if rf, ok := ret.Get(1).(func(*models.Condition, time.Time, *expr.Service) error); ok {
|
if rf, ok := ret.Get(1).(func(*models.Condition, time.Time) error); ok {
|
||||||
r1 = rf(condition, now, expressionService)
|
r1 = rf(condition, now)
|
||||||
} else {
|
} else {
|
||||||
r1 = ret.Error(1)
|
r1 = ret.Error(1)
|
||||||
}
|
}
|
||||||
@ -57,14 +55,13 @@ type FakeEvaluator_ConditionEval_Call struct {
|
|||||||
// ConditionEval is a helper method to define mock.On call
|
// ConditionEval is a helper method to define mock.On call
|
||||||
// - condition *models.Condition
|
// - condition *models.Condition
|
||||||
// - now time.Time
|
// - now time.Time
|
||||||
// - expressionService *expr.Service
|
func (_e *FakeEvaluator_Expecter) ConditionEval(condition interface{}, now interface{}) *FakeEvaluator_ConditionEval_Call {
|
||||||
func (_e *FakeEvaluator_Expecter) ConditionEval(condition interface{}, now interface{}, expressionService interface{}) *FakeEvaluator_ConditionEval_Call {
|
return &FakeEvaluator_ConditionEval_Call{Call: _e.mock.On("ConditionEval", condition, now)}
|
||||||
return &FakeEvaluator_ConditionEval_Call{Call: _e.mock.On("ConditionEval", condition, now, expressionService)}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *FakeEvaluator_ConditionEval_Call) Run(run func(condition *models.Condition, now time.Time, expressionService *expr.Service)) *FakeEvaluator_ConditionEval_Call {
|
func (_c *FakeEvaluator_ConditionEval_Call) Run(run func(condition *models.Condition, now time.Time)) *FakeEvaluator_ConditionEval_Call {
|
||||||
_c.Call.Run(func(args mock.Arguments) {
|
_c.Call.Run(func(args mock.Arguments) {
|
||||||
run(args[0].(*models.Condition), args[1].(time.Time), args[2].(*expr.Service))
|
run(args[0].(*models.Condition), args[1].(time.Time))
|
||||||
})
|
})
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
@ -74,13 +71,13 @@ func (_c *FakeEvaluator_ConditionEval_Call) Return(_a0 Results, _a1 error) *Fake
|
|||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
|
||||||
// QueriesAndExpressionsEval provides a mock function with given fields: orgID, data, now, expressionService
|
// QueriesAndExpressionsEval provides a mock function with given fields: orgID, data, now
|
||||||
func (_m *FakeEvaluator) QueriesAndExpressionsEval(orgID int64, data []models.AlertQuery, now time.Time, expressionService *expr.Service) (*backend.QueryDataResponse, error) {
|
func (_m *FakeEvaluator) QueriesAndExpressionsEval(orgID int64, data []models.AlertQuery, now time.Time) (*backend.QueryDataResponse, error) {
|
||||||
ret := _m.Called(orgID, data, now, expressionService)
|
ret := _m.Called(orgID, data, now)
|
||||||
|
|
||||||
var r0 *backend.QueryDataResponse
|
var r0 *backend.QueryDataResponse
|
||||||
if rf, ok := ret.Get(0).(func(int64, []models.AlertQuery, time.Time, *expr.Service) *backend.QueryDataResponse); ok {
|
if rf, ok := ret.Get(0).(func(int64, []models.AlertQuery, time.Time) *backend.QueryDataResponse); ok {
|
||||||
r0 = rf(orgID, data, now, expressionService)
|
r0 = rf(orgID, data, now)
|
||||||
} else {
|
} else {
|
||||||
if ret.Get(0) != nil {
|
if ret.Get(0) != nil {
|
||||||
r0 = ret.Get(0).(*backend.QueryDataResponse)
|
r0 = ret.Get(0).(*backend.QueryDataResponse)
|
||||||
@ -88,8 +85,8 @@ func (_m *FakeEvaluator) QueriesAndExpressionsEval(orgID int64, data []models.Al
|
|||||||
}
|
}
|
||||||
|
|
||||||
var r1 error
|
var r1 error
|
||||||
if rf, ok := ret.Get(1).(func(int64, []models.AlertQuery, time.Time, *expr.Service) error); ok {
|
if rf, ok := ret.Get(1).(func(int64, []models.AlertQuery, time.Time) error); ok {
|
||||||
r1 = rf(orgID, data, now, expressionService)
|
r1 = rf(orgID, data, now)
|
||||||
} else {
|
} else {
|
||||||
r1 = ret.Error(1)
|
r1 = ret.Error(1)
|
||||||
}
|
}
|
||||||
@ -106,14 +103,13 @@ type FakeEvaluator_QueriesAndExpressionsEval_Call struct {
|
|||||||
// - orgID int64
|
// - orgID int64
|
||||||
// - data []models.AlertQuery
|
// - data []models.AlertQuery
|
||||||
// - now time.Time
|
// - now time.Time
|
||||||
// - expressionService *expr.Service
|
func (_e *FakeEvaluator_Expecter) QueriesAndExpressionsEval(orgID interface{}, data interface{}, now interface{}) *FakeEvaluator_QueriesAndExpressionsEval_Call {
|
||||||
func (_e *FakeEvaluator_Expecter) QueriesAndExpressionsEval(orgID interface{}, data interface{}, now interface{}, expressionService interface{}) *FakeEvaluator_QueriesAndExpressionsEval_Call {
|
return &FakeEvaluator_QueriesAndExpressionsEval_Call{Call: _e.mock.On("QueriesAndExpressionsEval", orgID, data, now)}
|
||||||
return &FakeEvaluator_QueriesAndExpressionsEval_Call{Call: _e.mock.On("QueriesAndExpressionsEval", orgID, data, now, expressionService)}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_c *FakeEvaluator_QueriesAndExpressionsEval_Call) Run(run func(orgID int64, data []models.AlertQuery, now time.Time, expressionService *expr.Service)) *FakeEvaluator_QueriesAndExpressionsEval_Call {
|
func (_c *FakeEvaluator_QueriesAndExpressionsEval_Call) Run(run func(orgID int64, data []models.AlertQuery, now time.Time)) *FakeEvaluator_QueriesAndExpressionsEval_Call {
|
||||||
_c.Call.Run(func(args mock.Arguments) {
|
_c.Call.Run(func(args mock.Arguments) {
|
||||||
run(args[0].(int64), args[1].([]models.AlertQuery), args[2].(time.Time), args[3].(*expr.Service))
|
run(args[0].(int64), args[1].([]models.AlertQuery), args[2].(time.Time))
|
||||||
})
|
})
|
||||||
return _c
|
return _c
|
||||||
}
|
}
|
||||||
|
@ -133,7 +133,7 @@ func (ng *AlertNG) init() error {
|
|||||||
BaseInterval: ng.Cfg.UnifiedAlerting.BaseInterval,
|
BaseInterval: ng.Cfg.UnifiedAlerting.BaseInterval,
|
||||||
Logger: ng.Log,
|
Logger: ng.Log,
|
||||||
MaxAttempts: ng.Cfg.UnifiedAlerting.MaxAttempts,
|
MaxAttempts: ng.Cfg.UnifiedAlerting.MaxAttempts,
|
||||||
Evaluator: eval.NewEvaluator(ng.Cfg, ng.Log, ng.DataSourceCache, ng.SecretsService),
|
Evaluator: eval.NewEvaluator(ng.Cfg, ng.Log, ng.DataSourceCache, ng.SecretsService, ng.ExpressionService),
|
||||||
InstanceStore: store,
|
InstanceStore: store,
|
||||||
RuleStore: store,
|
RuleStore: store,
|
||||||
AdminConfigStore: store,
|
AdminConfigStore: store,
|
||||||
@ -152,7 +152,7 @@ func (ng *AlertNG) init() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
stateManager := state.NewManager(ng.Log, ng.Metrics.GetStateMetrics(), appUrl, store, store, ng.dashboardService, ng.imageService, clock.New())
|
stateManager := state.NewManager(ng.Log, ng.Metrics.GetStateMetrics(), appUrl, store, store, ng.dashboardService, ng.imageService, clock.New())
|
||||||
scheduler := schedule.NewScheduler(schedCfg, ng.ExpressionService, appUrl, stateManager, ng.bus)
|
scheduler := schedule.NewScheduler(schedCfg, appUrl, stateManager, ng.bus)
|
||||||
|
|
||||||
ng.stateManager = stateManager
|
ng.stateManager = stateManager
|
||||||
ng.schedule = scheduler
|
ng.schedule = scheduler
|
||||||
|
@ -10,7 +10,6 @@ import (
|
|||||||
|
|
||||||
"github.com/grafana/grafana/pkg/bus"
|
"github.com/grafana/grafana/pkg/bus"
|
||||||
"github.com/grafana/grafana/pkg/events"
|
"github.com/grafana/grafana/pkg/events"
|
||||||
"github.com/grafana/grafana/pkg/expr"
|
|
||||||
"github.com/grafana/grafana/pkg/infra/log"
|
"github.com/grafana/grafana/pkg/infra/log"
|
||||||
"github.com/grafana/grafana/pkg/models"
|
"github.com/grafana/grafana/pkg/models"
|
||||||
"github.com/grafana/grafana/pkg/services/alerting"
|
"github.com/grafana/grafana/pkg/services/alerting"
|
||||||
@ -83,11 +82,10 @@ type schedule struct {
|
|||||||
|
|
||||||
evaluator eval.Evaluator
|
evaluator eval.Evaluator
|
||||||
|
|
||||||
ruleStore store.RuleStore
|
ruleStore store.RuleStore
|
||||||
instanceStore store.InstanceStore
|
instanceStore store.InstanceStore
|
||||||
adminConfigStore store.AdminConfigurationStore
|
adminConfigStore store.AdminConfigurationStore
|
||||||
orgStore store.OrgStore
|
orgStore store.OrgStore
|
||||||
expressionService *expr.Service
|
|
||||||
|
|
||||||
stateManager *state.Manager
|
stateManager *state.Manager
|
||||||
|
|
||||||
@ -136,7 +134,7 @@ type SchedulerCfg struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// NewScheduler returns a new schedule.
|
// NewScheduler returns a new schedule.
|
||||||
func NewScheduler(cfg SchedulerCfg, expressionService *expr.Service, appURL *url.URL, stateManager *state.Manager, bus bus.Bus) *schedule {
|
func NewScheduler(cfg SchedulerCfg, appURL *url.URL, stateManager *state.Manager, bus bus.Bus) *schedule {
|
||||||
ticker := alerting.NewTicker(cfg.C, cfg.BaseInterval, cfg.Metrics.Ticker)
|
ticker := alerting.NewTicker(cfg.C, cfg.BaseInterval, cfg.Metrics.Ticker)
|
||||||
|
|
||||||
sch := schedule{
|
sch := schedule{
|
||||||
@ -152,7 +150,6 @@ func NewScheduler(cfg SchedulerCfg, expressionService *expr.Service, appURL *url
|
|||||||
ruleStore: cfg.RuleStore,
|
ruleStore: cfg.RuleStore,
|
||||||
instanceStore: cfg.InstanceStore,
|
instanceStore: cfg.InstanceStore,
|
||||||
orgStore: cfg.OrgStore,
|
orgStore: cfg.OrgStore,
|
||||||
expressionService: expressionService,
|
|
||||||
adminConfigStore: cfg.AdminConfigStore,
|
adminConfigStore: cfg.AdminConfigStore,
|
||||||
multiOrgNotifier: cfg.MultiOrgNotifier,
|
multiOrgNotifier: cfg.MultiOrgNotifier,
|
||||||
metrics: cfg.Metrics,
|
metrics: cfg.Metrics,
|
||||||
@ -628,7 +625,7 @@ func (sch *schedule) ruleRoutine(grafanaCtx context.Context, key ngmodels.AlertR
|
|||||||
OrgID: r.OrgID,
|
OrgID: r.OrgID,
|
||||||
Data: r.Data,
|
Data: r.Data,
|
||||||
}
|
}
|
||||||
results, err := sch.evaluator.ConditionEval(&condition, e.scheduledAt, sch.expressionService)
|
results, err := sch.evaluator.ConditionEval(&condition, e.scheduledAt)
|
||||||
dur := sch.clock.Now().Sub(start)
|
dur := sch.clock.Now().Sub(start)
|
||||||
evalTotal.Inc()
|
evalTotal.Inc()
|
||||||
evalDuration.Observe(dur.Seconds())
|
evalDuration.Observe(dur.Seconds())
|
||||||
|
@ -165,7 +165,7 @@ func TestAlertingTicker(t *testing.T) {
|
|||||||
Scheme: "http",
|
Scheme: "http",
|
||||||
Host: "localhost",
|
Host: "localhost",
|
||||||
}
|
}
|
||||||
sched := schedule.NewScheduler(schedCfg, nil, appUrl, st, busmock.New())
|
sched := schedule.NewScheduler(schedCfg, appUrl, st, busmock.New())
|
||||||
|
|
||||||
go func() {
|
go func() {
|
||||||
err := sched.Run(ctx)
|
err := sched.Run(ctx)
|
||||||
|
@ -949,7 +949,7 @@ func setupScheduler(t *testing.T, rs store.RuleStore, is store.InstanceStore, ac
|
|||||||
C: mockedClock,
|
C: mockedClock,
|
||||||
BaseInterval: time.Second,
|
BaseInterval: time.Second,
|
||||||
MaxAttempts: 1,
|
MaxAttempts: 1,
|
||||||
Evaluator: eval.NewEvaluator(&setting.Cfg{ExpressionsEnabled: true}, logger, nil, secretsService),
|
Evaluator: eval.NewEvaluator(&setting.Cfg{ExpressionsEnabled: true}, logger, nil, secretsService, expr.ProvideService(&setting.Cfg{ExpressionsEnabled: true}, nil, nil)),
|
||||||
RuleStore: rs,
|
RuleStore: rs,
|
||||||
InstanceStore: is,
|
InstanceStore: is,
|
||||||
AdminConfigStore: acs,
|
AdminConfigStore: acs,
|
||||||
@ -963,7 +963,7 @@ func setupScheduler(t *testing.T, rs store.RuleStore, is store.InstanceStore, ac
|
|||||||
Scheme: "http",
|
Scheme: "http",
|
||||||
Host: "localhost",
|
Host: "localhost",
|
||||||
}
|
}
|
||||||
return NewScheduler(schedCfg, expr.ProvideService(&setting.Cfg{ExpressionsEnabled: true}, nil, nil), appUrl, st, busmock.New()), mockedClock
|
return NewScheduler(schedCfg, appUrl, st, busmock.New()), mockedClock
|
||||||
}
|
}
|
||||||
|
|
||||||
// createTestAlertRule creates a dummy alert definition to be used by the tests.
|
// createTestAlertRule creates a dummy alert definition to be used by the tests.
|
||||||
|
Loading…
Reference in New Issue
Block a user