Skip to content

Commit 9135abf

Browse files
authored
Merge pull request grafana#6996 from bergquist/pause_all_alerts
Pause all alerts
2 parents 164de5e + 6c2c3c7 commit 9135abf

File tree

8 files changed

+126
-36
lines changed

8 files changed

+126
-36
lines changed

pkg/api/alerting.go

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -259,10 +259,11 @@ func NotificationTest(c *middleware.Context, dto dtos.NotificationTestCommand) R
259259

260260
//POST /api/alerts/:alertId/pause
261261
func PauseAlert(c *middleware.Context, dto dtos.PauseAlertCommand) Response {
262+
alertId := c.ParamsInt64("alertId")
262263
cmd := models.PauseAlertCommand{
263-
OrgId: c.OrgId,
264-
AlertId: c.ParamsInt64("alertId"),
265-
Paused: dto.Paused,
264+
OrgId: c.OrgId,
265+
AlertIds: []int64{alertId},
266+
Paused: dto.Paused,
266267
}
267268

268269
if err := bus.Dispatch(&cmd); err != nil {
@@ -277,10 +278,36 @@ func PauseAlert(c *middleware.Context, dto dtos.PauseAlertCommand) Response {
277278
}
278279

279280
result := map[string]interface{}{
280-
"alertId": cmd.AlertId,
281+
"alertId": alertId,
281282
"state": response,
282283
"message": "alert " + pausedState,
283284
}
284285

285286
return Json(200, result)
286287
}
288+
289+
//POST /api/admin/pause-all-alerts
290+
func PauseAllAlerts(c *middleware.Context, dto dtos.PauseAllAlertsCommand) Response {
291+
updateCmd := models.PauseAllAlertCommand{
292+
Paused: dto.Paused,
293+
}
294+
295+
if err := bus.Dispatch(&updateCmd); err != nil {
296+
return ApiError(500, "Failed to pause alerts", err)
297+
}
298+
299+
var response models.AlertStateType = models.AlertStatePending
300+
pausedState := "un paused"
301+
if updateCmd.Paused {
302+
response = models.AlertStatePaused
303+
pausedState = "paused"
304+
}
305+
306+
result := map[string]interface{}{
307+
"state": response,
308+
"message": "alert " + pausedState,
309+
"alertsAffected": updateCmd.ResultCount,
310+
}
311+
312+
return Json(200, result)
313+
}

pkg/api/api.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -289,6 +289,7 @@ func Register(r *macaron.Macaron) {
289289
r.Get("/users/:id/quotas", wrap(GetUserQuotas))
290290
r.Put("/users/:id/quotas/:target", bind(m.UpdateUserQuotaCmd{}), wrap(UpdateUserQuota))
291291
r.Get("/stats", AdminGetStats)
292+
r.Post("/pause-all-alerts", bind(dtos.PauseAllAlertsCommand{}), wrap(PauseAllAlerts))
292293
}, reqGrafanaAdmin)
293294

294295
// rendering

pkg/api/dtos/alerting.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,3 +64,7 @@ type PauseAlertCommand struct {
6464
AlertId int64 `json:"alertId"`
6565
Paused bool `json:"paused"`
6666
}
67+
68+
type PauseAllAlertsCommand struct {
69+
Paused bool `json:"paused"`
70+
}

pkg/models/alert.go

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ package models
33
import (
44
"time"
55

6+
"fmt"
7+
68
"github.com/grafana/grafana/pkg/components/simplejson"
79
)
810

@@ -31,6 +33,10 @@ const (
3133
ExecutionErrorKeepState ExecutionErrorOption = "keep_state"
3234
)
3335

36+
var (
37+
ErrCannotChangeStateOnPausedAlert error = fmt.Errorf("Cannot change state on pause alert")
38+
)
39+
3440
func (s AlertStateType) IsValid() bool {
3541
return s == AlertStateOK || s == AlertStateNoData || s == AlertStatePaused || s == AlertStatePending
3642
}
@@ -132,9 +138,15 @@ type SaveAlertsCommand struct {
132138
}
133139

134140
type PauseAlertCommand struct {
135-
OrgId int64
136-
AlertId int64
137-
Paused bool
141+
OrgId int64
142+
AlertIds []int64
143+
ResultCount int64
144+
Paused bool
145+
}
146+
147+
type PauseAllAlertCommand struct {
148+
ResultCount int64
149+
Paused bool
138150
}
139151

