@@ -137,7 +137,7 @@ func TestValidateLabels(t *testing.T) {
137137 },
138138 } {
139139 t .Run (tt .name , func (t * testing.T ) {
140- err := ValidateLabels (MockLimits {
140+ _ , err := ValidateLabels (MockLimits {
141141 MaxLabelNamesPerSeriesValue : 4 ,
142142 MaxLabelNameLengthValue : 12 ,
143143 MaxLabelValueLengthValue : 10 ,
@@ -153,6 +153,82 @@ func TestValidateLabels(t *testing.T) {
153153 }
154154}
155155
156+ func TestValidateLabels_SanitizedLabelsReturned (t * testing.T ) {
157+ for _ , tt := range []struct {
158+ name string
159+ inputLabels []* typesv1.LabelPair
160+ expectedLabels []* typesv1.LabelPair
161+ }{
162+ {
163+ name : "single dotted label is sanitized" ,
164+ inputLabels : []* typesv1.LabelPair {
165+ {Name : model .MetricNameLabel , Value : "cpu" },
166+ {Name : "service_name" , Value : "my-svc" },
167+ {Name : "label.dot" , Value : "val" },
168+ },
169+ expectedLabels : []* typesv1.LabelPair {
170+ {Name : model .MetricNameLabel , Value : "cpu" },
171+ {Name : "label_dot" , Value : "val" },
172+ {Name : "service_name" , Value : "my-svc" },
173+ },
174+ },
175+ {
176+ name : "dotted label merged with existing underscore label" ,
177+ inputLabels : []* typesv1.LabelPair {
178+ {Name : model .MetricNameLabel , Value : "cpu" },
179+ {Name : "service.name" , Value : "my-svc" },
180+ {Name : "service_name" , Value : "my-svc" },
181+ },
182+ expectedLabels : []* typesv1.LabelPair {
183+ {Name : model .MetricNameLabel , Value : "cpu" },
184+ {Name : "service_name" , Value : "my-svc" },
185+ },
186+ },
187+ {
188+ name : "multiple dotted labels sanitized" ,
189+ inputLabels : []* typesv1.LabelPair {
190+ {Name : model .MetricNameLabel , Value : "cpu" },
191+ {Name : "foo.bar" , Value : "val1" },
192+ {Name : "label.dot" , Value : "val2" },
193+ {Name : "service_name" , Value : "my-svc" },
194+ },
195+ expectedLabels : []* typesv1.LabelPair {
196+ {Name : model .MetricNameLabel , Value : "cpu" },
197+ {Name : "foo_bar" , Value : "val1" },
198+ {Name : "label_dot" , Value : "val2" },
199+ {Name : "service_name" , Value : "my-svc" },
200+ },
201+ },
202+ {
203+ name : "labels without dots unchanged" ,
204+ inputLabels : []* typesv1.LabelPair {
205+ {Name : model .MetricNameLabel , Value : "cpu" },
206+ {Name : "service_name" , Value : "my-svc" },
207+ },
208+ expectedLabels : []* typesv1.LabelPair {
209+ {Name : model .MetricNameLabel , Value : "cpu" },
210+ {Name : "service_name" , Value : "my-svc" },
211+ },
212+ },
213+ } {
214+ t .Run (tt .name , func (t * testing.T ) {
215+ result , err := ValidateLabels (MockLimits {
216+ MaxLabelNamesPerSeriesValue : 10 ,
217+ MaxLabelNameLengthValue : 50 ,
218+ MaxLabelValueLengthValue : 50 ,
219+ }, "test-tenant" , tt .inputLabels , log .NewNopLogger ())
220+
221+ require .NoError (t , err )
222+ require .Equal (t , len (tt .expectedLabels ), len (result ), "unexpected number of labels" )
223+
224+ for i , expected := range tt .expectedLabels {
225+ require .Equal (t , expected .Name , result [i ].Name , "label name mismatch at index %d" , i )
226+ require .Equal (t , expected .Value , result [i ].Value , "label value mismatch at index %d" , i )
227+ }
228+ })
229+ }
230+ }
231+
156232func Test_ValidateRangeRequest (t * testing.T ) {
157233 now := model .Now ()
158234 for _ , tt := range []struct {
0 commit comments