/
filter_label.go
85 lines (79 loc) · 1.88 KB
/
filter_label.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
package filters
import (
"fmt"
"strconv"
"strings"
"github.com/prymitive/karma/internal/models"
)
type labelFilter struct {
alertFilter
}
func (filter *labelFilter) Match(alert *models.Alert, matches int) bool {
if filter.IsValid {
isMatch := filter.Matcher.Compare(alert.Labels[filter.Matched], filter.Value)
if isMatch {
filter.Hits++
}
return isMatch
}
e := fmt.Sprintf("Match() called on invalid filter %#v", filter)
panic(e)
}
func newLabelFilter() FilterT {
f := labelFilter{}
return &f
}
func labelAutocomplete(name string, operators []string, alerts []models.Alert) []models.Autocomplete {
tokens := map[string]models.Autocomplete{}
for _, alert := range alerts {
for key, value := range alert.Labels {
for _, operator := range operators {
switch operator {
case equalOperator, notEqualOperator:
token := fmt.Sprintf("%s%s%s", key, operator, value)
tokens[token] = makeAC(
token,
[]string{
key,
fmt.Sprintf("%s%s", key, operator),
value,
},
)
case regexpOperator, negativeRegexOperator:
substrings := strings.Split(value, " ")
if len(substrings) > 1 {
for _, substring := range substrings {
token := fmt.Sprintf("%s%s%s", key, operator, substring)
tokens[token] = makeAC(
token,
[]string{
key,
fmt.Sprintf("%s%s", key, operator),
value,
substring,
},
)
}
}
case moreThanOperator, lessThanOperator:
if _, err := strconv.Atoi(value); err == nil {
token := fmt.Sprintf("%s%s%s", key, operator, value)
tokens[token] = makeAC(
token,
[]string{
key,
fmt.Sprintf("%s%s", key, operator),
value,
},
)
}
}
}
}
}
acData := []models.Autocomplete{}
for _, token := range tokens {
acData = append(acData, token)
}
return acData
}