master
go 54 lines 1.15 KB
Raw
1 package openmetrics
2
3 import (
4 "fmt"
5 "io"
6
7 promLabels "github.com/prometheus/prometheus/model/labels"
8 "github.com/prometheus/prometheus/model/textparse"
9
10 "github.com/netdata/netdata/go/plugins/pkg/prometheus"
11 "github.com/netdata/netdata/go/plugins/pkg/prometheus/selector"
12 )
13
14 type seriesParser struct {
15 selector selector.Selector
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 }