From b544127d9ac0da0c8c6f2c95ce752c0cfc537b68 Mon Sep 17 00:00:00 2001 From: Dimitar Dimitrov Date: Fri, 4 Oct 2024 12:19:12 +0200 Subject: [PATCH 1/2] ruler: correct logging of alert name The error messages we see in the embedded ruler in Mimir right now are contain `alert="unsupported value type"` and `data="unsupported value type"` ``` ts=2024-10-04T09:59:56.900015691Z caller=alerting.go:384 level=warn component=ruler insight=true user=XXX alert="unsupported value type" msg="Expanding alert template failed" err="error executing template __alert_service_mesh_down_alert: template: __alert_service_mesh_down_alert:1:139: executing \"__alert_service_mesh_down_alert\" at <.registry_name>: can't evaluate field registry_name in type struct { Labels map[string]string; ExternalLabels map[string]string; ExternalURL string; Value interface {} }" data="unsupported value type" ``` Signed-off-by: Dimitar Dimitrov --- rules/alerting.go | 2 +- rules/manager.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/rules/alerting.go b/rules/alerting.go index 2dc0917dce..4fc90d6139 100644 --- a/rules/alerting.go +++ b/rules/alerting.go @@ -381,7 +381,7 @@ func (r *AlertingRule) Eval(ctx context.Context, queryOffset time.Duration, ts t result, err := tmpl.Expand() if err != nil { result = fmt.Sprintf("", err) - level.Warn(r.logger).Log("msg", "Expanding alert template failed", "err", err, "data", tmplData) + level.Warn(r.logger).Log("msg", "Expanding alert template failed", "err", err, "data", fmt.Sprintf("%#v", tmplData)) } return result } diff --git a/rules/manager.go b/rules/manager.go index 9e5b33fbc9..e316a249fa 100644 --- a/rules/manager.go +++ b/rules/manager.go @@ -323,7 +323,7 @@ func (m *Manager) LoadGroups( externalLabels, externalURL, m.restored, - log.With(m.logger, "alert", r.Alert), + log.With(m.logger, "alert", r.Alert.Value), )) continue } From 8b45384a44c56158cdc0fb3bd9b7df419b1cf5ac Mon Sep 17 00:00:00 2001 From: Dimitar Dimitrov Date: Tue, 24 Dec 2024 11:09:33 +0200 Subject: [PATCH 2/2] Make templateData a struct Signed-off-by: Dimitar Dimitrov --- rules/alerting.go | 2 +- template/template.go | 28 ++++++++++++++++++++++------ 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/rules/alerting.go b/rules/alerting.go index 5fe438bd15..7e74c176aa 100644 --- a/rules/alerting.go +++ b/rules/alerting.go @@ -380,7 +380,7 @@ func (r *AlertingRule) Eval(ctx context.Context, queryOffset time.Duration, ts t result, err := tmpl.Expand() if err != nil { result = fmt.Sprintf("", err) - r.logger.Warn("Expanding alert template failed", "err", err, "data", fmt.Sprintf("%#v", tmplData)) + r.logger.Warn("Expanding alert template failed", "err", err, "data", tmplData) } return result } diff --git a/template/template.go b/template/template.go index 0698c6c8ac..610ec722bb 100644 --- a/template/template.go +++ b/template/template.go @@ -280,14 +280,30 @@ func NewTemplateExpander( } } +type templateData struct { + Labels map[string]string + ExternalLabels map[string]string + ExternalURL string + Value interface{} +} + +// String implements fmt.Stringer interface. +func (t templateData) String() string { + labelsString := func(labels map[string]string) string { + // model.LabelSet has a ready String() method, that we can use. + labelSet := make(model.LabelSet, len(t.Labels)) + for k, v := range t.Labels { + labelSet[model.LabelName(k)] = model.LabelValue(v) + } + return labelSet.String() + } + + return fmt.Sprintf("", labelsString(t.Labels), labelsString(t.ExternalLabels), t.ExternalURL, t.Value) +} + // AlertTemplateData returns the interface to be used in expanding the template. func AlertTemplateData(labels, externalLabels map[string]string, externalURL string, smpl promql.Sample) interface{} { - res := struct { - Labels map[string]string - ExternalLabels map[string]string - ExternalURL string - Value interface{} - }{ + res := templateData{ Labels: labels, ExternalLabels: externalLabels, ExternalURL: externalURL,