github.com/yankunsam/loki/v2@v2.6.3-0.20220817130409-389df5235c27/pkg/logql/log/labels_test.go (about) 1 package log 2 3 import ( 4 "sort" 5 "testing" 6 7 "github.com/prometheus/prometheus/model/labels" 8 "github.com/stretchr/testify/require" 9 10 "github.com/grafana/loki/pkg/logqlmodel" 11 ) 12 13 func TestLabelsBuilder_Get(t *testing.T) { 14 lbs := labels.Labels{labels.Label{Name: "already", Value: "in"}} 15 b := NewBaseLabelsBuilder().ForLabels(lbs, lbs.Hash()) 16 b.Reset() 17 b.Set("foo", "bar") 18 b.Set("bar", "buzz") 19 b.Del("foo") 20 _, ok := b.Get("foo") 21 require.False(t, ok) 22 v, ok := b.Get("bar") 23 require.True(t, ok) 24 require.Equal(t, "buzz", v) 25 v, ok = b.Get("already") 26 require.True(t, ok) 27 require.Equal(t, "in", v) 28 b.Del("bar") 29 _, ok = b.Get("bar") 30 require.False(t, ok) 31 b.Del("already") 32 _, ok = b.Get("already") 33 require.False(t, ok) 34 } 35 36 func TestLabelsBuilder_LabelsError(t *testing.T) { 37 lbs := labels.Labels{labels.Label{Name: "already", Value: "in"}} 38 b := NewBaseLabelsBuilder().ForLabels(lbs, lbs.Hash()) 39 b.Reset() 40 b.SetErr("err") 41 lbsWithErr := b.LabelsResult().Labels() 42 require.Equal( 43 t, 44 labels.Labels{ 45 labels.Label{Name: logqlmodel.ErrorLabel, Value: "err"}, 46 labels.Label{Name: "already", Value: "in"}, 47 }, 48 lbsWithErr, 49 ) 50 // make sure the original labels is unchanged. 51 require.Equal(t, labels.Labels{labels.Label{Name: "already", Value: "in"}}, lbs) 52 } 53 54 func TestLabelsBuilder_LabelsResult(t *testing.T) { 55 lbs := labels.Labels{ 56 labels.Label{Name: "namespace", Value: "loki"}, 57 labels.Label{Name: "job", Value: "us-central1/loki"}, 58 labels.Label{Name: "cluster", Value: "us-central1"}, 59 } 60 sort.Sort(lbs) 61 b := NewBaseLabelsBuilder().ForLabels(lbs, lbs.Hash()) 62 b.Reset() 63 assertLabelResult(t, lbs, b.LabelsResult()) 64 b.SetErr("err") 65 withErr := append(lbs, labels.Label{Name: logqlmodel.ErrorLabel, Value: "err"}) 66 sort.Sort(withErr) 67 assertLabelResult(t, withErr, b.LabelsResult()) 68 69 b.Set("foo", "bar") 70 b.Set("namespace", "tempo") 71 b.Set("buzz", "fuzz") 72 b.Del("job") 73 expected := labels.Labels{ 74 labels.Label{Name: logqlmodel.ErrorLabel, Value: "err"}, 75 labels.Label{Name: "namespace", Value: "tempo"}, 76 labels.Label{Name: "cluster", Value: "us-central1"}, 77 labels.Label{Name: "foo", Value: "bar"}, 78 labels.Label{Name: "buzz", Value: "fuzz"}, 79 } 80 sort.Sort(expected) 81 assertLabelResult(t, expected, b.LabelsResult()) 82 // cached. 83 assertLabelResult(t, expected, b.LabelsResult()) 84 } 85 86 func TestLabelsBuilder_GroupedLabelsResult(t *testing.T) { 87 lbs := labels.Labels{ 88 labels.Label{Name: "namespace", Value: "loki"}, 89 labels.Label{Name: "job", Value: "us-central1/loki"}, 90 labels.Label{Name: "cluster", Value: "us-central1"}, 91 } 92 sort.Sort(lbs) 93 b := NewBaseLabelsBuilderWithGrouping([]string{"namespace"}, nil, false, false).ForLabels(lbs, lbs.Hash()) 94 b.Reset() 95 assertLabelResult(t, labels.Labels{labels.Label{Name: "namespace", Value: "loki"}}, b.GroupedLabels()) 96 b.SetErr("err") 97 withErr := append(lbs, labels.Label{Name: logqlmodel.ErrorLabel, Value: "err"}) 98 sort.Sort(withErr) 99 assertLabelResult(t, withErr, b.GroupedLabels()) 100 101 b.Reset() 102 b.Set("foo", "bar") 103 b.Set("namespace", "tempo") 104 b.Set("buzz", "fuzz") 105 b.Del("job") 106 expected := labels.Labels{ 107 labels.Label{Name: "namespace", Value: "tempo"}, 108 } 109 sort.Sort(expected) 110 assertLabelResult(t, expected, b.GroupedLabels()) 111 // cached. 112 assertLabelResult(t, expected, b.GroupedLabels()) 113 114 b = NewBaseLabelsBuilderWithGrouping([]string{"job"}, nil, false, false).ForLabels(lbs, lbs.Hash()) 115 assertLabelResult(t, labels.Labels{labels.Label{Name: "job", Value: "us-central1/loki"}}, b.GroupedLabels()) 116 assertLabelResult(t, labels.Labels{labels.Label{Name: "job", Value: "us-central1/loki"}}, b.GroupedLabels()) 117 b.Del("job") 118 assertLabelResult(t, labels.Labels{}, b.GroupedLabels()) 119 b.Reset() 120 b.Set("namespace", "tempo") 121 assertLabelResult(t, labels.Labels{labels.Label{Name: "job", Value: "us-central1/loki"}}, b.GroupedLabels()) 122 123 b = NewBaseLabelsBuilderWithGrouping([]string{"job"}, nil, true, false).ForLabels(lbs, lbs.Hash()) 124 b.Del("job") 125 b.Set("foo", "bar") 126 b.Set("job", "something") 127 expected = labels.Labels{ 128 labels.Label{Name: "namespace", Value: "loki"}, 129 labels.Label{Name: "cluster", Value: "us-central1"}, 130 labels.Label{Name: "foo", Value: "bar"}, 131 } 132 sort.Sort(expected) 133 assertLabelResult(t, expected, b.GroupedLabels()) 134 135 b = NewBaseLabelsBuilderWithGrouping(nil, nil, false, false).ForLabels(lbs, lbs.Hash()) 136 b.Set("foo", "bar") 137 b.Set("job", "something") 138 expected = labels.Labels{ 139 labels.Label{Name: "namespace", Value: "loki"}, 140 labels.Label{Name: "job", Value: "something"}, 141 labels.Label{Name: "cluster", Value: "us-central1"}, 142 labels.Label{Name: "foo", Value: "bar"}, 143 } 144 sort.Sort(expected) 145 assertLabelResult(t, expected, b.GroupedLabels()) 146 } 147 148 func assertLabelResult(t *testing.T, lbs labels.Labels, res LabelsResult) { 149 t.Helper() 150 require.Equal(t, 151 lbs, 152 res.Labels(), 153 ) 154 require.Equal(t, 155 lbs.Hash(), 156 res.Hash(), 157 ) 158 require.Equal(t, 159 lbs.String(), 160 res.String(), 161 ) 162 }