diff --git a/model/textparse/openmetricsparse.go b/model/textparse/openmetricsparse.go index 1432e55f91..83edd7860d 100644 --- a/model/textparse/openmetricsparse.go +++ b/model/textparse/openmetricsparse.go @@ -95,21 +95,26 @@ type OpenMetricsParser struct { exemplarTs int64 hasExemplarTs bool - // lines ending with _created are skipped by default as they are - // parsed by the CreatedTimestamp method. The skipCT flag is set to - // false when the CreatedTimestamp method is called. skipCTSeries bool } + type openMetricsParserOptions struct { - // SkipCT skips the parsing of _created lines. SkipCTSeries bool } +// SkipCTSeries skips the parsing of _created lines. type OpenMetricsOption func(*openMetricsParserOptions) -func WithOMParserCTSeriesSkipped(skipCTSeries bool) OpenMetricsOption { +// WithOMParserCTSeriesSkipped turns off exposing _created lines +// as series, which makes those only used for parsing created timestamp +// for `CreatedTimestamp` method purposes. +// +// It's recommended to use this option to avoid using _created lines for other +// purposes than created timestamp, but leave false by default for the +// best-effort compatibility. +func WithOMParserCTSeriesSkipped() OpenMetricsOption { return func(o *openMetricsParserOptions) { - o.SkipCTSeries = skipCTSeries + o.SkipCTSeries = true } } @@ -124,17 +129,17 @@ func NewOpenMetricsParser(b []byte, st *labels.SymbolTable) Parser { // NewOpenMetricsParserWithOpts returns a new parser of the byte slice with options. func NewOpenMetricsParserWithOpts(b []byte, st *labels.SymbolTable, opts ...OpenMetricsOption) Parser { - parser := &OpenMetricsParser{ - l: &openMetricsLexer{b: b}, - builder: labels.NewScratchBuilderWithSymbolTable(st, 16), - } - DefaultOpenMetricsParserOptions := openMetricsParserOptions{ - SkipCTSeries: true, - } + options := &openMetricsParserOptions{} + for _, opt := range opts { - opt(&DefaultOpenMetricsParserOptions) + opt(options) + } + + parser := &OpenMetricsParser{ + l: &openMetricsLexer{b: b}, + builder: labels.NewScratchBuilderWithSymbolTable(st, 16), + skipCTSeries: options.SkipCTSeries, } - parser.skipCTSeries = DefaultOpenMetricsParserOptions.SkipCTSeries return parser } diff --git a/model/textparse/openmetricsparse_test.go b/model/textparse/openmetricsparse_test.go index f0a0acaa8a..5395d7729a 100644 --- a/model/textparse/openmetricsparse_test.go +++ b/model/textparse/openmetricsparse_test.go @@ -330,7 +330,7 @@ fizz_created 17.0` }, } - p := NewOpenMetricsParserWithOpts([]byte(input), labels.NewSymbolTable(), WithOMParserCTSeriesSkipped(true)) + p := NewOpenMetricsParserWithOpts([]byte(input), labels.NewSymbolTable(), WithOMParserCTSeriesSkipped()) checkParseResults(t, p, exp) } @@ -918,7 +918,7 @@ foobar{quantile="0.99"} 150.0` }, } - p := NewOpenMetricsParserWithOpts([]byte(input), labels.NewSymbolTable(), WithOMParserCTSeriesSkipped(true)) + p := NewOpenMetricsParserWithOpts([]byte(input), labels.NewSymbolTable(), WithOMParserCTSeriesSkipped()) i := 0 var res labels.Labels @@ -955,7 +955,7 @@ go_gc_duration_seconds go_gc_duration_seconds_created`) st := labels.NewSymbolTable() - parser := NewOpenMetricsParserWithOpts(input, st, WithOMParserCTSeriesSkipped(true)).(*OpenMetricsParser) + parser := NewOpenMetricsParserWithOpts(input, st, WithOMParserCTSeriesSkipped()).(*OpenMetricsParser) // Modify the original parser state _, err := parser.Next()