func (this *TelegramNotifier) Notify(evalContext *alerting.EvalContext) error { this.log.Info("Sending alert notification to", "bot_token", this.BotToken) this.log.Info("Sending alert notification to", "chat_id", this.ChatID) metrics.M_Alerting_Notification_Sent_Telegram.Inc(1) bodyJSON := simplejson.New() bodyJSON.Set("chat_id", this.ChatID) bodyJSON.Set("parse_mode", "html") message := fmt.Sprintf("%s\nState: %s\nMessage: %s\n", evalContext.GetNotificationTitle(), evalContext.Rule.Name, evalContext.Rule.Message) ruleUrl, err := evalContext.GetRuleUrl() if err == nil { message = message + fmt.Sprintf("URL: %s\n", ruleUrl) } bodyJSON.Set("text", message) url := fmt.Sprintf(telegeramApiUrl, this.BotToken, "sendMessage") body, _ := bodyJSON.MarshalJSON() cmd := &m.SendWebhookSync{ Url: url, Body: string(body), HttpMethod: "POST", } if err := bus.DispatchCtx(evalContext.Ctx, cmd); err != nil { this.log.Error("Failed to send webhook", "error", err, "webhook", this.Name) return err } return nil }
func (this *WebhookNotifier) Notify(evalContext *alerting.EvalContext) error { this.log.Info("Sending webhook") metrics.M_Alerting_Notification_Sent_Webhook.Inc(1) bodyJSON := simplejson.New() bodyJSON.Set("title", evalContext.GetNotificationTitle()) bodyJSON.Set("ruleId", evalContext.Rule.Id) bodyJSON.Set("ruleName", evalContext.Rule.Name) bodyJSON.Set("state", evalContext.Rule.State) bodyJSON.Set("evalMatches", evalContext.EvalMatches) ruleUrl, err := evalContext.GetRuleUrl() if err == nil { bodyJSON.Set("rule_url", ruleUrl) } if evalContext.ImagePublicUrl != "" { bodyJSON.Set("image_url", evalContext.ImagePublicUrl) } body, _ := bodyJSON.MarshalJSON() cmd := &m.SendWebhookSync{ Url: this.Url, User: this.User, Password: this.Password, Body: string(body), } if err := bus.DispatchCtx(evalContext.Ctx, cmd); err != nil { this.log.Error("Failed to send webhook", "error", err, "webhook", this.Name) } return nil }
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) } }