| 
									
										
										
										
											2015-09-26 08:36:40 -07:00
										 |  |  | // Copyright 2015 The Prometheus Authors
 | 
					
						
							|  |  |  | // Licensed under the Apache License, Version 2.0 (the "License");
 | 
					
						
							|  |  |  | // you may not use this file except in compliance with the License.
 | 
					
						
							|  |  |  | // You may obtain a copy of the License at
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // http://www.apache.org/licenses/LICENSE-2.0
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // Unless required by applicable law or agreed to in writing, software
 | 
					
						
							|  |  |  | // distributed under the License is distributed on an "AS IS" BASIS,
 | 
					
						
							|  |  |  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
					
						
							|  |  |  | // See the License for the specific language governing permissions and
 | 
					
						
							|  |  |  | // limitations under the License.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-15 02:38:13 -07:00
										 |  |  | //go:build !notextfile
 | 
					
						
							|  |  |  | // +build !notextfile
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-03 07:59:56 -07:00
										 |  |  | package collector | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							| 
									
										
										
										
											2017-12-23 11:21:58 -08:00
										 |  |  | 	"fmt" | 
					
						
							| 
									
										
										
										
											2024-09-11 01:51:28 -07:00
										 |  |  | 	"io" | 
					
						
							|  |  |  | 	"log/slog" | 
					
						
							| 
									
										
										
										
											2017-12-23 11:21:58 -08:00
										 |  |  | 	"net/http" | 
					
						
							|  |  |  | 	"net/http/httptest" | 
					
						
							| 
									
										
										
										
											2022-07-27 11:59:39 -07:00
										 |  |  | 	"os" | 
					
						
							| 
									
										
										
										
											2015-09-03 07:59:56 -07:00
										 |  |  | 	"testing" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-07 00:25:05 -08:00
										 |  |  | 	"github.com/alecthomas/kingpin/v2" | 
					
						
							| 
									
										
										
										
											2017-12-23 11:21:58 -08:00
										 |  |  | 	"github.com/prometheus/client_golang/prometheus" | 
					
						
							|  |  |  | 	"github.com/prometheus/client_golang/prometheus/promhttp" | 
					
						
							| 
									
										
										
										
											2024-09-11 01:51:28 -07:00
										 |  |  | 	"github.com/prometheus/common/promslog" | 
					
						
							|  |  |  | 	"github.com/prometheus/common/promslog/flag" | 
					
						
							| 
									
										
										
										
											2015-09-03 07:59:56 -07:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-23 11:21:58 -08:00
										 |  |  | 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) { | 
					
						
							| 
									
										
										
										
											2019-12-31 08:19:37 -08:00
										 |  |  | 	if err := a.Update(ch); err != nil { | 
					
						
							| 
									
										
										
										
											2017-12-23 11:21:58 -08:00
										 |  |  | 		panic(fmt.Sprintf("failed to update collector: %v", err)) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func TestTextfileCollector(t *testing.T) { | 
					
						
							| 
									
										
										
										
											2015-09-03 07:59:56 -07:00
										 |  |  | 	tests := []struct { | 
					
						
							| 
									
										
										
										
											2024-09-30 00:40:03 -07:00
										 |  |  | 		paths []string | 
					
						
							|  |  |  | 		out   string | 
					
						
							| 
									
										
										
										
											2015-09-03 07:59:56 -07:00
										 |  |  | 	}{ | 
					
						
							|  |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2024-09-30 00:40:03 -07:00
										 |  |  | 			paths: []string{"fixtures/textfile/no_metric_files"}, | 
					
						
							|  |  |  | 			out:   "fixtures/textfile/no_metric_files.out", | 
					
						
							| 
									
										
										
										
											2015-09-03 07:59:56 -07:00
										 |  |  | 		}, | 
					
						
							|  |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2024-09-30 00:40:03 -07:00
										 |  |  | 			paths: []string{"fixtures/textfile/two_metric_files"}, | 
					
						
							|  |  |  | 			out:   "fixtures/textfile/two_metric_files.out", | 
					
						
							| 
									
										
										
										
											2015-09-03 07:59:56 -07:00
										 |  |  | 		}, | 
					
						
							|  |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2024-09-30 00:40:03 -07:00
										 |  |  | 			paths: []string{"fixtures/textfile/nonexistent_path"}, | 
					
						
							|  |  |  | 			out:   "fixtures/textfile/nonexistent_path.out", | 
					
						
							| 
									
										
										
										
											2015-09-03 07:59:56 -07:00
										 |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2018-02-27 10:43:38 -08:00
										 |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2024-09-30 00:40:03 -07:00
										 |  |  | 			paths: []string{"fixtures/textfile/client_side_timestamp"}, | 
					
						
							|  |  |  | 			out:   "fixtures/textfile/client_side_timestamp.out", | 
					
						
							| 
									
										
										
										
											2018-02-27 10:43:38 -08:00
										 |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2017-12-23 11:21:58 -08:00
										 |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2024-09-30 00:40:03 -07:00
										 |  |  | 			paths: []string{"fixtures/textfile/different_metric_types"}, | 
					
						
							|  |  |  | 			out:   "fixtures/textfile/different_metric_types.out", | 
					
						
							| 
									
										
										
										
											2017-12-23 11:21:58 -08:00
										 |  |  | 		}, | 
					
						
							|  |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2024-09-30 00:40:03 -07:00
										 |  |  | 			paths: []string{"fixtures/textfile/inconsistent_metrics"}, | 
					
						
							|  |  |  | 			out:   "fixtures/textfile/inconsistent_metrics.out", | 
					
						
							| 
									
										
										
										
											2017-12-23 11:21:58 -08:00
										 |  |  | 		}, | 
					
						
							|  |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2024-09-30 00:40:03 -07:00
										 |  |  | 			paths: []string{"fixtures/textfile/histogram"}, | 
					
						
							|  |  |  | 			out:   "fixtures/textfile/histogram.out", | 
					
						
							| 
									
										
										
										
											2017-12-23 11:21:58 -08:00
										 |  |  | 		}, | 
					
						
							|  |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2024-09-30 00:40:03 -07:00
										 |  |  | 			paths: []string{"fixtures/textfile/histogram_extra_dimension"}, | 
					
						
							|  |  |  | 			out:   "fixtures/textfile/histogram_extra_dimension.out", | 
					
						
							| 
									
										
										
										
											2017-12-23 11:21:58 -08:00
										 |  |  | 		}, | 
					
						
							|  |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2024-09-30 00:40:03 -07:00
										 |  |  | 			paths: []string{"fixtures/textfile/summary"}, | 
					
						
							|  |  |  | 			out:   "fixtures/textfile/summary.out", | 
					
						
							| 
									
										
										
										
											2017-12-23 11:21:58 -08:00
										 |  |  | 		}, | 
					
						
							|  |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2024-09-30 00:40:03 -07:00
										 |  |  | 			paths: []string{"fixtures/textfile/summary_extra_dimension"}, | 
					
						
							|  |  |  | 			out:   "fixtures/textfile/summary_extra_dimension.out", | 
					
						
							| 
									
										
										
										
											2017-12-23 11:21:58 -08:00
										 |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2021-10-18 05:05:21 -07:00
										 |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2024-09-30 00:40:03 -07:00
										 |  |  | 			paths: []string{ | 
					
						
							|  |  |  | 				"fixtures/textfile/histogram_extra_dimension", | 
					
						
							|  |  |  | 				"fixtures/textfile/summary_extra_dimension", | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			out: "fixtures/textfile/glob_extra_dimension.out", | 
					
						
							| 
									
										
										
										
											2021-10-18 05:05:21 -07:00
										 |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2022-09-20 03:49:21 -07:00
										 |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2024-09-30 00:40:03 -07:00
										 |  |  | 			paths: []string{"fixtures/textfile/*_extra_dimension"}, | 
					
						
							|  |  |  | 			out:   "fixtures/textfile/glob_extra_dimension.out", | 
					
						
							| 
									
										
										
										
											2022-09-20 03:49:21 -07:00
										 |  |  | 		}, | 
					
						
							|  |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2024-09-30 00:40:03 -07:00
										 |  |  | 			paths: []string{"fixtures/textfile/metrics_merge_empty_help"}, | 
					
						
							|  |  |  | 			out:   "fixtures/textfile/metrics_merge_empty_help.out", | 
					
						
							| 
									
										
										
										
											2022-09-20 03:49:21 -07:00
										 |  |  | 		}, | 
					
						
							|  |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2024-09-30 00:40:03 -07:00
										 |  |  | 			paths: []string{"fixtures/textfile/metrics_merge_no_help"}, | 
					
						
							|  |  |  | 			out:   "fixtures/textfile/metrics_merge_no_help.out", | 
					
						
							| 
									
										
										
										
											2022-09-20 03:49:21 -07:00
										 |  |  | 		}, | 
					
						
							|  |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2024-09-30 00:40:03 -07:00
										 |  |  | 			paths: []string{"fixtures/textfile/metrics_merge_same_help"}, | 
					
						
							|  |  |  | 			out:   "fixtures/textfile/metrics_merge_same_help.out", | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			paths: []string{"fixtures/textfile/metrics_merge_different_help"}, | 
					
						
							|  |  |  | 			out:   "fixtures/textfile/metrics_merge_different_help.out", | 
					
						
							| 
									
										
										
										
											2022-09-20 03:49:21 -07:00
										 |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2015-09-03 07:59:56 -07:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	for i, test := range tests { | 
					
						
							| 
									
										
										
										
											2017-12-23 11:21:58 -08:00
										 |  |  | 		mtime := 1.0 | 
					
						
							|  |  |  | 		c := &textFileCollector{ | 
					
						
							| 
									
										
										
										
											2024-09-30 00:40:03 -07:00
										 |  |  | 			paths:  test.paths, | 
					
						
							| 
									
										
										
										
											2019-12-31 08:19:37 -08:00
										 |  |  | 			mtime:  &mtime, | 
					
						
							| 
									
										
										
										
											2024-09-11 01:51:28 -07:00
										 |  |  | 			logger: slog.New(slog.NewTextHandler(io.Discard, nil)), | 
					
						
							| 
									
										
										
										
											2015-09-03 07:59:56 -07:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-26 11:15:42 -07:00
										 |  |  | 		// Suppress a log message about `nonexistent_path` not existing, this is
 | 
					
						
							|  |  |  | 		// expected and clutters the test output.
 | 
					
						
							| 
									
										
										
										
											2024-09-11 01:51:28 -07:00
										 |  |  | 		promslogConfig := &promslog.Config{} | 
					
						
							|  |  |  | 		flag.AddFlags(kingpin.CommandLine, promslogConfig) | 
					
						
							| 
									
										
										
										
											2019-12-31 08:19:37 -08:00
										 |  |  | 		if _, err := kingpin.CommandLine.Parse([]string{"--log.level", "debug"}); err != nil { | 
					
						
							| 
									
										
										
										
											2015-09-26 11:15:42 -07:00
										 |  |  | 			t.Fatal(err) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-23 11:21:58 -08:00
										 |  |  | 		registry := prometheus.NewRegistry() | 
					
						
							|  |  |  | 		registry.MustRegister(collectorAdapter{c}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		rw := httptest.NewRecorder() | 
					
						
							| 
									
										
										
										
											2022-09-20 03:49:21 -07:00
										 |  |  | 		promhttp.HandlerFor(registry, promhttp.HandlerOpts{ErrorHandling: promhttp.ContinueOnError}).ServeHTTP(rw, &http.Request{}) | 
					
						
							| 
									
										
										
										
											2017-12-23 11:21:58 -08:00
										 |  |  | 		got := string(rw.Body.String()) | 
					
						
							| 
									
										
										
										
											2015-09-03 07:59:56 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-27 11:59:39 -07:00
										 |  |  | 		want, err := os.ReadFile(test.out) | 
					
						
							| 
									
										
										
										
											2015-09-03 07:59:56 -07:00
										 |  |  | 		if err != nil { | 
					
						
							|  |  |  | 			t.Fatalf("%d. error reading fixture file %s: %s", i, test.out, err) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if string(want) != got { | 
					
						
							| 
									
										
										
										
											2024-09-30 00:40:03 -07:00
										 |  |  | 			t.Fatalf("%d.%q want:\n\n%s\n\ngot:\n\n%s", i, test.paths, string(want), got) | 
					
						
							| 
									
										
										
										
											2015-09-03 07:59:56 -07:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } |