forked from slok/sloth
-
Notifications
You must be signed in to change notification settings - Fork 0
/
alert.go
119 lines (105 loc) 路 3.28 KB
/
alert.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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
package alert
import (
"context"
"fmt"
"time"
)
// Severity is the type of alert.
type Severity int
const (
UnknownAlertSeverity Severity = iota
PageAlertSeverity
TicketAlertSeverity
)
func (s Severity) String() string {
switch s {
case PageAlertSeverity:
return "page"
case TicketAlertSeverity:
return "ticket"
default:
return "unknown"
}
}
// MWMBAlert represents a multiwindow, multi-burn rate alert.
type MWMBAlert struct {
ID string
ShortWindow time.Duration
LongWindow time.Duration
BurnRateFactor float64
ErrorBudget float64
Severity Severity
}
// MWMBAlertGroup what represents all the alerts of an SLO.
// ITs divided into two groups that are made of 2 alerts:
// - Page & quick: Critical alerts that trigger in high rate burn in short term.
// - Page & slow: Critical alerts that trigger in high-normal rate burn in medium term.
// - Ticket & slow: Warning alerts that trigger in normal rate burn in medium term.
// - Ticket & slow: Warning alerts that trigger in slow rate burn in long term.
type MWMBAlertGroup struct {
PageQuick MWMBAlert
PageSlow MWMBAlert
TicketQuick MWMBAlert
TicketSlow MWMBAlert
}
// WindowsRepo knows how to retrieve windows based on the period of time.
type WindowsRepo interface {
GetWindows(ctx context.Context, period time.Duration) (*Windows, error)
}
// Generator knows how to generate all the required alerts based on an SLO.
// The generated alerts are generic and don't depend on any specific SLO implementation.
type Generator struct {
windowsRepo WindowsRepo
}
func NewGenerator(windowsRepo WindowsRepo) Generator {
return Generator{
windowsRepo: windowsRepo,
}
}
type SLO struct {
ID string
TimeWindow time.Duration
Objective float64
}
func (g Generator) GenerateMWMBAlerts(ctx context.Context, slo SLO) (*MWMBAlertGroup, error) {
windows, err := g.windowsRepo.GetWindows(ctx, slo.TimeWindow)
if err != nil {
return nil, fmt.Errorf("the %s SLO period time window is not supported", slo.TimeWindow)
}
errorBudget := 100 - slo.Objective
group := MWMBAlertGroup{
PageQuick: MWMBAlert{
ID: fmt.Sprintf("%s-page-quick", slo.ID),
ShortWindow: windows.PageQuick.ShortWindow,
LongWindow: windows.PageQuick.LongWindow,
BurnRateFactor: windows.GetSpeedPageQuick(),
ErrorBudget: errorBudget,
Severity: PageAlertSeverity,
},
PageSlow: MWMBAlert{
ID: fmt.Sprintf("%s-page-slow", slo.ID),
ShortWindow: windows.PageSlow.ShortWindow,
LongWindow: windows.PageSlow.LongWindow,
BurnRateFactor: windows.GetSpeedPageSlow(),
ErrorBudget: errorBudget,
Severity: PageAlertSeverity,
},
TicketQuick: MWMBAlert{
ID: fmt.Sprintf("%s-ticket-quick", slo.ID),
ShortWindow: windows.TicketQuick.ShortWindow,
LongWindow: windows.TicketQuick.LongWindow,
BurnRateFactor: windows.GetSpeedTicketQuick(),
ErrorBudget: errorBudget,
Severity: TicketAlertSeverity,
},
TicketSlow: MWMBAlert{
ID: fmt.Sprintf("%s-ticket-slow", slo.ID),
ShortWindow: windows.TicketSlow.ShortWindow,
LongWindow: windows.TicketSlow.LongWindow,
BurnRateFactor: windows.GetSpeedTicketSlow(),
ErrorBudget: errorBudget,
Severity: TicketAlertSeverity,
},
}
return &group, nil
}