email.go 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  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. Data: map[string]interface{}{
  50. "Title": evalContext.GetNotificationTitle(),
  51. "State": evalContext.Rule.State,
  52. "Name": evalContext.Rule.Name,
  53. "StateModel": evalContext.GetStateModel(),
  54. "Message": evalContext.Rule.Message,
  55. "RuleUrl": ruleUrl,
  56. "ImageLink": "",
  57. "EmbededImage": "",
  58. "AlertPageUrl": setting.AppUrl + "alerting",
  59. "EvalMatches": evalContext.EvalMatches,
  60. },
  61. To: this.Addresses,
  62. Template: "alert_notification.html",
  63. EmbededFiles: []string{},
  64. },
  65. }
  66. if evalContext.ImagePublicUrl != "" {
  67. cmd.Data["ImageLink"] = evalContext.ImagePublicUrl
  68. } else {
  69. file, err := os.Stat(evalContext.ImageOnDiskPath)
  70. if err == nil {
  71. cmd.EmbededFiles = []string{evalContext.ImageOnDiskPath}
  72. cmd.Data["EmbededImage"] = file.Name()
  73. }
  74. }
  75. err = bus.DispatchCtx(evalContext.Ctx, cmd)
  76. if err != nil {
  77. this.log.Error("Failed to send alert notification email", "error", err)
  78. }
  79. return nil
  80. }