From 8efe1856e22df23b6b67a1d69c451c93e5248cbc Mon Sep 17 00:00:00 2001 From: Ganesh Vernekar <15064823+codesome@users.noreply.github.com> Date: Mon, 12 Jul 2021 18:53:01 +0530 Subject: [PATCH] Alerting: A better and cleaner way to know if Alertmanager is initialised (#36659) Signed-off-by: Ganesh Vernekar --- pkg/services/ngalert/notifier/alertmanager.go | 20 +++++++++---------- pkg/services/ngalert/notifier/alerts.go | 2 +- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/pkg/services/ngalert/notifier/alertmanager.go b/pkg/services/ngalert/notifier/alertmanager.go index 241e79a8c6b..a763e9efb8a 100644 --- a/pkg/services/ngalert/notifier/alertmanager.go +++ b/pkg/services/ngalert/notifier/alertmanager.go @@ -104,8 +104,6 @@ type Alertmanager struct { reloadConfigMtx sync.RWMutex config []byte - - initialised bool } func New(cfg *setting.Cfg, store store.AlertingStore, m *metrics.Metrics) (*Alertmanager, error) { @@ -158,6 +156,16 @@ func New(cfg *setting.Cfg, store store.AlertingStore, m *metrics.Metrics) (*Aler return am, nil } +func (am *Alertmanager) Ready() bool { + // We consider AM as ready only when the config has been + // applied at least once successfully. Until then, some objects + // can still be nil. + am.reloadConfigMtx.RLock() + defer am.reloadConfigMtx.RUnlock() + + return len(am.config) > 0 +} + func (am *Alertmanager) Run(ctx context.Context) error { // Make sure dispatcher starts. We can tolerate future reload failures. if err := am.SyncAndApplyConfigFromDatabase(); err != nil { @@ -272,14 +280,6 @@ func (am *Alertmanager) SyncAndApplyConfigFromDatabase() error { // applyConfig applies a new configuration by re-initializing all components using the configuration provided. // It is not safe to call concurrently. func (am *Alertmanager) applyConfig(cfg *apimodels.PostableUserConfig, rawConfig []byte) (err error) { - defer func() { - if err == nil { - // We consider AM as initialised only when the config has been - // applied at least once successfully. Until then, some objects - // can still be nil. - am.initialised = true - } - }() // First, let's make sure this config is not already loaded var configChanged bool if rawConfig == nil { diff --git a/pkg/services/ngalert/notifier/alerts.go b/pkg/services/ngalert/notifier/alerts.go index 02078db01c3..0bc795d96d8 100644 --- a/pkg/services/ngalert/notifier/alerts.go +++ b/pkg/services/ngalert/notifier/alerts.go @@ -28,7 +28,7 @@ func (am *Alertmanager) GetAlerts(active, silenced, inhibited bool, filter []str res = apimodels.GettableAlerts{} ) - if !am.initialised { + if !am.Ready() { return res, ErrGetAlertsUnavailable }