diff --git a/pkg/services/ngalert/api/api.go b/pkg/services/ngalert/api/api.go index dc71170843e..838c91e3c91 100644 --- a/pkg/services/ngalert/api/api.go +++ b/pkg/services/ngalert/api/api.go @@ -62,7 +62,7 @@ func (api *API) RegisterAPIEndpoints() { // conditionEvalEndpoint handles POST /api/alert-definitions/eval. func (api *API) conditionEvalEndpoint(c *models.ReqContext, cmd ngmodels.EvalAlertConditionCommand) response.Response { - evalCond := eval.Condition{ + evalCond := ngmodels.Condition{ RefID: cmd.Condition, OrgID: c.SignedInUser.OrgId, QueriesAndExpressions: cmd.Data, @@ -165,7 +165,7 @@ func (api *API) updateAlertDefinitionEndpoint(c *models.ReqContext, cmd ngmodels cmd.UID = c.Params(":alertDefinitionUID") cmd.OrgID = c.SignedInUser.OrgId - evalCond := eval.Condition{ + evalCond := ngmodels.Condition{ RefID: cmd.Condition, OrgID: c.SignedInUser.OrgId, QueriesAndExpressions: cmd.Data, @@ -185,7 +185,7 @@ func (api *API) updateAlertDefinitionEndpoint(c *models.ReqContext, cmd ngmodels func (api *API) createAlertDefinitionEndpoint(c *models.ReqContext, cmd ngmodels.SaveAlertDefinitionCommand) response.Response { cmd.OrgID = c.SignedInUser.OrgId - evalCond := eval.Condition{ + evalCond := ngmodels.Condition{ RefID: cmd.Condition, OrgID: c.SignedInUser.OrgId, QueriesAndExpressions: cmd.Data, @@ -253,7 +253,7 @@ func (api *API) alertDefinitionUnpauseEndpoint(c *models.ReqContext, cmd ngmodel } // LoadAlertCondition returns a Condition object for the given alertDefinitionID. -func (api *API) LoadAlertCondition(alertDefinitionUID string, orgID int64) (*eval.Condition, error) { +func (api *API) LoadAlertCondition(alertDefinitionUID string, orgID int64) (*ngmodels.Condition, error) { q := ngmodels.GetAlertDefinitionByUIDQuery{UID: alertDefinitionUID, OrgID: orgID} if err := api.Store.GetAlertDefinitionByUID(&q); err != nil { return nil, err @@ -265,14 +265,14 @@ func (api *API) LoadAlertCondition(alertDefinitionUID string, orgID int64) (*eva return nil, err } - return &eval.Condition{ + return &ngmodels.Condition{ RefID: alertDefinition.Condition, OrgID: alertDefinition.OrgID, QueriesAndExpressions: alertDefinition.Data, }, nil } -func (api *API) validateCondition(c eval.Condition, user *models.SignedInUser, skipCache bool) error { +func (api *API) validateCondition(c ngmodels.Condition, user *models.SignedInUser, skipCache bool) error { var refID string if len(c.QueriesAndExpressions) == 0 { diff --git a/pkg/services/ngalert/eval/eval.go b/pkg/services/ngalert/eval/eval.go index 72d2b46b022..bfd7d995f7a 100644 --- a/pkg/services/ngalert/eval/eval.go +++ b/pkg/services/ngalert/eval/eval.go @@ -42,15 +42,6 @@ func (e *invalidEvalResultFormatError) Unwrap() error { return e.err } -// Condition contains backend expressions and queries and the RefID -// of the query or expression that will be evaluated. -type Condition struct { - RefID string `json:"refId"` - OrgID int64 `json:"-"` - - QueriesAndExpressions []models.AlertQuery `json:"queriesAndExpressions"` -} - // ExecutionResults contains the unevaluated results from executing // a condition. type ExecutionResults struct { @@ -88,12 +79,6 @@ func (s state) String() string { return [...]string{"Normal", "Alerting"}[s] } -// IsValid checks the condition's validity. -func (c Condition) IsValid() bool { - // TODO search for refIDs in QueriesAndExpressions - return len(c.QueriesAndExpressions) != 0 -} - // AlertExecCtx is the context provided for executing an alert condition. type AlertExecCtx struct { OrgID int64 @@ -103,7 +88,7 @@ type AlertExecCtx struct { } // execute runs the Condition's expressions or queries. -func (c *Condition) execute(ctx AlertExecCtx, now time.Time, dataService *tsdb.Service) (*ExecutionResults, error) { +func execute(ctx AlertExecCtx, c *models.Condition, now time.Time, dataService *tsdb.Service) (*ExecutionResults, error) { result := ExecutionResults{} if !c.IsValid() { return nil, fmt.Errorf("invalid conditions") @@ -224,13 +209,13 @@ func (evalResults Results) AsDataFrame() data.Frame { } // ConditionEval executes conditions and evaluates the result. -func (e *Evaluator) ConditionEval(condition *Condition, now time.Time, dataService *tsdb.Service) (Results, error) { +func (e *Evaluator) ConditionEval(condition *models.Condition, now time.Time, dataService *tsdb.Service) (Results, error) { alertCtx, cancelFn := context.WithTimeout(context.Background(), alertingEvaluationTimeout) defer cancelFn() alertExecCtx := AlertExecCtx{OrgID: condition.OrgID, Ctx: alertCtx, ExpressionsEnabled: e.Cfg.ExpressionsEnabled} - execResult, err := condition.execute(alertExecCtx, now, dataService) + execResult, err := execute(alertExecCtx, condition, now, dataService) if err != nil { return nil, fmt.Errorf("failed to execute conditions: %w", err) } diff --git a/pkg/services/ngalert/schedule/schedule.go b/pkg/services/ngalert/schedule/schedule.go index bc4624aedfd..f20fe89fbc7 100644 --- a/pkg/services/ngalert/schedule/schedule.go +++ b/pkg/services/ngalert/schedule/schedule.go @@ -63,7 +63,7 @@ func (sch *schedule) definitionRoutine(grafanaCtx context.Context, key models.Al sch.log.Debug("new alert definition version fetched", "title", alertDefinition.Title, "key", key, "version", alertDefinition.Version) } - condition := eval.Condition{ + condition := models.Condition{ RefID: alertDefinition.Condition, OrgID: alertDefinition.OrgID, QueriesAndExpressions: alertDefinition.Data,