diff --git a/pkg/services/alerting/alert_validator.go b/pkg/services/alerting/alert_validator.go index 4e0d186899e..d4ec0ca1446 100644 --- a/pkg/services/alerting/alert_validator.go +++ b/pkg/services/alerting/alert_validator.go @@ -10,6 +10,6 @@ const ( ) type alertValidator struct { - aFunc func(*models.Alert) (bool, string) + aFunc func(*models.Alert) error aSeverity validatorSeverity } diff --git a/pkg/services/alerting/extractor.go b/pkg/services/alerting/extractor.go index da7da37cb6e..b86ce73f4d5 100644 --- a/pkg/services/alerting/extractor.go +++ b/pkg/services/alerting/extractor.go @@ -197,8 +197,8 @@ func (e *DashAlertExtractor) getAlertFromPanels(jsonWithPanels *simplejson.Json, validationErrors := strings.Builder{} validationWarnings := strings.Builder{} for _, validator := range validators { - ok, reason := validator.aFunc(alert) - if ok { + err := validator.aFunc(alert) + if err == nil { continue } @@ -207,12 +207,12 @@ func (e *DashAlertExtractor) getAlertFromPanels(jsonWithPanels *simplejson.Json, if validationErrors.Len() > 0 { validationErrors.WriteString("\n") } - validationErrors.WriteString(reason) + validationErrors.WriteString(err.Error()) case alertWarning: if validationWarnings.Len() > 0 { validationErrors.WriteString("\n") } - validationWarnings.WriteString(reason) + validationWarnings.WriteString(err.Error()) } } if validationErrors.String() != "" { @@ -228,15 +228,14 @@ func (e *DashAlertExtractor) getAlertFromPanels(jsonWithPanels *simplejson.Json, return alerts, nil } -func validateAlertRule(alert *models.Alert) (ok bool, reason string) { - ok = alert.ValidToSave() - if !ok { - reason = fmt.Sprintf("Dashboard ID, Org ID or Panel ID is not correct, alertName=%v, panelId=%v, orgId=%v, dashboardId=%v", alert.Name, alert.PanelId, alert.OrgId, alert.DashboardId) +func validateAlertRule(alert *models.Alert) (err error) { + if !alert.ValidToSave() { + err = fmt.Errorf("Dashboard ID, Org ID or Panel ID is not correct, alertName=%v, panelId=%v, orgId=%v, dashboardId=%v", alert.Name, alert.PanelId, alert.OrgId, alert.DashboardId) } - return ok, reason + return err } -func validAlertJSON(alert *models.Alert) (ok bool, reason string) { +func validAlertJSON(alert *models.Alert) (err error) { warnings := strings.Builder{} for _, v := range alert.Settings.Get("notifications").MustArray() { jsonModel := simplejson.NewFromAny(v) @@ -249,14 +248,16 @@ func validAlertJSON(alert *models.Alert) (ok bool, reason string) { continue } - ok = false if warnings.Len() > 0 { warnings.WriteString("\n") } warnings.WriteString(fmt.Sprintf("Alert contains notification identified by incorrect ID, alertName=%v, panelId=%v, notificationId=%v", alert.Name, alert.PanelId, id)) } - reason = warnings.String() - return ok, reason + reason := warnings.String() + if reason != "" { + err = fmt.Errorf(reason) + } + return err } // GetAlerts extracts alerts from the dashboard json and does full validation on the alert json data. @@ -312,12 +313,12 @@ func (e *DashAlertExtractor) extractAlerts(validators ...alertValidator) ([]*mod // in the first validation pass. func (e *DashAlertExtractor) ValidateAlerts() error { _, err := e.extractAlerts(alertValidator{ - aFunc: func(alert *models.Alert) (ok bool, reason string) { - ok = alert.OrgId != 0 && alert.PanelId != 0 + aFunc: func(alert *models.Alert) (err error) { + ok := alert.OrgId != 0 && alert.PanelId != 0 if !ok { - reason = fmt.Sprintf("Org ID or Panel ID is not correct, alertName=%v, panelId=%v, orgId=%v", alert.Name, alert.PanelId, alert.OrgId) + err = fmt.Errorf("Org ID or Panel ID is not correct, alertName=%v, panelId=%v, orgId=%v", alert.Name, alert.PanelId, alert.OrgId) } - return ok, reason + return err }, aSeverity: alertError, })