From f39c46a1b525cf2d814337fea3d7d7e970522725 Mon Sep 17 00:00:00 2001 From: "Grot (@grafanabot)" <43478413+grafanabot@users.noreply.github.com> Date: Mon, 30 Jan 2023 21:34:40 +0000 Subject: [PATCH] [v9.4.x] Alerting: Configurable externalLabels for Loki state history (#62517) Alerting: Configurable externalLabels for Loki state history (#62404) * Add config option for external labels * Remove redundant nilcheck (cherry picked from commit b4682fe3cbb37bf7efdaa3fe6645544782f36237) Co-authored-by: Alexander Weaver --- pkg/services/ngalert/state/historian/loki.go | 19 ++++++++++++++----- .../ngalert/state/historian/loki_http.go | 1 + pkg/setting/setting_unified_alerting.go | 3 +++ 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/pkg/services/ngalert/state/historian/loki.go b/pkg/services/ngalert/state/historian/loki.go index f3bd9f5661d..80e9ce601a1 100644 --- a/pkg/services/ngalert/state/historian/loki.go +++ b/pkg/services/ngalert/state/historian/loki.go @@ -29,15 +29,17 @@ type remoteLokiClient interface { } type RemoteLokiBackend struct { - client remoteLokiClient - log log.Logger + client remoteLokiClient + externalLabels map[string]string + log log.Logger } func NewRemoteLokiBackend(cfg LokiConfig) *RemoteLokiBackend { logger := log.New("ngalert.state.historian", "backend", "loki") return &RemoteLokiBackend{ - client: newLokiClient(cfg, logger), - log: logger, + client: newLokiClient(cfg, logger), + externalLabels: cfg.ExternalLabels, + log: logger, } } @@ -62,7 +64,7 @@ func (h *RemoteLokiBackend) statesToStreams(rule history_model.RuleMeta, states continue } - labels := removePrivateLabels(state.State.Labels) + labels := h.addExternalLabels(removePrivateLabels(state.State.Labels)) labels[OrgIDLabel] = fmt.Sprint(rule.OrgID) labels[RuleUIDLabel] = fmt.Sprint(rule.UID) labels[GroupLabel] = fmt.Sprint(rule.Group) @@ -124,6 +126,13 @@ func (h *RemoteLokiBackend) recordStreams(ctx context.Context, streams []stream, return nil } +func (h *RemoteLokiBackend) addExternalLabels(labels data.Labels) data.Labels { + for k, v := range h.externalLabels { + labels[k] = v + } + return labels +} + type lokiEntry struct { SchemaVersion int `json:"schemaVersion"` Previous string `json:"previous"` diff --git a/pkg/services/ngalert/state/historian/loki_http.go b/pkg/services/ngalert/state/historian/loki_http.go index 708c48965a9..c82dd0f4a4f 100644 --- a/pkg/services/ngalert/state/historian/loki_http.go +++ b/pkg/services/ngalert/state/historian/loki_http.go @@ -20,6 +20,7 @@ type LokiConfig struct { BasicAuthUser string BasicAuthPassword string TenantID string + ExternalLabels map[string]string } type httpLokiClient struct { diff --git a/pkg/setting/setting_unified_alerting.go b/pkg/setting/setting_unified_alerting.go index d417be97417..97fe0dcb016 100644 --- a/pkg/setting/setting_unified_alerting.go +++ b/pkg/setting/setting_unified_alerting.go @@ -108,6 +108,7 @@ type UnifiedAlertingStateHistorySettings struct { // if one of them is set. LokiBasicAuthPassword string LokiBasicAuthUsername string + ExternalLabels map[string]string } // IsEnabled returns true if UnifiedAlertingSettings.Enabled is either nil or true. @@ -317,6 +318,7 @@ func (cfg *Cfg) ReadUnifiedAlertingSettings(iniFile *ini.File) error { uaCfg.ReservedLabels = uaCfgReservedLabels stateHistory := iniFile.Section("unified_alerting.state_history") + stateHistoryLabels := iniFile.Section("unified_alerting.state_history.external_labels") uaCfgStateHistory := UnifiedAlertingStateHistorySettings{ Enabled: stateHistory.Key("enabled").MustBool(stateHistoryDefaultEnabled), Backend: stateHistory.Key("backend").MustString("annotations"), @@ -324,6 +326,7 @@ func (cfg *Cfg) ReadUnifiedAlertingSettings(iniFile *ini.File) error { LokiTenantID: stateHistory.Key("loki_tenant_id").MustString(""), LokiBasicAuthUsername: stateHistory.Key("loki_basic_auth_username").MustString(""), LokiBasicAuthPassword: stateHistory.Key("loki_basic_auth_password").MustString(""), + ExternalLabels: stateHistoryLabels.KeysHash(), } uaCfg.StateHistory = uaCfgStateHistory