Skip to content

Commit

Permalink
expfmt/text: optionally include empty MetricFamilies
Browse files Browse the repository at this point in the history
When parsing text format it is sometimes useful to keep all the
MetricFamilies around, even the ones that don't have any timeseries.
This is the case for the testutil library in client_golang where we need
to distinguish registered metrics from erronous inputs.

Signed-off-by: Damien Grisonnet <dgrisonn@redhat.com>
  • Loading branch information
dgrisonnet committed Oct 10, 2024
1 parent dae848d commit a7244c2
Showing 1 changed file with 12 additions and 3 deletions.
15 changes: 12 additions & 3 deletions expfmt/text_parse.go
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,9 @@ type TextParser struct {
// These indicate if the metric name from the current line being parsed is inside
// braces and if that metric name was found respectively.
currentMetricIsInsideBraces, currentMetricInsideBracesIsPresent bool
// Include all MetricFamilies when parsing an input, even the ones for which
// the metric is registered but it doesn't have any timeseries.
includeEmptyMetricFamilies bool
}

// TextToMetricFamilies reads 'in' as the simple and flat text-based exchange
Expand Down Expand Up @@ -109,9 +112,11 @@ func (p *TextParser) TextToMetricFamilies(in io.Reader) (map[string]*dto.MetricF
// Magic happens here...
}
// Get rid of empty metric families.
for k, mf := range p.metricFamiliesByName {
if len(mf.GetMetric()) == 0 {
delete(p.metricFamiliesByName, k)
if !p.includeEmptyMetricFamilies {
for k, mf := range p.metricFamiliesByName {
if len(mf.GetMetric()) == 0 {
delete(p.metricFamiliesByName, k)
}
}
}
// If p.err is io.EOF now, we have run into a premature end of the input
Expand All @@ -124,6 +129,10 @@ func (p *TextParser) TextToMetricFamilies(in io.Reader) (map[string]*dto.MetricF
return p.metricFamiliesByName, p.err
}

func (p *TextParser) IncludeEmptyMetricFamilies(b bool) {
p.includeEmptyMetricFamilies = b
}

func (p *TextParser) reset(in io.Reader) {
p.metricFamiliesByName = map[string]*dto.MetricFamily{}
if p.buf == nil {
Expand Down

0 comments on commit a7244c2

Please sign in to comment.