func (this *EmailNotifier) Notify(context *alerting.EvalContext) { this.log.Info("Sending alert notification to", "addresses", this.Addresses) metrics.M_Alerting_Notification_Sent_Email.Inc(1) ruleUrl, err := context.GetRuleUrl() if err != nil { this.log.Error("Failed get rule link", "error", err) return } cmd := &m.SendEmailCommand{ Data: map[string]interface{}{ "Title": context.GetNotificationTitle(), "State": context.Rule.State, "Name": context.Rule.Name, "StateModel": context.GetStateModel(), "Message": context.Rule.Message, "RuleUrl": ruleUrl, "ImageLink": context.ImagePublicUrl, "AlertPageUrl": setting.AppUrl + "alerting", "EvalMatches": context.EvalMatches, }, To: this.Addresses, Template: "alert_notification.html", } if err := bus.Dispatch(cmd); err != nil { this.log.Error("Failed to send alert notification email", "error", err) } }
func (this *EmailNotifier) Notify(evalContext *alerting.EvalContext) error { this.log.Info("Sending alert notification to", "addresses", this.Addresses) metrics.M_Alerting_Notification_Sent_Email.Inc(1) ruleUrl, err := evalContext.GetRuleUrl() if err != nil { this.log.Error("Failed get rule link", "error", err) return err } cmd := &m.SendEmailCommandSync{ SendEmailCommand: m.SendEmailCommand{ Subject: evalContext.GetNotificationTitle(), Data: map[string]interface{}{ "Title": evalContext.GetNotificationTitle(), "State": evalContext.Rule.State, "Name": evalContext.Rule.Name, "StateModel": evalContext.GetStateModel(), "Message": evalContext.Rule.Message, "RuleUrl": ruleUrl, "ImageLink": "", "EmbededImage": "", "AlertPageUrl": setting.AppUrl + "alerting", "EvalMatches": evalContext.EvalMatches, }, To: this.Addresses, Template: "alert_notification.html", EmbededFiles: []string{}, }, } if evalContext.ImagePublicUrl != "" { cmd.Data["ImageLink"] = evalContext.ImagePublicUrl } else { file, err := os.Stat(evalContext.ImageOnDiskPath) if err == nil { cmd.EmbededFiles = []string{evalContext.ImageOnDiskPath} cmd.Data["EmbededImage"] = file.Name() } } err = bus.DispatchCtx(evalContext.Ctx, cmd) if err != nil { this.log.Error("Failed to send alert notification email", "error", err) return err } return nil }
func (this *SlackNotifier) Notify(evalContext *alerting.EvalContext) error { this.log.Info("Executing slack notification", "ruleId", evalContext.Rule.Id, "notification", this.Name) metrics.M_Alerting_Notification_Sent_Slack.Inc(1) ruleUrl, err := evalContext.GetRuleUrl() if err != nil { this.log.Error("Failed get rule link", "error", err) return err } fields := make([]map[string]interface{}, 0) fieldLimitCount := 4 for index, evt := range evalContext.EvalMatches { fields = append(fields, map[string]interface{}{ "title": evt.Metric, "value": evt.Value, "short": true, }) if index > fieldLimitCount { break } } if evalContext.Error != nil { fields = append(fields, map[string]interface{}{ "title": "Error message", "value": evalContext.Error.Error(), "short": false, }) } message := "" if evalContext.Rule.State != m.AlertStateOK { //dont add message when going back to alert state ok. message = evalContext.Rule.Message } body := map[string]interface{}{ "attachments": []map[string]interface{}{ { "color": evalContext.GetStateModel().Color, "title": evalContext.GetNotificationTitle(), "title_link": ruleUrl, "text": message, "fields": fields, "image_url": evalContext.ImagePublicUrl, "footer": "Grafana v" + setting.BuildVersion, "footer_icon": "http://grafana.org/assets/img/fav32.png", "ts": time.Now().Unix(), }, }, } data, _ := json.Marshal(&body) cmd := &m.SendWebhookSync{Url: this.Url, Body: string(data)} if err := bus.DispatchCtx(evalContext.Ctx, cmd); err != nil { this.log.Error("Failed to send slack notification", "error", err, "webhook", this.Name) } return nil }
func (this *SlackNotifier) Notify(context *alerting.EvalContext) { this.log.Info("Executing slack notification", "ruleId", context.Rule.Id, "notification", this.Name) metrics.M_Alerting_Notification_Sent_Slack.Inc(1) ruleUrl, err := context.GetRuleUrl() if err != nil { this.log.Error("Failed get rule link", "error", err) return } fields := make([]map[string]interface{}, 0) fieldLimitCount := 4 for index, evt := range context.EvalMatches { fields = append(fields, map[string]interface{}{ "title": evt.Metric, "value": evt.Value, "short": true, }) if index > fieldLimitCount { break } } if context.Error != nil { fields = append(fields, map[string]interface{}{ "title": "Error message", "value": context.Error.Error(), "short": false, }) } message := "" if context.Rule.State != m.AlertStateOK { //dont add message when going back to alert state ok. message = context.Rule.Message } body := map[string]interface{}{ "attachments": []map[string]interface{}{ { "color": context.GetStateModel().Color, "title": context.GetNotificationTitle(), "title_link": ruleUrl, "text": message, "fields": fields, "image_url": context.ImagePublicUrl, "footer": "Grafana v" + setting.BuildVersion, "footer_icon": "http://grafana.org/assets/img/fav32.png", "ts": time.Now().Unix(), //"pretext": "Optional text that appears above the attachment block", // "author_name": "Bobby Tables", // "author_link": "http://flickr.com/bobby/", // "author_icon": "http://flickr.com/icons/bobby.jpg", // "thumb_url": "http://example.com/path/to/thumb.png", }, }, } data, _ := json.Marshal(&body) cmd := &m.SendWebhook{Url: this.Url, Body: string(data)} if err := bus.Dispatch(cmd); err != nil { this.log.Error("Failed to send slack notification", "error", err, "webhook", this.Name) } }