diff --git a/collector/fixtures/textfile/metrics_merge_different_and_no_help.out b/collector/fixtures/textfile/metrics_merge_different_and_no_help.out new file mode 100644 index 0000000000..911899b196 --- /dev/null +++ b/collector/fixtures/textfile/metrics_merge_different_and_no_help.out @@ -0,0 +1,14 @@ +# HELP events_total A nice help message. +# TYPE events_total counter +events_total{file="a",foo="bar"} 10 +events_total{file="a",foo="baz"} 20 +events_total{file="c",foo="bar"} 50 +events_total{file="c",foo="baz"} 60 +# HELP node_textfile_mtime_seconds Unixtime mtime of textfiles successfully read. +# TYPE node_textfile_mtime_seconds gauge +node_textfile_mtime_seconds{file="fixtures/textfile/metrics_merge_different_and_no_help/a.prom"} 1 +node_textfile_mtime_seconds{file="fixtures/textfile/metrics_merge_different_and_no_help/b.prom"} 1 +node_textfile_mtime_seconds{file="fixtures/textfile/metrics_merge_different_and_no_help/c.prom"} 1 +# HELP node_textfile_scrape_error 1 if there was an error opening or reading a file, 0 otherwise +# TYPE node_textfile_scrape_error gauge +node_textfile_scrape_error 1 diff --git a/collector/fixtures/textfile/metrics_merge_different_and_no_help/a.prom b/collector/fixtures/textfile/metrics_merge_different_and_no_help/a.prom new file mode 100644 index 0000000000..9188bbdeec --- /dev/null +++ b/collector/fixtures/textfile/metrics_merge_different_and_no_help/a.prom @@ -0,0 +1,5 @@ +# HELP events_total A nice help message. +# TYPE events_total counter +events_total{foo="bar",file="a"} 10 +events_total{foo="baz",file="a"} 20 + diff --git a/collector/fixtures/textfile/metrics_merge_different_and_no_help/b.prom b/collector/fixtures/textfile/metrics_merge_different_and_no_help/b.prom new file mode 100644 index 0000000000..259d43d0a5 --- /dev/null +++ b/collector/fixtures/textfile/metrics_merge_different_and_no_help/b.prom @@ -0,0 +1,5 @@ +# HELP events_total A different help message. +# TYPE events_total counter +events_total{foo="bar",file="b"} 30 +events_total{foo="baz",file="b"} 40 + diff --git a/collector/fixtures/textfile/metrics_merge_different_and_no_help/c.prom b/collector/fixtures/textfile/metrics_merge_different_and_no_help/c.prom new file mode 100644 index 0000000000..3fc8cf870f --- /dev/null +++ b/collector/fixtures/textfile/metrics_merge_different_and_no_help/c.prom @@ -0,0 +1,3 @@ +# TYPE events_total counter +events_total{foo="bar",file="c"} 50 +events_total{foo="baz",file="c"} 60 diff --git a/collector/fixtures/textfile/metrics_merge_partial_help.out b/collector/fixtures/textfile/metrics_merge_partial_help.out new file mode 100644 index 0000000000..c70a678e81 --- /dev/null +++ b/collector/fixtures/textfile/metrics_merge_partial_help.out @@ -0,0 +1,16 @@ +# HELP events_total A nice help message. +# TYPE events_total counter +events_total{file="a",foo="bar"} 10 +events_total{file="a",foo="baz"} 20 +events_total{file="b",foo="bar"} 30 +events_total{file="b",foo="baz"} 40 +events_total{file="c",foo="bar"} 50 +events_total{file="c",foo="baz"} 60 +# HELP node_textfile_mtime_seconds Unixtime mtime of textfiles successfully read. +# TYPE node_textfile_mtime_seconds gauge +node_textfile_mtime_seconds{file="fixtures/textfile/metrics_merge_partial_help/a.prom"} 1 +node_textfile_mtime_seconds{file="fixtures/textfile/metrics_merge_partial_help/b.prom"} 1 +node_textfile_mtime_seconds{file="fixtures/textfile/metrics_merge_partial_help/c.prom"} 1 +# HELP node_textfile_scrape_error 1 if there was an error opening or reading a file, 0 otherwise +# TYPE node_textfile_scrape_error gauge +node_textfile_scrape_error 0 diff --git a/collector/fixtures/textfile/metrics_merge_partial_help/a.prom b/collector/fixtures/textfile/metrics_merge_partial_help/a.prom new file mode 100644 index 0000000000..1b6e29aa97 --- /dev/null +++ b/collector/fixtures/textfile/metrics_merge_partial_help/a.prom @@ -0,0 +1,3 @@ +# TYPE events_total counter +events_total{foo="bar",file="a"} 10 +events_total{foo="baz",file="a"} 20 diff --git a/collector/fixtures/textfile/metrics_merge_partial_help/b.prom b/collector/fixtures/textfile/metrics_merge_partial_help/b.prom new file mode 100644 index 0000000000..e6ac9efd8e --- /dev/null +++ b/collector/fixtures/textfile/metrics_merge_partial_help/b.prom @@ -0,0 +1,4 @@ +# HELP events_total A nice help message. +# TYPE events_total counter +events_total{foo="bar",file="b"} 30 +events_total{foo="baz",file="b"} 40 diff --git a/collector/fixtures/textfile/metrics_merge_partial_help/c.prom b/collector/fixtures/textfile/metrics_merge_partial_help/c.prom new file mode 100644 index 0000000000..3fc8cf870f --- /dev/null +++ b/collector/fixtures/textfile/metrics_merge_partial_help/c.prom @@ -0,0 +1,3 @@ +# TYPE events_total counter +events_total{foo="bar",file="c"} 50 +events_total{foo="baz",file="c"} 60 diff --git a/collector/textfile.go b/collector/textfile.go index 6629eb9d8e..0dc0c562ed 100644 --- a/collector/textfile.go +++ b/collector/textfile.go @@ -217,8 +217,9 @@ func (c *textFileCollector) Update(ch chan<- prometheus.Metric) error { for _, mf := range families { // Check for metrics with inconsistent help texts and take the first help text occurrence. - if helpTexts, seen := metricsNamesToHelpTexts[*mf.Name]; seen { - if mf.Help != nil && helpTexts[0] != *mf.Help || helpTexts[1] != "" { + // Families without a help text can't conflict; they inherit one below. + if mf.Help != nil { + if helpTexts, seen := metricsNamesToHelpTexts[*mf.Name]; seen && (helpTexts[0] != *mf.Help || helpTexts[1] != "") { metricsNamesToHelpTexts[*mf.Name] = [2]string{helpTexts[0], *mf.Help} errored = true c.logger.Error("inconsistent metric help text", @@ -229,8 +230,6 @@ func (c *textFileCollector) Update(ch chan<- prometheus.Metric) error { "file", metricsNamesToFiles[*mf.Name][0]) continue } - } - if mf.Help != nil { metricsNamesToHelpTexts[*mf.Name] = [2]string{*mf.Help} } metricsNamesToFiles[*mf.Name] = append(metricsNamesToFiles[*mf.Name], metricsFilePath) @@ -247,7 +246,12 @@ func (c *textFileCollector) Update(ch chan<- prometheus.Metric) error { } } - mfHelp := make(map[string]*string) + // Families without a help text take the one another file gave for the same metric, + // so that all families of a metric share the same help text when they are merged. + mfHelp := make(map[string]*string, len(metricsNamesToHelpTexts)) + for name, helpTexts := range metricsNamesToHelpTexts { + mfHelp[name] = &helpTexts[0] + } for _, mf := range parsedFamilies { if mf.Help == nil { if help, ok := mfHelp[*mf.Name]; ok { diff --git a/collector/textfile_test.go b/collector/textfile_test.go index 5b9f701ccd..5ff25d57da 100644 --- a/collector/textfile_test.go +++ b/collector/textfile_test.go @@ -121,6 +121,14 @@ func TestTextfileCollector(t *testing.T) { paths: []string{"fixtures/textfile/metrics_merge_different_help"}, out: "fixtures/textfile/metrics_merge_different_help.out", }, + { + paths: []string{"fixtures/textfile/metrics_merge_partial_help"}, + out: "fixtures/textfile/metrics_merge_partial_help.out", + }, + { + paths: []string{"fixtures/textfile/metrics_merge_different_and_no_help"}, + out: "fixtures/textfile/metrics_merge_different_and_no_help.out", + }, } for i, test := range tests {