Alerting: Support for Mimir configuration in Grafana Alertmanager (#106402)
This commit is contained in:
@@ -7,6 +7,7 @@ import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
alertingNotify "github.com/grafana/alerting/notify"
|
||||
@@ -314,11 +315,43 @@ func (am *alertmanager) aggregateInhibitMatchers(rules []config.InhibitRule, amu
|
||||
}
|
||||
}
|
||||
|
||||
func logMergeResult(l log.Logger, m apimodels.MergeResult) {
|
||||
if len(m.RenamedReceivers) == 0 && len(m.RenamedTimeIntervals) == 0 {
|
||||
return
|
||||
}
|
||||
|
||||
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]))
|
||||
}
|
||||
l.Info("Configurations merged successfully but some resources were renamed", logCtx...)
|
||||
}
|
||||
|
||||
// applyConfig applies a new configuration by re-initializing all components using the configuration provided.
|
||||
// It returns a boolean indicating whether the user config was changed and an error.
|
||||
// It is not safe to call concurrently.
|
||||
func (am *alertmanager) applyConfig(ctx context.Context, cfg *apimodels.PostableUserConfig, skipInvalid bool) (bool, error) {
|
||||
err := AddAutogenConfig(ctx, am.logger, am.Store, am.Base.TenantID(), &cfg.AlertmanagerConfig, skipInvalid)
|
||||
mergeResult, err := cfg.GetMergedAlertmanagerConfig()
|
||||
if err != nil {
|
||||
return false, fmt.Errorf("failed to get full alertmanager configuration: %w", err)
|
||||
}
|
||||
logMergeResult(am.logger, mergeResult)
|
||||
amConfig := mergeResult.Config
|
||||
templates := cfg.GetMergedTemplateDefinitions()
|
||||
|
||||
// Now add autogenerated config to the route.
|
||||
err = AddAutogenConfig(ctx, am.logger, am.Store, am.Base.TenantID(), &amConfig, skipInvalid)
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
@@ -337,7 +370,7 @@ func (am *alertmanager) applyConfig(ctx context.Context, cfg *apimodels.Postable
|
||||
return false, nil
|
||||
}
|
||||
|
||||
receivers := PostableApiAlertingConfigToApiReceivers(cfg.AlertmanagerConfig)
|
||||
receivers := PostableApiAlertingConfigToApiReceivers(amConfig)
|
||||
for _, recv := range receivers {
|
||||
err = patchNewSecureFields(ctx, recv, alertingNotify.DecodeSecretsFromBase64, am.decryptFn)
|
||||
if err != nil {
|
||||
@@ -347,11 +380,11 @@ func (am *alertmanager) applyConfig(ctx context.Context, cfg *apimodels.Postable
|
||||
|
||||
am.logger.Info("Applying new configuration to Alertmanager", "configHash", fmt.Sprintf("%x", configHash))
|
||||
err = am.Base.ApplyConfig(alertingNotify.NotificationsConfiguration{
|
||||
RoutingTree: cfg.AlertmanagerConfig.Route.AsAMRoute(),
|
||||
InhibitRules: cfg.AlertmanagerConfig.InhibitRules,
|
||||
MuteTimeIntervals: cfg.AlertmanagerConfig.MuteTimeIntervals,
|
||||
TimeIntervals: cfg.AlertmanagerConfig.TimeIntervals,
|
||||
Templates: ToTemplateDefinitions(cfg),
|
||||
RoutingTree: amConfig.Route.AsAMRoute(),
|
||||
InhibitRules: amConfig.InhibitRules,
|
||||
MuteTimeIntervals: amConfig.MuteTimeIntervals,
|
||||
TimeIntervals: amConfig.TimeIntervals,
|
||||
Templates: templates,
|
||||
Receivers: receivers,
|
||||
DispatcherLimits: &nilLimits{},
|
||||
Raw: rawConfig,
|
||||
|
||||
Reference in New Issue
Block a user