/ex_metrics

An Elixir Library for StatsD metrics.

Primary LanguageElixirMIT LicenseMIT

ExMetrics

Another Elixir metrics library, ExMetrics is a thin wrapper built on top of statix providing convenient macros for timing function calls.

Installation

def deps do
  [
    {:ex_metrics, "~> 0.1.0"}
  ]
end

Configuration

ex_metrics supports the following global configuration options:

  • prefix: A prefix for all metric names, default nil
  • host: The StatsD host, default 127.0.0.1
  • port: The port to send metrics, default 8125
  • tags: Global tags to be sent with all metrics, default is none.

Usage

Metrics Collection

ex_metrics exposes the following functions for metrics collection (the same as statix):

  • ExMetrics.decrement/1,2,3
  • ExMetrics.gauge/2,3
  • ExMetrics.histogram/2,3
  • ExMetrics.increment/1,2,3
  • ExMetrics.measure/2,3
  • ExMetrics.set/2,3
  • ExMetrics.timing/2,3

deftimed Macro

Functions can be timed easily with the deftimed macro:

defmodule MyApp do
  use ExMetrics.FunctionTimer

  deftimed foo do
    # Times foo/0 function and sends metric name: "function_call.elixir.myapp.foo_0"
  end

  @metric_name "custom_metric_name"
  @metric_options [tags: [key: :value]]
  deftimed bar do
    # Times bar/0 function and sends metric with name @metric_name and options @metric_options
  end

  # Metric names and options can be configured on a per-function-header level.
  @metric_name "baz_value1"
  deftimed baz(:value1) do
  end

  @metric_name "baz_value2"
  deftimed baz(:value2) do
  end

  @metric_name "baz_default"
  deftimed baz(value) do
  end
end

Plug

Response times can be automatically captured and reported with the ExMetrics.Plug:

defmodule MyRouter do
  use Plug.Router

  plug(:accepts, ["json", "urlencoded"])
  plug(ExMetrics.Plug)

  get("/", MyController, :action)                   # Metric name: response_time.root
  get("/v2/users/:id/edit", UsersController, :edit) # Metric name: response_time.v2.users.id.edit
end

Development

Testing

Unit tests with a code coverage report generated by Coveralls can be run with

$ mix coveralls.html

Linting

The linter can be run with

$ mix credo

Static Analysis

Static type analysis can be run with

$ mix dialyzer