From a4cc1f6b392f6c3e736a33c6a38d7b4b727b6e0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A1bor=20Farkas?= Date: Thu, 9 Dec 2021 15:16:01 +0100 Subject: [PATCH] loki: alerting: handle curly-braces-style variables (#42933) --- pkg/tsdb/loki/parse_query.go | 15 +++++++++++++++ pkg/tsdb/loki/parse_query_test.go | 8 ++++++++ 2 files changed, 23 insertions(+) diff --git a/pkg/tsdb/loki/parse_query.go b/pkg/tsdb/loki/parse_query.go index 22d57391085..8de9b75a01f 100644 --- a/pkg/tsdb/loki/parse_query.go +++ b/pkg/tsdb/loki/parse_query.go @@ -19,6 +19,14 @@ const ( varRangeMs = "$__range_ms" ) +const ( + varIntervalAlt = "${__interval}" + varIntervalMsAlt = "${__interval_ms}" + varRangeAlt = "${__range}" + varRangeSAlt = "${__range_s}" + varRangeMsAlt = "${__range_ms}" +) + func interpolateVariables(expr string, interval time.Duration, timeRange time.Duration) string { intervalText := intervalv2.FormatDuration(interval) intervalMsText := strconv.FormatInt(int64(interval/time.Millisecond), 10) @@ -34,6 +42,13 @@ func interpolateVariables(expr string, interval time.Duration, timeRange time.Du expr = strings.ReplaceAll(expr, varRangeS, rangeSText) expr = strings.ReplaceAll(expr, varRange, rangeSText+"s") + // this is duplicated code, hopefully this can be handled in a nicer way when + // https://github.com/grafana/grafana/issues/42928 is done. + expr = strings.ReplaceAll(expr, varIntervalMsAlt, intervalMsText) + expr = strings.ReplaceAll(expr, varIntervalAlt, intervalText) + expr = strings.ReplaceAll(expr, varRangeMsAlt, rangeMsText) + expr = strings.ReplaceAll(expr, varRangeSAlt, rangeSText) + expr = strings.ReplaceAll(expr, varRangeAlt, rangeSText+"s") return expr } diff --git a/pkg/tsdb/loki/parse_query_test.go b/pkg/tsdb/loki/parse_query_test.go index ff3098cd420..3df7fa15af6 100644 --- a/pkg/tsdb/loki/parse_query_test.go +++ b/pkg/tsdb/loki/parse_query_test.go @@ -50,4 +50,12 @@ func TestParseQuery(t *testing.T) { require.Equal(t, "go_goroutines 50ms 50 0s 0 250", interpolateVariables(expr, interval, timeRange)) }) + t.Run("interpolate variables, curly-braces syntax", func(t *testing.T) { + expr := "go_goroutines ${__interval} ${__interval_ms} ${__range} ${__range_s} ${__range_ms}" + + interval := time.Second * 2 + timeRange := time.Second * 50 + + require.Equal(t, "go_goroutines 2s 2000 50s 50 50000", interpolateVariables(expr, interval, timeRange)) + }) }