diff --git a/pkg/prometheus/parse.go b/pkg/prometheus/parse.go index db68257b8..258624333 100644 --- a/pkg/prometheus/parse.go +++ b/pkg/prometheus/parse.go @@ -3,6 +3,7 @@ package prometheus import ( "errors" "io" + "regexp" "strconv" "strings" @@ -80,6 +81,8 @@ func (p *promTextParser) parseToSeries(text []byte) (Series, error) { return p.series, nil } +var reSpace = regexp.MustCompile(`\s+`) + func (p *promTextParser) parseToMetricFamilies(text []byte) (MetricFamilies, error) { p.reset() @@ -101,6 +104,10 @@ func (p *promTextParser) parseToMetricFamilies(text []byte) (MetricFamilies, err name, help := parser.Help() p.setMetricFamilyByName(string(name)) p.currMF.help = string(help) + if strings.IndexByte(p.currMF.help, '\n') != -1 { + // convert multiline to one line because HELP is used as the chart title. + p.currMF.help = reSpace.ReplaceAllString(strings.TrimSpace(p.currMF.help), " ") + } case textparse.EntryType: name, typ := parser.Type() p.setMetricFamilyByName(string(name)) diff --git a/pkg/prometheus/parse_test.go b/pkg/prometheus/parse_test.go index 61851d395..ade471f0d 100644 --- a/pkg/prometheus/parse_test.go +++ b/pkg/prometheus/parse_test.go @@ -16,6 +16,8 @@ import ( ) var ( + dataMultilineHelp, _ = os.ReadFile("testdata/multiline-help.txt") + dataGaugeMeta, _ = os.ReadFile("testdata/gauge-meta.txt") dataGaugeNoMeta, _ = os.ReadFile("testdata/gauge-no-meta.txt") dataCounterMeta, _ = os.ReadFile("testdata/counter-meta.txt") @@ -32,6 +34,7 @@ var ( func Test_testParseDataIsValid(t *testing.T) { for name, data := range map[string][]byte{ + "dataMultilineHelp": dataMultilineHelp, "dataGaugeMeta": dataGaugeMeta, "dataGaugeNoMeta": dataGaugeNoMeta, "dataCounterMeta": dataCounterMeta, @@ -51,6 +54,22 @@ func TestPromTextParser_parseToMetricFamilies(t *testing.T) { input []byte want MetricFamilies }{ + "Gauge with multiline HELP": { + input: dataMultilineHelp, + want: MetricFamilies{ + "test_gauge_metric_1": { + name: "test_gauge_metric_1", + help: "First line. Second line.", + typ: textparse.MetricTypeGauge, + metrics: []Metric{ + { + labels: labels.Labels{{Name: "label1", Value: "value1"}}, + gauge: &Gauge{value: 11}, + }, + }, + }, + }, + }, "Gauge with meta parsed as Gauge": { input: dataGaugeMeta, want: MetricFamilies{ diff --git a/pkg/prometheus/testdata/multiline-help.txt b/pkg/prometheus/testdata/multiline-help.txt new file mode 100644 index 000000000..f1598fcce --- /dev/null +++ b/pkg/prometheus/testdata/multiline-help.txt @@ -0,0 +1,3 @@ +# HELP test_gauge_metric_1 \n First line.\n Second line.\n +# TYPE test_gauge_metric_1 gauge +test_gauge_metric_1{label1="value1"} 11