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 @@
-
-
- Name |
- State |
- |
-
-
-
+
+
+ edit
+
+ |
+
+