moira
/
dashboard.go
78 строк · 1.8 Кб
1package moira
2
3import (
4"fmt"
5"strings"
6)
7
8type SlackDashboard map[string]bool // map from metric to isOK
9
10func (sb *SlackDashboard) Update(events NotificationEvents, triggerName string) (hasChanged bool, changes NotificationEvents) {
11hasChanged = false
12changes = make(NotificationEvents, 0, len(events))
13for _, event := range events {
14if event.State == OK {
15if oldState, ok := (*sb)[event.Metric]; ok && !oldState {
16hasChanged = true
17(*sb)[event.Metric] = true
18changes = append(changes, event)
19}
20}
21if !event.IsTriggerEvent {
22if oldState, ok := (*sb)[triggerName]; ok && !oldState {
23hasChanged = true
24(*sb)[triggerName] = true
25changes = append(changes, event)
26}
27}
28}
29return hasChanged, changes
30}
31
32func (sb SlackDashboard) IsEverythingOK() bool {
33for _, isOK := range sb {
34if !isOK {
35return false
36}
37}
38return true
39}
40
41func MakeDashboardFromEvents(events NotificationEvents) SlackDashboard {
42result := make(SlackDashboard)
43for _, event := range events {
44result[event.Metric] = event.State == OK
45}
46return result
47}
48
49type SlackThreadLink struct {
50Contact string `json:"contact"`
51ThreadTs string `json:"thread_ts"`
52DashboardTs string `json:"dashboard_ts,omitempty"`
53}
54
55func (link SlackThreadLink) StorageKey() string {
56if link.DashboardTs != "" {
57return fmt.Sprintf("slack:%s:%s:%s", link.Contact, link.ThreadTs, link.DashboardTs)
58} else {
59return fmt.Sprintf("slack:%s:%s", link.Contact, link.ThreadTs)
60}
61}
62
63func (link *SlackThreadLink) FromString(s string) error {
64split := strings.SplitN(s, ":", 3)
65if len(split) < 2 {
66return fmt.Errorf("failed to parse %s as SlackThreadLink", s)
67}
68link.Contact = split[0]
69link.ThreadTs = split[1]
70if len(split) >= 3 {
71link.DashboardTs = split[2]
72}
73return nil
74}
75
76func (link SlackThreadLink) SenderName() string {
77return "slack"
78}
79