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 {
115
115
// textDecoder implements the Decoder interface for the text protocol.
116
116
type textDecoder struct {
117
117
r io.Reader
118
- p TextParser
119
- fams [] * dto. MetricFamily
118
+ fams map [ string ] * dto. MetricFamily
119
+ err error
120
120
}
121
121
122
122
// Decode implements the Decoder interface.
123
123
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
137
131
}
138
132
}
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
144
140
}
145
141
146
142
// SampleDecoder wraps a Decoder to extract samples from the metric families
You can’t perform that action at this time.
0 commit comments