feat(api): add @cluster filter

This commit is contained in:
Łukasz Mierzwa
2020-06-12 19:14:17 +01:00
committed by Łukasz Mierzwa
parent 91c8170433
commit 9390bbccc0
4 changed files with 99 additions and 5 deletions
+7 -4
View File
@@ -38,8 +38,8 @@ var acTests = []acTest{
},
Receiver: "default",
Alertmanager: []models.AlertmanagerInstance{
{Name: "am1"},
{Name: "am2"},
{Cluster: "cluster", Name: "am1"},
{Cluster: "cluster", Name: "am2"},
},
},
{
@@ -50,9 +50,10 @@ var acTests = []acTest{
},
Receiver: "not default",
Alertmanager: []models.AlertmanagerInstance{
{Name: "am1"},
{Cluster: "cluster", Name: "am1"},
{
Name: "am2",
Cluster: "cluster",
Name: "am2",
Silences: map[string]*models.Silence{
"1234567890": {
ID: "1234567890",
@@ -73,6 +74,8 @@ var acTests = []acTest{
"@alertmanager!=am2",
"@alertmanager=am1",
"@alertmanager=am2",
"@cluster!=cluster",
"@cluster=cluster",
"@limit=10",
"@limit=50",
"@receiver!=default",
+61
View File
@@ -0,0 +1,61 @@
package filters
import (
"fmt"
"strings"
"github.com/prymitive/karma/internal/models"
)
type alertmanagerClusterFilter struct {
alertFilter
}
func (filter *alertmanagerClusterFilter) Match(alert *models.Alert, matches int) bool {
if filter.IsValid {
var isMatch bool
for _, am := range alert.Alertmanager {
if filter.Matcher.Compare(am.Cluster, filter.Value) {
isMatch = true
}
}
if isMatch {
filter.Hits++
}
return isMatch
}
e := fmt.Sprintf("Match() called on invalid filter %#v", filter)
panic(e)
}
func newAlertmanagerClusterFilter() FilterT {
f := alertmanagerClusterFilter{}
return &f
}
func alertmanagerClusterAutocomplete(name string, operators []string, alerts []models.Alert) []models.Autocomplete {
tokens := map[string]models.Autocomplete{}
for _, alert := range alerts {
for _, am := range alert.Alertmanager {
for _, operator := range operators {
switch operator {
case equalOperator, notEqualOperator:
token := fmt.Sprintf("%s%s%s", name, operator, am.Cluster)
tokens[token] = makeAC(
token,
[]string{
name,
strings.TrimPrefix(name, "@"),
name + operator,
},
)
}
}
}
}
acData := make([]models.Autocomplete, 0, len(tokens))
for _, token := range tokens {
acData = append(acData, token)
}
return acData
}
+24 -1
View File
@@ -587,6 +587,28 @@ var tests = []filterTest{
},
IsMatch: true,
},
{
Expression: "@cluster=foo",
IsValid: true,
Alert: models.Alert{},
IsMatch: false,
},
{
Expression: "@cluster=HA",
IsValid: true,
Alert: models.Alert{
Receiver: "by-name",
},
IsMatch: true,
},
{
Expression: "@cluster!=foo",
IsValid: true,
Alert: models.Alert{
Receiver: "by-name",
},
IsMatch: true,
},
{
Expression: "@receiver=by-name",
IsValid: true,
@@ -608,7 +630,7 @@ var tests = []filterTest{
func TestFilters(t *testing.T) {
log.SetLevel(log.ErrorLevel)
am, err := alertmanager.NewAlertmanager("test", "http://localhost", alertmanager.WithRequestTimeout(time.Second))
am, err := alertmanager.NewAlertmanager("HA", "test", "http://localhost", alertmanager.WithRequestTimeout(time.Second))
if err != nil {
t.Error(err)
}
@@ -616,6 +638,7 @@ func TestFilters(t *testing.T) {
alert := models.Alert(ft.Alert)
alert.Alertmanager = []models.AlertmanagerInstance{
{
Cluster: "HA",
Name: am.Name,
Silences: map[string]*models.Silence{},
SilencedBy: []string{},
+7
View File
@@ -47,6 +47,13 @@ var AllFilters = []filterConfig{
Factory: newAlertmanagerInstanceFilter,
Autocomplete: alertmanagerInstanceAutocomplete,
},
{
Label: "@cluster",
LabelRe: regexp.MustCompile("^@cluster$"),
SupportedOperators: []string{regexpOperator, negativeRegexOperator, equalOperator, notEqualOperator},
Factory: newAlertmanagerClusterFilter,
Autocomplete: alertmanagerClusterAutocomplete,
},
{
Label: "@state",
LabelRe: regexp.MustCompile("^@state$"),