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/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.
diff --git a/CODEOWNERS b/CODEOWNERS
new file mode 100644
index 0000000..c907cbc
--- /dev/null
+++ b/CODEOWNERS
@@ -0,0 +1 @@
+* @itskingori @tsu-shiuan @zacblazic
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/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..5622b34
--- /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 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 test/scrape_output.txt can be regenerated by passing the
+`--golden` flag:
+```
+go test -v . --golden
+```
diff --git a/main.go b/passenger_exporter.go
similarity index 52%
rename from main.go
rename to passenger_exporter.go
index 9aa964a..322f63d 100644
--- a/main.go
+++ b/passenger_exporter.go
@@ -3,7 +3,6 @@ package main
import (
"bytes"
"encoding/xml"
- "errors"
"flag"
"fmt"
"io"
@@ -22,19 +21,121 @@ import (
"github.com/prometheus/common/version"
)
-const (
- namespace = "passenger_nginx"
+// Info represents the info section of passenger's status.
+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"`
+ TopLevelRequestQueueSize string `xml:"get_wait_list_size"`
+ 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"`
+ RequestQueueSize string `xml:"get_wait_list_size"`
+ CapacityUsed string `xml:"capacity_used"`
+ 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"`
+ AppRoot string `xml:"app_root"`
+ AppType string `xml:"app_type"`
+ Environment string `xml:"environment"`
+ UUID string `xml:"uuid"`
+ EnabledProcessCount string `xml:"enabled_process_count"`
+ DisablingProcessCount string `xml:"disabling_process_count"`
+ DisabledProcessCount string `xml:"disabled_process_count"`
+ CapacityUsed string `xml:"capacity_used"`
+ 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"`
+ 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"`
+ 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"`
+ 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"`
+ 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"`
+ Swap string `xml:"swap"`
+ RealMemory string `xml:"real_memory"`
+ VMSize string `xml:"vmsize"`
+ ProcessGroupID string `xml:"process_group_id"`
+ 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"`
+ 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"`
+ 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"`
+ MaxOutOfBandWorkInstances string `xml:"max_out_of_band_work_instances"`
+}
+
+const (
+ namespace = "passenger"
nanosecondsPerSecond = 1000000000
)
var (
- timeoutErr = errors.New("passenger-status command timed out")
-
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
@@ -44,15 +145,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.
@@ -61,27 +162,28 @@ type Exporter struct {
procMemory *prometheus.Desc
}
-func NewExporter(cmd string, timeout time.Duration) *Exporter {
+// NewExporter returns an initialized 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.",
+ "Current health of passenger.",
nil,
nil,
),
version: prometheus.NewDesc(
prometheus.BuildFQName(namespace, "", "version"),
- "Version of passenger",
+ "Version of passenger.",
[]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,
@@ -104,9 +206,9 @@ func NewExporter(cmd string, timeout time.Duration) *Exporter {
nil,
nil,
),
- appQueue: prometheus.NewDesc(
- prometheus.BuildFQName(namespace, "", "app_queue"),
- "Number of requests in app process queues.",
+ appRequestQueue: prometheus.NewDesc(
+ prometheus.BuildFQName(namespace, "", "app_request_queue"),
+ "Number of requests in the app queue.",
[]string{"name"},
nil,
),
@@ -118,14 +220,14 @@ func NewExporter(cmd string, timeout time.Duration) *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.",
- []string{"name", "id", "codeRevision"},
+ "Number of seconds since process started.",
+ []string{"name", "id"},
nil,
),
procMemory: prometheus.NewDesc(
@@ -137,8 +239,23 @@ func NewExporter(cmd string, timeout time.Duration) *Exporter {
}
}
-// Collect fetches the statistics from the configured passenger frontend, and
-// delivers them as Prometheus metrics. It implements prometheus.Collector.
+// Describe describes all the metrics exported by the passenger 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 passenger, and delivers them as
+// Prometheus metrics.
func (e *Exporter) Collect(ch chan<- prometheus.Metric) {
info, err := e.status()
if err != nil {
@@ -147,16 +264,15 @@ 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.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.
@@ -168,13 +284,12 @@ 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),
)
}
}
}
}
-
}
func (e *Exporter) status() (*Info, error) {
@@ -189,37 +304,27 @@ 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, timeoutErr
}
return parseOutput(&out)
}
-func (e *Exporter) Describe(ch chan<- *prometheus.Desc) {
- ch <- e.up
- ch <- e.version
- ch <- e.toplevelQueue
- ch <- e.maxProcessCount
- ch <- e.currentProcessCount
- ch <- e.appCount
- ch <- e.appQueue
- 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)
@@ -305,8 +410,8 @@ 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.")
- pidFile = flag.String("passenger.pid-file", "", "Optional path to a file containing the passenger/nginx PID for additional metrics.")
+ 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.")
)
@@ -332,9 +437,18 @@ func main() {
prometheus.MustRegister(NewExporter(*cmd, *timeout))
http.Handle(*metricsPath, prometheus.Handler())
-
- log.Infoln("starting passenger_exporter_nginx", version.Info())
- log.Infoln("build context", version.BuildContext())
- log.Infoln("listening on", *listenAddress)
+ 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())
+ log.Infoln("Listening on", *listenAddress)
log.Fatal(http.ListenAndServe(*listenAddress, nil))
}
diff --git a/main_test.go b/passenger_exporter_test.go
similarity index 92%
rename from main_test.go
rename to passenger_exporter_test.go
index 4a14a5e..edfc4de 100644
--- a/main_test.go
+++ b/passenger_exporter_test.go
@@ -8,6 +8,7 @@ import (
"net/http/httptest"
"os"
"reflect"
+ "strings"
"testing"
"time"
@@ -32,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)
}
@@ -84,9 +85,9 @@ 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_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)
}
@@ -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 != timeoutErr {
+ 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 ./test/passenger_xml_output.xml", time.Second.Seconds())
}
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"`
-}
diff --git a/testdata/passenger_xml_output.xml b/test/passenger_xml_output.xml
similarity index 96%
rename from testdata/passenger_xml_output.xml
rename to test/passenger_xml_output.xml
index f925278..ef56e43 100644
--- a/testdata/passenger_xml_output.xml
+++ b/test/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/test/scrape_output.txt b/test/scrape_output.txt
new file mode 100644
index 0000000..5a6276a
--- /dev/null
+++ b/test/scrape_output.txt
@@ -0,0 +1,174 @@
+# 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_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
+# 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 process started.
+# TYPE passenger_proc_start_time_seconds gauge
+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
+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_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.
+# TYPE passenger_version gauge
+passenger_version{version="5.0.26"} 1
diff --git a/testdata/scrape_output.txt b/testdata/scrape_output.txt
deleted file mode 100644
index 460a315..0000000
--- a/testdata/scrape_output.txt
+++ /dev/null
@@ -1,124 +0,0 @@
-# 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