Alerting: Sort NumberCaptureValues in EvaluationString (#71927)

This commit changes extractEvalString to sort NumberCaptureValues
in ascending order of Var before building the output string. This
means that users will see EvaluationString in a consistent order,
but also make it possible to assert its output in tests.
This commit is contained in:
George Robinson 2023-07-19 12:09:21 +01:00 committed by GitHub
parent dbc0642009
commit 89dcaaf049
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 13 additions and 5 deletions

View File

@ -2,6 +2,7 @@ package eval
import (
"fmt"
"sort"
"strings"
"github.com/grafana/grafana-plugin-sdk-go/data"
@ -43,20 +44,20 @@ func extractEvalString(frame *data.Frame) (s string) {
}
if captures, ok := frame.Meta.Custom.([]NumberValueCapture); ok {
// Sort captures in ascending order of "Var" so we can assert in tests
sort.Slice(captures, func(i, j int) bool {
return captures[i].Var < captures[j].Var
})
sb := strings.Builder{}
for i, capture := range captures {
sb.WriteString("[ ")
sb.WriteString(fmt.Sprintf("var='%s' ", capture.Var))
sb.WriteString(fmt.Sprintf("labels={%s} ", capture.Labels))
valString := "null"
if capture.Value != nil {
valString = fmt.Sprintf("%v", *capture.Value)
}
sb.WriteString(fmt.Sprintf("value=%v ", valString))
sb.WriteString("]")
if i < len(captures)-1 {
sb.WriteString(", ")
@ -64,7 +65,6 @@ func extractEvalString(frame *data.Frame) (s string) {
}
return sb.String()
}
return ""
}

View File

@ -40,6 +40,14 @@ func TestExtractEvalString(t *testing.T) {
}, util.Pointer(1.0), withRefID("A")),
outString: `[ var='A0' metric='Test' labels={host=foo} value=32.3 ], [ var='A1' metric='Test' labels={host=baz} value=10 ], [ var='A2' metric='TestA' labels={host=zip} value=11 ]`,
},
{
desc: "Captures are sorted in ascending order of var",
inFrame: newMetaFrame([]NumberValueCapture{
{Var: "B", Labels: data.Labels{"host": "foo"}, Value: util.Pointer(1.0)},
{Var: "A", Labels: data.Labels{"host": "foo"}, Value: util.Pointer(10.0)},
}, util.Pointer(1.0)),
outString: `[ var='A' labels={host=foo} value=10 ], [ var='B' labels={host=foo} value=1 ]`,
},
}
for _, tc := range cases {
t.Run(tc.desc, func(t *testing.T) {