From 70d1e64c57195a945b752ad893ac11684928feeb Mon Sep 17 00:00:00 2001 From: Zac Blazic Date: Sun, 28 Jan 2018 12:40:58 +0200 Subject: [PATCH 01/19] Improve README --- README | 71 ------------------------------------------------------- README.md | 40 +++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 71 deletions(-) delete mode 100644 README create mode 100644 README.md diff --git a/README b/README deleted file mode 100644 index 3bfcb00..0000000 --- a/README +++ /dev/null @@ -1,71 +0,0 @@ -************************ -passenger_exporter_nginx ------------------------- - -This is a Prometheus exporter for passenger with nginx integration. - -https://www.phusionpassenger.com/ - -********************* -Building the Exporter ---------------------- - -The default Makefile target creates a statically linked binary for Linux. - -A Dockerfile and Makefile target are also supplied: - -make build-docker - -******************** -Running the Exporter --------------------- - -Usage of passenger_exporter_nginx: - -log.format value - If set use a syslog logger or JSON logging. - Example: logger:syslog?appname=bob&local=7 or logger:stdout?json=true. - Defaults to stderr. - -log.level value - Only log messages with the given severity or above. - Valid levels: [debug, info, warn, error, fatal]. (default info) - -passenger.command string - Passenger command for querying passenger status. - (default "passenger-status --show=xml") - -passenger.pid-file string - Optional path to a file containing the passenger/nginx PID for additional metrics. - -passenger.command.timeout duration - Timeout for passenger.command. (default 500ms) - -web.listen-address string - Address to listen on for web interface and telemetry. (default ":9149") - -web.telemetry-path string - Path under which to expose metrics. (default "/metrics") - -To run the Docker image: - -docker run -p 9106:9106 -v $PATH_TO_PASSENGER_STATUS:/bin \ - passenger_exporter_nginx:latest /passenger_exporter_nginx - -Notes for running the Docker container: - -- You must mount the passenger-status binary within the container to - have access. -- You must expose the -web.listen-address port on the container to be scraped. - -********** -Collectors ----------- - -An example of the metrics exported can be seen in testdata/scrape_output.txt - -************* -Running Tests -------------- - -Tests can be run with: - -go test . - -Additionally, the testdata/scrape_output.txt can be regenerated by passing the ---golden flag: - -go test -v . --golden diff --git a/README.md b/README.md new file mode 100644 index 0000000..658dbd7 --- /dev/null +++ b/README.md @@ -0,0 +1,40 @@ +# Passenger Exporter + +Prometheus exporter for [Phusion Passenger](https://www.phusionpassenger.com) metrics. + +## Flags + +``` + -log.format value + If set use a syslog logger or JSON logging. + Example: logger:syslog?appname=bob&local=7 or logger:stdout?json=true. + Defaults to stderr. + -log.level value + Only log messages with the given severity or above. + Valid levels: [debug, info, warn, error, fatal]. (default info) + -passenger.command string + Passenger command for querying passenger status. + (default "passenger-status --show=xml") + -passenger.pid-file string + Optional path to a file containing the passenger/nginx PID for additional metrics. + -passenger.command.timeout duration + Timeout for passenger.command. (default 500ms) + -web.listen-address string + Address to listen on for web interface and telemetry. (default ":9149") + -web.telemetry-path string + Path under which to expose metrics. (default "/metrics") +``` + + +## Running Tests + +Tests can be run with: +``` +go test . +``` + +Additionally, the testdata/scrape_output.txt can be regenerated by passing the +`--golden` flag: +``` +go test -v . --golden +``` From a22437f07b6cb896e304b286533e87bf3a6f648b Mon Sep 17 00:00:00 2001 From: Zac Blazic Date: Sun, 28 Jan 2018 12:41:54 +0200 Subject: [PATCH 02/19] Rename exporter --- .gitignore | 4 +--- Makefile | 5 ++--- main.go | 2 +- 3 files changed, 4 insertions(+), 7 deletions(-) diff --git a/.gitignore b/.gitignore index e77d206..9e38b36 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1 @@ -passenger_exporter -passenger_exporter_nginx -passenger_exporter_nginx-*.tar.gz +passenger-exporter diff --git a/Makefile b/Makefile index 697153c..1dcac10 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ VERSION := $(shell cat VERSION) -BIN := passenger_exporter_nginx -CONTAINER := passenger_exporter_nginx +BIN := passenger-exporter +CONTAINER := passenger-exporter GOOS ?= linux GOARCH ?= amd64 @@ -23,4 +23,3 @@ build-docker: $(BIN) $(TAR): $(BIN) tar czf $@ $< - diff --git a/main.go b/main.go index 9aa964a..6d08006 100644 --- a/main.go +++ b/main.go @@ -333,7 +333,7 @@ func main() { http.Handle(*metricsPath, prometheus.Handler()) - log.Infoln("starting passenger_exporter_nginx", version.Info()) + log.Infoln("starting passenger-exporter", version.Info()) log.Infoln("build context", version.BuildContext()) log.Infoln("listening on", *listenAddress) log.Fatal(http.ListenAndServe(*listenAddress, nil)) From 365fbd1d9168ec803340440b7f6321122185c852 Mon Sep 17 00:00:00 2001 From: Zac Blazic Date: Sun, 28 Jan 2018 12:46:51 +0200 Subject: [PATCH 03/19] Remove almost all mention of nginx --- README.md | 2 +- main.go | 6 +- main_test.go | 2 +- testdata/scrape_output.txt | 298 ++++++++++++++++++++++--------------- 4 files changed, 179 insertions(+), 129 deletions(-) diff --git a/README.md b/README.md index 658dbd7..e6b7cd4 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ Prometheus exporter for [Phusion Passenger](https://www.phusionpassenger.com) me Passenger command for querying passenger status. (default "passenger-status --show=xml") -passenger.pid-file string - Optional path to a file containing the passenger/nginx PID for additional metrics. + Optional path to a file containing the passenger PID for additional metrics. -passenger.command.timeout duration Timeout for passenger.command. (default 500ms) -web.listen-address string diff --git a/main.go b/main.go index 6d08006..31a72cf 100644 --- a/main.go +++ b/main.go @@ -23,7 +23,7 @@ import ( ) const ( - namespace = "passenger_nginx" + namespace = "passenger" nanosecondsPerSecond = 1000000000 ) @@ -34,7 +34,7 @@ var ( processIdentifiers = make(map[string]int) ) -// Exporter collects metrics from a passenger-nginx integration. +// Exporter collects metrics from passenger. type Exporter struct { // binary file path for querying passenger state. cmd string @@ -306,7 +306,7 @@ func main() { var ( cmd = flag.String("passenger.command", "passenger-status --show=xml", "Passenger command for querying passenger status.") timeout = flag.Duration("passenger.command.timeout", 500*time.Millisecond, "Timeout for passenger.command.") - pidFile = flag.String("passenger.pid-file", "", "Optional path to a file containing the passenger/nginx PID for additional metrics.") + pidFile = flag.String("passenger.pid-file", "", "Optional path to a file containing the passenger PID for additional metrics.") metricsPath = flag.String("web.telemetry-path", "/metrics", "Path under which to expose metrics.") listenAddress = flag.String("web.listen-address", ":9149", "Address to listen on for web interface and telemetry.") ) diff --git a/main_test.go b/main_test.go index 4a14a5e..1bd859c 100644 --- a/main_test.go +++ b/main_test.go @@ -86,7 +86,7 @@ func TestScrape(t *testing.T) { scrapeFixturePath := "./testdata/scrape_output.txt" if golden { - idx := bytes.Index(body, []byte("# HELP passenger_nginx_app_count Number of apps.")) + idx := bytes.Index(body, []byte("# HELP passenger_app_count Number of apps.")) ioutil.WriteFile(scrapeFixturePath, body[idx:], 0666) t.Skipf("--golden passed: re-writing %s", scrapeFixturePath) } diff --git a/testdata/scrape_output.txt b/testdata/scrape_output.txt index 460a315..2bc52d8 100644 --- a/testdata/scrape_output.txt +++ b/testdata/scrape_output.txt @@ -1,124 +1,174 @@ -# HELP passenger_nginx_app_count Number of apps. -# TYPE passenger_nginx_app_count gauge -passenger_nginx_app_count 1 -# HELP passenger_nginx_app_procs_spawning Number of processes spawning. -# TYPE passenger_nginx_app_procs_spawning gauge -passenger_nginx_app_procs_spawning{name="/srv/app/my_app (production)"} 0 -# HELP passenger_nginx_app_queue Number of requests in app process queues. -# TYPE passenger_nginx_app_queue gauge -passenger_nginx_app_queue{name="/srv/app/my_app (production)"} 0 -# HELP passenger_nginx_current_processes Current number of processes. -# TYPE passenger_nginx_current_processes gauge -passenger_nginx_current_processes 48 -# HELP passenger_nginx_max_processes Configured maximum number of processes. -# TYPE passenger_nginx_max_processes gauge -passenger_nginx_max_processes 48 -# HELP passenger_nginx_proc_memory Memory consumed by a process -# TYPE passenger_nginx_proc_memory gauge -passenger_nginx_proc_memory{id="0",name="/srv/app/my_app (production)"} 330012 -passenger_nginx_proc_memory{id="1",name="/srv/app/my_app (production)"} 303296 -passenger_nginx_proc_memory{id="10",name="/srv/app/my_app (production)"} 303984 -passenger_nginx_proc_memory{id="11",name="/srv/app/my_app (production)"} 289680 -passenger_nginx_proc_memory{id="12",name="/srv/app/my_app (production)"} 306148 -passenger_nginx_proc_memory{id="13",name="/srv/app/my_app (production)"} 293128 -passenger_nginx_proc_memory{id="14",name="/srv/app/my_app (production)"} 322064 -passenger_nginx_proc_memory{id="15",name="/srv/app/my_app (production)"} 297124 -passenger_nginx_proc_memory{id="16",name="/srv/app/my_app (production)"} 290364 -passenger_nginx_proc_memory{id="17",name="/srv/app/my_app (production)"} 292056 -passenger_nginx_proc_memory{id="18",name="/srv/app/my_app (production)"} 272784 -passenger_nginx_proc_memory{id="19",name="/srv/app/my_app (production)"} 281176 -passenger_nginx_proc_memory{id="2",name="/srv/app/my_app (production)"} 288884 -passenger_nginx_proc_memory{id="20",name="/srv/app/my_app (production)"} 269520 -passenger_nginx_proc_memory{id="21",name="/srv/app/my_app (production)"} 269404 -passenger_nginx_proc_memory{id="22",name="/srv/app/my_app (production)"} 275844 -passenger_nginx_proc_memory{id="23",name="/srv/app/my_app (production)"} 276412 -passenger_nginx_proc_memory{id="24",name="/srv/app/my_app (production)"} 267316 -passenger_nginx_proc_memory{id="25",name="/srv/app/my_app (production)"} 265152 -passenger_nginx_proc_memory{id="26",name="/srv/app/my_app (production)"} 261144 -passenger_nginx_proc_memory{id="27",name="/srv/app/my_app (production)"} 260224 -passenger_nginx_proc_memory{id="28",name="/srv/app/my_app (production)"} 243688 -passenger_nginx_proc_memory{id="29",name="/srv/app/my_app (production)"} 243724 -passenger_nginx_proc_memory{id="3",name="/srv/app/my_app (production)"} 293316 -passenger_nginx_proc_memory{id="30",name="/srv/app/my_app (production)"} 261492 -passenger_nginx_proc_memory{id="31",name="/srv/app/my_app (production)"} 260196 -passenger_nginx_proc_memory{id="32",name="/srv/app/my_app (production)"} 244720 -passenger_nginx_proc_memory{id="33",name="/srv/app/my_app (production)"} 261268 -passenger_nginx_proc_memory{id="34",name="/srv/app/my_app (production)"} 261320 -passenger_nginx_proc_memory{id="35",name="/srv/app/my_app (production)"} 244740 -passenger_nginx_proc_memory{id="36",name="/srv/app/my_app (production)"} 244656 -passenger_nginx_proc_memory{id="37",name="/srv/app/my_app (production)"} 244860 -passenger_nginx_proc_memory{id="38",name="/srv/app/my_app (production)"} 244752 -passenger_nginx_proc_memory{id="39",name="/srv/app/my_app (production)"} 244708 -passenger_nginx_proc_memory{id="4",name="/srv/app/my_app (production)"} 330412 -passenger_nginx_proc_memory{id="40",name="/srv/app/my_app (production)"} 244684 -passenger_nginx_proc_memory{id="41",name="/srv/app/my_app (production)"} 255428 -passenger_nginx_proc_memory{id="42",name="/srv/app/my_app (production)"} 243744 -passenger_nginx_proc_memory{id="43",name="/srv/app/my_app (production)"} 254432 -passenger_nginx_proc_memory{id="44",name="/srv/app/my_app (production)"} 243592 -passenger_nginx_proc_memory{id="45",name="/srv/app/my_app (production)"} 244640 -passenger_nginx_proc_memory{id="46",name="/srv/app/my_app (production)"} 242576 -passenger_nginx_proc_memory{id="47",name="/srv/app/my_app (production)"} 255376 -passenger_nginx_proc_memory{id="5",name="/srv/app/my_app (production)"} 306904 -passenger_nginx_proc_memory{id="6",name="/srv/app/my_app (production)"} 330644 -passenger_nginx_proc_memory{id="7",name="/srv/app/my_app (production)"} 315104 -passenger_nginx_proc_memory{id="8",name="/srv/app/my_app (production)"} 288508 -passenger_nginx_proc_memory{id="9",name="/srv/app/my_app (production)"} 306520 -# HELP passenger_nginx_requests_processed_total Number of processes served by a process. -# TYPE passenger_nginx_requests_processed_total counter -passenger_nginx_requests_processed_total{id="0",name="/srv/app/my_app (production)"} 43578 -passenger_nginx_requests_processed_total{id="1",name="/srv/app/my_app (production)"} 48130 -passenger_nginx_requests_processed_total{id="10",name="/srv/app/my_app (production)"} 26226 -passenger_nginx_requests_processed_total{id="11",name="/srv/app/my_app (production)"} 22752 -passenger_nginx_requests_processed_total{id="12",name="/srv/app/my_app (production)"} 18646 -passenger_nginx_requests_processed_total{id="13",name="/srv/app/my_app (production)"} 15254 -passenger_nginx_requests_processed_total{id="14",name="/srv/app/my_app (production)"} 11561 -passenger_nginx_requests_processed_total{id="15",name="/srv/app/my_app (production)"} 9107 -passenger_nginx_requests_processed_total{id="16",name="/srv/app/my_app (production)"} 6831 -passenger_nginx_requests_processed_total{id="17",name="/srv/app/my_app (production)"} 4804 -passenger_nginx_requests_processed_total{id="18",name="/srv/app/my_app (production)"} 3420 -passenger_nginx_requests_processed_total{id="19",name="/srv/app/my_app (production)"} 2150 -passenger_nginx_requests_processed_total{id="2",name="/srv/app/my_app (production)"} 46701 -passenger_nginx_requests_processed_total{id="20",name="/srv/app/my_app (production)"} 1333 -passenger_nginx_requests_processed_total{id="21",name="/srv/app/my_app (production)"} 809 -passenger_nginx_requests_processed_total{id="22",name="/srv/app/my_app (production)"} 504 -passenger_nginx_requests_processed_total{id="23",name="/srv/app/my_app (production)"} 288 -passenger_nginx_requests_processed_total{id="24",name="/srv/app/my_app (production)"} 161 -passenger_nginx_requests_processed_total{id="25",name="/srv/app/my_app (production)"} 99 -passenger_nginx_requests_processed_total{id="26",name="/srv/app/my_app (production)"} 60 -passenger_nginx_requests_processed_total{id="27",name="/srv/app/my_app (production)"} 49 -passenger_nginx_requests_processed_total{id="28",name="/srv/app/my_app (production)"} 24 -passenger_nginx_requests_processed_total{id="29",name="/srv/app/my_app (production)"} 19 -passenger_nginx_requests_processed_total{id="3",name="/srv/app/my_app (production)"} 45134 -passenger_nginx_requests_processed_total{id="30",name="/srv/app/my_app (production)"} 9 -passenger_nginx_requests_processed_total{id="31",name="/srv/app/my_app (production)"} 5 -passenger_nginx_requests_processed_total{id="32",name="/srv/app/my_app (production)"} 4 -passenger_nginx_requests_processed_total{id="33",name="/srv/app/my_app (production)"} 4 -passenger_nginx_requests_processed_total{id="34",name="/srv/app/my_app (production)"} 2 -passenger_nginx_requests_processed_total{id="35",name="/srv/app/my_app (production)"} 2 -passenger_nginx_requests_processed_total{id="36",name="/srv/app/my_app (production)"} 0 -passenger_nginx_requests_processed_total{id="37",name="/srv/app/my_app (production)"} 0 -passenger_nginx_requests_processed_total{id="38",name="/srv/app/my_app (production)"} 0 -passenger_nginx_requests_processed_total{id="39",name="/srv/app/my_app (production)"} 0 -passenger_nginx_requests_processed_total{id="4",name="/srv/app/my_app (production)"} 42932 -passenger_nginx_requests_processed_total{id="40",name="/srv/app/my_app (production)"} 0 -passenger_nginx_requests_processed_total{id="41",name="/srv/app/my_app (production)"} 0 -passenger_nginx_requests_processed_total{id="42",name="/srv/app/my_app (production)"} 0 -passenger_nginx_requests_processed_total{id="43",name="/srv/app/my_app (production)"} 0 -passenger_nginx_requests_processed_total{id="44",name="/srv/app/my_app (production)"} 0 -passenger_nginx_requests_processed_total{id="45",name="/srv/app/my_app (production)"} 0 -passenger_nginx_requests_processed_total{id="46",name="/srv/app/my_app (production)"} 0 -passenger_nginx_requests_processed_total{id="47",name="/srv/app/my_app (production)"} 0 -passenger_nginx_requests_processed_total{id="5",name="/srv/app/my_app (production)"} 40815 -passenger_nginx_requests_processed_total{id="6",name="/srv/app/my_app (production)"} 38615 -passenger_nginx_requests_processed_total{id="7",name="/srv/app/my_app (production)"} 35802 -passenger_nginx_requests_processed_total{id="8",name="/srv/app/my_app (production)"} 33600 -passenger_nginx_requests_processed_total{id="9",name="/srv/app/my_app (production)"} 30490 -# HELP passenger_nginx_top_level_queue Number of requests in the top-level queue. -# TYPE passenger_nginx_top_level_queue gauge -passenger_nginx_top_level_queue 0 -# HELP passenger_nginx_up Could passenger status be queried. -# TYPE passenger_nginx_up gauge -passenger_nginx_up 1 -# HELP passenger_nginx_version Version of passenger -# TYPE passenger_nginx_version gauge -passenger_nginx_version{version="5.0.26"} 1 +# HELP passenger_app_count Number of apps. +# TYPE passenger_app_count gauge +passenger_app_count 1 +# HELP passenger_app_procs_spawning Number of processes spawning. +# TYPE passenger_app_procs_spawning gauge +passenger_app_procs_spawning{name="/srv/app/my_app (production)"} 0 +# HELP passenger_app_queue Number of requests in app process queues. +# TYPE passenger_app_queue gauge +passenger_app_queue{name="/srv/app/my_app (production)"} 0 +# HELP passenger_current_processes Current number of processes. +# TYPE passenger_current_processes gauge +passenger_current_processes 48 +# HELP passenger_max_processes Configured maximum number of processes. +# TYPE passenger_max_processes gauge +passenger_max_processes 48 +# HELP passenger_proc_memory Memory consumed by a process +# TYPE passenger_proc_memory gauge +passenger_proc_memory{id="0",name="/srv/app/my_app (production)"} 330012 +passenger_proc_memory{id="1",name="/srv/app/my_app (production)"} 303296 +passenger_proc_memory{id="10",name="/srv/app/my_app (production)"} 303984 +passenger_proc_memory{id="11",name="/srv/app/my_app (production)"} 289680 +passenger_proc_memory{id="12",name="/srv/app/my_app (production)"} 306148 +passenger_proc_memory{id="13",name="/srv/app/my_app (production)"} 293128 +passenger_proc_memory{id="14",name="/srv/app/my_app (production)"} 322064 +passenger_proc_memory{id="15",name="/srv/app/my_app (production)"} 297124 +passenger_proc_memory{id="16",name="/srv/app/my_app (production)"} 290364 +passenger_proc_memory{id="17",name="/srv/app/my_app (production)"} 292056 +passenger_proc_memory{id="18",name="/srv/app/my_app (production)"} 272784 +passenger_proc_memory{id="19",name="/srv/app/my_app (production)"} 281176 +passenger_proc_memory{id="2",name="/srv/app/my_app (production)"} 288884 +passenger_proc_memory{id="20",name="/srv/app/my_app (production)"} 269520 +passenger_proc_memory{id="21",name="/srv/app/my_app (production)"} 269404 +passenger_proc_memory{id="22",name="/srv/app/my_app (production)"} 275844 +passenger_proc_memory{id="23",name="/srv/app/my_app (production)"} 276412 +passenger_proc_memory{id="24",name="/srv/app/my_app (production)"} 267316 +passenger_proc_memory{id="25",name="/srv/app/my_app (production)"} 265152 +passenger_proc_memory{id="26",name="/srv/app/my_app (production)"} 261144 +passenger_proc_memory{id="27",name="/srv/app/my_app (production)"} 260224 +passenger_proc_memory{id="28",name="/srv/app/my_app (production)"} 243688 +passenger_proc_memory{id="29",name="/srv/app/my_app (production)"} 243724 +passenger_proc_memory{id="3",name="/srv/app/my_app (production)"} 293316 +passenger_proc_memory{id="30",name="/srv/app/my_app (production)"} 261492 +passenger_proc_memory{id="31",name="/srv/app/my_app (production)"} 260196 +passenger_proc_memory{id="32",name="/srv/app/my_app (production)"} 244720 +passenger_proc_memory{id="33",name="/srv/app/my_app (production)"} 261268 +passenger_proc_memory{id="34",name="/srv/app/my_app (production)"} 261320 +passenger_proc_memory{id="35",name="/srv/app/my_app (production)"} 244740 +passenger_proc_memory{id="36",name="/srv/app/my_app (production)"} 244656 +passenger_proc_memory{id="37",name="/srv/app/my_app (production)"} 244860 +passenger_proc_memory{id="38",name="/srv/app/my_app (production)"} 244752 +passenger_proc_memory{id="39",name="/srv/app/my_app (production)"} 244708 +passenger_proc_memory{id="4",name="/srv/app/my_app (production)"} 330412 +passenger_proc_memory{id="40",name="/srv/app/my_app (production)"} 244684 +passenger_proc_memory{id="41",name="/srv/app/my_app (production)"} 255428 +passenger_proc_memory{id="42",name="/srv/app/my_app (production)"} 243744 +passenger_proc_memory{id="43",name="/srv/app/my_app (production)"} 254432 +passenger_proc_memory{id="44",name="/srv/app/my_app (production)"} 243592 +passenger_proc_memory{id="45",name="/srv/app/my_app (production)"} 244640 +passenger_proc_memory{id="46",name="/srv/app/my_app (production)"} 242576 +passenger_proc_memory{id="47",name="/srv/app/my_app (production)"} 255376 +passenger_proc_memory{id="5",name="/srv/app/my_app (production)"} 306904 +passenger_proc_memory{id="6",name="/srv/app/my_app (production)"} 330644 +passenger_proc_memory{id="7",name="/srv/app/my_app (production)"} 315104 +passenger_proc_memory{id="8",name="/srv/app/my_app (production)"} 288508 +passenger_proc_memory{id="9",name="/srv/app/my_app (production)"} 306520 +# HELP passenger_proc_start_time_seconds Number of seconds since processor started. +# TYPE passenger_proc_start_time_seconds gauge +passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="0",name="/srv/app/my_app (production)"} 1.462477e+06 +passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="1",name="/srv/app/my_app (production)"} 1.462477e+06 +passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="10",name="/srv/app/my_app (production)"} 1.462477e+06 +passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="11",name="/srv/app/my_app (production)"} 1.462477e+06 +passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="12",name="/srv/app/my_app (production)"} 1.462477e+06 +passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="13",name="/srv/app/my_app (production)"} 1.462477e+06 +passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="14",name="/srv/app/my_app (production)"} 1.462477e+06 +passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="15",name="/srv/app/my_app (production)"} 1.462477e+06 +passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="16",name="/srv/app/my_app (production)"} 1.462477e+06 +passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="17",name="/srv/app/my_app (production)"} 1.462477e+06 +passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="18",name="/srv/app/my_app (production)"} 1.462477e+06 +passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="19",name="/srv/app/my_app (production)"} 1.462477e+06 +passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="2",name="/srv/app/my_app (production)"} 1.462477e+06 +passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="20",name="/srv/app/my_app (production)"} 1.462477e+06 +passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="21",name="/srv/app/my_app (production)"} 1.462477e+06 +passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="22",name="/srv/app/my_app (production)"} 1.462477e+06 +passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="23",name="/srv/app/my_app (production)"} 1.462477e+06 +passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="24",name="/srv/app/my_app (production)"} 1.462477e+06 +passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="25",name="/srv/app/my_app (production)"} 1.462477e+06 +passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="26",name="/srv/app/my_app (production)"} 1.462477e+06 +passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="27",name="/srv/app/my_app (production)"} 1.462477e+06 +passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="28",name="/srv/app/my_app (production)"} 1.462477e+06 +passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="29",name="/srv/app/my_app (production)"} 1.462477e+06 +passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="3",name="/srv/app/my_app (production)"} 1.462477e+06 +passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="30",name="/srv/app/my_app (production)"} 1.462477e+06 +passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="31",name="/srv/app/my_app (production)"} 1.462477e+06 +passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="32",name="/srv/app/my_app (production)"} 1.462477e+06 +passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="33",name="/srv/app/my_app (production)"} 1.462477e+06 +passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="34",name="/srv/app/my_app (production)"} 1.462477e+06 +passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="35",name="/srv/app/my_app (production)"} 1.462477e+06 +passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="36",name="/srv/app/my_app (production)"} 1.462477e+06 +passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="37",name="/srv/app/my_app (production)"} 1.462478e+06 +passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="38",name="/srv/app/my_app (production)"} 1.462478e+06 +passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="39",name="/srv/app/my_app (production)"} 1.462478e+06 +passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="4",name="/srv/app/my_app (production)"} 1.462477e+06 +passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="40",name="/srv/app/my_app (production)"} 1.462478e+06 +passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="41",name="/srv/app/my_app (production)"} 1.462478e+06 +passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="42",name="/srv/app/my_app (production)"} 1.462478e+06 +passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="43",name="/srv/app/my_app (production)"} 1.462478e+06 +passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="44",name="/srv/app/my_app (production)"} 1.462478e+06 +passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="45",name="/srv/app/my_app (production)"} 1.462478e+06 +passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="46",name="/srv/app/my_app (production)"} 1.462478e+06 +passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="47",name="/srv/app/my_app (production)"} 1.462478e+06 +passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="5",name="/srv/app/my_app (production)"} 1.462477e+06 +passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="6",name="/srv/app/my_app (production)"} 1.462477e+06 +passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="7",name="/srv/app/my_app (production)"} 1.462477e+06 +passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="8",name="/srv/app/my_app (production)"} 1.462477e+06 +passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="9",name="/srv/app/my_app (production)"} 1.462477e+06 +# HELP passenger_requests_processed_total Number of processes served by a process. +# TYPE passenger_requests_processed_total counter +passenger_requests_processed_total{id="0",name="/srv/app/my_app (production)"} 43578 +passenger_requests_processed_total{id="1",name="/srv/app/my_app (production)"} 48130 +passenger_requests_processed_total{id="10",name="/srv/app/my_app (production)"} 26226 +passenger_requests_processed_total{id="11",name="/srv/app/my_app (production)"} 22752 +passenger_requests_processed_total{id="12",name="/srv/app/my_app (production)"} 18646 +passenger_requests_processed_total{id="13",name="/srv/app/my_app (production)"} 15254 +passenger_requests_processed_total{id="14",name="/srv/app/my_app (production)"} 11561 +passenger_requests_processed_total{id="15",name="/srv/app/my_app (production)"} 9107 +passenger_requests_processed_total{id="16",name="/srv/app/my_app (production)"} 6831 +passenger_requests_processed_total{id="17",name="/srv/app/my_app (production)"} 4804 +passenger_requests_processed_total{id="18",name="/srv/app/my_app (production)"} 3420 +passenger_requests_processed_total{id="19",name="/srv/app/my_app (production)"} 2150 +passenger_requests_processed_total{id="2",name="/srv/app/my_app (production)"} 46701 +passenger_requests_processed_total{id="20",name="/srv/app/my_app (production)"} 1333 +passenger_requests_processed_total{id="21",name="/srv/app/my_app (production)"} 809 +passenger_requests_processed_total{id="22",name="/srv/app/my_app (production)"} 504 +passenger_requests_processed_total{id="23",name="/srv/app/my_app (production)"} 288 +passenger_requests_processed_total{id="24",name="/srv/app/my_app (production)"} 161 +passenger_requests_processed_total{id="25",name="/srv/app/my_app (production)"} 99 +passenger_requests_processed_total{id="26",name="/srv/app/my_app (production)"} 60 +passenger_requests_processed_total{id="27",name="/srv/app/my_app (production)"} 49 +passenger_requests_processed_total{id="28",name="/srv/app/my_app (production)"} 24 +passenger_requests_processed_total{id="29",name="/srv/app/my_app (production)"} 19 +passenger_requests_processed_total{id="3",name="/srv/app/my_app (production)"} 45134 +passenger_requests_processed_total{id="30",name="/srv/app/my_app (production)"} 9 +passenger_requests_processed_total{id="31",name="/srv/app/my_app (production)"} 5 +passenger_requests_processed_total{id="32",name="/srv/app/my_app (production)"} 4 +passenger_requests_processed_total{id="33",name="/srv/app/my_app (production)"} 4 +passenger_requests_processed_total{id="34",name="/srv/app/my_app (production)"} 2 +passenger_requests_processed_total{id="35",name="/srv/app/my_app (production)"} 2 +passenger_requests_processed_total{id="36",name="/srv/app/my_app (production)"} 0 +passenger_requests_processed_total{id="37",name="/srv/app/my_app (production)"} 0 +passenger_requests_processed_total{id="38",name="/srv/app/my_app (production)"} 0 +passenger_requests_processed_total{id="39",name="/srv/app/my_app (production)"} 0 +passenger_requests_processed_total{id="4",name="/srv/app/my_app (production)"} 42932 +passenger_requests_processed_total{id="40",name="/srv/app/my_app (production)"} 0 +passenger_requests_processed_total{id="41",name="/srv/app/my_app (production)"} 0 +passenger_requests_processed_total{id="42",name="/srv/app/my_app (production)"} 0 +passenger_requests_processed_total{id="43",name="/srv/app/my_app (production)"} 0 +passenger_requests_processed_total{id="44",name="/srv/app/my_app (production)"} 0 +passenger_requests_processed_total{id="45",name="/srv/app/my_app (production)"} 0 +passenger_requests_processed_total{id="46",name="/srv/app/my_app (production)"} 0 +passenger_requests_processed_total{id="47",name="/srv/app/my_app (production)"} 0 +passenger_requests_processed_total{id="5",name="/srv/app/my_app (production)"} 40815 +passenger_requests_processed_total{id="6",name="/srv/app/my_app (production)"} 38615 +passenger_requests_processed_total{id="7",name="/srv/app/my_app (production)"} 35802 +passenger_requests_processed_total{id="8",name="/srv/app/my_app (production)"} 33600 +passenger_requests_processed_total{id="9",name="/srv/app/my_app (production)"} 30490 +# HELP passenger_top_level_queue Number of requests in the top-level queue. +# TYPE passenger_top_level_queue gauge +passenger_top_level_queue 0 +# HELP passenger_up Could passenger status be queried. +# TYPE passenger_up gauge +passenger_up 1 +# HELP passenger_version Version of passenger +# TYPE passenger_version gauge +passenger_version{version="5.0.26"} 1 From 945bf8cb20a573a4e8b1d369fa73b8c8d0713c94 Mon Sep 17 00:00:00 2001 From: Zac Blazic Date: Sun, 28 Jan 2018 21:03:09 +0200 Subject: [PATCH 04/19] Rename main files to name of exporter --- main.go => passenger_exporter.go | 0 main_test.go => passenger_exporter_test.go | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename main.go => passenger_exporter.go (100%) rename main_test.go => passenger_exporter_test.go (100%) diff --git a/main.go b/passenger_exporter.go similarity index 100% rename from main.go rename to passenger_exporter.go diff --git a/main_test.go b/passenger_exporter_test.go similarity index 100% rename from main_test.go rename to passenger_exporter_test.go From 7c22af3fb7a56ba7031dc367b77338bd48d44bb8 Mon Sep 17 00:00:00 2001 From: Zac Blazic Date: Sun, 28 Jan 2018 21:04:08 +0200 Subject: [PATCH 05/19] Move structs into main file --- passenger_exporter.go | 97 ++++++++++++++++++++++++++++++++++++++++++ structs.go | 98 ------------------------------------------- 2 files changed, 97 insertions(+), 98 deletions(-) delete mode 100644 structs.go diff --git a/passenger_exporter.go b/passenger_exporter.go index 31a72cf..b0e60cc 100644 --- a/passenger_exporter.go +++ b/passenger_exporter.go @@ -34,6 +34,103 @@ var ( processIdentifiers = make(map[string]int) ) +type Info struct { + CapacityUsed string `xml:"capacity_used"` + MaxProcessCount string `xml:"max"` + PassengerVersion string `xml:"passenger_version"` + AppCount string `xml:"group_count"` + TopLevelRequestsInQueue string `xml:"get_wait_list_size"` + CurrentProcessCount string `xml:"process_count"` + SuperGroups []SuperGroup `xml:"supergroups>supergroup"` +} + +type SuperGroup struct { + RequestsInQueue string `xml:"get_wait_list_size"` + CapacityUsed string `xml:"capacity_used"` + State string `xml:"state"` + Group Group `xml:"group"` + Name string `xml:"name"` +} + +type Group struct { + Environment string `xml:"environment"` + DisabledProcessCount string `xml:"disabled_process_count"` + UID string `xml:"uid"` + GetWaitListSize string `xml:"get_wait_list_size"` + CapacityUsed string `xml:"capacity_used"` + Name string `xml:"name"` + AppType string `xml:"app_type"` + AppRoot string `xml:"app_root"` + User string `xml:"user"` + ComponentName string `xml:"component_name"` + LifeStatus string `xml:"life_status"` + UUID string `xml:"uuid"` + Default string `xml:"default,attr"` + DisablingProcessCount string `xml:"disabling_process_count"` + EnabledProcessCount string `xml:"enabled_process_count"` + DisableWaitListSize string `xml:"disable_wait_list_size"` + GID string `xml:"gid"` + ProcessesSpawning string `xml:"processes_being_spawned"` + Options Options `xml:"options"` + Processes []Process `xml:"processes>process"` +} + +type Process struct { + CodeRevision string `xml:"code_revision"` + Enabled string `xml:"enabled"` + SpawnEndTime string `xml:"spawn_end_time"` + HasMetrics string `xml:"has_metrics"` + LifeStatus string `xml:"life_status"` + Busyness string `xml:"busyness"` + RealMemory string `xml:"real_memory"` + StickySessionID string `xml:"sticky_session_id"` + PSS string `xml:"pss"` + Command string `xml:"command"` + LastUsed string `xml:"last_used"` + CPU string `xml:"cpu"` + SpawnerCreationTime string `xml:"spawner_creation_time"` + LastUsedDesc string `xml:"last_used_desc"` + Uptime string `xml:"uptime"` + Swap string `xml:"swap"` + Sessions string `xml:"sessions"` + RSS string `xml:"rss"` + PrivateDirty string `xml:"private_dirty"` + RequestsProcessed string `xml:"processed"` + ProcessGroupID string `xml:"process_group_id"` + PID string `xml:"pid"` + GUPID string `xml:"gupid"` + VMSize string `xml:"vmsize"` + Concurrency string `xml:"concurrency"` + SpawnStartTime string `xml:"spawn_start_time"` +} + +type Options struct { + DefaultGroup string `xml:"default_group"` + RubyBinPath string `xml:"ruby"` + USTRouterAddress string `xml:"ust_router_address"` + USTRouterPassword string `xml:"ust_router_password"` + StartCommand string `xml:"start_command"` + USTRouterUsername string `xml:"ust_router_username"` + MaxPreloaderIdleTime string `xml:"max_preloader_idle_time"` + BaseURI string `xml:"base_uri"` + SpawnMethod string `xml:"spawn_method"` + AppType string `xml:"app_type"` + Environment string `xml:"environment"` + Analytics string `xml:"analytics"` + MinProcesses string `xml:"min_processes"` + StartTimeout string `xml:"start_timeout"` + AppRoot string `xml:"app_root"` + ProcessTitle string `xml:"process_title"` + Debugger string `xml:"debugger"` + DefaultUser string `xml:"default_user"` + MaxOutOfBandWorkInstances string `xml:"max_out_of_band_work_instances"` + MaxProcesses string `xml:"max_processes"` + AppGroupName string `xml:"app_group_name"` + StartupFile string `xml:"startup_file"` + IntegrationMode string `xml:"integration_mode"` + LogLevel string `xml:"log_level"` +} + // Exporter collects metrics from passenger. type Exporter struct { // binary file path for querying passenger state. diff --git a/structs.go b/structs.go deleted file mode 100644 index d4040fd..0000000 --- a/structs.go +++ /dev/null @@ -1,98 +0,0 @@ -package main - -type Info struct { - CapacityUsed string `xml:"capacity_used"` - MaxProcessCount string `xml:"max"` - PassengerVersion string `xml:"passenger_version"` - AppCount string `xml:"group_count"` - TopLevelRequestsInQueue string `xml:"get_wait_list_size"` - CurrentProcessCount string `xml:"process_count"` - SuperGroups []SuperGroup `xml:"supergroups>supergroup"` -} - -type SuperGroup struct { - RequestsInQueue string `xml:"get_wait_list_size"` - CapacityUsed string `xml:"capacity_used"` - State string `xml:"state"` - Group Group `xml:"group"` - Name string `xml:"name"` -} - -type Group struct { - Environment string `xml:"environment"` - DisabledProcessCount string `xml:"disabled_process_count"` - UID string `xml:"uid"` - GetWaitListSize string `xml:"get_wait_list_size"` - CapacityUsed string `xml:"capacity_used"` - Name string `xml:"name"` - AppType string `xml:"app_type"` - AppRoot string `xml:"app_root"` - User string `xml:"user"` - ComponentName string `xml:"component_name"` - LifeStatus string `xml:"life_status"` - UUID string `xml:"uuid"` - Default string `xml:"default,attr"` - DisablingProcessCount string `xml:"disabling_process_count"` - EnabledProcessCount string `xml:"enabled_process_count"` - DisableWaitListSize string `xml:"disable_wait_list_size"` - GID string `xml:"gid"` - ProcessesSpawning string `xml:"processes_being_spawned"` - Options Options `xml:"options"` - Processes []Process `xml:"processes>process"` -} - -type Process struct { - CodeRevision string `xml:"code_revision"` - Enabled string `xml:"enabled"` - SpawnEndTime string `xml:"spawn_end_time"` - HasMetrics string `xml:"has_metrics"` - LifeStatus string `xml:"life_status"` - Busyness string `xml:"busyness"` - RealMemory string `xml:"real_memory"` - StickySessionID string `xml:"sticky_session_id"` - PSS string `xml:"pss"` - Command string `xml:"command"` - LastUsed string `xml:"last_used"` - CPU string `xml:"cpu"` - SpawnerCreationTime string `xml:"spawner_creation_time"` - LastUsedDesc string `xml:"last_used_desc"` - Uptime string `xml:"uptime"` - Swap string `xml:"swap"` - Sessions string `xml:"sessions"` - RSS string `xml:"rss"` - PrivateDirty string `xml:"private_dirty"` - RequestsProcessed string `xml:"processed"` - ProcessGroupID string `xml:"process_group_id"` - PID string `xml:"pid"` - GUPID string `xml:"gupid"` - VMSize string `xml:"vmsize"` - Concurrency string `xml:"concurrency"` - SpawnStartTime string `xml:"spawn_start_time"` -} - -type Options struct { - DefaultGroup string `xml:"default_group"` - RubyBinPath string `xml:"ruby"` - USTRouterAddress string `xml:"ust_router_address"` - USTRouterPassword string `xml:"ust_router_password"` - StartCommand string `xml:"start_command"` - USTRouterUsername string `xml:"ust_router_username"` - MaxPreloaderIdleTime string `xml:"max_preloader_idle_time"` - BaseURI string `xml:"base_uri"` - SpawnMethod string `xml:"spawn_method"` - AppType string `xml:"app_type"` - Environment string `xml:"environment"` - Analytics string `xml:"analytics"` - MinProcesses string `xml:"min_processes"` - StartTimeout string `xml:"start_timeout"` - AppRoot string `xml:"app_root"` - ProcessTitle string `xml:"process_title"` - Debugger string `xml:"debugger"` - DefaultUser string `xml:"default_user"` - MaxOutOfBandWorkInstances string `xml:"max_out_of_band_work_instances"` - MaxProcesses string `xml:"max_processes"` - AppGroupName string `xml:"app_group_name"` - StartupFile string `xml:"startup_file"` - IntegrationMode string `xml:"integration_mode"` - LogLevel string `xml:"log_level"` -} From ec0c32705d0c9ee3191f392043f2165a9f7316ce Mon Sep 17 00:00:00 2001 From: Zac Blazic Date: Sun, 28 Jan 2018 22:44:08 +0200 Subject: [PATCH 06/19] Order struct fields according to content being parsed This will make maintenance on these fields simpler. --- passenger_exporter.go | 106 +++++++++++++++++++++--------------------- 1 file changed, 53 insertions(+), 53 deletions(-) diff --git a/passenger_exporter.go b/passenger_exporter.go index b0e60cc..51028b5 100644 --- a/passenger_exporter.go +++ b/passenger_exporter.go @@ -35,100 +35,100 @@ var ( ) type Info struct { - CapacityUsed string `xml:"capacity_used"` - MaxProcessCount string `xml:"max"` PassengerVersion string `xml:"passenger_version"` AppCount string `xml:"group_count"` - TopLevelRequestsInQueue string `xml:"get_wait_list_size"` CurrentProcessCount string `xml:"process_count"` + MaxProcessCount string `xml:"max"` + CapacityUsed string `xml:"capacity_used"` + TopLevelRequestsInQueue string `xml:"get_wait_list_size"` SuperGroups []SuperGroup `xml:"supergroups>supergroup"` } type SuperGroup struct { + Name string `xml:"name"` + State string `xml:"state"` RequestsInQueue string `xml:"get_wait_list_size"` CapacityUsed string `xml:"capacity_used"` - State string `xml:"state"` Group Group `xml:"group"` - Name string `xml:"name"` } type Group struct { - Environment string `xml:"environment"` - DisabledProcessCount string `xml:"disabled_process_count"` - UID string `xml:"uid"` - GetWaitListSize string `xml:"get_wait_list_size"` - CapacityUsed string `xml:"capacity_used"` Name string `xml:"name"` - AppType string `xml:"app_type"` - AppRoot string `xml:"app_root"` - User string `xml:"user"` ComponentName string `xml:"component_name"` - LifeStatus string `xml:"life_status"` + AppRoot string `xml:"app_root"` + AppType string `xml:"app_type"` + Environment string `xml:"environment"` UUID string `xml:"uuid"` - Default string `xml:"default,attr"` - DisablingProcessCount string `xml:"disabling_process_count"` EnabledProcessCount string `xml:"enabled_process_count"` + DisablingProcessCount string `xml:"disabling_process_count"` + DisabledProcessCount string `xml:"disabled_process_count"` + CapacityUsed string `xml:"capacity_used"` + GetWaitListSize string `xml:"get_wait_list_size"` DisableWaitListSize string `xml:"disable_wait_list_size"` - GID string `xml:"gid"` ProcessesSpawning string `xml:"processes_being_spawned"` + LifeStatus string `xml:"life_status"` + User string `xml:"user"` + UID string `xml:"uid"` + GID string `xml:"gid"` + Default string `xml:"default,attr"` Options Options `xml:"options"` Processes []Process `xml:"processes>process"` } type Process struct { - CodeRevision string `xml:"code_revision"` - Enabled string `xml:"enabled"` - SpawnEndTime string `xml:"spawn_end_time"` - HasMetrics string `xml:"has_metrics"` - LifeStatus string `xml:"life_status"` - Busyness string `xml:"busyness"` - RealMemory string `xml:"real_memory"` + PID string `xml:"pid"` StickySessionID string `xml:"sticky_session_id"` - PSS string `xml:"pss"` - Command string `xml:"command"` - LastUsed string `xml:"last_used"` - CPU string `xml:"cpu"` + GUPID string `xml:"gupid"` + Concurrency string `xml:"concurrency"` + Sessions string `xml:"sessions"` + Busyness string `xml:"busyness"` + RequestsProcessed string `xml:"processed"` SpawnerCreationTime string `xml:"spawner_creation_time"` + SpawnStartTime string `xml:"spawn_start_time"` + SpawnEndTime string `xml:"spawn_end_time"` + LastUsed string `xml:"last_used"` LastUsedDesc string `xml:"last_used_desc"` Uptime string `xml:"uptime"` - Swap string `xml:"swap"` - Sessions string `xml:"sessions"` + LifeStatus string `xml:"life_status"` + Enabled string `xml:"enabled"` + HasMetrics string `xml:"has_metrics"` + CPU string `xml:"cpu"` RSS string `xml:"rss"` + PSS string `xml:"pss"` PrivateDirty string `xml:"private_dirty"` - RequestsProcessed string `xml:"processed"` - ProcessGroupID string `xml:"process_group_id"` - PID string `xml:"pid"` - GUPID string `xml:"gupid"` + Swap string `xml:"swap"` + RealMemory string `xml:"real_memory"` VMSize string `xml:"vmsize"` - Concurrency string `xml:"concurrency"` - SpawnStartTime string `xml:"spawn_start_time"` + ProcessGroupID string `xml:"process_group_id"` + Command string `xml:"command"` + CodeRevision string `xml:"code_revision"` } type Options struct { + AppRoot string `xml:"app_root"` + AppGroupName string `xml:"app_group_name"` + AppType string `xml:"app_type"` + StartCommand string `xml:"start_command"` + StartupFile string `xml:"startup_file"` + ProcessTitle string `xml:"process_title"` + LogLevel string `xml:"log_level"` + StartTimeout string `xml:"start_timeout"` + Environment string `xml:"environment"` + BaseURI string `xml:"base_uri"` + SpawnMethod string `xml:"spawn_method"` + DefaultUser string `xml:"default_user"` DefaultGroup string `xml:"default_group"` + IntegrationMode string `xml:"integration_mode"` RubyBinPath string `xml:"ruby"` USTRouterAddress string `xml:"ust_router_address"` - USTRouterPassword string `xml:"ust_router_password"` - StartCommand string `xml:"start_command"` USTRouterUsername string `xml:"ust_router_username"` - MaxPreloaderIdleTime string `xml:"max_preloader_idle_time"` - BaseURI string `xml:"base_uri"` - SpawnMethod string `xml:"spawn_method"` - AppType string `xml:"app_type"` - Environment string `xml:"environment"` + USTRouterPassword string `xml:"ust_router_password"` + Debugger string `xml:"debugger"` Analytics string `xml:"analytics"` MinProcesses string `xml:"min_processes"` - StartTimeout string `xml:"start_timeout"` - AppRoot string `xml:"app_root"` - ProcessTitle string `xml:"process_title"` - Debugger string `xml:"debugger"` - DefaultUser string `xml:"default_user"` - MaxOutOfBandWorkInstances string `xml:"max_out_of_band_work_instances"` MaxProcesses string `xml:"max_processes"` - AppGroupName string `xml:"app_group_name"` - StartupFile string `xml:"startup_file"` - IntegrationMode string `xml:"integration_mode"` - LogLevel string `xml:"log_level"` + MaxPreloaderIdleTime string `xml:"max_preloader_idle_time"` + MaxOutOfBandWorkInstances string `xml:"max_out_of_band_work_instances"` } // Exporter collects metrics from passenger. From 07742b9594c62ae8de5155492e2bc2c69e3d7be8 Mon Sep 17 00:00:00 2001 From: Zac Blazic Date: Sun, 28 Jan 2018 22:48:03 +0200 Subject: [PATCH 07/19] Add missing fields to structs --- passenger_exporter.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/passenger_exporter.go b/passenger_exporter.go index 51028b5..e0aa5fa 100644 --- a/passenger_exporter.go +++ b/passenger_exporter.go @@ -69,6 +69,7 @@ type Group struct { LifeStatus string `xml:"life_status"` User string `xml:"user"` UID string `xml:"uid"` + Group string `xml:"group"` GID string `xml:"gid"` Default string `xml:"default,attr"` Options Options `xml:"options"` @@ -120,11 +121,14 @@ type Options struct { DefaultGroup string `xml:"default_group"` IntegrationMode string `xml:"integration_mode"` RubyBinPath string `xml:"ruby"` + PythonBinPath string `xml:"python"` + NodeJSBinPath string `xml:"nodejs"` USTRouterAddress string `xml:"ust_router_address"` USTRouterUsername string `xml:"ust_router_username"` USTRouterPassword string `xml:"ust_router_password"` Debugger string `xml:"debugger"` Analytics string `xml:"analytics"` + APIKey string `xml:"api_key"` MinProcesses string `xml:"min_processes"` MaxProcesses string `xml:"max_processes"` MaxPreloaderIdleTime string `xml:"max_preloader_idle_time"` From d0b75eaffccc7c0fedfd979bf2a564fcb324738a Mon Sep 17 00:00:00 2001 From: Zac Blazic Date: Sun, 28 Jan 2018 22:50:49 +0200 Subject: [PATCH 08/19] Clean up consts and vars --- passenger_exporter.go | 24 +++++++++++------------- passenger_exporter_test.go | 2 +- 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/passenger_exporter.go b/passenger_exporter.go index e0aa5fa..1d8a251 100644 --- a/passenger_exporter.go +++ b/passenger_exporter.go @@ -22,18 +22,6 @@ import ( "github.com/prometheus/common/version" ) -const ( - namespace = "passenger" - - nanosecondsPerSecond = 1000000000 -) - -var ( - timeoutErr = errors.New("passenger-status command timed out") - - processIdentifiers = make(map[string]int) -) - type Info struct { PassengerVersion string `xml:"passenger_version"` AppCount string `xml:"group_count"` @@ -135,6 +123,16 @@ type Options struct { MaxOutOfBandWorkInstances string `xml:"max_out_of_band_work_instances"` } +const ( + namespace = "passenger" + nanosecondsPerSecond = 1000000000 +) + +var ( + errTimeout = errors.New("passenger-status command timed out") + processIdentifiers = make(map[string]int) +) + // Exporter collects metrics from passenger. type Exporter struct { // binary file path for querying passenger state. @@ -301,7 +299,7 @@ func (e *Exporter) status() (*Info, error) { return nil, err } case <-time.After(e.timeout): - return nil, timeoutErr + return nil, errTimeout } return parseOutput(&out) diff --git a/passenger_exporter_test.go b/passenger_exporter_test.go index 1bd859c..cac799a 100644 --- a/passenger_exporter_test.go +++ b/passenger_exporter_test.go @@ -108,7 +108,7 @@ func TestStatusTimeout(t *testing.T) { t.Fatalf("failed to timeout") } - if err != timeoutErr { + if err != errTimeout { t.Fatalf("incorrect err: %v", err) } } From a6405c93361d5d67adf67b91fbb0f56fefb8ce17 Mon Sep 17 00:00:00 2001 From: Zac Blazic Date: Sun, 28 Jan 2018 22:55:43 +0200 Subject: [PATCH 09/19] Removed deprecated code revision field --- passenger_exporter.go | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/passenger_exporter.go b/passenger_exporter.go index 1d8a251..0d20fa2 100644 --- a/passenger_exporter.go +++ b/passenger_exporter.go @@ -90,7 +90,6 @@ type Process struct { VMSize string `xml:"vmsize"` ProcessGroupID string `xml:"process_group_id"` Command string `xml:"command"` - CodeRevision string `xml:"code_revision"` } type Options struct { @@ -224,7 +223,7 @@ func NewExporter(cmd string, timeout time.Duration) *Exporter { procStartTime: prometheus.NewDesc( prometheus.BuildFQName(namespace, "", "proc_start_time_seconds"), "Number of seconds since processor started.", - []string{"name", "id", "codeRevision"}, + []string{"name", "id"}, nil, ), procMemory: prometheus.NewDesc( @@ -267,7 +266,7 @@ func (e *Exporter) Collect(ch chan<- prometheus.Metric) { if startTime, err := strconv.Atoi(proc.SpawnStartTime); err == nil { ch <- prometheus.MustNewConstMetric(e.procStartTime, prometheus.GaugeValue, float64(startTime/nanosecondsPerSecond), - sg.Name, strconv.Itoa(bucketID), proc.CodeRevision, + sg.Name, strconv.Itoa(bucketID), ) } } From 8d269a863e846892c87a102f592554b7ef7eb788 Mon Sep 17 00:00:00 2001 From: Zac Blazic Date: Sun, 28 Jan 2018 23:09:33 +0200 Subject: [PATCH 10/19] Improve request queue metric naming --- passenger_exporter.go | 56 +++++++++++++++++++++---------------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/passenger_exporter.go b/passenger_exporter.go index 0d20fa2..dfbf3f3 100644 --- a/passenger_exporter.go +++ b/passenger_exporter.go @@ -23,21 +23,21 @@ import ( ) type Info struct { - PassengerVersion string `xml:"passenger_version"` - AppCount string `xml:"group_count"` - CurrentProcessCount string `xml:"process_count"` - MaxProcessCount string `xml:"max"` - CapacityUsed string `xml:"capacity_used"` - TopLevelRequestsInQueue string `xml:"get_wait_list_size"` - SuperGroups []SuperGroup `xml:"supergroups>supergroup"` + PassengerVersion string `xml:"passenger_version"` + AppCount string `xml:"group_count"` + CurrentProcessCount string `xml:"process_count"` + MaxProcessCount string `xml:"max"` + CapacityUsed string `xml:"capacity_used"` + TopLevelRequestQueueSize string `xml:"get_wait_list_size"` + SuperGroups []SuperGroup `xml:"supergroups>supergroup"` } type SuperGroup struct { - Name string `xml:"name"` - State string `xml:"state"` - RequestsInQueue string `xml:"get_wait_list_size"` - CapacityUsed string `xml:"capacity_used"` - Group Group `xml:"group"` + Name string `xml:"name"` + State string `xml:"state"` + RequestQueueSize string `xml:"get_wait_list_size"` + CapacityUsed string `xml:"capacity_used"` + Group Group `xml:"group"` } type Group struct { @@ -51,7 +51,7 @@ type Group struct { DisablingProcessCount string `xml:"disabling_process_count"` DisabledProcessCount string `xml:"disabled_process_count"` CapacityUsed string `xml:"capacity_used"` - GetWaitListSize string `xml:"get_wait_list_size"` + RequestQueueSize string `xml:"get_wait_list_size"` DisableWaitListSize string `xml:"disable_wait_list_size"` ProcessesSpawning string `xml:"processes_being_spawned"` LifeStatus string `xml:"life_status"` @@ -142,15 +142,15 @@ type Exporter struct { timeout time.Duration // Passenger metrics. - up *prometheus.Desc - version *prometheus.Desc - toplevelQueue *prometheus.Desc - maxProcessCount *prometheus.Desc - currentProcessCount *prometheus.Desc - appCount *prometheus.Desc + up *prometheus.Desc + version *prometheus.Desc + topLevelRequestQueue *prometheus.Desc + maxProcessCount *prometheus.Desc + currentProcessCount *prometheus.Desc + appCount *prometheus.Desc // App metrics. - appQueue *prometheus.Desc + appRequestQueue *prometheus.Desc appProcsSpawning *prometheus.Desc // Process metrics. @@ -178,8 +178,8 @@ func NewExporter(cmd string, timeout time.Duration) *Exporter { []string{"version"}, nil, ), - toplevelQueue: prometheus.NewDesc( - prometheus.BuildFQName(namespace, "", "top_level_queue"), + topLevelRequestQueue: prometheus.NewDesc( + prometheus.BuildFQName(namespace, "", "top_level_request_queue"), "Number of requests in the top-level queue.", nil, nil, @@ -202,8 +202,8 @@ func NewExporter(cmd string, timeout time.Duration) *Exporter { nil, nil, ), - appQueue: prometheus.NewDesc( - prometheus.BuildFQName(namespace, "", "app_queue"), + appRequestQueue: prometheus.NewDesc( + prometheus.BuildFQName(namespace, "", "app_request_queue"), "Number of requests in app process queues.", []string{"name"}, nil, @@ -248,13 +248,13 @@ func (e *Exporter) Collect(ch chan<- prometheus.Metric) { ch <- prometheus.MustNewConstMetric(e.version, prometheus.GaugeValue, 1, info.PassengerVersion) - ch <- prometheus.MustNewConstMetric(e.toplevelQueue, prometheus.GaugeValue, parseFloat(info.TopLevelRequestsInQueue)) + ch <- prometheus.MustNewConstMetric(e.topLevelRequestQueue, prometheus.GaugeValue, parseFloat(info.TopLevelRequestQueueSize)) ch <- prometheus.MustNewConstMetric(e.maxProcessCount, prometheus.GaugeValue, parseFloat(info.MaxProcessCount)) ch <- prometheus.MustNewConstMetric(e.currentProcessCount, prometheus.GaugeValue, parseFloat(info.CurrentProcessCount)) ch <- prometheus.MustNewConstMetric(e.appCount, prometheus.GaugeValue, parseFloat(info.AppCount)) for _, sg := range info.SuperGroups { - ch <- prometheus.MustNewConstMetric(e.appQueue, prometheus.GaugeValue, parseFloat(sg.Group.GetWaitListSize), sg.Name) + ch <- prometheus.MustNewConstMetric(e.appRequestQueue, prometheus.GaugeValue, parseFloat(sg.Group.RequestQueueSize), sg.Name) ch <- prometheus.MustNewConstMetric(e.appProcsSpawning, prometheus.GaugeValue, parseFloat(sg.Group.ProcessesSpawning), sg.Name) // Update process identifiers map. @@ -307,11 +307,11 @@ func (e *Exporter) status() (*Info, error) { func (e *Exporter) Describe(ch chan<- *prometheus.Desc) { ch <- e.up ch <- e.version - ch <- e.toplevelQueue + ch <- e.topLevelRequestQueue ch <- e.maxProcessCount ch <- e.currentProcessCount ch <- e.appCount - ch <- e.appQueue + ch <- e.appRequestQueue ch <- e.appProcsSpawning ch <- e.requestsProcessed ch <- e.procStartTime From d4328756c6b0430826b7debc372258dfeadfdba3 Mon Sep 17 00:00:00 2001 From: Zac Blazic Date: Sun, 28 Jan 2018 23:11:16 +0200 Subject: [PATCH 11/19] Fix spacing --- passenger_exporter.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/passenger_exporter.go b/passenger_exporter.go index dfbf3f3..c180868 100644 --- a/passenger_exporter.go +++ b/passenger_exporter.go @@ -245,7 +245,6 @@ func (e *Exporter) Collect(ch chan<- prometheus.Metric) { return } ch <- prometheus.MustNewConstMetric(e.up, prometheus.GaugeValue, 1) - ch <- prometheus.MustNewConstMetric(e.version, prometheus.GaugeValue, 1, info.PassengerVersion) ch <- prometheus.MustNewConstMetric(e.topLevelRequestQueue, prometheus.GaugeValue, parseFloat(info.TopLevelRequestQueueSize)) @@ -272,7 +271,6 @@ func (e *Exporter) Collect(ch chan<- prometheus.Metric) { } } } - } func (e *Exporter) status() (*Info, error) { From 60471a2bc2fe853c4212464005ba93d29100a1c6 Mon Sep 17 00:00:00 2001 From: Zac Blazic Date: Mon, 29 Jan 2018 00:06:45 +0200 Subject: [PATCH 12/19] Improve command timeouts --- passenger_exporter.go | 26 ++++++++++++++------------ passenger_exporter_test.go | 7 ++++--- 2 files changed, 18 insertions(+), 15 deletions(-) diff --git a/passenger_exporter.go b/passenger_exporter.go index c180868..3cdccaa 100644 --- a/passenger_exporter.go +++ b/passenger_exporter.go @@ -3,7 +3,6 @@ package main import ( "bytes" "encoding/xml" - "errors" "flag" "fmt" "io" @@ -128,7 +127,6 @@ const ( ) var ( - errTimeout = errors.New("passenger-status command timed out") processIdentifiers = make(map[string]int) ) @@ -159,13 +157,13 @@ type Exporter struct { procMemory *prometheus.Desc } -func NewExporter(cmd string, timeout time.Duration) *Exporter { +func NewExporter(cmd string, timeout float64) *Exporter { cmdComponents := strings.Split(cmd, " ") return &Exporter{ cmd: cmdComponents[0], args: cmdComponents[1:], - timeout: timeout, + timeout: time.Duration(timeout * nanosecondsPerSecond), up: prometheus.NewDesc( prometheus.BuildFQName(namespace, "", "up"), "Could passenger status be queried.", @@ -285,18 +283,22 @@ func (e *Exporter) status() (*Info, error) { return nil, err } - errc := make(chan error, 1) - go func(cmd *exec.Cmd, c chan<- error) { - c <- cmd.Wait() - }(cmd, errc) + done := make(chan error, 1) + go func() { + done <- cmd.Wait() + }() select { - case err := <-errc: + case <-time.After(e.timeout): + if err := cmd.Process.Kill(); err != nil { + log.Errorf("failed to kill process: %s", err) + } + err = fmt.Errorf("status command timed out after %f seconds", e.timeout.Seconds()) + return nil, err + case err := <-done: if err != nil { return nil, err } - case <-time.After(e.timeout): - return nil, errTimeout } return parseOutput(&out) @@ -401,7 +403,7 @@ func updateProcesses(old map[string]int, processes []Process) map[string]int { func main() { var ( cmd = flag.String("passenger.command", "passenger-status --show=xml", "Passenger command for querying passenger status.") - timeout = flag.Duration("passenger.command.timeout", 500*time.Millisecond, "Timeout for passenger.command.") + timeout = flag.Float64("passenger.command.timeout-seconds", 0.5, "Timeout in seconds for passenger.command.") pidFile = flag.String("passenger.pid-file", "", "Optional path to a file containing the passenger PID for additional metrics.") metricsPath = flag.String("web.telemetry-path", "/metrics", "Path under which to expose metrics.") listenAddress = flag.String("web.listen-address", ":9149", "Address to listen on for web interface and telemetry.") diff --git a/passenger_exporter_test.go b/passenger_exporter_test.go index cac799a..c80eb51 100644 --- a/passenger_exporter_test.go +++ b/passenger_exporter_test.go @@ -8,6 +8,7 @@ import ( "net/http/httptest" "os" "reflect" + "strings" "testing" "time" @@ -102,13 +103,13 @@ func TestScrape(t *testing.T) { } func TestStatusTimeout(t *testing.T) { - e := NewExporter("sleep 1", time.Millisecond) + e := NewExporter("sleep 1", time.Millisecond.Seconds()) _, err := e.status() if err == nil { t.Fatalf("failed to timeout") } - if err != errTimeout { + if !strings.Contains(err.Error(), "status command timed out after 0.001000 seconds") { t.Fatalf("incorrect err: %v", err) } } @@ -238,5 +239,5 @@ func TestInsertingNewProcesses(t *testing.T) { } func newTestExporter() *Exporter { - return NewExporter("cat ./testdata/passenger_xml_output.xml", time.Second) + return NewExporter("cat ./testdata/passenger_xml_output.xml", time.Second.Seconds()) } From 5e17fd35b50a1e6d57c17a55cccecebdd04acdad Mon Sep 17 00:00:00 2001 From: Zac Blazic Date: Mon, 29 Jan 2018 00:13:28 +0200 Subject: [PATCH 13/19] Order exported functions --- passenger_exporter.go | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/passenger_exporter.go b/passenger_exporter.go index 3cdccaa..a44b433 100644 --- a/passenger_exporter.go +++ b/passenger_exporter.go @@ -233,6 +233,20 @@ func NewExporter(cmd string, timeout float64) *Exporter { } } +func (e *Exporter) Describe(ch chan<- *prometheus.Desc) { + ch <- e.up + ch <- e.version + ch <- e.topLevelRequestQueue + ch <- e.maxProcessCount + ch <- e.currentProcessCount + ch <- e.appCount + ch <- e.appRequestQueue + ch <- e.appProcsSpawning + ch <- e.requestsProcessed + ch <- e.procStartTime + ch <- e.procMemory +} + // Collect fetches the statistics from the configured passenger frontend, and // delivers them as Prometheus metrics. It implements prometheus.Collector. func (e *Exporter) Collect(ch chan<- prometheus.Metric) { @@ -304,20 +318,6 @@ func (e *Exporter) status() (*Info, error) { return parseOutput(&out) } -func (e *Exporter) Describe(ch chan<- *prometheus.Desc) { - ch <- e.up - ch <- e.version - ch <- e.topLevelRequestQueue - ch <- e.maxProcessCount - ch <- e.currentProcessCount - ch <- e.appCount - ch <- e.appRequestQueue - ch <- e.appProcsSpawning - ch <- e.requestsProcessed - ch <- e.procStartTime - ch <- e.procMemory -} - func parseOutput(r io.Reader) (*Info, error) { var info Info decoder := xml.NewDecoder(r) From 239b0dc6942c6b154db13b5e1dedb4b10d4a2c55 Mon Sep 17 00:00:00 2001 From: Zac Blazic Date: Mon, 29 Jan 2018 00:26:37 +0200 Subject: [PATCH 14/19] Improve comments and logging content --- passenger_exporter.go | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/passenger_exporter.go b/passenger_exporter.go index a44b433..225b3bb 100644 --- a/passenger_exporter.go +++ b/passenger_exporter.go @@ -21,6 +21,7 @@ import ( "github.com/prometheus/common/version" ) +// Info represents the info section of passenger's status. type Info struct { PassengerVersion string `xml:"passenger_version"` AppCount string `xml:"group_count"` @@ -31,6 +32,7 @@ type Info struct { SuperGroups []SuperGroup `xml:"supergroups>supergroup"` } +// SuperGroup represents the super group section of passenger's status. type SuperGroup struct { Name string `xml:"name"` State string `xml:"state"` @@ -39,6 +41,7 @@ type SuperGroup struct { Group Group `xml:"group"` } +// Group represents the group section of passenger's status. type Group struct { Name string `xml:"name"` ComponentName string `xml:"component_name"` @@ -63,6 +66,7 @@ type Group struct { Processes []Process `xml:"processes>process"` } +// Process represents the process section of passenger's status. type Process struct { PID string `xml:"pid"` StickySessionID string `xml:"sticky_session_id"` @@ -91,6 +95,7 @@ type Process struct { Command string `xml:"command"` } +// Options represents the options section of passenger's status. type Options struct { AppRoot string `xml:"app_root"` AppGroupName string `xml:"app_group_name"` @@ -157,6 +162,7 @@ type Exporter struct { procMemory *prometheus.Desc } +// NewExporter returns an initialized exporter. func NewExporter(cmd string, timeout float64) *Exporter { cmdComponents := strings.Split(cmd, " ") @@ -166,13 +172,13 @@ func NewExporter(cmd string, timeout float64) *Exporter { timeout: time.Duration(timeout * nanosecondsPerSecond), up: prometheus.NewDesc( prometheus.BuildFQName(namespace, "", "up"), - "Could passenger status be queried.", + "Current health of passenger.", nil, nil, ), version: prometheus.NewDesc( prometheus.BuildFQName(namespace, "", "version"), - "Version of passenger", + "Version of passenger.", []string{"version"}, nil, ), @@ -202,7 +208,7 @@ func NewExporter(cmd string, timeout float64) *Exporter { ), appRequestQueue: prometheus.NewDesc( prometheus.BuildFQName(namespace, "", "app_request_queue"), - "Number of requests in app process queues.", + "Number of requests in the app queue.", []string{"name"}, nil, ), @@ -214,13 +220,13 @@ func NewExporter(cmd string, timeout float64) *Exporter { ), requestsProcessed: prometheus.NewDesc( prometheus.BuildFQName(namespace, "", "requests_processed_total"), - "Number of processes served by a process.", + "Number of requests served by a process.", []string{"name", "id"}, nil, ), procStartTime: prometheus.NewDesc( prometheus.BuildFQName(namespace, "", "proc_start_time_seconds"), - "Number of seconds since processor started.", + "Number of seconds since process started.", []string{"name", "id"}, nil, ), @@ -233,6 +239,7 @@ func NewExporter(cmd string, timeout float64) *Exporter { } } +// Describe describes all the metrics exported by the passenger exporter. func (e *Exporter) Describe(ch chan<- *prometheus.Desc) { ch <- e.up ch <- e.version @@ -247,8 +254,8 @@ func (e *Exporter) Describe(ch chan<- *prometheus.Desc) { ch <- e.procMemory } -// Collect fetches the statistics from the configured passenger frontend, and -// delivers them as Prometheus metrics. It implements prometheus.Collector. +// Collect fetches the statistics from passenger, and delivers them as +// Prometheus metrics. func (e *Exporter) Collect(ch chan<- prometheus.Metric) { info, err := e.status() if err != nil { @@ -431,8 +438,8 @@ func main() { http.Handle(*metricsPath, prometheus.Handler()) - log.Infoln("starting passenger-exporter", version.Info()) - log.Infoln("build context", version.BuildContext()) - log.Infoln("listening on", *listenAddress) + log.Infoln("Starting passenger-exporter", version.Info()) + log.Infoln("Build context", version.BuildContext()) + log.Infoln("Listening on", *listenAddress) log.Fatal(http.ListenAndServe(*listenAddress, nil)) } From f59385aacf4ec418d6f1ccd2dcff87c224c758b1 Mon Sep 17 00:00:00 2001 From: Zac Blazic Date: Mon, 29 Jan 2018 00:28:42 +0200 Subject: [PATCH 15/19] Add page at root of site with link to metrics --- passenger_exporter.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/passenger_exporter.go b/passenger_exporter.go index 225b3bb..322f63d 100644 --- a/passenger_exporter.go +++ b/passenger_exporter.go @@ -437,6 +437,15 @@ func main() { prometheus.MustRegister(NewExporter(*cmd, *timeout)) http.Handle(*metricsPath, prometheus.Handler()) + http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { + w.Write([]byte(` + Passenger Exporter + +

