Current section
Files
Jump to
Current section
Files
lib/metrix/plug.ex
defmodule ElixirTools.Metrix.Plug do
@moduledoc """
Sends phoenix metrics to the statsd adapter for request and response information
"""
@behaviour Plug
import Plug.Conn, only: [register_before_send: 2]
alias ElixirTools.Metrix
alias ElixirTools.Metrix.Plug.Tags
alias Plug.Conn
@timer_metric "request.timer"
@http_status_metric "request.status"
@unit :millisecond
@spec init(Plug.opts()) :: Plug.opts()
def init(opts), do: opts
@spec call(Conn.t(), any) :: Conn.t()
def call(conn, opts \\ []) do
metrics_module = opts[:metrics_module] || Metrix
start_time = :erlang.monotonic_time(@unit)
register_before_send(conn, fn conn ->
tags = tags(conn)
duration = :erlang.monotonic_time(@unit) - start_time
metrics_module.timing(@timer_metric, duration, tags)
metrics_module.increment(@http_status_metric, 1, tags)
conn
end)
end
@spec tags(Conn.t()) :: map
defp tags(conn) do
%{
controller: Tags.controller_name(conn),
action: Tags.method_name(conn),
http_method: conn.method,
api_version: Tags.api_version(conn),
response_status_code: conn.status,
response_status_code_class: Tags.response_status_code_class(conn)
}
end
end