Alerting: Send templates from extra configuration to remote Alertmanager (#107981)
* extract logging of MergedResult into method * convert GetMergedTemplateDefinitions to return PostableApiTemplate * update mergeExtracConfigs to return GrafanaAlertmanagerConfig * pass by value, not pointer * add template definition to payload * update tests * rename to Templates * log merge results * fix reference in workspace
This commit is contained in:
@@ -5,10 +5,10 @@ import (
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/go-openapi/strfmt"
|
||||
alertingTemplates "github.com/grafana/alerting/templates"
|
||||
amv2 "github.com/prometheus/alertmanager/api/v2/models"
|
||||
"github.com/prometheus/alertmanager/config"
|
||||
"github.com/prometheus/alertmanager/pkg/labels"
|
||||
@@ -17,6 +17,7 @@ import (
|
||||
|
||||
"github.com/grafana/alerting/definition"
|
||||
alertingmodels "github.com/grafana/alerting/models"
|
||||
|
||||
"github.com/grafana/grafana/pkg/apimachinery/errutil"
|
||||
)
|
||||
|
||||
@@ -267,9 +268,32 @@ type (
|
||||
PostableApiReceiver = definition.PostableApiReceiver
|
||||
PostableGrafanaReceivers = definition.PostableGrafanaReceivers
|
||||
ReceiverType = definition.ReceiverType
|
||||
MergeResult = definition.MergeResult
|
||||
)
|
||||
|
||||
type MergeResult definition.MergeResult
|
||||
|
||||
func (m MergeResult) LogContext() []any {
|
||||
if len(m.RenamedReceivers) == 0 && len(m.RenamedTimeIntervals) == 0 {
|
||||
return nil
|
||||
}
|
||||
logCtx := make([]any, 0, 4)
|
||||
if len(m.RenamedTimeIntervals) > 0 {
|
||||
rcvBuilder := strings.Builder{}
|
||||
for from, to := range m.RenamedReceivers {
|
||||
rcvBuilder.WriteString(fmt.Sprintf("'%s'->'%s',", from, to))
|
||||
}
|
||||
logCtx = append(logCtx, "renamedReceivers", fmt.Sprintf("[%s]", rcvBuilder.String()[0:rcvBuilder.Len()-1]))
|
||||
}
|
||||
if len(m.RenamedTimeIntervals) > 0 {
|
||||
rcvBuilder := strings.Builder{}
|
||||
for from, to := range m.RenamedTimeIntervals {
|
||||
rcvBuilder.WriteString(fmt.Sprintf("'%s'->'%s',", from, to))
|
||||
}
|
||||
logCtx = append(logCtx, "renamedTimeIntervals", fmt.Sprintf("[%s]", rcvBuilder.String()[0:rcvBuilder.Len()-1]))
|
||||
}
|
||||
return logCtx
|
||||
}
|
||||
|
||||
const (
|
||||
GrafanaReceiverType = definition.GrafanaReceiverType
|
||||
AlertmanagerReceiverType = definition.AlertmanagerReceiverType
|
||||
@@ -779,31 +803,20 @@ func (c *PostableUserConfig) GetMergedAlertmanagerConfig() (MergeResult, error)
|
||||
return MergeResult{}, fmt.Errorf("failed to get mimir alertmanager config: %w", err)
|
||||
}
|
||||
|
||||
return definition.Merge(c.AlertmanagerConfig, mcfg, opts)
|
||||
m, err := definition.Merge(c.AlertmanagerConfig, mcfg, opts)
|
||||
if err != nil {
|
||||
return MergeResult{}, fmt.Errorf("failed to merge alertmanager config: %w", err)
|
||||
}
|
||||
return MergeResult(m), nil
|
||||
}
|
||||
|
||||
// GetMergedTemplateDefinitions converts the given PostableUserConfig's TemplateFiles to a slice of TemplateDefinitions.
|
||||
func (c *PostableUserConfig) GetMergedTemplateDefinitions() []alertingTemplates.TemplateDefinition {
|
||||
out := make([]alertingTemplates.TemplateDefinition, 0, len(c.TemplateFiles))
|
||||
for name, tmpl := range c.TemplateFiles {
|
||||
out = append(out, alertingTemplates.TemplateDefinition{
|
||||
Name: name,
|
||||
Template: tmpl,
|
||||
Kind: alertingTemplates.GrafanaKind,
|
||||
})
|
||||
}
|
||||
if len(c.ExtraConfigs) == 0 {
|
||||
// GetMergedTemplateDefinitions converts the given PostableUserConfig's TemplateFiles to a slice of Templates.
|
||||
func (c *PostableUserConfig) GetMergedTemplateDefinitions() []definition.PostableApiTemplate {
|
||||
out := definition.TemplatesMapToPostableAPITemplates(c.TemplateFiles, definition.GrafanaTemplateKind)
|
||||
if len(c.ExtraConfigs) == 0 || len(c.ExtraConfigs[0].TemplateFiles) == 0 {
|
||||
return out
|
||||
}
|
||||
// support only one config for now
|
||||
for name, tmpl := range c.ExtraConfigs[0].TemplateFiles {
|
||||
out = append(out, alertingTemplates.TemplateDefinition{
|
||||
Name: name,
|
||||
Template: tmpl,
|
||||
Kind: alertingTemplates.MimirKind,
|
||||
})
|
||||
}
|
||||
return out
|
||||
return append(out, definition.TemplatesMapToPostableAPITemplates(c.ExtraConfigs[0].TemplateFiles, definition.MimirTemplateKind)...)
|
||||
}
|
||||
|
||||
func (c *PostableUserConfig) UnmarshalJSON(b []byte) error {
|
||||
|
||||
@@ -6,7 +6,7 @@ import (
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
alertingTemplates "github.com/grafana/alerting/templates"
|
||||
"github.com/grafana/alerting/definition"
|
||||
"github.com/prometheus/alertmanager/config"
|
||||
"github.com/prometheus/alertmanager/pkg/labels"
|
||||
"github.com/prometheus/common/model"
|
||||
@@ -383,21 +383,21 @@ func TestPostableUserConfig_GetMergedTemplateDefinitions(t *testing.T) {
|
||||
require.Len(t, result, tc.expectedTemplates)
|
||||
|
||||
templateMap := make(map[string]string)
|
||||
kindMap := make(map[string]alertingTemplates.Kind)
|
||||
kindMap := make(map[string]definition.TemplateKind)
|
||||
for _, tmpl := range result {
|
||||
templateMap[tmpl.Name] = tmpl.Template
|
||||
templateMap[tmpl.Name] = tmpl.Content
|
||||
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])
|
||||
require.Equal(t, definition.GrafanaTemplateKind, 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])
|
||||
require.Equal(t, definition.MimirTemplateKind, kindMap[name])
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user