Cloudwatch: Pass label in deep link (#49160)

* pass label in deep iink

* add unit test

* pr feedback
This commit is contained in:
Erik Sundell 2022-05-23 07:23:38 +02:00 committed by GitHub
parent 1d724810de
commit aac5c9fd22
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 106 additions and 25 deletions

View File

@ -102,7 +102,7 @@ func (q *cloudWatchQuery) isMultiValuedDimensionExpression() bool {
return false
}
func (q *cloudWatchQuery) buildDeepLink(startTime time.Time, endTime time.Time) (string, error) {
func (q *cloudWatchQuery) buildDeepLink(startTime time.Time, endTime time.Time, dynamicLabelEnabled bool) (string, error) {
if q.isMathExpression() || q.MetricQueryType == MetricQueryTypeQuery {
return "", nil
}
@ -117,16 +117,24 @@ func (q *cloudWatchQuery) buildDeepLink(startTime time.Time, endTime time.Time)
}
if q.isSearchExpression() {
link.Metrics = []interface{}{&metricExpression{Expression: q.UsedExpression}}
metricExpressions := &metricExpression{Expression: q.UsedExpression}
if dynamicLabelEnabled {
metricExpressions.Label = q.Label
}
link.Metrics = []interface{}{metricExpressions}
} else {
metricStat := []interface{}{q.Namespace, q.MetricName}
for dimensionKey, dimensionValues := range q.Dimensions {
metricStat = append(metricStat, dimensionKey, dimensionValues[0])
}
metricStat = append(metricStat, &metricStatMeta{
metricStatMeta := &metricStatMeta{
Stat: q.Statistic,
Period: q.Period,
})
}
if dynamicLabelEnabled {
metricStatMeta.Label = q.Label
}
metricStat = append(metricStat, metricStatMeta)
link.Metrics = []interface{}{metricStat}
}

View File

@ -9,27 +9,98 @@ import (
)
func TestCloudWatchQuery(t *testing.T) {
t.Run("Deeplink is not generated for MetricQueryTypeQuery", func(t *testing.T) {
startTime := time.Now()
endTime := startTime.Add(2 * time.Hour)
query := &cloudWatchQuery{
RefId: "A",
Region: "us-east-1",
Expression: "",
Statistic: "Average",
Period: 300,
Id: "id1",
MatchExact: true,
Dimensions: map[string][]string{
"InstanceId": {"i-12345678"},
},
MetricQueryType: MetricQueryTypeQuery,
MetricEditorMode: MetricEditorModeBuilder,
}
t.Run("Deeplink", func(t *testing.T) {
t.Run("is not generated for MetricQueryTypeQuery", func(t *testing.T) {
startTime := time.Now()
endTime := startTime.Add(2 * time.Hour)
query := &cloudWatchQuery{
RefId: "A",
Region: "us-east-1",
Expression: "",
Statistic: "Average",
Period: 300,
Id: "id1",
MatchExact: true,
Dimensions: map[string][]string{
"InstanceId": {"i-12345678"},
},
MetricQueryType: MetricQueryTypeQuery,
MetricEditorMode: MetricEditorModeBuilder,
}
deepLink, err := query.buildDeepLink(startTime, endTime)
require.NoError(t, err)
assert.Empty(t, deepLink)
deepLink, err := query.buildDeepLink(startTime, endTime, false)
require.NoError(t, err)
assert.Empty(t, deepLink)
})
t.Run("does not include label in case dynamic label is diabled", func(t *testing.T) {
startTime := time.Now()
endTime := startTime.Add(2 * time.Hour)
query := &cloudWatchQuery{
RefId: "A",
Region: "us-east-1",
Expression: "",
Statistic: "Average",
Period: 300,
Id: "id1",
MatchExact: true,
Label: "${PROP('Namespace')}",
Dimensions: map[string][]string{
"InstanceId": {"i-12345678"},
},
MetricQueryType: MetricQueryTypeSearch,
MetricEditorMode: MetricEditorModeBuilder,
}
deepLink, err := query.buildDeepLink(startTime, endTime, false)
require.NoError(t, err)
assert.NotContains(t, deepLink, "label")
})
t.Run("includes label in case dynamic label is enabled and it's a metric stat query", func(t *testing.T) {
startTime := time.Now()
endTime := startTime.Add(2 * time.Hour)
query := &cloudWatchQuery{
RefId: "A",
Region: "us-east-1",
Expression: "",
Statistic: "Average",
Period: 300,
Id: "id1",
MatchExact: true,
Label: "${PROP('Namespace')}",
Dimensions: map[string][]string{
"InstanceId": {"i-12345678"},
},
MetricQueryType: MetricQueryTypeSearch,
MetricEditorMode: MetricEditorModeBuilder,
}
deepLink, err := query.buildDeepLink(startTime, endTime, false)
require.NoError(t, err)
assert.NotContains(t, deepLink, "label")
})
t.Run("includes label in case dynamic label is enabled and it's a math expression query", func(t *testing.T) {
startTime := time.Now()
endTime := startTime.Add(2 * time.Hour)
query := &cloudWatchQuery{
RefId: "A",
Region: "us-east-1",
Statistic: "Average",
Expression: "SEARCH(someexpression)",
Period: 300,
Id: "id1",
MatchExact: true,
Label: "${PROP('Namespace')}",
MetricQueryType: MetricQueryTypeSearch,
MetricEditorMode: MetricEditorModeRaw,
}
deepLink, err := query.buildDeepLink(startTime, endTime, false)
require.NoError(t, err)
assert.NotContains(t, deepLink, "label")
})
})
t.Run("SEARCH(someexpression) was specified in the query editor", func(t *testing.T) {

View File

@ -118,7 +118,7 @@ func buildDataFrames(startTime time.Time, endTime time.Time, aggregatedResponse
for _, metric := range aggregatedResponse.Metrics {
label := *metric.Label
deepLink, err := query.buildDeepLink(startTime, endTime)
deepLink, err := query.buildDeepLink(startTime, endTime, dynamicLabelEnabled)
if err != nil {
return nil, err
}

View File

@ -25,11 +25,13 @@ type cloudWatchLink struct {
type metricExpression struct {
Expression string `json:"expression"`
Label string `json:"label,omitempty"`
}
type metricStatMeta struct {
Stat string `json:"stat"`
Period int `json:"period"`
Label string `json:"label,omitempty"`
}
type metricQueryType uint32