in pkg/prompb/iterator.go [153:233]
func (i *Iterator) parseLabels(ts *TimeSeries, line string) (*TimeSeries, string, error) {
orig := line
line = trimSpacePrefix(line)
if len(line) == 0 {
return nil, "", nil
}
if line[0] == '{' {
line = line[1:]
for len(line) > 0 {
if line[0] == '}' {
return ts, line[1:], nil
}
var idx = -1
for i := 0; i < len(line); i++ {
if line[i] == '=' {
idx = i
break
}
}
if idx == -1 {
return nil, "", fmt.Errorf("invalid label: no =: %s", orig)
}
key := line[:idx]
if len(key) == 0 {
return nil, "", fmt.Errorf("invalid label: no key: %s", orig)
}
line = line[idx+1:]
if len(line) == 0 {
return nil, "", fmt.Errorf("invalid label: no opening \": %s", orig)
}
if line[0] == '"' {
line = line[1:]
}
value := i.buf[:0]
var j int
for j < len(line) {
if line[j] == '\\' {
switch line[j+1] {
case '\\':
value = append(value, '\\')
case '"':
value = append(value, '"')
case 'n':
value = append(value, '\n')
default:
value = append(value, '\\', line[j])
}
j += 2
continue
}
if line[j] == '"' {
line = line[j+1:]
break
}
value = append(value, line[j])
j += 1
}
ts.AppendLabel([]byte(key), value)
if len(line) == 0 {
return nil, "", fmt.Errorf("invalid labels: no closing }: %s", orig)
}
if line[0] == '}' {
return ts, line[1:], nil
}
if line[0] == ',' {
line = line[1:]
}
}
}
return ts, line, nil
}