tech(alerting): add logging about failed notifications

This commit is contained in:
bergquist 2016-06-15 09:19:22 +02:00
parent 9a8416416d
commit b9b65cf2d4
4 changed files with 55 additions and 27 deletions

View File

@ -27,6 +27,10 @@ func (alert *Alert) ValidToSave() bool {
return alert.DashboardId != 0 && alert.OrgId != 0 && alert.PanelId != 0 return alert.DashboardId != 0 && alert.OrgId != 0 && alert.PanelId != 0
} }
func (alert *Alert) ShouldUpdateState(newState string) bool {
return alert.State != newState
}
func (this *Alert) ContainsUpdates(other *Alert) bool { func (this *Alert) ContainsUpdates(other *Alert) bool {
result := false result := false
result = result || this.Name != other.Name result = result || this.Name != other.Name

View File

@ -20,6 +20,7 @@ type Engine struct {
handler AlertingHandler handler AlertingHandler
ruleReader RuleReader ruleReader RuleReader
log log.Logger log log.Logger
notifier Notifier
} }
func NewEngine() *Engine { func NewEngine() *Engine {
@ -31,6 +32,7 @@ func NewEngine() *Engine {
handler: NewHandler(), handler: NewHandler(),
ruleReader: NewRuleReader(), ruleReader: NewRuleReader(),
log: log.New("alerting.engine"), log: log.New("alerting.engine"),
notifier: NewNotifier(),
} }
return e return e
@ -129,13 +131,23 @@ func (e *Engine) resultHandler() {
} }
func (e *Engine) saveState(result *AlertResult) { func (e *Engine) saveState(result *AlertResult) {
cmd := &m.UpdateAlertStateCommand{ query := &m.GetAlertByIdQuery{Id: result.AlertJob.Rule.Id}
AlertId: result.AlertJob.Rule.Id, bus.Dispatch(query)
NewState: result.State,
Info: result.Description,
}
if err := bus.Dispatch(cmd); err != nil { if query.Result.ShouldUpdateState(result.State) {
e.log.Error("Failed to save state", "error", err) cmd := &m.UpdateAlertStateCommand{
AlertId: result.AlertJob.Rule.Id,
NewState: result.State,
Info: result.Description,
}
if err := bus.Dispatch(cmd); err != nil {
e.log.Error("Failed to save state", "error", err)
}
e.log.Debug("will notify! about", "new state", result.State)
e.notifier.Notify(result)
} else {
e.log.Debug("state remains the same!")
} }
} }

View File

@ -10,3 +10,7 @@ type Scheduler interface {
Tick(time time.Time, execQueue chan *AlertJob) Tick(time time.Time, execQueue chan *AlertJob)
Update(rules []*AlertRule) Update(rules []*AlertRule)
} }
type Notifier interface {
Notify(alertResult *AlertResult)
}

View File

@ -1,29 +1,32 @@
package alerting package alerting
import ( import (
"github.com/grafana/grafana/pkg/bus"
"github.com/grafana/grafana/pkg/components/simplejson" "github.com/grafana/grafana/pkg/components/simplejson"
"github.com/grafana/grafana/pkg/log" "github.com/grafana/grafana/pkg/log"
m "github.com/grafana/grafana/pkg/models" m "github.com/grafana/grafana/pkg/models"
"github.com/grafana/grafana/pkg/services/alerting/alertstates" "github.com/grafana/grafana/pkg/services/alerting/alertstates"
) )
type Notifier struct { type NotifierImpl struct {
log log.Logger log log.Logger
} }
func NewNotifier() *Notifier { func NewNotifier() *NotifierImpl {
return &Notifier{ return &NotifierImpl{
log: log.New("alerting.notifier"), log: log.New("alerting.notifier"),
} }
} }
func (n *Notifier) Notify(alertResult AlertResult) { func (n *NotifierImpl) Notify(alertResult *AlertResult) {
notifiers := getNotifiers(alertResult.AlertJob.Rule.OrgId, alertResult.AlertJob.Rule.NotificationGroups) n.log.Warn("LETS NOTIFY!!!!A")
notifiers := n.getNotifiers(alertResult.AlertJob.Rule.OrgId, []int64{1, 2})
for _, notifier := range notifiers { for _, notifier := range notifiers {
warn := alertResult.State == alertstates.Warn && notifier.SendWarning warn := alertResult.State == alertstates.Warn && notifier.SendWarning
crit := alertResult.State == alertstates.Critical && notifier.SendCritical crit := alertResult.State == alertstates.Critical && notifier.SendCritical
n.log.Warn("looopie", "warn", warn, "crit", crit)
if warn || crit { if warn || crit {
n.log.Info("Sending notification", "state", alertResult.State, "type", notifier.Type) n.log.Info("Sending notification", "state", alertResult.State, "type", notifier.Type)
go notifier.Notifierr.Notify(alertResult) go notifier.Notifierr.Notify(alertResult)
@ -44,41 +47,44 @@ type Notification struct {
type EmailNotifier struct { type EmailNotifier struct {
To string To string
From string From string
log log.Logger
} }
func (this EmailNotifier) Notify(alertResult AlertResult) { func (this *EmailNotifier) Notify(alertResult *AlertResult) {
//bus.dispath to notification package in grafana //bus.dispath to notification package in grafana
this.log.Info("Sending email")
} }
type WebhookNotifier struct { type WebhookNotifier struct {
Url string Url string
AuthUser string AuthUser string
AuthPassword string AuthPassword string
log log.Logger
} }
func (this WebhookNotifier) Notify(alertResult AlertResult) { func (this *WebhookNotifier) Notify(alertResult *AlertResult) {
//bus.dispath to notification package in grafana //bus.dispath to notification package in grafana
this.log.Info("Sending webhook")
} }
type Notifierr interface { type Notifierr interface {
Notify(alertResult AlertResult) Notify(alertResult *AlertResult)
} }
func getNotifiers(orgId int64, notificationGroups []int64) []*Notification { func (n *NotifierImpl) getNotifiers(orgId int64, notificationGroups []int64) []*Notification {
var notifications []*m.AlertNotification query := &m.GetAlertNotificationQuery{
OrgID: orgId,
for _, notificationId := range notificationGroups { Ids: notificationGroups,
query := m.GetAlertNotificationQuery{ }
OrgID: orgId, err := bus.Dispatch(query)
Id: notificationId, if err != nil {
} n.log.Error("Failed to read notifications", "error", err)
notifications = append(notifications, query.Result...)
} }
var result []*Notification var result []*Notification
for _, notification := range notifications { n.log.Warn("query result", "length", len(query.Result))
for _, notification := range query.Result {
not, err := NewNotificationFromDBModel(notification) not, err := NewNotificationFromDBModel(notification)
if err == nil { if err == nil {
result = append(result, not) result = append(result, not)
@ -103,6 +109,7 @@ var createNotifier = func(notificationType string, settings *simplejson.Json) No
return &EmailNotifier{ return &EmailNotifier{
To: settings.Get("to").MustString(), To: settings.Get("to").MustString(),
From: settings.Get("from").MustString(), From: settings.Get("from").MustString(),
log: log.New("alerting.notification.email"),
} }
} }
@ -110,5 +117,6 @@ var createNotifier = func(notificationType string, settings *simplejson.Json) No
Url: settings.Get("url").MustString(), Url: settings.Get("url").MustString(),
AuthUser: settings.Get("user").MustString(), AuthUser: settings.Get("user").MustString(),
AuthPassword: settings.Get("password").MustString(), AuthPassword: settings.Get("password").MustString(),
log: log.New("alerting.notification.webhook"),
} }
} }