mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
tech(alerting): add logging about failed notifications
This commit is contained in:
parent
9a8416416d
commit
b9b65cf2d4
@ -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
|
||||||
|
@ -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!")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
|
}
|
||||||
|
@ -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"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user