From d5bdc3e90d047b39c7db540a57101fec4836e710 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Philippe=20Qu=C3=A9m=C3=A9ner?= Date: Tue, 7 Nov 2023 12:07:21 +0100 Subject: [PATCH] =?UTF-8?q?[v9.4.x]=20fix(alerting):=20fallback=20to=20das?= =?UTF-8?q?hboard=20to=20get=20the=20full=20targets=E2=80=A6=20(#77779)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [v9.4.x] fix(alerting): fallback to dashboard to get the full targets PART2 --- .../migrations/ualert/alert_rule_graphite.go | 3 +- .../migrations/ualert/alert_rule_test.go | 32 ++++++++++++++----- 2 files changed, 26 insertions(+), 9 deletions(-) diff --git a/pkg/services/sqlstore/migrations/ualert/alert_rule_graphite.go b/pkg/services/sqlstore/migrations/ualert/alert_rule_graphite.go index cb70dacce2a..dd525b0b1cf 100644 --- a/pkg/services/sqlstore/migrations/ualert/alert_rule_graphite.go +++ b/pkg/services/sqlstore/migrations/ualert/alert_rule_graphite.go @@ -66,7 +66,8 @@ func fixGraphiteReferencedSubQueries(l log.Logger, queryData map[string]json.Raw successfulGraphiteMigrationDashboard++ l.Debug("graphite query migration: successfully unwrapped query using the dashboard", "query", fullQueryRaw, "rule_id", ruleID) queryData[graphite.TargetModelField] = b - + // Always delete target full, as it might be set and always used as the first option by the query engine. + delete(queryData, graphite.TargetFullModelField) return queryData } diff --git a/pkg/services/sqlstore/migrations/ualert/alert_rule_test.go b/pkg/services/sqlstore/migrations/ualert/alert_rule_test.go index 5b5863d1ef3..f6f4ebd2c9b 100644 --- a/pkg/services/sqlstore/migrations/ualert/alert_rule_test.go +++ b/pkg/services/sqlstore/migrations/ualert/alert_rule_test.go @@ -14,10 +14,11 @@ import ( func TestMigrateAlertRuleQueries(t *testing.T) { tc := []struct { - name string - input *simplejson.Json - expected string - err error + name string + input *simplejson.Json + expected string + err error + dashboard *dashboards.Dashboard }{ { name: "when a query has a sub query - it is extracted", @@ -25,21 +26,36 @@ func TestMigrateAlertRuleQueries(t *testing.T) { "targetFull": "thisisafullquery", "target": "ahalfquery", }), - expected: `{"target":"thisisafullquery"}`, + expected: `{"target":"thisisafullquery"}`, + dashboard: &dashboards.Dashboard{}, + }, + { + name: "when a query has a sub query that is not fully unwrapped, it unwraps it", + input: simplejson.NewFromAny(map[string]interface{}{ + "refId": "B", + "targetFull": "alias(xxx, #A)", + "target": "alias(#A, #A)", + }), + expected: `{"refId":"B", "target": "alias(xxx, xxx)"}`, + dashboard: &dashboards.Dashboard{ + Data: simplejson.MustJson([]byte(`{"panels":[{"id":0,"targets":[{"refId":"A","target":"xxx"},{"refId":"B","target":"alias(#A, #A)"}]}]}`)), + }, }, { name: "when a query does not have a sub query - it no-ops", input: simplejson.NewFromAny(map[string]interface{}{ "target": "ahalfquery", }), - expected: `{"target":"ahalfquery"}`, + expected: `{"target":"ahalfquery"}`, + dashboard: &dashboards.Dashboard{}, }, { name: "when query was hidden, it removes the flag", input: simplejson.NewFromAny(map[string]interface{}{ "hide": true, }), - expected: `{}`, + expected: `{}`, + dashboard: &dashboards.Dashboard{}, }, } @@ -47,7 +63,7 @@ func TestMigrateAlertRuleQueries(t *testing.T) { t.Run(tt.name, func(t *testing.T) { model, err := tt.input.Encode() require.NoError(t, err) - queries, err := migrateAlertRuleQueries(log.NewNopLogger(), 0, []alertQuery{{Model: model, DatasourceUID: "a"}}, 0, &dashboards.Dashboard{}, map[string]string{"a": "graphite"}) + queries, err := migrateAlertRuleQueries(log.NewNopLogger(), 0, []alertQuery{{Model: model, DatasourceUID: "a"}}, 0, tt.dashboard, map[string]string{"a": "graphite"}) if tt.err != nil { require.Error(t, err) require.EqualError(t, err, tt.err.Error())