Skip to content

Commit 464c424

Browse files
alanprotstevesg
andauthored
Removing Stale alert manager templates files (#4495)
* Removing Stale alert manager templates files Signed-off-by: Alan Protasio <[email protected]> * Update pkg/alertmanager/multitenant.go Co-authored-by: Steve Simpson <[email protected]> Signed-off-by: Alan Protasio <[email protected]> * Update pkg/alertmanager/multitenant.go Co-authored-by: Steve Simpson <[email protected]> Signed-off-by: Alan Protasio <[email protected]> * Update pkg/alertmanager/multitenant.go Co-authored-by: Steve Simpson <[email protected]> Signed-off-by: Alan Protasio <[email protected]> * Address comments Signed-off-by: Alan Protasio <[email protected]> Co-authored-by: Steve Simpson <[email protected]>
1 parent 19f3802 commit 464c424

File tree

3 files changed

+39
-2
lines changed

3 files changed

+39
-2
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@
6161
* [BUGFIX] Querier: fixed panic when querying exemplars and using `-distributor.shard-by-all-labels=false`. #4473
6262
* [BUGFIX] Querier: honor querier minT,maxT if `nil` SelectHints are passed to Select(). #4413
6363
* [BUGFIX] Compactor: fixed panic while collecting Prometheus metrics. #4483
64+
* [BUGFIX] AlertManager: remove stale template files. #4495
6465

6566

6667
## 1.10.0 / 2021-08-03

pkg/alertmanager/multitenant.go

+21-2
Original file line numberDiff line numberDiff line change
@@ -825,14 +825,25 @@ func (am *MultitenantAlertmanager) setConfig(cfg alertspb.AlertConfigDesc) error
825825
var userAmConfig *amconfig.Config
826826
var err error
827827
var hasTemplateChanges bool
828+
var userTemplateDir = filepath.Join(am.getTenantDirectory(cfg.User), templatesDir)
829+
var pathsToRemove = make(map[string]struct{})
830+
831+
// List existing files to keep track the ones to be removed
832+
if oldTemplateFiles, err := ioutil.ReadDir(userTemplateDir); err == nil {
833+
for _, file := range oldTemplateFiles {
834+
pathsToRemove[filepath.Join(userTemplateDir, file.Name())] = struct{}{}
835+
}
836+
}
828837

829838
for _, tmpl := range cfg.Templates {
830-
templateFilepath, err := safeTemplateFilepath(filepath.Join(am.getTenantDirectory(cfg.User), templatesDir), tmpl.Filename)
839+
templateFilePath, err := safeTemplateFilepath(userTemplateDir, tmpl.Filename)
831840
if err != nil {
832841
return err
833842
}
834843

835-
hasChanged, err := storeTemplateFile(templateFilepath, tmpl.Body)
844+
// Removing from pathsToRemove map the files that still exists in the config
845+
delete(pathsToRemove, templateFilePath)
846+
hasChanged, err := storeTemplateFile(templateFilePath, tmpl.Body)
836847
if err != nil {
837848
return err
838849
}
@@ -842,6 +853,14 @@ func (am *MultitenantAlertmanager) setConfig(cfg alertspb.AlertConfigDesc) error
842853
}
843854
}
844855

856+
for pathToRemove := range pathsToRemove {
857+
err := os.Remove(pathToRemove)
858+
if err != nil {
859+
level.Warn(am.logger).Log("msg", "failed to remove file", "file", pathToRemove, "err", err)
860+
}
861+
hasTemplateChanges = true
862+
}
863+
845864
level.Debug(am.logger).Log("msg", "setting config", "user", cfg.User)
846865

847866
am.alertmanagersMtx.Lock()

pkg/alertmanager/multitenant_test.go

+17
Original file line numberDiff line numberDiff line change
@@ -319,6 +319,23 @@ templates:
319319
cortex_alertmanager_config_last_reload_successful{user="user2"} 1
320320
cortex_alertmanager_config_last_reload_successful{user="user3"} 1
321321
`), "cortex_alertmanager_config_last_reload_successful"))
322+
323+
// Removed template files should be cleaned up
324+
user3Cfg.Templates = []*alertspb.TemplateDesc{
325+
{
326+
Filename: "first.tpl",
327+
Body: `{{ define "t1" }}Template 1 ... {{end}}`,
328+
},
329+
}
330+
331+
require.NoError(t, store.SetAlertConfig(ctx, user3Cfg))
332+
333+
err = am.loadAndSyncConfigs(context.Background(), reasonPeriodic)
334+
require.NoError(t, err)
335+
336+
require.True(t, dirExists(t, user3Dir))
337+
require.True(t, fileExists(t, filepath.Join(user3Dir, templatesDir, "first.tpl")))
338+
require.False(t, fileExists(t, filepath.Join(user3Dir, templatesDir, "second.tpl")))
322339
}
323340

324341
func TestMultitenantAlertmanager_FirewallShouldBlockHTTPBasedReceiversWhenEnabled(t *testing.T) {

0 commit comments

Comments
 (0)