zanhsieh / prometheus-plugs

Prometheus.erl Elixir Plugs

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Prometheus Plugs Hex.pm

Elixir plugs for prometheus.erl

TL;DR Example app

Plugs

Prometheus Plugs currently comes with two Plugs. One is for collecting http metrics while another provides endpoint for scraping by Prometheus daemon.

Prometheus.PlugsInstrumenter

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)

Plug.PrometheusExporter

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

Installation

The package can be installed as:

  1. Add prometheus_plug to your list of dependencies in mix.exs:

    def deps do [{:prometheus_plugs, "~> 0.7"}] end

  2. Ensure prometheus is started before your application:

    def application do [applications: [:prometheus]] end

License

MIT

About

Prometheus.erl Elixir Plugs


Languages

Language:Elixir 100.0%