Skip to content

Commit

Permalink
Alerting: Fix provisioned templates being ignored by alertmanager (#6…
Browse files Browse the repository at this point in the history
…9485)

* Alerting: Fix provisioned templates being ignored by alertmanager

Template provisioning sets the template in cfg.TemplateFiles while a recent change
made it so that alertmanager reads cfg.AlertmanagerConfig.Templates instead.

This change fixes the issue on both ends, by having provisioning set boths fields and
reverts the change on the alertmanager side so that it uses cfg.TemplateFiles.
  • Loading branch information
JacobsonMT committed Jun 2, 2023
1 parent 17836c5 commit c16f1f5
Show file tree
Hide file tree
Showing 4 changed files with 9 additions and 9 deletions.
4 changes: 2 additions & 2 deletions pkg/services/ngalert/notifier/alertmanager.go
Original file line number Diff line number Diff line change
Expand Up @@ -260,13 +260,13 @@ func (am *Alertmanager) applyConfig(cfg *apimodels.PostableUserConfig, rawConfig
cfg.TemplateFiles = map[string]string{}
}
cfg.TemplateFiles["__default__.tmpl"] = alertingTemplates.DefaultTemplateString
cfg.AlertmanagerConfig.Templates = append(cfg.AlertmanagerConfig.Templates, "__default__.tmpl")

// next, we need to make sure we persist the templates to disk.
_, templatesChanged, err := PersistTemplates(am.logger, cfg, am.Base.WorkingDirectory())
paths, templatesChanged, err := PersistTemplates(am.logger, cfg, am.Base.WorkingDirectory())
if err != nil {
return false, err
}
cfg.AlertmanagerConfig.Templates = paths

// If neither the configuration nor templates have changed, we've got nothing to do.
if !amConfigChanged && !templatesChanged {
Expand Down
4 changes: 2 additions & 2 deletions pkg/services/ngalert/notifier/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ func PersistTemplates(logger log.Logger, cfg *api.PostableUserConfig, path strin
}

file := filepath.Join(path, name)
pathSet[file] = struct{}{}
pathSet[name] = struct{}{}

// Check if the template file already exists and if it has changed
// We can safely ignore gosec here as we've previously checked the filename is clean
Expand Down Expand Up @@ -60,7 +60,7 @@ func PersistTemplates(logger log.Logger, cfg *api.PostableUserConfig, path strin
}
for _, existingFile := range existingFiles {
p := filepath.Join(path, existingFile.Name())
_, ok := pathSet[p]
_, ok := pathSet[existingFile.Name()]
if !ok {
templatesChanged = true
err := os.Remove(p)
Expand Down
5 changes: 0 additions & 5 deletions pkg/services/ngalert/notifier/config_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -96,11 +96,6 @@ func TestPersistTemplates(t *testing.T) {
files[f.Name()] = string(content)
}

// Given we use a temporary directory in tests, we need to prepend the expected paths with it.
for i, p := range tt.expectedPaths {
tt.expectedPaths[i] = filepath.Join(dir, p)
}

require.Equal(t, tt.expectedError, persistErr)
require.ElementsMatch(t, tt.expectedPaths, paths)
require.Equal(t, tt.expectedChange, changed)
Expand Down
5 changes: 5 additions & 0 deletions pkg/services/ngalert/provisioning/templates.go
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,11 @@ func (t *TemplateService) SetTemplate(ctx context.Context, orgID int64, tmpl def
revision.cfg.TemplateFiles = map[string]string{}
}
revision.cfg.TemplateFiles[tmpl.Name] = tmpl.Template
tmpls := make([]string, 0, len(revision.cfg.TemplateFiles))
for name := range revision.cfg.TemplateFiles {
tmpls = append(tmpls, name)
}
revision.cfg.AlertmanagerConfig.Templates = tmpls

serialized, err := serializeAlertmanagerConfig(*revision.cfg)
if err != nil {
Expand Down

0 comments on commit c16f1f5

Please sign in to comment.