grafana/pkg/services/ngalert/models/instance_labels_test.go
Alexander Akhmetov 667fea6623
Alerting: use hash of labels instead of labels string as the alert state cache key (#88956)
* Alerting: use hash instead of labels as the cache key
* Use data.Labels.Fingerprint to calculate the cache key
2024-06-11 18:34:58 +02:00

129 lines
2.6 KiB
Go

package models
import (
"fmt"
"testing"
"github.com/grafana/grafana-plugin-sdk-go/data"
"github.com/stretchr/testify/require"
)
func TestTupleLabelsToLabels(t *testing.T) {
t.Run("converts tupleLabels to InstanceLabels", func(t *testing.T) {
in := tupleLabels{
{"foo", "bar"},
{"baz", "qux"},
}
labels, err := tupleLablesToLabels(in)
require.NoError(t, err)
require.Equal(t, InstanceLabels{
"foo": "bar",
"baz": "qux",
}, labels)
})
t.Run("nil input gives empty output", func(t *testing.T) {
labels, err := tupleLablesToLabels(nil)
require.NoError(t, err)
require.Empty(t, labels)
})
t.Run("duplicate keys are not allowed", func(t *testing.T) {
in := tupleLabels{
{"foo", "bar"},
{"foo", "qux"},
}
_, err := tupleLablesToLabels(in)
require.Error(t, err)
})
}
func TestInstanceLabelsFingerprint(t *testing.T) {
t.Run("returns labels fingerprint", func(t *testing.T) {
labels := InstanceLabels{
"foo": "bar",
"baz": "qux",
}
fingerprint := labels.Fingerprint()
expectedFingerprint := data.Labels(labels).Fingerprint()
require.Equal(t, expectedFingerprint, fingerprint)
})
}
func BenchmarkTupleLabelsToLabels(b *testing.B) {
b.Run("10 labels", func(b *testing.B) {
in := make(tupleLabels, 0, 10)
for i := 0; i < 10; i++ {
key := fmt.Sprintf("key%d", i)
value := fmt.Sprintf("value%d", i)
in = append(in, tupleLabel{key, value})
}
b.ResetTimer()
for i := 0; i < b.N; i++ {
_, err := tupleLablesToLabels(in)
if err != nil {
b.Fatal(err)
}
}
})
b.Run("100 labels", func(b *testing.B) {
in := make(tupleLabels, 0, 100)
for i := 0; i < 100; i++ {
key := fmt.Sprintf("key%d", i)
value := fmt.Sprintf("value%d", i)
in = append(in, tupleLabel{key, value})
}
b.ResetTimer()
for i := 0; i < b.N; i++ {
_, err := tupleLablesToLabels(in)
if err != nil {
b.Fatal(err)
}
}
})
b.Run("10_000 labels", func(b *testing.B) {
in := make(tupleLabels, 0, 10_000)
for i := 0; i < 10_000; i++ {
key := fmt.Sprintf("key%d", i)
value := fmt.Sprintf("value%d", i)
in = append(in, tupleLabel{key, value})
}
b.ResetTimer()
for i := 0; i < b.N; i++ {
_, err := tupleLablesToLabels(in)
if err != nil {
b.Fatal(err)
}
}
})
b.Run("1_000_000 labels", func(b *testing.B) {
in := make(tupleLabels, 0, 1_000_000)
for i := 0; i < 1_000_000; i++ {
key := fmt.Sprintf("key%d", i)
value := fmt.Sprintf("value%d", i)
in = append(in, tupleLabel{key, value})
}
b.ResetTimer()
for i := 0; i < b.N; i++ {
_, err := tupleLablesToLabels(in)
if err != nil {
b.Fatal(err)
}
}
})
}