prometheus_plugs v0.8.1 Plug.PrometheusCollector
Plug for collecting http metrics.
To use it, plug it into the desired module.
You also want to call setup/0,1
before using plug, for example on application start!
plug Plug.PrometheusCollector
Currently maintains two metrics.
http_requests_total
- Total nubmer of HTTP requests made. This one is a counter.http_request_duration_microseconds
- The HTTP request latencies in microseconds. This one is a histogram.
All metrics support configurable labels:
# on app startup (e.g. supervisor setup)
Plug.PrometheusCollector.setup([:method, :host])
# in your plugs pipeline
plug Plug.PrometheusCollector, [:method, :host]
Supported labels include:
- status_code - http code
- status_class - http code class, like “success”, “redirect”, “client-error”, etc
- method - http method
- host - requested host
- port - requested port
- scheme - request scheme (like http or https)
In fact almost any Plug.Conn field value can be used as metric label. In order to create a custom label simply provide a fun as either a key-value pair where the value is a fun which will be given the label and conn as parameters:
defmodule CustomLabels do
def connection_private_key(key, conn) do
Map.get(conn.private, key, "unknown") |> to_string
end
def phoenix_controller_action(%Plug.Conn{private: private}) do
case [private[:phoenix_controller], private[:phoenix_action]] do
[nil, nil] -> "unknown"
[controller, action] -> "#{controller}/#{action}"
end
end
end
# As a key/value for the Collector
Plug.PrometheusCollector.setup(labels: [:method, :phoenix_controller]
plug Plug.PrometheusCollector, [:code, phoenix_controller: &CustomLabels.connection_private_key/2]
# As a simple fun
Plug.PrometheusCollector.setup(labels: [:method, :phoenix_controller_action]
plug Plug.PrometheusCollector, [:code, &CustomLabels.phoenix_controller_action/1]
Additionaly http_request_duration_microseconds
supports configurable bucket bounds:
Plug.PrometheusCollector.setup([labels: [:method, :host],
request_duration_bounds: [10, 100, 1_000, 10_000, 100_000, 300_000, 500_000, 750_000, 1_000_000, 1_500_000, 2_000_000, 3_000_000]])
plug Plug.PrometheusCollector, [:method, :host]
Bear in mind that bounds are microseconds (1s is 1_000_000us)