| 16 | } |
| 17 | |
| 18 | func (p *seriesParser) parse(data []byte) (prometheus.Series, error) { |
| 19 | var series prometheus.Series |
| 20 | parser := textparse.NewPromParser(data, promLabels.NewSymbolTable()) |
| 21 | var tmp promLabels.Labels |
| 22 | |
| 23 | for { |
| 24 | entry, err := parser.Next() |
| 25 | if err != nil { |
| 26 | if err == io.EOF { |
| 27 | break |
| 28 | } |
| 29 | if entry == textparse.EntryInvalid { |
| 30 | // Skip invalid metric types and continue. |
| 31 | continue |
| 32 | } |
| 33 | return nil, fmt.Errorf("openmetrics parser: failed to parse metrics: %w", err) |
| 34 | } |
| 35 | |
| 36 | if entry != textparse.EntrySeries { |
| 37 | continue |
| 38 | } |
| 39 | |
| 40 | tmp = tmp[:0] |
| 41 | parser.Metric(&tmp) |
| 42 | |
| 43 | if p.selector != nil && !p.selector.Matches(tmp) { |
| 44 | continue |
| 45 | } |
| 46 | |
| 47 | _, _, value := parser.Series() |
| 48 | labels := append(promLabels.Labels(nil), tmp...) |
| 49 | series.Add(prometheus.SeriesSample{Labels: labels, Value: value}) |
| 50 | } |
| 51 | |
| 52 | series.Sort() |
| 53 | return series, nil |
| 54 | } |