Elixir plugs for prometheus.erl
TL;DR Example app
Prometheus Plugs currently comes with two Plugs. One is for collecting http metrics while another provides endpoint for scraping by Prometheus daemon.
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.
Setup
# on app startup (e.g. supervisor setup)
Prometheus.PlugsInstrumenter.setup()
# in your plugs pipeline
plug Prometheus.PlugsInstrumenter
Plugs instrumenter can be configured via PlugsInstrumenter key of prometheus app env.
All metrics support configurable labels:
- 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)
Default configuration:
config :prometheus, PlugsInstrumenter,
labels: [:status_class, :method, :host, :scheme],
duration_buckets:[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],
registry: :default
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 label_value(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
labels: [:status_class, phoenix_controller: CustomLabels, phoenix_controller_action: {CustomLabels, :phoenix_controller_action}]
Bear in mind that bounds are microseconds (1s is 1_000_000us)
Exports metrics in text format via configurable endpoint:
# on app startup (e.g. supervisor setup)
Plug.PrometheusExporter.setup()
# in your plugs pipeline
plug Plug.PrometheusExporter
Defautl Configuration:
config :prometheus, PlugsExporter,
path: "/metrics",
format: :text,
registry: :default
The package can be installed as:
-
Add prometheus_plug to your list of dependencies in
mix.exs
:def deps do [{:prometheus_plugs, "~> 0.7"}] end
-
Ensure prometheus is started before your application:
def application do [applications: [:prometheus]] end
MIT