Alerting: Better printing of labels (#63348)

This commit changes how labels are printed in templates for custom
annotations and labels from map[foo:bar bar:baz] to foo=bar, bar=baz.
Labels are comma separated, and sorted in increasing order.
This commit is contained in:
George Robinson 2023-02-16 18:04:15 +01:00 committed by GitHub
parent 9e86916d48
commit 0659134793
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 48 additions and 2 deletions

View File

@ -4,6 +4,7 @@ import (
"context" "context"
"math" "math"
"net/url" "net/url"
"sort"
"strconv" "strconv"
"strings" "strings"
"time" "time"
@ -16,10 +17,33 @@ import (
"github.com/grafana/grafana/pkg/services/ngalert/eval" "github.com/grafana/grafana/pkg/services/ngalert/eval"
) )
type Labels map[string]string
// String returns the labels as k=v, comma separated, in increasing order.
func (l Labels) String() string {
// sort the names of the labels in increasing order
sorted := make([]string, 0, len(l))
for k := range l {
sorted = append(sorted, k)
}
sort.Strings(sorted)
// create the string from the sorted labels
b := strings.Builder{}
for i, k := range sorted {
b.WriteString(k)
b.WriteString("=")
b.WriteString(l[k])
if i < len(l)-1 {
b.WriteString(", ")
}
}
return b.String()
}
// Value contains the labels and value of a Reduce, Math or Threshold // Value contains the labels and value of a Reduce, Math or Threshold
// expression for a series. // expression for a series.
type Value struct { type Value struct {
Labels map[string]string Labels Labels
Value float64 Value float64
} }
@ -37,7 +61,7 @@ func NewValues(values map[string]eval.NumberValueCapture) map[string]Value {
f = math.NaN() f = math.NaN()
} }
m[k] = Value{ m[k] = Value{
Labels: v.Labels, Labels: Labels(v.Labels),
Value: f, Value: f,
} }
} }

View File

@ -14,6 +14,28 @@ import (
"github.com/grafana/grafana/pkg/services/ngalert/eval" "github.com/grafana/grafana/pkg/services/ngalert/eval"
) )
func TestLabelsString(t *testing.T) {
tests := []struct {
name string
labels Labels
expected string
}{{
name: "single label has no commas",
labels: Labels{"foo": "bar"},
expected: "foo=bar",
}, {
name: "labels are sorted in increasing order",
labels: Labels{"foo": "bar", "bar": "baz"},
expected: "bar=baz, foo=bar",
}}
for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
assert.Equal(t, test.expected, test.labels.String())
})
}
}
func TestValueString(t *testing.T) { func TestValueString(t *testing.T) {
tests := []struct { tests := []struct {
name string name string