Alerting: Support for Mimir configuration in Grafana Alertmanager (#106402)

This commit is contained in:
Yuri Tseretyan
2025-06-13 16:32:23 +02:00
committed by GitHub
parent 3c0d087186
commit b0ff51a903
6 changed files with 476 additions and 21 deletions
@@ -6,7 +6,9 @@ import (
"strings"
"testing"
alertingTemplates "github.com/grafana/alerting/templates"
"github.com/prometheus/alertmanager/config"
"github.com/prometheus/alertmanager/pkg/labels"
"github.com/prometheus/common/model"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
@@ -215,3 +217,201 @@ func Test_RawMessageMarshaling(t *testing.T) {
assert.Equal(t, RawMessage(`{"data":"test"}`), n.Field)
})
}
func TestPostableUserConfig_GetMergedAlertmanagerConfig(t *testing.T) {
alertmanagerCfg := PostableApiAlertingConfig{
Config: Config{
Route: &Route{
Receiver: "default",
},
},
Receivers: []*PostableApiReceiver{
{
Receiver: config.Receiver{
Name: "default",
},
},
},
}
testCases := []struct {
name string
config PostableUserConfig
expectedError string
}{
{
name: "no extra configs",
config: PostableUserConfig{
AlertmanagerConfig: alertmanagerCfg,
},
},
{
name: "valid mimir config",
config: PostableUserConfig{
AlertmanagerConfig: alertmanagerCfg,
ExtraConfigs: []ExtraConfiguration{
{
Identifier: "mimir-1",
MergeMatchers: config.Matchers{
{
Type: labels.MatchEqual,
Name: "cluster",
Value: "prod",
},
},
AlertmanagerConfig: PostableApiAlertingConfig{
Config: Config{
Route: &Route{
Receiver: "mimir-receiver",
},
},
Receivers: []*PostableApiReceiver{
{
Receiver: config.Receiver{
Name: "mimir-receiver",
},
},
},
},
},
},
},
},
{
name: "empty identifier",
config: PostableUserConfig{
AlertmanagerConfig: alertmanagerCfg,
ExtraConfigs: []ExtraConfiguration{
{
Identifier: "",
MergeMatchers: config.Matchers{},
AlertmanagerConfig: PostableApiAlertingConfig{
Config: Config{
Route: &Route{
Receiver: "test",
},
},
},
},
},
},
expectedError: "invalid merge options",
},
{
name: "bad matcher type",
config: PostableUserConfig{
AlertmanagerConfig: alertmanagerCfg,
ExtraConfigs: []ExtraConfiguration{
{
Identifier: "test",
MergeMatchers: config.Matchers{
{
Type: labels.MatchNotEqual,
Name: "cluster",
Value: "prod",
},
},
},
},
},
expectedError: "only equality matchers are allowed",
},
}
for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
result, err := tc.config.GetMergedAlertmanagerConfig()
if tc.expectedError != "" {
require.Error(t, err)
require.ErrorContains(t, err, tc.expectedError)
} else {
require.NoError(t, err)
require.NotNil(t, result.Config)
}
})
}
}
func TestPostableUserConfig_GetMergedTemplateDefinitions(t *testing.T) {
testCases := []struct {
name string
config PostableUserConfig
expectedTemplates int
}{
{
name: "no templates",
config: PostableUserConfig{
TemplateFiles: map[string]string{},
ExtraConfigs: []ExtraConfiguration{},
},
expectedTemplates: 0,
},
{
name: "grafana templates only",
config: PostableUserConfig{
TemplateFiles: map[string]string{
"grafana-template1": "{{ define \"test\" }}Hello{{ end }}",
"grafana-template2": "{{ define \"test2\" }}World{{ end }}",
},
ExtraConfigs: []ExtraConfiguration{},
},
expectedTemplates: 2,
},
{
name: "mimir templates only",
config: PostableUserConfig{
TemplateFiles: map[string]string{},
ExtraConfigs: []ExtraConfiguration{
{
TemplateFiles: map[string]string{
"mimir-template": "{{ define \"mimir\" }}Mimir{{ end }}",
},
},
},
},
expectedTemplates: 1,
},
{
name: "mixed templates",
config: PostableUserConfig{
TemplateFiles: map[string]string{
"grafana-template": "{{ define \"grafana\" }}Grafana{{ end }}",
},
ExtraConfigs: []ExtraConfiguration{
{
TemplateFiles: map[string]string{
"mimir-template": "{{ define \"mimir\" }}Mimir{{ end }}",
},
},
},
},
expectedTemplates: 2,
},
}
for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
result := tc.config.GetMergedTemplateDefinitions()
require.Len(t, result, tc.expectedTemplates)
templateMap := make(map[string]string)
kindMap := make(map[string]alertingTemplates.Kind)
for _, tmpl := range result {
templateMap[tmpl.Name] = tmpl.Template
kindMap[tmpl.Name] = tmpl.Kind
}
for name, content := range tc.config.TemplateFiles {
require.Equal(t, content, templateMap[name])
require.Equal(t, alertingTemplates.GrafanaKind, kindMap[name])
}
if len(tc.config.ExtraConfigs) > 0 {
for name, content := range tc.config.ExtraConfigs[0].TemplateFiles {
require.Equal(t, content, templateMap[name])
require.Equal(t, alertingTemplates.MimirKind, kindMap[name])
}
}
})
}
}