Skip to content

Commit 2b4a995

Browse files
committed
feat(alerting): progress on alerting UI and model, refactoring of dashboard parser and tests into extractor component, moved tests from sqlstore to alerting package
1 parent 1fa9ae8 commit 2b4a995

File tree

13 files changed

+441
-270
lines changed

13 files changed

+441
-270
lines changed

pkg/api/dashboard.go

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -151,15 +151,13 @@ func PostDashboard(c *middleware.Context, cmd m.SaveDashboardCommand) {
151151
}
152152

153153
if setting.AlertingEnabled {
154-
saveAlertCommand := m.SaveAlertsCommand{
155-
DashboardId: cmd.Result.Id,
156-
OrgId: c.OrgId,
157-
UserId: c.UserId,
158-
Alerts: alerting.ParseAlertsFromDashboard(&cmd),
154+
alertCmd := alerting.UpdateDashboardAlertsCommand{
155+
OrgId: c.OrgId,
156+
UserId: c.UserId,
157+
Dashboard: cmd.Result,
159158
}
160159

161-
err = bus.Dispatch(&saveAlertCommand)
162-
if err != nil {
160+
if err := bus.Dispatch(&alertCmd); err != nil {
163161
c.JsonApiErr(500, "Failed to save alerts", err)
164162
return
165163
}

pkg/models/alerts.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,18 @@ type AlertRuleModel struct {
1414
Name string
1515
Description string
1616
State string
17+
Scheduler int64
18+
Enabled bool
19+
Frequency int
1720

1821
Created time.Time
1922
Updated time.Time
2023

2124
Expression *simplejson.Json
2225
}
2326

27+
type AlertRules []*AlertRuleModel
28+
2429
func (this AlertRuleModel) TableName() string {
2530
return "alert_rule"
2631
}
@@ -83,7 +88,7 @@ type SaveAlertsCommand struct {
8388
UserId int64
8489
OrgId int64
8590

86-
Alerts []*AlertRuleModel
91+
Alerts AlertRules
8792
}
8893

8994
type DeleteAlertCommand struct {

pkg/services/alerting/alert_rule.go

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
package alerting
2+
3+
import (
4+
"fmt"
5+
6+
"github.com/grafana/grafana/pkg/components/simplejson"
7+
8+
m "github.com/grafana/grafana/pkg/models"
9+
)
10+
11+
type AlertRule struct {
12+
Id int64
13+
OrgId int64
14+
DashboardId int64
15+
PanelId int64
16+
Frequency int64
17+
Name string
18+
Description string
19+
State string
20+
Warning Level
21+
Critical Level
22+
Query AlertQuery
23+
Transform string
24+
TransformParams simplejson.Json
25+
Transformer Transformer
26+
}
27+
28+
func NewAlertRuleFromDBModel(ruleDef *m.AlertRuleModel) (*AlertRule, error) {
29+
model := &AlertRule{}
30+
model.Id = ruleDef.Id
31+
model.OrgId = ruleDef.OrgId
32+
model.Name = ruleDef.Name
33+
model.Description = ruleDef.Description
34+
model.State = ruleDef.State
35+
36+
critical := ruleDef.Expression.Get("critical")
37+
model.Critical = Level{
38+
Operator: critical.Get("op").MustString(),
39+
Level: critical.Get("level").MustFloat64(),
40+
}
41+
42+
warning := ruleDef.Expression.Get("warning")
43+
model.Warning = Level{
44+
Operator: warning.Get("op").MustString(),
45+
Level: warning.Get("level").MustFloat64(),
46+
}
47+
48+
model.Frequency = ruleDef.Expression.Get("frequency").MustInt64()
49+
model.Transform = ruleDef.Expression.Get("transform").Get("type").MustString()
50+
model.TransformParams = *ruleDef.Expression.Get("transform")
51+
52+
if model.Transform == "aggregation" {
53+
model.Transformer = &AggregationTransformer{
54+
Method: ruleDef.Expression.Get("transform").Get("method").MustString(),
55+
}
56+
}
57+
58+
query := ruleDef.Expression.Get("query")
59+
model.Query = AlertQuery{
60+
Query: query.Get("query").MustString(),
61+
DatasourceId: query.Get("datasourceId").MustInt64(),
62+
From: query.Get("from").MustString(),
63+
To: query.Get("to").MustString(),
64+
Aggregator: query.Get("agg").MustString(),
65+
}
66+
67+
if model.Query.Query == "" {
68+
return nil, fmt.Errorf("missing query.query")
69+
}
70+
71+
if model.Query.DatasourceId == 0 {
72+
return nil, fmt.Errorf("missing query.datasourceId")
73+
}
74+
75+
return model, nil
76+
}

pkg/services/alerting/commands.go

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
package alerting
2+
3+
import (
4+
"fmt"
5+
6+
"github.com/grafana/grafana/pkg/bus"
7+
m "github.com/grafana/grafana/pkg/models"
8+
)
9+
10+
type UpdateDashboardAlertsCommand struct {
11+
UserId int64
12+
OrgId int64
13+
Dashboard *m.Dashboard
14+
}
15+
16+
func init() {
17+
bus.AddHandler("alerting", updateDashboardAlerts)
18+
}
19+
20+
func updateDashboardAlerts(cmd *UpdateDashboardAlertsCommand) error {
21+
saveRulesCmd := m.SaveAlertsCommand{
22+
OrgId: cmd.OrgId,
23+
UserId: cmd.UserId,
24+
}
25+
26+
extractor := NewAlertRuleExtractor(cmd.Dashboard, cmd.OrgId)
27+
28+
rules, err := extractor.GetRuleModels()
29+
if err != nil {
30+
return err
31+
}
32+
33+
saveRulesCmd.Alerts = rules
34+
if bus.Dispatch(&saveRulesCmd); err != nil {
35+
return err
36+
}
37+
38+
return nil
39+
}
40+
41+
func ConvetAlertModelToAlertRule(ruleDef *m.AlertRuleModel) (*AlertRule, error) {
42+
model := &AlertRule{}
43+
model.Id = ruleDef.Id
44+
model.OrgId = ruleDef.OrgId
45+
model.Name = ruleDef.Name
46+
model.Description = ruleDef.Description
47+
model.State = ruleDef.State
48+
49+
critical := ruleDef.Expression.Get("critical")
50+
model.Critical = Level{
51+
Operator: critical.Get("op").MustString(),
52+
Level: critical.Get("level").MustFloat64(),
53+
}
54+
55+
warning := ruleDef.Expression.Get("warning")
56+
model.Warning = Level{
57+
Operator: warning.Get("op").MustString(),
58+
Level: warning.Get("level").MustFloat64(),
59+
}
60+
61+
model.Frequency = ruleDef.Expression.Get("frequency").MustInt64()
62+
model.Transform = ruleDef.Expression.Get("transform").Get("type").MustString()
63+
model.TransformParams = *ruleDef.Expression.Get("transform")
64+
65+
if model.Transform == "aggregation" {
66+
model.Transformer = &AggregationTransformer{
67+
Method: ruleDef.Expression.Get("transform").Get("method").MustString(),
68+
}
69+
}
70+
71+
query := ruleDef.Expression.Get("query")
72+
model.Query = AlertQuery{
73+
Query: query.Get("query").MustString(),
74+
DatasourceId: query.Get("datasourceId").MustInt64(),
75+
From: query.Get("from").MustString(),
76+
To: query.Get("to").MustString(),
77+
Aggregator: query.Get("agg").MustString(),
78+
}
79+
80+
if model.Query.Query == "" {
81+
return nil, fmt.Errorf("missing query.query")
82+
}
83+
84+
if model.Query.DatasourceId == 0 {
85+
return nil, fmt.Errorf("missing query.datasourceId")
86+
}
87+
88+
return model, nil
89+
}

pkg/services/alerting/dashboard_parser.go

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

0 commit comments

Comments
 (0)