Skip to content

Commit d888bfa

Browse files
author
Julien Pivotto
authored
Merge pull request #443 from abursavich/expfmt-decode
expfmt: only call TextParser.TextToMetricFamilies once from textDecoder
2 parents f9c1994 + 5be97a0 commit d888bfa

File tree

1 file changed

+16
-20
lines changed

1 file changed

+16
-20
lines changed

expfmt/decode.go

Lines changed: 16 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -115,32 +115,28 @@ func (d *protoDecoder) Decode(v *dto.MetricFamily) error {
115115
// textDecoder implements the Decoder interface for the text protocol.
116116
type textDecoder struct {
117117
r io.Reader
118-
p TextParser
119-
fams []*dto.MetricFamily
118+
fams map[string]*dto.MetricFamily
119+
err error
120120
}
121121

122122
// Decode implements the Decoder interface.
123123
func (d *textDecoder) Decode(v *dto.MetricFamily) error {
124-
// TODO(fabxc): Wrap this as a line reader to make streaming safer.
125-
if len(d.fams) == 0 {
126-
// No cached metric families, read everything and parse metrics.
127-
fams, err := d.p.TextToMetricFamilies(d.r)
128-
if err != nil {
129-
return err
130-
}
131-
if len(fams) == 0 {
132-
return io.EOF
133-
}
134-
d.fams = make([]*dto.MetricFamily, 0, len(fams))
135-
for _, f := range fams {
136-
d.fams = append(d.fams, f)
124+
if d.err == nil {
125+
// Read all metrics in one shot.
126+
var p TextParser
127+
d.fams, d.err = p.TextToMetricFamilies(d.r)
128+
// If we don't get an error, store io.EOF for the end.
129+
if d.err == nil {
130+
d.err = io.EOF
137131
}
138132
}
139-
140-
*v = *d.fams[0]
141-
d.fams = d.fams[1:]
142-
143-
return nil
133+
// Pick off one MetricFamily per Decode until there's nothing left.
134+
for key, fam := range d.fams {
135+
*v = *fam
136+
delete(d.fams, key)
137+
return nil
138+
}
139+
return d.err
144140
}
145141

146142
// SampleDecoder wraps a Decoder to extract samples from the metric families

0 commit comments

Comments
 (0)