Skip to content

Commit e8695a1

Browse files
committed
update name sanitation to reflect latest definition of what is valid
1 parent 4338db1 commit e8695a1

File tree

2 files changed

+35
-20
lines changed

2 files changed

+35
-20
lines changed

metric.go

+17-10
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ func (m *MetricDefinition) NameWithTags() string {
166166
return m.nameWithTags
167167
}
168168

169-
func (m *MetricDefinition) NameSanitizedAsTagValue() string {
169+
func (m *MetricDefinition) NameSanitizedAsTagValue() (string, error) {
170170
return SanitizeNameAsTagValue(m.Name)
171171
}
172172

@@ -259,20 +259,27 @@ func MetricDefinitionFromMetricData(d *MetricData) *MetricDefinition {
259259
// modifies it to ensure it is a valid value that can be
260260
// used as a tag value. This is important when we index
261261
// metric names as values of the tag "name"
262-
func SanitizeNameAsTagValue(name string) string {
263-
if !strings.Contains(name, "~") {
264-
return name
262+
func SanitizeNameAsTagValue(name string) (string, error) {
263+
if len(name) == 0 {
264+
return name, fmt.Errorf("Invalid name of length 0")
265265
}
266266

267-
sanitized := []byte(name)
268-
for i := 0; i < len(sanitized); i++ {
269-
if sanitized[i] == '~' {
270-
sanitized = append(sanitized[:i], sanitized[i+1:]...)
271-
i--
267+
if name[0] != '~' {
268+
return name, nil
269+
}
270+
271+
i := 1
272+
for ; i < len(name); i++ {
273+
if name[i] != '~' {
274+
break
272275
}
273276
}
274277

275-
return string(sanitized)
278+
if i == len(name) {
279+
return "", fmt.Errorf("Invalid name, requiring other characters than ~")
280+
}
281+
282+
return name[i:], nil
276283
}
277284

278285
// ValidateTags returns whether all tags are in a valid format.

metric_test.go

+18-10
Original file line numberDiff line numberDiff line change
@@ -137,31 +137,39 @@ func TestNameSanitizedAsTagValue(t *testing.T) {
137137
type testCase struct {
138138
originalName string
139139
expectedName string
140+
expectError bool
140141
}
141142
cases := []testCase{
142143
{
143144
originalName: "my~.test.abc",
144-
expectedName: "my.test.abc",
145+
expectedName: "my~.test.abc",
145146
}, {
146-
originalName: "a.b.c",
147+
originalName: "~a.b.c",
147148
expectedName: "a.b.c",
148149
}, {
149150
originalName: "~~a~~.~~~b~~~.~~~c~~~",
150-
expectedName: "a.b.c",
151+
expectedName: "a~~.~~~b~~~.~~~c~~~",
151152
}, {
152-
originalName: "a.b.c~",
153-
expectedName: "a.b.c",
153+
originalName: "~a~",
154+
expectedName: "a~",
154155
}, {
155-
originalName: "~a.b.c",
156-
expectedName: "a.b.c",
156+
originalName: "~",
157+
expectError: true,
157158
}, {
158-
originalName: "~a~",
159-
expectedName: "a",
159+
originalName: "~~~",
160+
expectError: true,
160161
},
161162
}
162163
for i := range cases {
163164
md := MetricDefinition{Name: cases[i].originalName}
164-
sanitized := md.NameSanitizedAsTagValue()
165+
sanitized, err := md.NameSanitizedAsTagValue()
166+
if (err != nil) != cases[i].expectError {
167+
if err == nil {
168+
t.Fatalf("TC %d: Expected an error, but did not get one", i)
169+
} else {
170+
t.Fatalf("TC %d: Got an unexpected error: %s", i, err)
171+
}
172+
}
165173
if sanitized != cases[i].expectedName {
166174
t.Fatalf("TC %d: Expected sanitized version of %s to be %s, but it was %s", i, md.Name, cases[i].expectedName, sanitized)
167175
}

0 commit comments

Comments
 (0)