File tree Expand file tree Collapse file tree 1 file changed +16
-20
lines changed Expand file tree Collapse file tree 1 file changed +16
-20
lines changed Original file line number Diff line number Diff line change @@ -115,32 +115,28 @@ func (d *protoDecoder) Decode(v *dto.MetricFamily) error {
115115// textDecoder implements the Decoder interface for the text protocol.
116116type 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.
123123func (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
You can’t perform that action at this time.
0 commit comments