Passenger Exporter

+

Metrics

+ + `)) + }) log.Infoln("Starting passenger-exporter", version.Info()) log.Infoln("Build context", version.BuildContext()) From 772925e0020683793e75bb49c8742bf48c5b0fc0 Mon Sep 17 00:00:00 2001 From: Zac Blazic Date: Mon, 29 Jan 2018 00:33:43 +0200 Subject: [PATCH 16/19] Update test data --- testdata/passenger_xml_output.xml | 48 ------------- testdata/scrape_output.txt | 116 +++++++++++++++--------------- 2 files changed, 58 insertions(+), 106 deletions(-) diff --git a/testdata/passenger_xml_output.xml b/testdata/passenger_xml_output.xml index f925278..ef56e43 100644 --- a/testdata/passenger_xml_output.xml +++ b/testdata/passenger_xml_output.xml @@ -75,7 +75,6 @@ 1462479725218338 0s ago 34m 54s - 4fef3ec ALIVE ENABLED true @@ -103,7 +102,6 @@ 1462479725262357 0s ago 34m 43s - 4fef3ec ALIVE ENABLED true @@ -131,7 +129,6 @@ 1462479724844363 1s ago 34m 33s - 4fef3ec ALIVE ENABLED true @@ -159,7 +156,6 @@ 1462479724951789 1s ago 34m 23s - 4fef3ec ALIVE ENABLED true @@ -187,7 +183,6 @@ 1462479725234990 0s ago 34m 13s - 4fef3ec ALIVE ENABLED true @@ -215,7 +210,6 @@ 1462479725071885 0s ago 34m 2s - 4fef3ec ALIVE ENABLED true @@ -243,7 +237,6 @@ 1462479725291842 0s ago 33m 52s - 4fef3ec ALIVE ENABLED true @@ -271,7 +264,6 @@ 1462479724987085 1s ago 33m 42s - 4fef3ec ALIVE ENABLED true @@ -299,7 +291,6 @@ 1462479725291925 0s ago 33m 32s - 4fef3ec ALIVE ENABLED true @@ -327,7 +318,6 @@ 1462479725295845 0s ago 33m 22s - 4fef3ec ALIVE ENABLED true @@ -355,7 +345,6 @@ 1462479725280878 0s ago 33m 12s - 4fef3ec ALIVE ENABLED true @@ -383,7 +372,6 @@ 1462479725277911 0s ago 33m 2s - 4fef3ec ALIVE ENABLED true @@ -411,7 +399,6 @@ 1462479725273013 0s ago 32m 52s - 4fef3ec ALIVE ENABLED true @@ -439,7 +426,6 @@ 1462479725278205 0s ago 32m 42s - 4fef3ec ALIVE ENABLED true @@ -467,7 +453,6 @@ 1462479725208853 0s ago 32m 31s - 4fef3ec ALIVE ENABLED true @@ -495,7 +480,6 @@ 1462479725210092 0s ago 32m 21s - 4fef3ec ALIVE ENABLED true @@ -523,7 +507,6 @@ 1462479725069799 0s ago 32m 11s - 4fef3ec ALIVE ENABLED true @@ -551,7 +534,6 @@ 1462479725073291 0s ago 32m 1s - 4fef3ec ALIVE ENABLED true @@ -579,7 +561,6 @@ 1462479725079017 0s ago 31m 51s - 4fef3ec ALIVE ENABLED true @@ -607,7 +588,6 @@ 1462479722285638 3s ago 31m 40s - 4fef3ec ALIVE ENABLED true @@ -635,7 +615,6 @@ 1462479722286757 3s ago 31m 31s - 4fef3ec ALIVE ENABLED true @@ -663,7 +642,6 @@ 1462479722287097 3s ago 31m 20s - 4fef3ec ALIVE ENABLED true @@ -691,7 +669,6 @@ 1462479722102361 3s ago 31m 8s - 4fef3ec ALIVE ENABLED true @@ -719,7 +696,6 @@ 1462479714371904 11s ago 30m 58s - 4fef3ec ALIVE ENABLED true @@ -747,7 +723,6 @@ 1462479714371920 11s ago 30m 48s - 4fef3ec ALIVE ENABLED true @@ -775,7 +750,6 @@ 1462479689907679 36s ago 30m 38s - 4fef3ec ALIVE ENABLED true @@ -803,7 +777,6 @@ 1462479678442770 47s ago 30m 28s - 4fef3ec ALIVE ENABLED true @@ -831,7 +804,6 @@ 1462479599147273 2m 6s ago 30m 18s - 4fef3ec ALIVE ENABLED true @@ -859,7 +831,6 @@ 1462479599149297 2m 6s ago 30m 8s - 4fef3ec ALIVE ENABLED true @@ -887,7 +858,6 @@ 1462479599149485 2m 6s ago 29m 58s - 4fef3ec ALIVE ENABLED true @@ -915,7 +885,6 @@ 1462479476254444 4m 9s ago 29m 48s - 4fef3ec ALIVE ENABLED true @@ -943,7 +912,6 @@ 1462479476256611 4m 9s ago 29m 38s - 4fef3ec ALIVE ENABLED true @@ -971,7 +939,6 @@ 1462478645631915 18m 0s ago 29m 26s - 4fef3ec ALIVE ENABLED true @@ -999,7 +966,6 @@ 1462478645632843 18m 0s ago 29m 16s - 4fef3ec ALIVE ENABLED true @@ -1027,7 +993,6 @@ 1462478645614383 18m 0s ago 29m 5s - 4fef3ec ALIVE ENABLED true @@ -1055,7 +1020,6 @@ 1462478645616320 18m 0s ago 28m 55s - 4fef3ec ALIVE ENABLED true @@ -1083,7 +1047,6 @@ 1462478000166418 28m 45s ago 28m 45s - 4fef3ec ALIVE ENABLED true @@ -1111,7 +1074,6 @@ 1462478010227916 28m 35s ago 28m 35s - 4fef3ec ALIVE ENABLED true @@ -1139,7 +1101,6 @@ 1462478020210776 28m 25s ago 28m 25s - 4fef3ec ALIVE ENABLED true @@ -1167,7 +1128,6 @@ 1462478030076590 28m 15s ago 28m 15s - 4fef3ec ALIVE ENABLED true @@ -1195,7 +1155,6 @@ 1462478040746532 28m 5s ago 28m 5s - 4fef3ec ALIVE ENABLED true @@ -1223,7 +1182,6 @@ 1462478051138239 27m 54s ago 27m 54s - 4fef3ec ALIVE ENABLED true @@ -1251,7 +1209,6 @@ 1462478061402699 27m 44s ago 27m 44s - 4fef3ec ALIVE ENABLED true @@ -1279,7 +1236,6 @@ 1462478071439058 27m 34s ago 27m 34s - 4fef3ec ALIVE ENABLED true @@ -1307,7 +1263,6 @@ 1462478081184367 27m 24s ago 27m 24s - 4fef3ec ALIVE ENABLED true @@ -1335,7 +1290,6 @@ 1462478090749911 27m 15s ago 27m 15s - 4fef3ec ALIVE ENABLED true @@ -1363,7 +1317,6 @@ 1462478100931419 27m 5s ago 27m 5s - 4fef3ec ALIVE ENABLED true @@ -1391,7 +1344,6 @@ 1462478111138392 26m 54s ago 26m 54s - 4fef3ec ALIVE ENABLED true diff --git a/testdata/scrape_output.txt b/testdata/scrape_output.txt index 2bc52d8..5a6276a 100644 --- a/testdata/scrape_output.txt +++ b/testdata/scrape_output.txt @@ -4,9 +4,9 @@ passenger_app_count 1 # HELP passenger_app_procs_spawning Number of processes spawning. # TYPE passenger_app_procs_spawning gauge passenger_app_procs_spawning{name="/srv/app/my_app (production)"} 0 -# HELP passenger_app_queue Number of requests in app process queues. -# TYPE passenger_app_queue gauge -passenger_app_queue{name="/srv/app/my_app (production)"} 0 +# HELP passenger_app_request_queue Number of requests in the app queue. +# TYPE passenger_app_request_queue gauge +passenger_app_request_queue{name="/srv/app/my_app (production)"} 0 # HELP passenger_current_processes Current number of processes. # TYPE passenger_current_processes gauge passenger_current_processes 48 @@ -63,57 +63,57 @@ passenger_proc_memory{id="6",name="/srv/app/my_app (production)"} 330644 passenger_proc_memory{id="7",name="/srv/app/my_app (production)"} 315104 passenger_proc_memory{id="8",name="/srv/app/my_app (production)"} 288508 passenger_proc_memory{id="9",name="/srv/app/my_app (production)"} 306520 -# HELP passenger_proc_start_time_seconds Number of seconds since processor started. +# HELP passenger_proc_start_time_seconds Number of seconds since process started. # TYPE passenger_proc_start_time_seconds gauge -passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="0",name="/srv/app/my_app (production)"} 1.462477e+06 -passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="1",name="/srv/app/my_app (production)"} 1.462477e+06 -passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="10",name="/srv/app/my_app (production)"} 1.462477e+06 -passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="11",name="/srv/app/my_app (production)"} 1.462477e+06 -passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="12",name="/srv/app/my_app (production)"} 1.462477e+06 -passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="13",name="/srv/app/my_app (production)"} 1.462477e+06 -passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="14",name="/srv/app/my_app (production)"} 1.462477e+06 -passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="15",name="/srv/app/my_app (production)"} 1.462477e+06 -passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="16",name="/srv/app/my_app (production)"} 1.462477e+06 -passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="17",name="/srv/app/my_app (production)"} 1.462477e+06 -passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="18",name="/srv/app/my_app (production)"} 1.462477e+06 -passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="19",name="/srv/app/my_app (production)"} 1.462477e+06 -passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="2",name="/srv/app/my_app (production)"} 1.462477e+06 -passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="20",name="/srv/app/my_app (production)"} 1.462477e+06 -passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="21",name="/srv/app/my_app (production)"} 1.462477e+06 -passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="22",name="/srv/app/my_app (production)"} 1.462477e+06 -passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="23",name="/srv/app/my_app (production)"} 1.462477e+06 -passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="24",name="/srv/app/my_app (production)"} 1.462477e+06 -passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="25",name="/srv/app/my_app (production)"} 1.462477e+06 -passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="26",name="/srv/app/my_app (production)"} 1.462477e+06 -passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="27",name="/srv/app/my_app (production)"} 1.462477e+06 -passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="28",name="/srv/app/my_app (production)"} 1.462477e+06 -passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="29",name="/srv/app/my_app (production)"} 1.462477e+06 -passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="3",name="/srv/app/my_app (production)"} 1.462477e+06 -passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="30",name="/srv/app/my_app (production)"} 1.462477e+06 -passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="31",name="/srv/app/my_app (production)"} 1.462477e+06 -passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="32",name="/srv/app/my_app (production)"} 1.462477e+06 -passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="33",name="/srv/app/my_app (production)"} 1.462477e+06 -passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="34",name="/srv/app/my_app (production)"} 1.462477e+06 -passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="35",name="/srv/app/my_app (production)"} 1.462477e+06 -passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="36",name="/srv/app/my_app (production)"} 1.462477e+06 -passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="37",name="/srv/app/my_app (production)"} 1.462478e+06 -passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="38",name="/srv/app/my_app (production)"} 1.462478e+06 -passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="39",name="/srv/app/my_app (production)"} 1.462478e+06 -passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="4",name="/srv/app/my_app (production)"} 1.462477e+06 -passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="40",name="/srv/app/my_app (production)"} 1.462478e+06 -passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="41",name="/srv/app/my_app (production)"} 1.462478e+06 -passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="42",name="/srv/app/my_app (production)"} 1.462478e+06 -passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="43",name="/srv/app/my_app (production)"} 1.462478e+06 -passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="44",name="/srv/app/my_app (production)"} 1.462478e+06 -passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="45",name="/srv/app/my_app (production)"} 1.462478e+06 -passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="46",name="/srv/app/my_app (production)"} 1.462478e+06 -passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="47",name="/srv/app/my_app (production)"} 1.462478e+06 -passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="5",name="/srv/app/my_app (production)"} 1.462477e+06 -passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="6",name="/srv/app/my_app (production)"} 1.462477e+06 -passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="7",name="/srv/app/my_app (production)"} 1.462477e+06 -passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="8",name="/srv/app/my_app (production)"} 1.462477e+06 -passenger_proc_start_time_seconds{codeRevision="4fef3ec",id="9",name="/srv/app/my_app (production)"} 1.462477e+06 -# HELP passenger_requests_processed_total Number of processes served by a process. +passenger_proc_start_time_seconds{id="0",name="/srv/app/my_app (production)"} 1.462477e+06 +passenger_proc_start_time_seconds{id="1",name="/srv/app/my_app (production)"} 1.462477e+06 +passenger_proc_start_time_seconds{id="10",name="/srv/app/my_app (production)"} 1.462477e+06 +passenger_proc_start_time_seconds{id="11",name="/srv/app/my_app (production)"} 1.462477e+06 +passenger_proc_start_time_seconds{id="12",name="/srv/app/my_app (production)"} 1.462477e+06 +passenger_proc_start_time_seconds{id="13",name="/srv/app/my_app (production)"} 1.462477e+06 +passenger_proc_start_time_seconds{id="14",name="/srv/app/my_app (production)"} 1.462477e+06 +passenger_proc_start_time_seconds{id="15",name="/srv/app/my_app (production)"} 1.462477e+06 +passenger_proc_start_time_seconds{id="16",name="/srv/app/my_app (production)"} 1.462477e+06 +passenger_proc_start_time_seconds{id="17",name="/srv/app/my_app (production)"} 1.462477e+06 +passenger_proc_start_time_seconds{id="18",name="/srv/app/my_app (production)"} 1.462477e+06 +passenger_proc_start_time_seconds{id="19",name="/srv/app/my_app (production)"} 1.462477e+06 +passenger_proc_start_time_seconds{id="2",name="/srv/app/my_app (production)"} 1.462477e+06 +passenger_proc_start_time_seconds{id="20",name="/srv/app/my_app (production)"} 1.462477e+06 +passenger_proc_start_time_seconds{id="21",name="/srv/app/my_app (production)"} 1.462477e+06 +passenger_proc_start_time_seconds{id="22",name="/srv/app/my_app (production)"} 1.462477e+06 +passenger_proc_start_time_seconds{id="23",name="/srv/app/my_app (production)"} 1.462477e+06 +passenger_proc_start_time_seconds{id="24",name="/srv/app/my_app (production)"} 1.462477e+06 +passenger_proc_start_time_seconds{id="25",name="/srv/app/my_app (production)"} 1.462477e+06 +passenger_proc_start_time_seconds{id="26",name="/srv/app/my_app (production)"} 1.462477e+06 +passenger_proc_start_time_seconds{id="27",name="/srv/app/my_app (production)"} 1.462477e+06 +passenger_proc_start_time_seconds{id="28",name="/srv/app/my_app (production)"} 1.462477e+06 +passenger_proc_start_time_seconds{id="29",name="/srv/app/my_app (production)"} 1.462477e+06 +passenger_proc_start_time_seconds{id="3",name="/srv/app/my_app (production)"} 1.462477e+06 +passenger_proc_start_time_seconds{id="30",name="/srv/app/my_app (production)"} 1.462477e+06 +passenger_proc_start_time_seconds{id="31",name="/srv/app/my_app (production)"} 1.462477e+06 +passenger_proc_start_time_seconds{id="32",name="/srv/app/my_app (production)"} 1.462477e+06 +passenger_proc_start_time_seconds{id="33",name="/srv/app/my_app (production)"} 1.462477e+06 +passenger_proc_start_time_seconds{id="34",name="/srv/app/my_app (production)"} 1.462477e+06 +passenger_proc_start_time_seconds{id="35",name="/srv/app/my_app (production)"} 1.462477e+06 +passenger_proc_start_time_seconds{id="36",name="/srv/app/my_app (production)"} 1.462477e+06 +passenger_proc_start_time_seconds{id="37",name="/srv/app/my_app (production)"} 1.462478e+06 +passenger_proc_start_time_seconds{id="38",name="/srv/app/my_app (production)"} 1.462478e+06 +passenger_proc_start_time_seconds{id="39",name="/srv/app/my_app (production)"} 1.462478e+06 +passenger_proc_start_time_seconds{id="4",name="/srv/app/my_app (production)"} 1.462477e+06 +passenger_proc_start_time_seconds{id="40",name="/srv/app/my_app (production)"} 1.462478e+06 +passenger_proc_start_time_seconds{id="41",name="/srv/app/my_app (production)"} 1.462478e+06 +passenger_proc_start_time_seconds{id="42",name="/srv/app/my_app (production)"} 1.462478e+06 +passenger_proc_start_time_seconds{id="43",name="/srv/app/my_app (production)"} 1.462478e+06 +passenger_proc_start_time_seconds{id="44",name="/srv/app/my_app (production)"} 1.462478e+06 +passenger_proc_start_time_seconds{id="45",name="/srv/app/my_app (production)"} 1.462478e+06 +passenger_proc_start_time_seconds{id="46",name="/srv/app/my_app (production)"} 1.462478e+06 +passenger_proc_start_time_seconds{id="47",name="/srv/app/my_app (production)"} 1.462478e+06 +passenger_proc_start_time_seconds{id="5",name="/srv/app/my_app (production)"} 1.462477e+06 +passenger_proc_start_time_seconds{id="6",name="/srv/app/my_app (production)"} 1.462477e+06 +passenger_proc_start_time_seconds{id="7",name="/srv/app/my_app (production)"} 1.462477e+06 +passenger_proc_start_time_seconds{id="8",name="/srv/app/my_app (production)"} 1.462477e+06 +passenger_proc_start_time_seconds{id="9",name="/srv/app/my_app (production)"} 1.462477e+06 +# HELP passenger_requests_processed_total Number of requests served by a process. # TYPE passenger_requests_processed_total counter passenger_requests_processed_total{id="0",name="/srv/app/my_app (production)"} 43578 passenger_requests_processed_total{id="1",name="/srv/app/my_app (production)"} 48130 @@ -163,12 +163,12 @@ passenger_requests_processed_total{id="6",name="/srv/app/my_app (production)"} 3 passenger_requests_processed_total{id="7",name="/srv/app/my_app (production)"} 35802 passenger_requests_processed_total{id="8",name="/srv/app/my_app (production)"} 33600 passenger_requests_processed_total{id="9",name="/srv/app/my_app (production)"} 30490 -# HELP passenger_top_level_queue Number of requests in the top-level queue. -# TYPE passenger_top_level_queue gauge -passenger_top_level_queue 0 -# HELP passenger_up Could passenger status be queried. +# HELP passenger_top_level_request_queue Number of requests in the top-level queue. +# TYPE passenger_top_level_request_queue gauge +passenger_top_level_request_queue 0 +# HELP passenger_up Current health of passenger. # TYPE passenger_up gauge passenger_up 1 -# HELP passenger_version Version of passenger +# HELP passenger_version Version of passenger. # TYPE passenger_version gauge passenger_version{version="5.0.26"} 1 From 5b428c6f0295aabc8704655c5461c64be29ad114 Mon Sep 17 00:00:00 2001 From: Zac Blazic Date: Mon, 29 Jan 2018 00:35:28 +0200 Subject: [PATCH 17/19] Rename testdata directory to test --- README.md | 2 +- passenger_exporter_test.go | 6 +++--- {testdata => test}/passenger_xml_output.xml | 0 {testdata => test}/scrape_output.txt | 0 4 files changed, 4 insertions(+), 4 deletions(-) rename {testdata => test}/passenger_xml_output.xml (100%) rename {testdata => test}/scrape_output.txt (100%) diff --git a/README.md b/README.md index e6b7cd4..5622b34 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,7 @@ Tests can be run with: go test . ``` -Additionally, the testdata/scrape_output.txt can be regenerated by passing the +Additionally, the test/scrape_output.txt can be regenerated by passing the `--golden` flag: ``` go test -v . --golden diff --git a/passenger_exporter_test.go b/passenger_exporter_test.go index c80eb51..edfc4de 100644 --- a/passenger_exporter_test.go +++ b/passenger_exporter_test.go @@ -33,7 +33,7 @@ func TestParsing(t *testing.T) { return info }, "parseOutput": func(t *testing.T) *Info { - f, err := os.Open("./testdata/passenger_xml_output.xml") + f, err := os.Open("./test/passenger_xml_output.xml") if err != nil { t.Fatalf("open xml file failed: %v", err) } @@ -85,7 +85,7 @@ func TestScrape(t *testing.T) { t.Fatalf("failed to read response body: %v", err) } - scrapeFixturePath := "./testdata/scrape_output.txt" + scrapeFixturePath := "./test/scrape_output.txt" if golden { idx := bytes.Index(body, []byte("# HELP passenger_app_count Number of apps.")) ioutil.WriteFile(scrapeFixturePath, body[idx:], 0666) @@ -239,5 +239,5 @@ func TestInsertingNewProcesses(t *testing.T) { } func newTestExporter() *Exporter { - return NewExporter("cat ./testdata/passenger_xml_output.xml", time.Second.Seconds()) + return NewExporter("cat ./test/passenger_xml_output.xml", time.Second.Seconds()) } diff --git a/testdata/passenger_xml_output.xml b/test/passenger_xml_output.xml similarity index 100% rename from testdata/passenger_xml_output.xml rename to test/passenger_xml_output.xml diff --git a/testdata/scrape_output.txt b/test/scrape_output.txt similarity index 100% rename from testdata/scrape_output.txt rename to test/scrape_output.txt From a20b28457e1afce553694e06894f7583a6ade330 Mon Sep 17 00:00:00 2001 From: Zac Blazic Date: Mon, 29 Jan 2018 00:54:05 +0200 Subject: [PATCH 18/19] Add CODEOWNERS file --- CODEOWNERS | 1 + 1 file changed, 1 insertion(+) create mode 100644 CODEOWNERS diff --git a/CODEOWNERS b/CODEOWNERS new file mode 100644 index 0000000..c907cbc --- /dev/null +++ b/CODEOWNERS @@ -0,0 +1 @@ +* @itskingori @tsu-shiuan @zacblazic From 3565ccf6475f1cd878ca8104645569d308c9b5d9 Mon Sep 17 00:00:00 2001 From: Zac Blazic Date: Mon, 29 Jan 2018 00:54:20 +0200 Subject: [PATCH 19/19] Bump version and add CHANGELOG --- CHANGELOG.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..8097266 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,16 @@ +# Changelog + +## 0.5.0 + +### Improvements +* Added home page with link to metrics. +* Added new fields to output parsed from passenger status command. +* Removed mentions of nginx as this exporter can support other integration modes. + +### Breaking Changes +* Changed metrics prefix from `passenger_nginx` to `passenger`. This affects _all_ passenger metrics. +* Renamed metrics: + * Changed `passenger_top_level_queue` to `passenger_top_level_request_queue`. + * Changed `passenger_app_queue` to `passenger_app_request_queue`. +* Changed unit of passenger command timeout duration to seconds. +* Removed deprecated `code_revision` field from output parsed from passenger status command.