140152
type SetAlertStateCommand struct {

pkg/services/alerting/result_handler.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,10 @@ func (handler *DefaultResultHandler) Handle(evalContext *EvalContext) error {
8686
}
8787

8888
if err := bus.Dispatch(cmd); err != nil {
89+
if err == m.ErrCannotChangeStateOnPausedAlert {
90+
handler.log.Error("Cannot change state on alert thats pause", "error", err)
91+
return err
92+
}
8993
handler.log.Error("Failed to save state", "error", err)
9094
}
9195

pkg/services/sqlstore/alert.go

Lines changed: 40 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package sqlstore
33
import (
44
"bytes"
55
"fmt"
6+
"strings"
67
"time"
78

89
"github.com/go-xorm/xorm"
@@ -18,7 +19,8 @@ func init() {
1819
bus.AddHandler("sql", GetAllAlertQueryHandler)
1920
bus.AddHandler("sql", SetAlertState)
2021
bus.AddHandler("sql", GetAlertStatesForDashboard)
21-
bus.AddHandler("sql", PauseAlertRule)
22+
bus.AddHandler("sql", PauseAlert)
23+
bus.AddHandler("sql", PauseAllAlerts)
2224
}
2325

2426
func GetAlertById(query *m.GetAlertByIdQuery) error {
@@ -228,6 +230,10 @@ func SetAlertState(cmd *m.SetAlertStateCommand) error {
228230
return fmt.Errorf("Could not find alert")
229231
}
230232

233+
if alert.State == m.AlertStatePaused {
234+
return m.ErrCannotChangeStateOnPausedAlert
235+
}
236+
231237
alert.State = cmd.State
232238
alert.StateChanges += 1
233239
alert.NewStateDate = time.Now()
@@ -244,27 +250,50 @@ func SetAlertState(cmd *m.SetAlertStateCommand) error {
244250
})
245251
}
246252

247-
func PauseAlertRule(cmd *m.PauseAlertCommand) error {
253+
func PauseAlert(cmd *m.PauseAlertCommand) error {
248254
return inTransaction(func(sess *xorm.Session) error {
249-
alert := m.Alert{}
255+
if len(cmd.AlertIds) == 0 {
256+
return fmt.Errorf("command contains no alertids")
257+
}
258+
259+
var buffer bytes.Buffer
260+
params := make([]interface{}, 0)
250261

251-
has, err := x.Where("id = ? AND org_id=?", cmd.AlertId, cmd.OrgId).Get(&alert)
262+
buffer.WriteString(`UPDATE alert SET state = ?`)
263+
if cmd.Paused {
264+
params = append(params, string(m.AlertStatePaused))
265+
} else {
266+
params = append(params, string(m.AlertStatePending))
267+
}
268+
269+
buffer.WriteString(` WHERE id IN (?` + strings.Repeat(",?", len(cmd.AlertIds)-1) + `)`)
270+
for _, v := range cmd.AlertIds {
271+
params = append(params, v)
272+
}
252273

274+
res, err := sess.Exec(buffer.String(), params...)
253275
if err != nil {
254276
return err
255-
} else if !has {
256-
return fmt.Errorf("Could not find alert")
257277
}
278+
cmd.ResultCount, _ = res.RowsAffected()
279+
return nil
280+
})
281+
}
258282

259-
var newState m.AlertStateType
283+
func PauseAllAlerts(cmd *m.PauseAllAlertCommand) error {
284+
return inTransaction(func(sess *xorm.Session) error {
285+
var newState string
260286
if cmd.Paused {
261-
newState = m.AlertStatePaused
287+
newState = string(m.AlertStatePaused)
262288
} else {
263-
newState = m.AlertStatePending
289+
newState = string(m.AlertStatePending)
264290
}
265-
alert.State = newState
266291

267-
sess.Id(alert.Id).Update(&alert)
292+
res, err := sess.Exec(`UPDATE alert SET state = ?`, newState)
293+
if err != nil {
294+
return err
295+
}
296+
cmd.ResultCount, _ = res.RowsAffected()
268297
return nil
269298
})
270299
}

pkg/services/sqlstore/alert_heartbeat_test.go

Lines changed: 0 additions & 18 deletions
This file was deleted.

pkg/services/sqlstore/alert_test.go

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,37 @@ func TestAlertingDataAccess(t *testing.T) {
3939
So(err, ShouldBeNil)
4040
})
4141

42+
Convey("Can set new states", func() {
43+
Convey("new state ok", func() {
44+
cmd := &m.SetAlertStateCommand{
45+
AlertId: 1,
46+
State: m.AlertStateOK,
47+
}
48+
49+
err = SetAlertState(cmd)
50+
So(err, ShouldBeNil)
51+
})
52+
53+
Convey("can pause alert", func() {
54+
cmd := &m.PauseAllAlertCommand{
55+
Paused: true,
56+
}
57+
58+
err = PauseAllAlerts(cmd)
59+
So(err, ShouldBeNil)
60+
61+
Convey("cannot updated paused alert", func() {
62+
cmd := &m.SetAlertStateCommand{
63+
AlertId: 1,
64+
State: m.AlertStateOK,
65+
}
66+
67+
err = SetAlertState(cmd)
68+
So(err, ShouldNotBeNil)
69+
})
70+
})
71+
})
72+
4273
Convey("Can read properties", func() {
4374
alertQuery := m.GetAlertsQuery{DashboardId: testDash.Id, PanelId: 1, OrgId: 1}
4475
err2 := HandleAlertsQuery(&alertQuery)

0 commit comments

Comments
 (0)