email.go 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. package notifiers
  2. import (
  3. "os"
  4. "strings"
  5. "github.com/grafana/grafana/pkg/bus"
  6. "github.com/grafana/grafana/pkg/log"
  7. "github.com/grafana/grafana/pkg/metrics"
  8. m "github.com/grafana/grafana/pkg/models"
  9. "github.com/grafana/grafana/pkg/services/alerting"
  10. "github.com/grafana/grafana/pkg/setting"
  11. )
  12. func init() {
  13. alerting.RegisterNotifier("email", NewEmailNotifier)
  14. }
  15. type EmailNotifier struct {
  16. NotifierBase
  17. Addresses []string
  18. log log.Logger
  19. }
  20. func NewEmailNotifier(model *m.AlertNotification) (alerting.Notifier, error) {
  21. addressesString := model.Settings.Get("addresses").MustString()
  22. if addressesString == "" {
  23. return nil, alerting.ValidationError{Reason: "Could not find addresses in settings"}
  24. }
  25. // split addresses with a few different ways
  26. addresses := strings.FieldsFunc(addressesString, func(r rune) bool {
  27. switch r {
  28. case ',', ';', '\n':
  29. return true
  30. }
  31. return false
  32. })
  33. return &EmailNotifier{
  34. NotifierBase: NewNotifierBase(model.Id, model.IsDefault, model.Name, model.Type, model.Settings),
  35. Addresses: addresses,
  36. log: log.New("alerting.notifier.email"),
  37. }, nil
  38. }
  39. func (this *EmailNotifier) Notify(evalContext *alerting.EvalContext) error {
  40. this.log.Info("Sending alert notification to", "addresses", this.Addresses)
  41. metrics.M_Alerting_Notification_Sent_Email.Inc(1)
  42. ruleUrl, err := evalContext.GetRuleUrl()
  43. if err != nil {
  44. this.log.Error("Failed get rule link", "error", err)
  45. return err
  46. }
  47. cmd := &m.SendEmailCommandSync{
  48. SendEmailCommand: m.SendEmailCommand{
  49. Subject: evalContext.GetNotificationTitle(),
  50. Data: map[string]interface{}{
  51. "Title": evalContext.GetNotificationTitle(),
  52. "State": evalContext.Rule.State,
  53. "Name": evalContext.Rule.Name,
  54. "StateModel": evalContext.GetStateModel(),
  55. "Message": evalContext.Rule.Message,
  56. "RuleUrl": ruleUrl,
  57. "ImageLink": "",
  58. "EmbededImage": "",
  59. "AlertPageUrl": setting.AppUrl + "alerting",
  60. "EvalMatches": evalContext.EvalMatches,
  61. },
  62. To: this.Addresses,
  63. Template: "alert_notification.html",
  64. EmbededFiles: []string{},
  65. },
  66. }
  67. if evalContext.ImagePublicUrl != "" {
  68. cmd.Data["ImageLink"] = evalContext.ImagePublicUrl
  69. } else {
  70. file, err := os.Stat(evalContext.ImageOnDiskPath)
  71. if err == nil {
  72. cmd.EmbededFiles = []string{evalContext.ImageOnDiskPath}
  73. cmd.Data["EmbededImage"] = file.Name()
  74. }
  75. }
  76. err = bus.DispatchCtx(evalContext.Ctx, cmd)
  77. if err != nil {
  78. this.log.Error("Failed to send alert notification email", "error", err)
  79. return err
  80. }
  81. return nil
  82. }