/
inmemory.go
112 lines (90 loc) · 2.49 KB
/
inmemory.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
package kioradb
import (
"context"
"sort"
"sync"
"github.com/sinkingpoint/kiora/lib/kiora/kioradb/query"
"github.com/sinkingpoint/kiora/lib/kiora/model"
)
var _ DB = &inMemoryDB{}
// inMemoryDB is a DB that does not persist anything, just storing all data in memory.
type inMemoryDB struct {
aLock sync.RWMutex
alerts map[model.LabelsHash]model.Alert
sLock sync.RWMutex
silences map[string]model.Silence
}
func NewInMemoryDB() *inMemoryDB {
return &inMemoryDB{
aLock: sync.RWMutex{},
alerts: make(map[model.LabelsHash]model.Alert),
sLock: sync.RWMutex{},
silences: make(map[string]model.Silence),
}
}
func (m *inMemoryDB) Clear() {
m.aLock.Lock()
defer m.aLock.Unlock()
m.alerts = make(map[model.LabelsHash]model.Alert)
m.sLock.Lock()
defer m.sLock.Unlock()
m.silences = make(map[string]model.Silence)
}
func (m *inMemoryDB) storeAlert(alert model.Alert) {
labelsHash := alert.Labels.Hash()
m.aLock.Lock()
defer m.aLock.Unlock()
m.alerts[labelsHash] = alert
}
func (m *inMemoryDB) StoreAlerts(ctx context.Context, alerts ...model.Alert) error {
for i := range alerts {
m.storeAlert(alerts[i])
}
return nil
}
func (m *inMemoryDB) QueryAlerts(ctx context.Context, q query.AlertQuery) []model.Alert {
m.aLock.RLock()
defer m.aLock.RUnlock()
switch filter := q.Filter.(type) {
// Short circuit exact matches because we can process them more efficiently by just looking up the hash.
case *query.ExactLabelMatchFilter:
if existingAlert, ok := m.alerts[filter.Labels.Hash()]; ok {
return []model.Alert{existingAlert}
}
return []model.Alert{}
default:
alerts := []model.Alert{}
for _, alert := range m.alerts {
if filter == nil || filter.MatchesAlert(ctx, &alert) {
alerts = append(alerts, alert)
}
}
sort.Stable(query.SortAlertsByFields(alerts, q.OrderBy, q.Order))
if q.Limit > 0 && len(alerts) > q.Limit {
alerts = alerts[:q.Limit]
}
return alerts
}
}
func (m *inMemoryDB) StoreSilences(ctx context.Context, silences ...model.Silence) error {
m.sLock.Lock()
defer m.sLock.Unlock()
for i := range silences {
m.silences[silences[i].ID] = silences[i]
}
return nil
}
func (m *inMemoryDB) QuerySilences(ctx context.Context, query query.SilenceQuery) []model.Silence {
m.sLock.RLock()
defer m.sLock.RUnlock()
silences := []model.Silence{}
for _, silence := range m.silences {
if query.Filter.MatchesSilence(ctx, &silence) {
silences = append(silences, silence)
}
}
return silences
}
func (m *inMemoryDB) Close() error {
return nil
}