Browse Source

alerting: dedupe alert notifications when running multiple servers

alert notifications will only be sent if the database value
is updated.

ref #6957
bergquist 8 years ago
parent
commit
00dddca26a
3 changed files with 11 additions and 0 deletions
  1. 1 0
      pkg/models/alert.go
  2. 6 0
      pkg/services/alerting/result_handler.go
  3. 4 0
      pkg/services/sqlstore/alert.go

+ 1 - 0
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 {

+ 6 - 0
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)
 		}
 

+ 4 - 0
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()