From 00dddca26ae42ad0671c223a36616dc30cdb0dfb Mon Sep 17 00:00:00 2001 From: bergquist Date: Tue, 21 Feb 2017 14:47:02 +0100 Subject: [PATCH] alerting: dedupe alert notifications when running multiple servers alert notifications will only be sent if the database value is updated. ref #6957 --- pkg/models/alert.go | 1 + pkg/services/alerting/result_handler.go | 6 ++++++ pkg/services/sqlstore/alert.go | 4 ++++ 3 files changed, 11 insertions(+) diff --git a/pkg/models/alert.go b/pkg/models/alert.go index 61976677764..fa3f4b466a8 100644 --- a/pkg/models/alert.go +++ b/pkg/models/alert.go @@ -35,6 +35,7 @@ const ( var ( ErrCannotChangeStateOnPausedAlert error = fmt.Errorf("Cannot change state on pause alert") + ErrRequiresNewState error = fmt.Errorf("update alert state requires a new state.") ) func (s AlertStateType) IsValid() bool { diff --git a/pkg/services/alerting/result_handler.go b/pkg/services/alerting/result_handler.go index 80e6ba5bf51..1298a5dda36 100644 --- a/pkg/services/alerting/result_handler.go +++ b/pkg/services/alerting/result_handler.go @@ -61,6 +61,12 @@ func (handler *DefaultResultHandler) Handle(evalContext *EvalContext) error { handler.log.Error("Cannot change state on alert thats pause", "error", err) return err } + + if err == m.ErrRequiresNewState { + handler.log.Info("Alert already updated") + return nil + } + handler.log.Error("Failed to save state", "error", err) } diff --git a/pkg/services/sqlstore/alert.go b/pkg/services/sqlstore/alert.go index 66f3b5b7250..4bf4cb5d0e9 100644 --- a/pkg/services/sqlstore/alert.go +++ b/pkg/services/sqlstore/alert.go @@ -240,6 +240,10 @@ func SetAlertState(cmd *m.SetAlertStateCommand) error { return m.ErrCannotChangeStateOnPausedAlert } + if alert.State == cmd.State { + return m.ErrRequiresNewState + } + alert.State = cmd.State alert.StateChanges += 1 alert.NewStateDate = time.Now()