forked from moira-alert/moira
/
trigger.go
89 lines (72 loc) · 2.19 KB
/
trigger.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
88
89
package checker
import (
"errors"
"time"
"github.com/moira-alert/moira"
"github.com/moira-alert/moira/database"
"github.com/moira-alert/moira/metrics/graphite"
"github.com/moira-alert/moira/remote"
)
// TriggerChecker represents data, used for handling new trigger state
type TriggerChecker struct {
TriggerID string
Database moira.Database
Logger moira.Logger
Config *Config
RemoteConfig *remote.Config
Metrics *graphite.CheckerMetrics
From int64
Until int64
trigger *moira.Trigger
lastCheck *moira.CheckData
ttl int64
ttlState string
}
// ErrTriggerNotExists used if trigger to check does not exists
var ErrTriggerNotExists = errors.New("trigger does not exists")
// InitTriggerChecker initialize new triggerChecker data, if trigger does not exists then return ErrTriggerNotExists error
func (triggerChecker *TriggerChecker) InitTriggerChecker() error {
triggerChecker.Until = time.Now().Unix()
trigger, err := triggerChecker.Database.GetTrigger(triggerChecker.TriggerID)
if err != nil {
if err == database.ErrNil {
return ErrTriggerNotExists
}
return err
}
triggerChecker.trigger = &trigger
triggerChecker.ttl = trigger.TTL
if trigger.TTLState != nil {
triggerChecker.ttlState = *trigger.TTLState
} else {
triggerChecker.ttlState = NODATA
}
triggerChecker.lastCheck, err = getLastCheck(triggerChecker.Database, triggerChecker.TriggerID, triggerChecker.Until-3600)
if err != nil {
return err
}
triggerChecker.From = triggerChecker.lastCheck.Timestamp
if triggerChecker.ttl != 0 {
triggerChecker.From = triggerChecker.From - triggerChecker.ttl
} else {
triggerChecker.From = triggerChecker.From - 600
}
return nil
}
func getLastCheck(dataBase moira.Database, triggerID string, emptyLastCheckTimestamp int64) (*moira.CheckData, error) {
lastCheck, err := dataBase.GetTriggerLastCheck(triggerID)
if err != nil && err != database.ErrNil {
return nil, err
}
if err == database.ErrNil {
lastCheck = moira.CheckData{
Metrics: make(map[string]moira.MetricState),
State: OK,
Timestamp: emptyLastCheckTimestamp,
}
}
if lastCheck.Timestamp == 0 {
lastCheck.Timestamp = emptyLastCheckTimestamp
}
return &lastCheck, nil
}