forked from nathanielc/morgoth
/
alerts_manager.go
87 lines (75 loc) · 1.8 KB
/
alerts_manager.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
package morgoth
import (
"github.com/nathanielc/morgoth/Godeps/_workspace/src/github.com/golang/glog"
)
type AlertsManager struct {
scheduledAlertQueries []*scheduledAlertQuery
engine Engine
queryQueue chan alertQuery
}
func NewAlertsManager(
engine Engine,
scheduledAlertQueries []*scheduledAlertQuery,
) *AlertsManager {
return &AlertsManager{
scheduledAlertQueries: scheduledAlertQueries,
engine: engine,
queryQueue: make(chan alertQuery, queryBufferSize),
}
}
func (self *AlertsManager) Start() {
for _, sq := range self.scheduledAlertQueries {
sq.Start(self.queryQueue)
}
go self.processQueries()
}
func (self *AlertsManager) processQueries() {
for query := range self.queryQueue {
glog.V(2).Info("Executing query:", query)
windows, err := self.engine.GetWindows(query.query)
if err != nil {
glog.Errorf("Failed to execute query: '%s' %s", query, err)
continue
}
glog.Info(windows)
for _, w := range windows {
sum := 0.0
for _, point := range w.Data {
sum += point
}
glog.V(1).Info("Alert Query total ", sum)
if sum > query.threshold {
for _, n := range query.notifiers {
n.Notify(query.message, w)
}
}
}
}
}
type scheduledAlertQuery struct {
sq *ScheduledQuery
threshold float64
notifiers []Notifier
message string
queue chan alertQuery
}
func (self *scheduledAlertQuery) Start(queue chan alertQuery) {
self.queue = queue
self.sq.Callback = self.callback
self.sq.Start()
}
func (self *scheduledAlertQuery) callback(query Query) {
aq := alertQuery{
query: query,
threshold: self.threshold,
notifiers: self.notifiers,
message: self.message,
}
self.queue <- aq
}
type alertQuery struct {
query Query
threshold float64
notifiers []Notifier
message string
}