mirror of
				https://github.com/prometheus/node_exporter.git
				synced 2025-08-20 18:33:52 -07:00 
			
		
		
		
	Filter out testfile metrics correctly when using collect[] filters (#763)
				
					
				
			* remove injection hook for textfile metrics, convert them to prometheus format * add support for summaries * add support for histograms * add logic for handling inconsistent labels within a metric family for counter, gauge, untyped * change logic for parsing the metrics textfile * fix logic to adding missing labels * Export time and error metrics for textfiles * Add tests for new textfile collector, fix found bugs * refactor Update() to split into smaller functions * remove parseTextFiles(), fix import issue * add mtime metric directly to channel, fix handling of mtime during testing * rename variables related to labels * refactor: add default case, remove if guard for metrics, remove extra loop and slice * refactor: remove extra loop iterating over metric families * test: add test case for different metric type, fix found bug * test: add test for metrics with inconsistent labels * test: add test for histogram * test: add test for histogram with extra dimension * test: add test for summary * test: add test for summary with extra dimension * remove unnecessary creation of protobuf * nit: remove extra blank line
This commit is contained in:
		
							parent
							
								
									cd2a17176a
								
							
						
					
					
						commit
						1f2458f42c
					
				
							
								
								
									
										32
									
								
								collector/fixtures/textfile/different_metric_types.out
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								collector/fixtures/textfile/different_metric_types.out
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,32 @@ | |||
| # HELP event_duration_seconds_total Query timings | ||||
| # TYPE event_duration_seconds_total summary | ||||
| event_duration_seconds_total{baz="inner_eval",quantile="0.5"} 1.073e-06 | ||||
| event_duration_seconds_total{baz="inner_eval",quantile="0.9"} 1.928e-06 | ||||
| event_duration_seconds_total{baz="inner_eval",quantile="0.99"} 4.35e-06 | ||||
| event_duration_seconds_total_sum{baz="inner_eval"} 1.8652166505091474e+06 | ||||
| event_duration_seconds_total_count{baz="inner_eval"} 1.492355615e+09 | ||||
| event_duration_seconds_total{baz="prepare_time",quantile="0.5"} 4.283e-06 | ||||
| event_duration_seconds_total{baz="prepare_time",quantile="0.9"} 7.796e-06 | ||||
| event_duration_seconds_total{baz="prepare_time",quantile="0.99"} 2.2083e-05 | ||||
| event_duration_seconds_total_sum{baz="prepare_time"} 840923.7919437207 | ||||
| event_duration_seconds_total_count{baz="prepare_time"} 1.492355814e+09 | ||||
| event_duration_seconds_total{baz="result_append",quantile="0.5"} 1.566e-06 | ||||
| event_duration_seconds_total{baz="result_append",quantile="0.9"} 3.223e-06 | ||||
| event_duration_seconds_total{baz="result_append",quantile="0.99"} 6.53e-06 | ||||
| event_duration_seconds_total_sum{baz="result_append"} 4.404109951000078 | ||||
| event_duration_seconds_total_count{baz="result_append"} 1.427647e+06 | ||||
| event_duration_seconds_total{baz="result_sort",quantile="0.5"} 1.847e-06 | ||||
| event_duration_seconds_total{baz="result_sort",quantile="0.9"} 2.975e-06 | ||||
| event_duration_seconds_total{baz="result_sort",quantile="0.99"} 4.08e-06 | ||||
| event_duration_seconds_total_sum{baz="result_sort"} 3.4123187829998307 | ||||
| event_duration_seconds_total_count{baz="result_sort"} 1.427647e+06 | ||||
| # HELP events_total this is a test metric | ||||
| # TYPE events_total counter | ||||
| events_total{foo="bar"} 10 | ||||
| events_total{foo="baz"} 20 | ||||
| # HELP node_textfile_mtime Unixtime mtime of textfiles successfully read. | ||||
| # TYPE node_textfile_mtime gauge | ||||
| node_textfile_mtime{file="metrics.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 | ||||
|  | @ -0,0 +1,28 @@ | |||
| # HELP events_total this is a test metric | ||||
| # TYPE events_total counter | ||||
| events_total{foo="bar"} 10 | ||||
| events_total{foo="baz"} 20 | ||||
| 
 | ||||
| # HELP event_duration_seconds_total Query timings | ||||
| # TYPE event_duration_seconds_total summary | ||||
| event_duration_seconds_total{baz="inner_eval",quantile="0.5"} 1.073e-06 | ||||
| event_duration_seconds_total{baz="inner_eval",quantile="0.9"} 1.928e-06 | ||||
| event_duration_seconds_total{baz="inner_eval",quantile="0.99"} 4.35e-06 | ||||
| event_duration_seconds_total_sum{baz="inner_eval"} 1.8652166505091474e+06 | ||||
| event_duration_seconds_total_count{baz="inner_eval"} 1.492355615e+09 | ||||
| event_duration_seconds_total{baz="prepare_time",quantile="0.5"} 4.283e-06 | ||||
| event_duration_seconds_total{baz="prepare_time",quantile="0.9"} 7.796e-06 | ||||
| event_duration_seconds_total{baz="prepare_time",quantile="0.99"} 2.2083e-05 | ||||
| event_duration_seconds_total_sum{baz="prepare_time"} 840923.7919437207 | ||||
| event_duration_seconds_total_count{baz="prepare_time"} 1.492355814e+09 | ||||
| event_duration_seconds_total{baz="result_append",quantile="0.5"} 1.566e-06 | ||||
| event_duration_seconds_total{baz="result_append",quantile="0.9"} 3.223e-06 | ||||
| event_duration_seconds_total{baz="result_append",quantile="0.99"} 6.53e-06 | ||||
| event_duration_seconds_total_sum{baz="result_append"} 4.404109951000078 | ||||
| event_duration_seconds_total_count{baz="result_append"} 1.427647e+06 | ||||
| event_duration_seconds_total{baz="result_sort",quantile="0.5"} 1.847e-06 | ||||
| event_duration_seconds_total{baz="result_sort",quantile="0.9"} 2.975e-06 | ||||
| event_duration_seconds_total{baz="result_sort",quantile="0.99"} 4.08e-06 | ||||
| event_duration_seconds_total_sum{baz="result_sort"} 3.4123187829998307 | ||||
| event_duration_seconds_total_count{baz="result_sort"} 1.427647e+06 | ||||
| 
 | ||||
							
								
								
									
										21
									
								
								collector/fixtures/textfile/histogram.out
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								collector/fixtures/textfile/histogram.out
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,21 @@ | |||
| # HELP node_textfile_mtime Unixtime mtime of textfiles successfully read. | ||||
| # TYPE node_textfile_mtime gauge | ||||
| node_textfile_mtime{file="metrics.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 | ||||
| # HELP prometheus_tsdb_compaction_chunk_range Final time range of chunks on their first compaction | ||||
| # TYPE prometheus_tsdb_compaction_chunk_range histogram | ||||
| prometheus_tsdb_compaction_chunk_range_bucket{le="100"} 0 | ||||
| prometheus_tsdb_compaction_chunk_range_bucket{le="400"} 0 | ||||
| prometheus_tsdb_compaction_chunk_range_bucket{le="1600"} 0 | ||||
| prometheus_tsdb_compaction_chunk_range_bucket{le="6400"} 0 | ||||
| prometheus_tsdb_compaction_chunk_range_bucket{le="25600"} 7 | ||||
| prometheus_tsdb_compaction_chunk_range_bucket{le="102400"} 7 | ||||
| prometheus_tsdb_compaction_chunk_range_bucket{le="409600"} 1.412839e+06 | ||||
| prometheus_tsdb_compaction_chunk_range_bucket{le="1.6384e+06"} 1.69185e+06 | ||||
| prometheus_tsdb_compaction_chunk_range_bucket{le="6.5536e+06"} 1.691853e+06 | ||||
| prometheus_tsdb_compaction_chunk_range_bucket{le="2.62144e+07"} 1.691853e+06 | ||||
| prometheus_tsdb_compaction_chunk_range_bucket{le="+Inf"} 1.691853e+06 | ||||
| prometheus_tsdb_compaction_chunk_range_sum 6.71393432189e+11 | ||||
| prometheus_tsdb_compaction_chunk_range_count 1.691853e+06 | ||||
							
								
								
									
										15
									
								
								collector/fixtures/textfile/histogram/metrics.prom
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								collector/fixtures/textfile/histogram/metrics.prom
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,15 @@ | |||
| # HELP prometheus_tsdb_compaction_chunk_range Final time range of chunks on their first compaction | ||||
| # TYPE prometheus_tsdb_compaction_chunk_range histogram | ||||
| prometheus_tsdb_compaction_chunk_range_bucket{le="100"} 0 | ||||
| prometheus_tsdb_compaction_chunk_range_bucket{le="400"} 0 | ||||
| prometheus_tsdb_compaction_chunk_range_bucket{le="1600"} 0 | ||||
| prometheus_tsdb_compaction_chunk_range_bucket{le="6400"} 0 | ||||
| prometheus_tsdb_compaction_chunk_range_bucket{le="25600"} 7 | ||||
| prometheus_tsdb_compaction_chunk_range_bucket{le="102400"} 7 | ||||
| prometheus_tsdb_compaction_chunk_range_bucket{le="409600"} 1.412839e+06 | ||||
| prometheus_tsdb_compaction_chunk_range_bucket{le="1.6384e+06"} 1.69185e+06 | ||||
| prometheus_tsdb_compaction_chunk_range_bucket{le="6.5536e+06"} 1.691853e+06 | ||||
| prometheus_tsdb_compaction_chunk_range_bucket{le="2.62144e+07"} 1.691853e+06 | ||||
| prometheus_tsdb_compaction_chunk_range_bucket{le="+Inf"} 1.691853e+06 | ||||
| prometheus_tsdb_compaction_chunk_range_sum 6.71393432189e+11 | ||||
| prometheus_tsdb_compaction_chunk_range_count 1.691853e+06 | ||||
							
								
								
									
										34
									
								
								collector/fixtures/textfile/histogram_extra_dimension.out
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								collector/fixtures/textfile/histogram_extra_dimension.out
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,34 @@ | |||
| # HELP node_textfile_mtime Unixtime mtime of textfiles successfully read. | ||||
| # TYPE node_textfile_mtime gauge | ||||
| node_textfile_mtime{file="metrics.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 | ||||
| # HELP prometheus_tsdb_compaction_chunk_range Final time range of chunks on their first compaction | ||||
| # TYPE prometheus_tsdb_compaction_chunk_range histogram | ||||
| prometheus_tsdb_compaction_chunk_range_bucket{foo="bar",le="100"} 0 | ||||
| prometheus_tsdb_compaction_chunk_range_bucket{foo="bar",le="400"} 0 | ||||
| prometheus_tsdb_compaction_chunk_range_bucket{foo="bar",le="1600"} 0 | ||||
| prometheus_tsdb_compaction_chunk_range_bucket{foo="bar",le="6400"} 0 | ||||
| prometheus_tsdb_compaction_chunk_range_bucket{foo="bar",le="25600"} 7 | ||||
| prometheus_tsdb_compaction_chunk_range_bucket{foo="bar",le="102400"} 7 | ||||
| prometheus_tsdb_compaction_chunk_range_bucket{foo="bar",le="409600"} 1.412839e+06 | ||||
| prometheus_tsdb_compaction_chunk_range_bucket{foo="bar",le="1.6384e+06"} 1.69185e+06 | ||||
| prometheus_tsdb_compaction_chunk_range_bucket{foo="bar",le="6.5536e+06"} 1.691853e+06 | ||||
| prometheus_tsdb_compaction_chunk_range_bucket{foo="bar",le="2.62144e+07"} 1.691853e+06 | ||||
| prometheus_tsdb_compaction_chunk_range_bucket{foo="bar",le="+Inf"} 1.691853e+06 | ||||
| prometheus_tsdb_compaction_chunk_range_sum{foo="bar"} 6.71393432189e+11 | ||||
| prometheus_tsdb_compaction_chunk_range_count{foo="bar"} 1.691853e+06 | ||||
| prometheus_tsdb_compaction_chunk_range_bucket{foo="baz",le="100"} 0 | ||||
| prometheus_tsdb_compaction_chunk_range_bucket{foo="baz",le="400"} 0 | ||||
| prometheus_tsdb_compaction_chunk_range_bucket{foo="baz",le="1600"} 0 | ||||
| prometheus_tsdb_compaction_chunk_range_bucket{foo="baz",le="6400"} 0 | ||||
| prometheus_tsdb_compaction_chunk_range_bucket{foo="baz",le="25600"} 7 | ||||
| prometheus_tsdb_compaction_chunk_range_bucket{foo="baz",le="102400"} 7 | ||||
| prometheus_tsdb_compaction_chunk_range_bucket{foo="baz",le="409600"} 1.412839e+06 | ||||
| prometheus_tsdb_compaction_chunk_range_bucket{foo="baz",le="1.6384e+06"} 1.69185e+06 | ||||
| prometheus_tsdb_compaction_chunk_range_bucket{foo="baz",le="6.5536e+06"} 1.691853e+06 | ||||
| prometheus_tsdb_compaction_chunk_range_bucket{foo="baz",le="2.62144e+07"} 1.691853e+06 | ||||
| prometheus_tsdb_compaction_chunk_range_bucket{foo="baz",le="+Inf"} 1.691853e+06 | ||||
| prometheus_tsdb_compaction_chunk_range_sum{foo="baz"} 6.71393432189e+11 | ||||
| prometheus_tsdb_compaction_chunk_range_count{foo="baz"} 1.691853e+06 | ||||
|  | @ -0,0 +1,28 @@ | |||
| # HELP prometheus_tsdb_compaction_chunk_range Final time range of chunks on their first compaction | ||||
| # TYPE prometheus_tsdb_compaction_chunk_range histogram | ||||
| prometheus_tsdb_compaction_chunk_range_bucket{foo="bar",le="100"} 0 | ||||
| prometheus_tsdb_compaction_chunk_range_bucket{foo="bar",le="400"} 0 | ||||
| prometheus_tsdb_compaction_chunk_range_bucket{foo="bar",le="1600"} 0 | ||||
| prometheus_tsdb_compaction_chunk_range_bucket{foo="bar",le="6400"} 0 | ||||
| prometheus_tsdb_compaction_chunk_range_bucket{foo="bar",le="25600"} 7 | ||||
| prometheus_tsdb_compaction_chunk_range_bucket{foo="bar",le="102400"} 7 | ||||
| prometheus_tsdb_compaction_chunk_range_bucket{foo="bar",le="409600"} 1.412839e+06 | ||||
| prometheus_tsdb_compaction_chunk_range_bucket{foo="bar",le="1.6384e+06"} 1.69185e+06 | ||||
| prometheus_tsdb_compaction_chunk_range_bucket{foo="bar",le="6.5536e+06"} 1.691853e+06 | ||||
| prometheus_tsdb_compaction_chunk_range_bucket{foo="bar",le="2.62144e+07"} 1.691853e+06 | ||||
| prometheus_tsdb_compaction_chunk_range_bucket{foo="bar",le="+Inf"} 1.691853e+06 | ||||
| prometheus_tsdb_compaction_chunk_range_sum{foo="bar"} 6.71393432189e+11 | ||||
| prometheus_tsdb_compaction_chunk_range_count{foo="bar"} 1.691853e+06 | ||||
| prometheus_tsdb_compaction_chunk_range_bucket{foo="baz",le="100"} 0 | ||||
| prometheus_tsdb_compaction_chunk_range_bucket{foo="baz",le="400"} 0 | ||||
| prometheus_tsdb_compaction_chunk_range_bucket{foo="baz",le="1600"} 0 | ||||
| prometheus_tsdb_compaction_chunk_range_bucket{foo="baz",le="6400"} 0 | ||||
| prometheus_tsdb_compaction_chunk_range_bucket{foo="baz",le="25600"} 7 | ||||
| prometheus_tsdb_compaction_chunk_range_bucket{foo="baz",le="102400"} 7 | ||||
| prometheus_tsdb_compaction_chunk_range_bucket{foo="baz",le="409600"} 1.412839e+06 | ||||
| prometheus_tsdb_compaction_chunk_range_bucket{foo="baz",le="1.6384e+06"} 1.69185e+06 | ||||
| prometheus_tsdb_compaction_chunk_range_bucket{foo="baz",le="6.5536e+06"} 1.691853e+06 | ||||
| prometheus_tsdb_compaction_chunk_range_bucket{foo="baz",le="2.62144e+07"} 1.691853e+06 | ||||
| prometheus_tsdb_compaction_chunk_range_bucket{foo="baz",le="+Inf"} 1.691853e+06 | ||||
| prometheus_tsdb_compaction_chunk_range_sum{foo="baz"} 6.71393432189e+11 | ||||
| prometheus_tsdb_compaction_chunk_range_count{foo="baz"} 1.691853e+06 | ||||
							
								
								
									
										29
									
								
								collector/fixtures/textfile/inconsistent_metrics.out
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								collector/fixtures/textfile/inconsistent_metrics.out
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,29 @@ | |||
| # HELP go_goroutines Number of goroutines that currently exist. | ||||
| # TYPE go_goroutines gauge | ||||
| go_goroutines{foo=""} 20 | ||||
| go_goroutines{foo="bar"} 229 | ||||
| # HELP http_requests_total Total number of HTTP requests made. | ||||
| # TYPE http_requests_total counter | ||||
| http_requests_total{baz="",code="200",foo="",handler="",method="get"} 11 | ||||
| http_requests_total{baz="",code="200",foo="",handler="alerts",method="get"} 35 | ||||
| http_requests_total{baz="",code="200",foo="",handler="config",method="get"} 8 | ||||
| http_requests_total{baz="",code="200",foo="",handler="flags",method="get"} 18 | ||||
| http_requests_total{baz="",code="200",foo="",handler="graph",method="get"} 89 | ||||
| http_requests_total{baz="",code="200",foo="",handler="prometheus",method="get"} 17051 | ||||
| http_requests_total{baz="",code="200",foo="",handler="query",method="get"} 401 | ||||
| http_requests_total{baz="",code="200",foo="",handler="query_range",method="get"} 15663 | ||||
| http_requests_total{baz="",code="200",foo="",handler="rules",method="get"} 7 | ||||
| http_requests_total{baz="",code="200",foo="",handler="series",method="get"} 221 | ||||
| http_requests_total{baz="",code="200",foo="",handler="static",method="get"} 1647 | ||||
| http_requests_total{baz="",code="200",foo="",handler="status",method="get"} 12 | ||||
| http_requests_total{baz="",code="200",foo="bar",handler="",method="get"} 325 | ||||
| http_requests_total{baz="",code="206",foo="",handler="static",method="get"} 2 | ||||
| http_requests_total{baz="",code="400",foo="",handler="query_range",method="get"} 40 | ||||
| http_requests_total{baz="",code="503",foo="",handler="query_range",method="get"} 3 | ||||
| http_requests_total{baz="bar",code="200",foo="",handler="",method="get"} 93 | ||||
| # HELP node_textfile_mtime Unixtime mtime of textfiles successfully read. | ||||
| # TYPE node_textfile_mtime gauge | ||||
| node_textfile_mtime{file="metrics.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 | ||||
|  | @ -0,0 +1,24 @@ | |||
| # HELP http_requests_total Total number of HTTP requests made. | ||||
| # TYPE http_requests_total counter | ||||
| http_requests_total{code="200",handler="alerts",method="get"} 35 | ||||
| http_requests_total{code="200",handler="config",method="get"} 8 | ||||
| http_requests_total{code="200",method="get", foo="bar"} 325 | ||||
| http_requests_total{code="200",handler="flags",method="get"} 18 | ||||
| http_requests_total{code="200",handler="graph",method="get"} 89 | ||||
| http_requests_total{code="200",method="get", baz="bar"} 93 | ||||
| http_requests_total{code="200",handler="prometheus",method="get"} 17051 | ||||
| http_requests_total{code="200",handler="query",method="get"} 401 | ||||
| http_requests_total{code="200",handler="query_range",method="get"} 15663 | ||||
| http_requests_total{code="200",handler="rules",method="get"} 7 | ||||
| http_requests_total{code="200",handler="series",method="get"} 221 | ||||
| http_requests_total{code="200",handler="static",method="get"} 1647 | ||||
| http_requests_total{code="200",handler="status",method="get"} 12 | ||||
| http_requests_total{code="200",method="get"} 11 | ||||
| http_requests_total{code="206",handler="static",method="get"} 2 | ||||
| http_requests_total{code="400",handler="query_range",method="get"} 40 | ||||
| http_requests_total{code="503",handler="query_range",method="get"} 3 | ||||
| 
 | ||||
| # HELP go_goroutines Number of goroutines that currently exist. | ||||
| # TYPE go_goroutines gauge | ||||
| go_goroutines{foo="bar"} 229 | ||||
| go_goroutines 20 | ||||
|  | @ -1,8 +1,3 @@ | |||
| name: "node_textfile_scrape_error" | ||||
| help: "1 if there was an error opening or reading a file, 0 otherwise" | ||||
| type: GAUGE | ||||
| metric: < | ||||
|   gauge: < | ||||
|     value: 0 | ||||
|   > | ||||
| > | ||||
| # 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 | ||||
|  |  | |||
|  | @ -1,8 +1,3 @@ | |||
| name: "node_textfile_scrape_error" | ||||
| help: "1 if there was an error opening or reading a file, 0 otherwise" | ||||
| type: GAUGE | ||||
| metric: < | ||||
|   gauge: < | ||||
|     value: 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 | ||||
|  |  | |||
							
								
								
									
										28
									
								
								collector/fixtures/textfile/summary.out
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								collector/fixtures/textfile/summary.out
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,28 @@ | |||
| # HELP event_duration_seconds_total Query timings | ||||
| # TYPE event_duration_seconds_total summary | ||||
| event_duration_seconds_total{baz="inner_eval",quantile="0.5"} 1.073e-06 | ||||
| event_duration_seconds_total{baz="inner_eval",quantile="0.9"} 1.928e-06 | ||||
| event_duration_seconds_total{baz="inner_eval",quantile="0.99"} 4.35e-06 | ||||
| event_duration_seconds_total_sum{baz="inner_eval"} 1.8652166505091474e+06 | ||||
| event_duration_seconds_total_count{baz="inner_eval"} 1.492355615e+09 | ||||
| event_duration_seconds_total{baz="prepare_time",quantile="0.5"} 4.283e-06 | ||||
| event_duration_seconds_total{baz="prepare_time",quantile="0.9"} 7.796e-06 | ||||
| event_duration_seconds_total{baz="prepare_time",quantile="0.99"} 2.2083e-05 | ||||
| event_duration_seconds_total_sum{baz="prepare_time"} 840923.7919437207 | ||||
| event_duration_seconds_total_count{baz="prepare_time"} 1.492355814e+09 | ||||
| event_duration_seconds_total{baz="result_append",quantile="0.5"} 1.566e-06 | ||||
| event_duration_seconds_total{baz="result_append",quantile="0.9"} 3.223e-06 | ||||
| event_duration_seconds_total{baz="result_append",quantile="0.99"} 6.53e-06 | ||||
| event_duration_seconds_total_sum{baz="result_append"} 4.404109951000078 | ||||
| event_duration_seconds_total_count{baz="result_append"} 1.427647e+06 | ||||
| event_duration_seconds_total{baz="result_sort",quantile="0.5"} 1.847e-06 | ||||
| event_duration_seconds_total{baz="result_sort",quantile="0.9"} 2.975e-06 | ||||
| event_duration_seconds_total{baz="result_sort",quantile="0.99"} 4.08e-06 | ||||
| event_duration_seconds_total_sum{baz="result_sort"} 3.4123187829998307 | ||||
| event_duration_seconds_total_count{baz="result_sort"} 1.427647e+06 | ||||
| # HELP node_textfile_mtime Unixtime mtime of textfiles successfully read. | ||||
| # TYPE node_textfile_mtime gauge | ||||
| node_textfile_mtime{file="metrics.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 | ||||
							
								
								
									
										22
									
								
								collector/fixtures/textfile/summary/metrics.prom
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								collector/fixtures/textfile/summary/metrics.prom
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,22 @@ | |||
| # HELP event_duration_seconds_total Query timings | ||||
| # TYPE event_duration_seconds_total summary | ||||
| event_duration_seconds_total{baz="inner_eval",quantile="0.5"} 1.073e-06 | ||||
| event_duration_seconds_total{baz="inner_eval",quantile="0.9"} 1.928e-06 | ||||
| event_duration_seconds_total{baz="inner_eval",quantile="0.99"} 4.35e-06 | ||||
| event_duration_seconds_total_sum{baz="inner_eval"} 1.8652166505091474e+06 | ||||
| event_duration_seconds_total_count{baz="inner_eval"} 1.492355615e+09 | ||||
| event_duration_seconds_total{baz="prepare_time",quantile="0.5"} 4.283e-06 | ||||
| event_duration_seconds_total{baz="prepare_time",quantile="0.9"} 7.796e-06 | ||||
| event_duration_seconds_total{baz="prepare_time",quantile="0.99"} 2.2083e-05 | ||||
| event_duration_seconds_total_sum{baz="prepare_time"} 840923.7919437207 | ||||
| event_duration_seconds_total_count{baz="prepare_time"} 1.492355814e+09 | ||||
| event_duration_seconds_total{baz="result_append",quantile="0.5"} 1.566e-06 | ||||
| event_duration_seconds_total{baz="result_append",quantile="0.9"} 3.223e-06 | ||||
| event_duration_seconds_total{baz="result_append",quantile="0.99"} 6.53e-06 | ||||
| event_duration_seconds_total_sum{baz="result_append"} 4.404109951000078 | ||||
| event_duration_seconds_total_count{baz="result_append"} 1.427647e+06 | ||||
| event_duration_seconds_total{baz="result_sort",quantile="0.5"} 1.847e-06 | ||||
| event_duration_seconds_total{baz="result_sort",quantile="0.9"} 2.975e-06 | ||||
| event_duration_seconds_total{baz="result_sort",quantile="0.99"} 4.08e-06 | ||||
| event_duration_seconds_total_sum{baz="result_sort"} 3.4123187829998307 | ||||
| event_duration_seconds_total_count{baz="result_sort"} 1.427647e+06 | ||||
							
								
								
									
										20
									
								
								collector/fixtures/textfile/summary_extra_dimension.out
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								collector/fixtures/textfile/summary_extra_dimension.out
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,20 @@ | |||
| # HELP node_textfile_mtime Unixtime mtime of textfiles successfully read. | ||||
| # TYPE node_textfile_mtime gauge | ||||
| node_textfile_mtime{file="metrics.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 | ||||
| # HELP prometheus_rule_evaluation_duration_seconds The duration for a rule to execute. | ||||
| # TYPE prometheus_rule_evaluation_duration_seconds summary | ||||
| prometheus_rule_evaluation_duration_seconds{handler="",rule_type="alerting",quantile="0.9"} 0.001765451 | ||||
| prometheus_rule_evaluation_duration_seconds{handler="",rule_type="alerting",quantile="0.99"} 0.018672076 | ||||
| prometheus_rule_evaluation_duration_seconds_sum{handler="",rule_type="alerting"} 214.85081044700146 | ||||
| prometheus_rule_evaluation_duration_seconds_count{handler="",rule_type="alerting"} 185209 | ||||
| prometheus_rule_evaluation_duration_seconds{handler="",rule_type="recording",quantile="0.5"} 4.3132e-05 | ||||
| prometheus_rule_evaluation_duration_seconds{handler="",rule_type="recording",quantile="0.9"} 8.9295e-05 | ||||
| prometheus_rule_evaluation_duration_seconds{handler="",rule_type="recording",quantile="0.99"} 0.000193657 | ||||
| prometheus_rule_evaluation_duration_seconds_sum{handler="",rule_type="recording"} 185091.01317759082 | ||||
| prometheus_rule_evaluation_duration_seconds_count{handler="",rule_type="recording"} 1.0020195e+08 | ||||
| prometheus_rule_evaluation_duration_seconds{handler="foo",rule_type="alerting",quantile="0.5"} 0.000571464 | ||||
| prometheus_rule_evaluation_duration_seconds_sum{handler="foo",rule_type="alerting"} 0 | ||||
| prometheus_rule_evaluation_duration_seconds_count{handler="foo",rule_type="alerting"} 0 | ||||
|  | @ -0,0 +1,12 @@ | |||
| # HELP prometheus_rule_evaluation_duration_seconds The duration for a rule to execute. | ||||
| # TYPE prometheus_rule_evaluation_duration_seconds summary | ||||
| prometheus_rule_evaluation_duration_seconds{rule_type="alerting",quantile="0.5", handler="foo"} 0.000571464 | ||||
| prometheus_rule_evaluation_duration_seconds{rule_type="alerting",quantile="0.9"} 0.001765451 | ||||
| prometheus_rule_evaluation_duration_seconds{rule_type="alerting",quantile="0.99"} 0.018672076 | ||||
| prometheus_rule_evaluation_duration_seconds_sum{rule_type="alerting"} 214.85081044700146 | ||||
| prometheus_rule_evaluation_duration_seconds_count{rule_type="alerting"} 185209 | ||||
| prometheus_rule_evaluation_duration_seconds{rule_type="recording",quantile="0.5"} 4.3132e-05 | ||||
| prometheus_rule_evaluation_duration_seconds{rule_type="recording",quantile="0.9"} 8.9295e-05 | ||||
| prometheus_rule_evaluation_duration_seconds{rule_type="recording",quantile="0.99"} 0.000193657 | ||||
| prometheus_rule_evaluation_duration_seconds_sum{rule_type="recording"} 185091.01317759082 | ||||
| prometheus_rule_evaluation_duration_seconds_count{rule_type="recording"} 1.0020195e+08 | ||||
|  | @ -1,79 +1,19 @@ | |||
| name: "node_textfile_mtime" | ||||
| help: "Unixtime mtime of textfiles successfully read." | ||||
| type: GAUGE | ||||
| metric: < | ||||
|   label: < | ||||
|     name: "file" | ||||
|     value: "metrics1.prom" | ||||
|   > | ||||
|   gauge: < | ||||
|     value: 1 | ||||
|   > | ||||
| > | ||||
| metric: < | ||||
|   label: < | ||||
|     name: "file" | ||||
|     value: "metrics2.prom" | ||||
|   > | ||||
|   gauge: < | ||||
|     value: 2 | ||||
|   > | ||||
| > | ||||
| name: "node_textfile_scrape_error" | ||||
| help: "1 if there was an error opening or reading a file, 0 otherwise" | ||||
| type: GAUGE | ||||
| metric: < | ||||
|   gauge: < | ||||
|     value: 0 | ||||
|   > | ||||
| > | ||||
| name: "testmetric1_1" | ||||
| help: "Metric read from fixtures/textfile/two_metric_files/metrics1.prom" | ||||
| type: UNTYPED | ||||
| metric: < | ||||
|   label: < | ||||
|     name: "foo" | ||||
|     value: "bar" | ||||
|   > | ||||
|   untyped: < | ||||
|     value: 10 | ||||
|   > | ||||
| > | ||||
| name: "testmetric1_2" | ||||
| help: "Metric read from fixtures/textfile/two_metric_files/metrics1.prom" | ||||
| type: UNTYPED | ||||
| metric: < | ||||
|   label: < | ||||
|     name: "foo" | ||||
|     value: "baz" | ||||
|   > | ||||
|   untyped: < | ||||
|     value: 20 | ||||
|   > | ||||
| > | ||||
| name: "testmetric2_1" | ||||
| help: "Metric read from fixtures/textfile/two_metric_files/metrics2.prom" | ||||
| type: UNTYPED | ||||
| metric: < | ||||
|   label: < | ||||
|     name: "foo" | ||||
|     value: "bar" | ||||
|   > | ||||
|   untyped: < | ||||
|     value: 30 | ||||
|   > | ||||
|   timestamp_ms: 1441205977284 | ||||
| > | ||||
| name: "testmetric2_2" | ||||
| help: "Metric read from fixtures/textfile/two_metric_files/metrics2.prom" | ||||
| type: UNTYPED | ||||
| metric: < | ||||
|   label: < | ||||
|     name: "foo" | ||||
|     value: "baz" | ||||
|   > | ||||
|   untyped: < | ||||
|     value: 40 | ||||
|   > | ||||
|   timestamp_ms: 1441205977284 | ||||
| > | ||||
| # HELP node_textfile_mtime Unixtime mtime of textfiles successfully read. | ||||
| # TYPE node_textfile_mtime gauge | ||||
| node_textfile_mtime{file="metrics1.prom"} 1 | ||||
| node_textfile_mtime{file="metrics2.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 | ||||
| # HELP testmetric1_1 Metric read from fixtures/textfile/two_metric_files/metrics1.prom | ||||
| # TYPE testmetric1_1 untyped | ||||
| testmetric1_1{foo="bar"} 10 | ||||
| # HELP testmetric1_2 Metric read from fixtures/textfile/two_metric_files/metrics1.prom | ||||
| # TYPE testmetric1_2 untyped | ||||
| testmetric1_2{foo="baz"} 20 | ||||
| # HELP testmetric2_1 Metric read from fixtures/textfile/two_metric_files/metrics2.prom | ||||
| # TYPE testmetric2_1 untyped | ||||
| testmetric2_1{foo="bar"} 30 | ||||
| # HELP testmetric2_2 Metric read from fixtures/textfile/two_metric_files/metrics2.prom | ||||
| # TYPE testmetric2_2 untyped | ||||
| testmetric2_2{foo="baz"} 40 | ||||
|  |  | |||
|  | @ -25,21 +25,28 @@ import ( | |||
| 	"sync" | ||||
| 	"time" | ||||
| 
 | ||||
| 	"github.com/golang/protobuf/proto" | ||||
| 	"github.com/prometheus/client_golang/prometheus" | ||||
| 	dto "github.com/prometheus/client_model/go" | ||||
| 	"github.com/prometheus/common/expfmt" | ||||
| 	"github.com/prometheus/common/log" | ||||
| 	"gopkg.in/alecthomas/kingpin.v2" | ||||
| 	kingpin "gopkg.in/alecthomas/kingpin.v2" | ||||
| ) | ||||
| 
 | ||||
| var ( | ||||
| 	textFileDirectory = kingpin.Flag("collector.textfile.directory", "Directory to read text files with metrics from.").Default("").String() | ||||
| 	textFileAddOnce   sync.Once | ||||
| 	mtimeDesc         = prometheus.NewDesc( | ||||
| 		"node_textfile_mtime", | ||||
| 		"Unixtime mtime of textfiles successfully read.", | ||||
| 		[]string{"file"}, | ||||
| 		nil, | ||||
| 	) | ||||
| ) | ||||
| 
 | ||||
| type textFileCollector struct { | ||||
| 	path string | ||||
| 	// Only set for testing to get predictable output.
 | ||||
| 	mtime *float64 | ||||
| } | ||||
| 
 | ||||
| func init() { | ||||
|  | @ -52,31 +59,129 @@ func NewTextFileCollector() (Collector, error) { | |||
| 	c := &textFileCollector{ | ||||
| 		path: *textFileDirectory, | ||||
| 	} | ||||
| 	return c, nil | ||||
| } | ||||
| 
 | ||||
| 	if c.path == "" { | ||||
| 		// This collector is enabled by default, so do not fail if
 | ||||
| 		// the flag is not passed.
 | ||||
| 		log.Infof("No directory specified, see --collector.textfile.directory") | ||||
| 	} else { | ||||
| 		textFileAddOnce.Do(func() { | ||||
| 			prometheus.DefaultGatherer = prometheus.Gatherers{ | ||||
| 				prometheus.DefaultGatherer, | ||||
| 				prometheus.GathererFunc(func() ([]*dto.MetricFamily, error) { return c.parseTextFiles(), nil }), | ||||
| func convertMetricFamily(metricFamily *dto.MetricFamily, ch chan<- prometheus.Metric) { | ||||
| 	var valType prometheus.ValueType | ||||
| 	var val float64 | ||||
| 
 | ||||
| 	allLabelNames := map[string]struct{}{} | ||||
| 	for _, metric := range metricFamily.Metric { | ||||
| 		labels := metric.GetLabel() | ||||
| 		for _, label := range labels { | ||||
| 			if _, ok := allLabelNames[label.GetName()]; !ok { | ||||
| 				allLabelNames[label.GetName()] = struct{}{} | ||||
| 			} | ||||
| 		}) | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	return c, nil | ||||
| 	for _, metric := range metricFamily.Metric { | ||||
| 		labels := metric.GetLabel() | ||||
| 		var names []string | ||||
| 		var values []string | ||||
| 		for _, label := range labels { | ||||
| 			names = append(names, label.GetName()) | ||||
| 			values = append(values, label.GetValue()) | ||||
| 		} | ||||
| 
 | ||||
| 		for k := range allLabelNames { | ||||
| 			present := false | ||||
| 			for _, name := range names { | ||||
| 				if k == name { | ||||
| 					present = true | ||||
| 					break | ||||
| 				} | ||||
| 			} | ||||
| 			if present == false { | ||||
| 				names = append(names, k) | ||||
| 				values = append(values, "") | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 		metricType := metricFamily.GetType() | ||||
| 		switch metricType { | ||||
| 		case dto.MetricType_COUNTER: | ||||
| 			valType = prometheus.CounterValue | ||||
| 			val = metric.Counter.GetValue() | ||||
| 
 | ||||
| 		case dto.MetricType_GAUGE: | ||||
| 			valType = prometheus.GaugeValue | ||||
| 			val = metric.Gauge.GetValue() | ||||
| 
 | ||||
| 		case dto.MetricType_UNTYPED: | ||||
| 			valType = prometheus.UntypedValue | ||||
| 			val = metric.Untyped.GetValue() | ||||
| 
 | ||||
| 		case dto.MetricType_SUMMARY: | ||||
| 			quantiles := map[float64]float64{} | ||||
| 			for _, q := range metric.Summary.Quantile { | ||||
| 				quantiles[q.GetQuantile()] = q.GetValue() | ||||
| 			} | ||||
| 			ch <- prometheus.MustNewConstSummary( | ||||
| 				prometheus.NewDesc( | ||||
| 					*metricFamily.Name, | ||||
| 					metricFamily.GetHelp(), | ||||
| 					names, nil, | ||||
| 				), | ||||
| 				metric.Summary.GetSampleCount(), | ||||
| 				metric.Summary.GetSampleSum(), | ||||
| 				quantiles, values..., | ||||
| 			) | ||||
| 		case dto.MetricType_HISTOGRAM: | ||||
| 			buckets := map[float64]uint64{} | ||||
| 			for _, b := range metric.Histogram.Bucket { | ||||
| 				buckets[b.GetUpperBound()] = b.GetCumulativeCount() | ||||
| 			} | ||||
| 			ch <- prometheus.MustNewConstHistogram( | ||||
| 				prometheus.NewDesc( | ||||
| 					*metricFamily.Name, | ||||
| 					metricFamily.GetHelp(), | ||||
| 					names, nil, | ||||
| 				), | ||||
| 				metric.Histogram.GetSampleCount(), | ||||
| 				metric.Histogram.GetSampleSum(), | ||||
| 				buckets, values..., | ||||
| 			) | ||||
| 		default: | ||||
| 			panic("unknown metric type") | ||||
| 		} | ||||
| 		if metricType == dto.MetricType_GAUGE || metricType == dto.MetricType_COUNTER || metricType == dto.MetricType_UNTYPED { | ||||
| 			ch <- prometheus.MustNewConstMetric( | ||||
| 				prometheus.NewDesc( | ||||
| 					*metricFamily.Name, | ||||
| 					metricFamily.GetHelp(), | ||||
| 					names, nil, | ||||
| 				), | ||||
| 				valType, val, values..., | ||||
| 			) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func (c *textFileCollector) exportMTimes(mtimes map[string]time.Time, ch chan<- prometheus.Metric) { | ||||
| 	// Export the mtimes of the successful files.
 | ||||
| 	if len(mtimes) > 0 { | ||||
| 		// Sorting is needed for predictable output comparison in tests.
 | ||||
| 		filenames := make([]string, 0, len(mtimes)) | ||||
| 		for filename := range mtimes { | ||||
| 			filenames = append(filenames, filename) | ||||
| 		} | ||||
| 		sort.Strings(filenames) | ||||
| 
 | ||||
| 		for _, filename := range filenames { | ||||
| 			mtime := float64(mtimes[filename].UnixNano() / 1e9) | ||||
| 			if c.mtime != nil { | ||||
| 				mtime = *c.mtime | ||||
| 			} | ||||
| 			ch <- prometheus.MustNewConstMetric(mtimeDesc, prometheus.GaugeValue, mtime, filename) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // Update implements the Collector interface.
 | ||||
| func (c *textFileCollector) Update(ch chan<- prometheus.Metric) error { | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| func (c *textFileCollector) parseTextFiles() []*dto.MetricFamily { | ||||
| 	error := 0.0 | ||||
| 	var metricFamilies []*dto.MetricFamily | ||||
| 	mtimes := map[string]time.Time{} | ||||
| 
 | ||||
| 	// Iterate over files and accumulate their metrics.
 | ||||
|  | @ -112,52 +217,20 @@ func (c *textFileCollector) parseTextFiles() []*dto.MetricFamily { | |||
| 				help := fmt.Sprintf("Metric read from %s", path) | ||||
| 				mf.Help = &help | ||||
| 			} | ||||
| 			metricFamilies = append(metricFamilies, mf) | ||||
| 			convertMetricFamily(mf, ch) | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	// Export the mtimes of the successful files.
 | ||||
| 	if len(mtimes) > 0 { | ||||
| 		mtimeMetricFamily := dto.MetricFamily{ | ||||
| 			Name:   proto.String("node_textfile_mtime"), | ||||
| 			Help:   proto.String("Unixtime mtime of textfiles successfully read."), | ||||
| 			Type:   dto.MetricType_GAUGE.Enum(), | ||||
| 			Metric: []*dto.Metric{}, | ||||
| 		} | ||||
| 	c.exportMTimes(mtimes, ch) | ||||
| 
 | ||||
| 		// Sorting is needed for predictable output comparison in tests.
 | ||||
| 		filenames := make([]string, 0, len(mtimes)) | ||||
| 		for filename := range mtimes { | ||||
| 			filenames = append(filenames, filename) | ||||
| 		} | ||||
| 		sort.Strings(filenames) | ||||
| 
 | ||||
| 		for _, filename := range filenames { | ||||
| 			mtimeMetricFamily.Metric = append(mtimeMetricFamily.Metric, | ||||
| 				&dto.Metric{ | ||||
| 					Label: []*dto.LabelPair{ | ||||
| 						{ | ||||
| 							Name:  proto.String("file"), | ||||
| 							Value: proto.String(filename), | ||||
| 						}, | ||||
| 					}, | ||||
| 					Gauge: &dto.Gauge{Value: proto.Float64(float64(mtimes[filename].UnixNano()) / 1e9)}, | ||||
| 				}, | ||||
| 			) | ||||
| 		} | ||||
| 		metricFamilies = append(metricFamilies, &mtimeMetricFamily) | ||||
| 	} | ||||
| 	// Export if there were errors.
 | ||||
| 	metricFamilies = append(metricFamilies, &dto.MetricFamily{ | ||||
| 		Name: proto.String("node_textfile_scrape_error"), | ||||
| 		Help: proto.String("1 if there was an error opening or reading a file, 0 otherwise"), | ||||
| 		Type: dto.MetricType_GAUGE.Enum(), | ||||
| 		Metric: []*dto.Metric{ | ||||
| 			{ | ||||
| 				Gauge: &dto.Gauge{Value: &error}, | ||||
| 			}, | ||||
| 		}, | ||||
| 	}) | ||||
| 
 | ||||
| 	return metricFamilies | ||||
| 	ch <- prometheus.MustNewConstMetric( | ||||
| 		prometheus.NewDesc( | ||||
| 			"node_textfile_scrape_error", | ||||
| 			"1 if there was an error opening or reading a file, 0 otherwise", | ||||
| 			nil, nil, | ||||
| 		), | ||||
| 		prometheus.GaugeValue, error, | ||||
| 	) | ||||
| 	return nil | ||||
| } | ||||
|  |  | |||
|  | @ -14,17 +14,38 @@ | |||
| package collector | ||||
| 
 | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"io/ioutil" | ||||
| 	"sort" | ||||
| 	"strings" | ||||
| 	"net/http" | ||||
| 	"net/http/httptest" | ||||
| 	"testing" | ||||
| 
 | ||||
| 	"github.com/golang/protobuf/proto" | ||||
| 	"github.com/prometheus/client_golang/prometheus" | ||||
| 	"github.com/prometheus/client_golang/prometheus/promhttp" | ||||
| 	"github.com/prometheus/common/log" | ||||
| 	"gopkg.in/alecthomas/kingpin.v2" | ||||
| 	kingpin "gopkg.in/alecthomas/kingpin.v2" | ||||
| ) | ||||
| 
 | ||||
| func TestParseTextFiles(t *testing.T) { | ||||
| type collectorAdapter struct { | ||||
| 	Collector | ||||
| } | ||||
| 
 | ||||
| // Describe implements the prometheus.Collector interface.
 | ||||
| func (a collectorAdapter) Describe(ch chan<- *prometheus.Desc) { | ||||
| 	// We have to send *some* metric in Describe, but we don't know which ones
 | ||||
| 	// we're going to get, so just send a dummy metric.
 | ||||
| 	ch <- prometheus.NewDesc("dummy_metric", "Dummy metric.", nil, nil) | ||||
| } | ||||
| 
 | ||||
| // Collect implements the prometheus.Collector interface.
 | ||||
| func (a collectorAdapter) Collect(ch chan<- prometheus.Metric) { | ||||
| 	err := a.Update(ch) | ||||
| 	if err != nil { | ||||
| 		panic(fmt.Sprintf("failed to update collector: %v", err)) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func TestTextfileCollector(t *testing.T) { | ||||
| 	tests := []struct { | ||||
| 		path string | ||||
| 		out  string | ||||
|  | @ -41,11 +62,37 @@ func TestParseTextFiles(t *testing.T) { | |||
| 			path: "fixtures/textfile/nonexistent_path", | ||||
| 			out:  "fixtures/textfile/nonexistent_path.out", | ||||
| 		}, | ||||
| 		{ | ||||
| 			path: "fixtures/textfile/different_metric_types", | ||||
| 			out:  "fixtures/textfile/different_metric_types.out", | ||||
| 		}, | ||||
| 		{ | ||||
| 			path: "fixtures/textfile/inconsistent_metrics", | ||||
| 			out:  "fixtures/textfile/inconsistent_metrics.out", | ||||
| 		}, | ||||
| 		{ | ||||
| 			path: "fixtures/textfile/histogram", | ||||
| 			out:  "fixtures/textfile/histogram.out", | ||||
| 		}, | ||||
| 		{ | ||||
| 			path: "fixtures/textfile/histogram_extra_dimension", | ||||
| 			out:  "fixtures/textfile/histogram_extra_dimension.out", | ||||
| 		}, | ||||
| 		{ | ||||
| 			path: "fixtures/textfile/summary", | ||||
| 			out:  "fixtures/textfile/summary.out", | ||||
| 		}, | ||||
| 		{ | ||||
| 			path: "fixtures/textfile/summary_extra_dimension", | ||||
| 			out:  "fixtures/textfile/summary_extra_dimension.out", | ||||
| 		}, | ||||
| 	} | ||||
| 
 | ||||
| 	for i, test := range tests { | ||||
| 		c := textFileCollector{ | ||||
| 			path: test.path, | ||||
| 		mtime := 1.0 | ||||
| 		c := &textFileCollector{ | ||||
| 			path:  test.path, | ||||
| 			mtime: &mtime, | ||||
| 		} | ||||
| 
 | ||||
| 		// Suppress a log message about `nonexistent_path` not existing, this is
 | ||||
|  | @ -56,17 +103,12 @@ func TestParseTextFiles(t *testing.T) { | |||
| 			t.Fatal(err) | ||||
| 		} | ||||
| 
 | ||||
| 		mfs := c.parseTextFiles() | ||||
| 		textMFs := make([]string, 0, len(mfs)) | ||||
| 		for _, mf := range mfs { | ||||
| 			if mf.GetName() == "node_textfile_mtime" { | ||||
| 				mf.GetMetric()[0].GetGauge().Value = proto.Float64(1) | ||||
| 				mf.GetMetric()[1].GetGauge().Value = proto.Float64(2) | ||||
| 			} | ||||
| 			textMFs = append(textMFs, proto.MarshalTextString(mf)) | ||||
| 		} | ||||
| 		sort.Strings(textMFs) | ||||
| 		got := strings.Join(textMFs, "") | ||||
| 		registry := prometheus.NewRegistry() | ||||
| 		registry.MustRegister(collectorAdapter{c}) | ||||
| 
 | ||||
| 		rw := httptest.NewRecorder() | ||||
| 		promhttp.HandlerFor(registry, promhttp.HandlerOpts{}).ServeHTTP(rw, &http.Request{}) | ||||
| 		got := string(rw.Body.String()) | ||||
| 
 | ||||
| 		want, err := ioutil.ReadFile(test.out) | ||||
| 		if err != nil { | ||||
|  | @ -74,7 +116,7 @@ func TestParseTextFiles(t *testing.T) { | |||
| 		} | ||||
| 
 | ||||
| 		if string(want) != got { | ||||
| 			t.Fatalf("%d. want:\n\n%s\n\ngot:\n\n%s", i, string(want), got) | ||||
| 			t.Fatalf("%d.%q want:\n\n%s\n\ngot:\n\n%s", i, test.path, string(want), got) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue