diff --git a/pkg/api/alerting.go b/pkg/api/alerting.go index 63757041f5d..8a4ee443e98 100644 --- a/pkg/api/alerting.go +++ b/pkg/api/alerting.go @@ -47,6 +47,7 @@ func GetAlertChanges(c *middleware.Context) Response { func GetAlerts(c *middleware.Context) Response { query := models.GetAlertsQuery{ OrgId: c.OrgId, + State: c.QueryStrings("state"), } if err := bus.Dispatch(&query); err != nil { @@ -78,8 +79,10 @@ func GetAlerts(c *middleware.Context) Response { DashboardIds: dashboardIds, } - if err := bus.Dispatch(&dashboardsQuery); err != nil { - return ApiError(500, "List alerts failed", err) + if len(alertDTOs) > 0 { + if err := bus.Dispatch(&dashboardsQuery); err != nil { + return ApiError(500, "List alerts failed", err) + } } //TODO: should be possible to speed this up with lookup table @@ -128,7 +131,7 @@ func DelAlert(c *middleware.Context) Response { func GetAlertStates(c *middleware.Context) Response { alertId := c.ParamsInt64(":alertId") - query := models.GetAlertsStateCommand{ + query := models.GetAlertsStateQuery{ AlertId: alertId, } diff --git a/pkg/models/alerts.go b/pkg/models/alerts.go index be143ae850c..82edfdbefeb 100644 --- a/pkg/models/alerts.go +++ b/pkg/models/alerts.go @@ -96,6 +96,7 @@ type DeleteAlertCommand struct { //Queries type GetAlertsQuery struct { OrgId int64 + State []string Result []AlertRule } diff --git a/pkg/models/alerts_state.go b/pkg/models/alerts_state.go index dfd3ac376e3..6aea3e94db4 100644 --- a/pkg/models/alerts_state.go +++ b/pkg/models/alerts_state.go @@ -38,7 +38,7 @@ type UpdateAlertStateCommand struct { // Queries -type GetAlertsStateCommand struct { +type GetAlertsStateQuery struct { OrgId int64 `json:"orgId" binding:"Required"` AlertId int64 `json:"alertId" binding:"Required"` diff --git a/pkg/services/sqlstore/alert_rule.go b/pkg/services/sqlstore/alert_rule.go index f34319f35bc..00bb2aa9964 100644 --- a/pkg/services/sqlstore/alert_rule.go +++ b/pkg/services/sqlstore/alert_rule.go @@ -1,15 +1,17 @@ package sqlstore import ( + "bytes" "fmt" "github.com/go-xorm/xorm" "github.com/grafana/grafana/pkg/bus" m "github.com/grafana/grafana/pkg/models" + "strings" ) func init() { bus.AddHandler("sql", SaveAlerts) - bus.AddHandler("sql", GetAllAlertsForOrg) + bus.AddHandler("sql", HandleAlertsQuery) bus.AddHandler("sql", GetAlertById) bus.AddHandler("sql", GetAlertsByDashboardId) bus.AddHandler("sql", GetAlertsByDashboardAndPanelId) @@ -41,9 +43,33 @@ func DeleteAlertById(cmd *m.DeleteAlertCommand) error { }) } -func GetAllAlertsForOrg(query *m.GetAlertsQuery) error { +func HandleAlertsQuery(query *m.GetAlertsQuery) error { + var sql bytes.Buffer + params := make([]interface{}, 0) + + sql.WriteString(`SELECT * + from alert_rule + `) + + sql.WriteString(`WHERE org_id = ?`) + params = append(params, query.OrgId) + + if len(query.State) > 0 { + + sql.WriteString(` AND (`) + for i, v := range query.State { + if i > 0 { + sql.WriteString(" OR ") + } + sql.WriteString("state = ? ") + params = append(params, strings.ToUpper(v)) + } + sql.WriteString(")") + + } + alerts := make([]m.AlertRule, 0) - if err := x.Where("org_id = ?", query.OrgId).Find(&alerts); err != nil { + if err := x.Sql(sql.String(), params...).Find(&alerts); err != nil { return err } @@ -127,6 +153,7 @@ func upsertAlerts(alerts []m.AlertRule, posted *[]m.AlertRule, sess *xorm.Sessio } } else { + alert.State = "OK" _, err := sess.Insert(&alert) if err != nil { return err diff --git a/pkg/services/sqlstore/alert_rule_test.go b/pkg/services/sqlstore/alert_rule_test.go index 895fb79e1e4..480b9f42326 100644 --- a/pkg/services/sqlstore/alert_rule_test.go +++ b/pkg/services/sqlstore/alert_rule_test.go @@ -30,7 +30,6 @@ func TestAlertingDataAccess(t *testing.T) { Description: "Alerting description", QueryRange: "5m", Aggregator: "avg", - State: "OK", }, } diff --git a/pkg/services/sqlstore/alert_state.go b/pkg/services/sqlstore/alert_state.go index 768033c145b..1cb28148446 100644 --- a/pkg/services/sqlstore/alert_state.go +++ b/pkg/services/sqlstore/alert_state.go @@ -47,7 +47,7 @@ func SetNewAlertState(cmd *m.UpdateAlertStateCommand) error { }) } -func GetAlertStateLogByAlertId(cmd *m.GetAlertsStateCommand) error { +func GetAlertStateLogByAlertId(cmd *m.GetAlertsStateQuery) error { alertLogs := make([]m.AlertState, 0) if err := x.Where("alert_id = ?", cmd.AlertId).Desc("created").Find(&alertLogs); err != nil { diff --git a/pkg/services/sqlstore/alert_state_test.go b/pkg/services/sqlstore/alert_state_test.go index 3d723380be8..1768125e875 100644 --- a/pkg/services/sqlstore/alert_state_test.go +++ b/pkg/services/sqlstore/alert_state_test.go @@ -82,7 +82,7 @@ func TestAlertingStateAccess(t *testing.T) { }) Convey("should have two event state logs", func() { - query := &m.GetAlertsStateCommand{ + query := &m.GetAlertsStateQuery{ AlertId: 1, OrgId: 1, } @@ -92,6 +92,17 @@ func TestAlertingStateAccess(t *testing.T) { So(len(*query.Result), ShouldEqual, 2) }) + + Convey("should not get any alerts with critical state", func() { + query := &m.GetAlertsQuery{ + OrgId: 1, + State: []string{"Critical"}, + } + + err := HandleAlertsQuery(query) + So(err, ShouldBeNil) + So(len(query.Result), ShouldEqual, 0) + }) }) }) }) diff --git a/public/app/features/alerts/alerts_ctrl.ts b/public/app/features/alerts/alerts_ctrl.ts index 255b9efc31e..e07a074433a 100644 --- a/public/app/features/alerts/alerts_ctrl.ts +++ b/public/app/features/alerts/alerts_ctrl.ts @@ -9,6 +9,8 @@ import alertDef from './alert_def'; export class AlertPageCtrl { alerts: any; + stateFilters = [ 'Ok', 'Warn', 'Critical', 'Acknowledged' ]; + stateFilter = 'Warn'; /** @ngInject */ constructor(private backendSrv) { @@ -16,7 +18,11 @@ export class AlertPageCtrl { } loadAlerts() { - this.backendSrv.get('/api/alerts/rules').then(result => { + var params = { + state: this.stateFilter + }; + + this.backendSrv.get('/api/alerts/rules', params).then(result => { this.alerts = _.map(result, alert => { alert.iconCss = alertDef.getCssForState(alert.state); return alert; diff --git a/public/app/features/alerts/partials/alerts_page.html b/public/app/features/alerts/partials/alerts_page.html index f1cdbdb45d6..f4962746a55 100644 --- a/public/app/features/alerts/partials/alerts_page.html +++ b/public/app/features/alerts/partials/alerts_page.html @@ -3,34 +3,37 @@
+

Alerts

+
+ +
+
- - - - - - - - + +
NameState
+ + + + + + + + - + - + - -
NameState
- {{alert.title}} - - + {{alert.title}} + + - - - + + + - - edit - -
+ + edit + +