Commit 597103a1 by Torkel Ödegaard

Merge branch 'alerting' of github.com:grafana/grafana into alerting

parents 06210a4a 1dcae464
......@@ -47,7 +47,7 @@ func GetAlerts(c *middleware.Context) Response {
DashboardId: alert.DashboardId,
PanelId: alert.PanelId,
Name: alert.Name,
Description: alert.Description,
Message: alert.Message,
State: alert.State,
Severity: alert.Severity,
})
......
......@@ -12,7 +12,7 @@ type AlertRule struct {
DashboardId int64 `json:"dashboardId"`
PanelId int64 `json:"panelId"`
Name string `json:"name"`
Description string `json:"description"`
Message string `json:"message"`
State m.AlertStateType `json:"state"`
Severity m.AlertSeverityType `json:"severity"`
......
......@@ -19,7 +19,7 @@ func TestGraphitePublisher(t *testing.T) {
So(err, ShouldBeNil)
sec, err := setting.Cfg.NewSection("metrics.graphite")
sec.NewKey("prefix", "service.grafana.%(instance_name)s")
sec.NewKey("prefix", "service.grafana.%(instance_name)s.")
sec.NewKey("address", "localhost:2003")
So(err, ShouldBeNil)
......@@ -30,7 +30,7 @@ func TestGraphitePublisher(t *testing.T) {
So(err, ShouldBeNil)
So(publisher, ShouldNotBeNil)
So(publisher.prefix, ShouldEqual, "service.grafana.hostname_with_dots_com")
So(publisher.prefix, ShouldEqual, "service.grafana.hostname_with_dots_com.")
})
Convey("Test graphite publisher default values", t, func() {
......@@ -49,7 +49,7 @@ func TestGraphitePublisher(t *testing.T) {
So(err, ShouldBeNil)
So(publisher, ShouldNotBeNil)
So(publisher.prefix, ShouldEqual, "service.grafana.hostname_with_dots_com")
So(publisher.prefix, ShouldEqual, "service.grafana.hostname_with_dots_com.")
So(publisher.address, ShouldEqual, "localhost:2003")
})
}
......@@ -80,9 +80,9 @@ func initMetricVars(settings *MetricSettings) {
M_Alerting_Result_Info = RegCounter("alerting.result", "severity", "info")
M_Alerting_Result_Ok = RegCounter("alerting.result", "severity", "ok")
M_Alerting_Active_Alerts = RegCounter("alerting.active_alerts")
M_Alerting_Notification_Sent_Slack = RegCounter("alerting.notifcations_sent", "type", "slack")
M_Alerting_Notification_Sent_Email = RegCounter("alerting.notifcations_sent", "type", "email")
M_Alerting_Notification_Sent_Webhook = RegCounter("alerting.notifcations_sent", "type", "webhook")
M_Alerting_Notification_Sent_Slack = RegCounter("alerting.notifications_sent", "type", "slack")
M_Alerting_Notification_Sent_Email = RegCounter("alerting.notifications_sent", "type", "email")
M_Alerting_Notification_Sent_Webhook = RegCounter("alerting.notifications_sent", "type", "webhook")
// Timers
M_DataSource_ProxyReq_Timer = RegTimer("api.dataproxy.request.all")
......
......@@ -36,7 +36,7 @@ type Alert struct {
DashboardId int64
PanelId int64
Name string
Description string
Message string
Severity AlertSeverityType
State AlertStateType
Handler int64
......@@ -63,7 +63,7 @@ func (alert *Alert) ShouldUpdateState(newState AlertStateType) bool {
func (this *Alert) ContainsUpdates(other *Alert) bool {
result := false
result = result || this.Name != other.Name
result = result || this.Description != other.Description
result = result || this.Message != other.Message
if this.Settings != nil && other.Settings != nil {
json1, err1 := this.Settings.Encode()
......
......@@ -14,15 +14,15 @@ func TestAlertingModelTest(t *testing.T) {
json2, _ := simplejson.NewJson([]byte(`{ "field": "value" }`))
rule1 := &Alert{
Settings: json1,
Name: "Namn",
Description: "Description",
Settings: json1,
Name: "Namn",
Message: "Message",
}
rule2 := &Alert{
Settings: json2,
Name: "Namn",
Description: "Description",
Settings: json2,
Name: "Namn",
Message: "Message",
}
Convey("Testing AlertRule equals", func() {
......
......@@ -88,7 +88,7 @@ func (e *DashAlertExtractor) GetAlerts() ([]*m.Alert, error) {
Name: jsonAlert.Get("name").MustString(),
Handler: jsonAlert.Get("handler").MustInt64(),
Enabled: jsonAlert.Get("enabled").MustBool(),
Description: jsonAlert.Get("description").MustString(),
Message: jsonAlert.Get("message").MustString(),
Severity: m.AlertSeverityType(jsonAlert.Get("severity").MustString()),
Frequency: getTimeDurationStringToSeconds(jsonAlert.Get("frequency").MustString()),
}
......
......@@ -40,7 +40,7 @@ func TestAlertRuleExtraction(t *testing.T) {
"datasource": null,
"alert": {
"name": "name1",
"description": "desc1",
"message": "desc1",
"handler": 1,
"enabled": true,
"frequency": "60s",
......@@ -65,7 +65,7 @@ func TestAlertRuleExtraction(t *testing.T) {
"datasource": "graphite2",
"alert": {
"name": "name2",
"description": "desc2",
"message": "desc2",
"handler": 0,
"enabled": true,
"frequency": "60s",
......@@ -121,7 +121,7 @@ func TestAlertRuleExtraction(t *testing.T) {
for _, v := range alerts {
So(v.DashboardId, ShouldEqual, 57)
So(v.Name, ShouldNotBeEmpty)
So(v.Description, ShouldNotBeEmpty)
So(v.Message, ShouldNotBeEmpty)
}
Convey("should extract handler property", func() {
......@@ -146,9 +146,9 @@ func TestAlertRuleExtraction(t *testing.T) {
Convey("should extract name and desc", func() {
So(alerts[0].Name, ShouldEqual, "name1")
So(alerts[0].Description, ShouldEqual, "desc1")
So(alerts[0].Message, ShouldEqual, "desc1")
So(alerts[1].Name, ShouldEqual, "name2")
So(alerts[1].Description, ShouldEqual, "desc2")
So(alerts[1].Message, ShouldEqual, "desc2")
})
Convey("should set datasourceId", func() {
......
......@@ -9,6 +9,7 @@ import (
"github.com/grafana/grafana/pkg/metrics"
m "github.com/grafana/grafana/pkg/models"
"github.com/grafana/grafana/pkg/services/alerting"
"github.com/grafana/grafana/pkg/setting"
)
func init() {
......@@ -70,11 +71,11 @@ func (this *SlackNotifier) Notify(context *alerting.EvalContext) {
// "author_icon": "http://flickr.com/icons/bobby.jpg",
"title": context.GetNotificationTitle(),
"title_link": ruleUrl,
// "text": "Optional text that appears within the attachment",
"fields": fields,
"image_url": context.ImagePublicUrl,
"text": context.Rule.Message,
"fields": fields,
"image_url": context.ImagePublicUrl,
// "thumb_url": "http://example.com/path/to/thumb.png",
"footer": "Grafana v4.0.0",
"footer": "Grafana v" + setting.BuildVersion,
"footer_icon": "http://grafana.org/assets/img/fav32.png",
"ts": time.Now().Unix(),
},
......
......@@ -17,7 +17,7 @@ type Rule struct {
PanelId int64
Frequency int64
Name string
Description string
Message string
State m.AlertStateType
Severity m.AlertSeverityType
Conditions []Condition
......@@ -63,7 +63,7 @@ func NewRuleFromDBAlert(ruleDef *m.Alert) (*Rule, error) {
model.DashboardId = ruleDef.DashboardId
model.PanelId = ruleDef.PanelId
model.Name = ruleDef.Name
model.Description = ruleDef.Description
model.Message = ruleDef.Message
model.Frequency = ruleDef.Frequency
model.Severity = ruleDef.Severity
model.State = ruleDef.State
......
......@@ -40,84 +40,5 @@ func TestNotifications(t *testing.T) {
So(sentMsg.Subject, ShouldEqual, "Reset your Grafana password - asd@asd.com")
So(sentMsg.Body, ShouldNotContainSubstring, "Subject")
})
Convey("Alert notifications", func() {
// Convey("When sending reset email password", func() {
// cmd := &m.SendEmailCommand{
// Data: map[string]interface{}{
// "Name": "Name",
// "State": "Critical",
// "Description": "Description",
// "DashboardLink": "http://localhost:3000/dashboard/db/alerting",
// "AlertPageUrl": "http://localhost:3000/alerting",
// "DashboardImage": "http://localhost:3000/render/dashboard-solo/db/alerting?from=1466169458375&to=1466171258375&panelId=1&width=1000&height=500",
// "TriggeredAlerts": []testTriggeredAlert{
// {Name: "desktop", State: "Critical", ActualValue: 13},
// {Name: "mobile", State: "Warn", ActualValue: 5},
// },
// },
// To: []string{"asd@asd.com "},
// Template: "alert_notification.html",
// }
//
// err := sendEmailCommandHandler(cmd)
// So(err, ShouldBeNil)
//
// So(sentMsg.Body, ShouldContainSubstring, "Alertstate: Critical")
// So(sentMsg.Body, ShouldContainSubstring, "http://localhost:3000/dashboard/db/alerting")
// So(sentMsg.Body, ShouldContainSubstring, "Critical")
// So(sentMsg.Body, ShouldContainSubstring, "Warn")
// So(sentMsg.Body, ShouldContainSubstring, "mobile")
// So(sentMsg.Body, ShouldContainSubstring, "desktop")
// So(sentMsg.Subject, ShouldContainSubstring, "Grafana Alert: [ Critical ] ")
// })
//
// Convey("given critical", func() {
// cmd := &m.SendEmailCommand{
// Data: map[string]interface{}{
// "Name": "Name",
// "State": "Warn",
// "Description": "Description",
// "DashboardLink": "http://localhost:3000/dashboard/db/alerting",
// "DashboardImage": "http://localhost:3000/render/dashboard-solo/db/alerting?from=1466169458375&to=1466171258375&panelId=1&width=1000&height=500",
// "AlertPageUrl": "http://localhost:3000/alerting",
// "TriggeredAlerts": []testTriggeredAlert{
// {Name: "desktop", State: "Critical", ActualValue: 13},
// {Name: "mobile", State: "Warn", ActualValue: 5},
// },
// },
// To: []string{"asd@asd.com "},
// Template: "alert_notification.html",
// }
//
// err := sendEmailCommandHandler(cmd)
// So(err, ShouldBeNil)
// So(sentMsg.Body, ShouldContainSubstring, "Alertstate: Warn")
// So(sentMsg.Body, ShouldContainSubstring, "http://localhost:3000/dashboard/db/alerting")
// So(sentMsg.Body, ShouldContainSubstring, "Critical")
// So(sentMsg.Body, ShouldContainSubstring, "Warn")
// So(sentMsg.Body, ShouldContainSubstring, "mobile")
// So(sentMsg.Body, ShouldContainSubstring, "desktop")
// So(sentMsg.Subject, ShouldContainSubstring, "Grafana Alert: [ Warn ]")
// })
//
// Convey("given ok", func() {
// cmd := &m.SendEmailCommand{
// Data: map[string]interface{}{
// "Name": "Name",
// "State": "Ok",
// "Description": "Description",
// "DashboardLink": "http://localhost:3000/dashboard/db/alerting",
// "AlertPageUrl": "http://localhost:3000/alerting",
// },
// To: []string{"asd@asd.com "},
// Template: "alert_notification.html",
// }
//
// err := sendEmailCommandHandler(cmd)
// So(err, ShouldBeNil)
// So(sentMsg.Subject, ShouldContainSubstring, "Grafana Alert: [ Ok ]")
// })
})
})
}
......@@ -20,7 +20,7 @@ func TestAlertingDataAccess(t *testing.T) {
DashboardId: testDash.Id,
OrgId: testDash.OrgId,
Name: "Alerting title",
Description: "Alerting description",
Message: "Alerting message",
Settings: simplejson.New(),
Frequency: 1,
},
......@@ -46,7 +46,7 @@ func TestAlertingDataAccess(t *testing.T) {
alert := alertQuery.Result[0]
So(err2, ShouldBeNil)
So(alert.Name, ShouldEqual, "Alerting title")
So(alert.Description, ShouldEqual, "Alerting description")
So(alert.Message, ShouldEqual, "Alerting message")
So(alert.State, ShouldEqual, "pending")
So(alert.Frequency, ShouldEqual, 1)
})
......@@ -146,7 +146,7 @@ func TestAlertingDataAccess(t *testing.T) {
PanelId: 1,
DashboardId: testDash.Id,
Name: "Alerting title",
Description: "Alerting description",
Message: "Alerting message",
},
}
......
......@@ -14,7 +14,7 @@ func addAlertMigrations(mg *Migrator) {
{Name: "panel_id", Type: DB_BigInt, Nullable: false},
{Name: "org_id", Type: DB_BigInt, Nullable: false},
{Name: "name", Type: DB_NVarchar, Length: 255, Nullable: false},
{Name: "description", Type: DB_Text, Nullable: false},
{Name: "message", Type: DB_Text, Nullable: false},
{Name: "state", Type: DB_NVarchar, Length: 255, Nullable: false},
{Name: "settings", Type: DB_Text, Nullable: false},
{Name: "frequency", Type: DB_BigInt, Nullable: false},
......
......@@ -111,7 +111,6 @@ export class AlertTabCtrl {
var defaultName = this.panel.title + ' alert';
alert.name = alert.name || defaultName;
alert.description = alert.description || defaultName;
this.conditionModels = _.reduce(alert.conditions, (memo, value) => {
memo.push(this.buildConditionModel(value));
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment