Statix is an Elixir client for StatsD-compatible servers. It is focused on speed without sacrificing simplicity, completeness, or correctness.
What makes Statix the fastest library around:
[1] In contrast with process-based clients, Statix has lower memory consumption and higher throughput – Statix v1.0.0 does about 876640 counter increments per flush:
It is possible to measure it yourself.
for _ <- 1..10_000 do
Task.start(fn ->
for _ <- 1..10_000 do
StatixSample.increment("sample", 1)
end
end)
end
Make sure you have StatsD server running to get more realistic results.
Add Statix as a dependency to your mix.exs
file:
def application() do
[applications: [:statix]]
end
defp deps() do
[{:statix, ">= 0.0.0"}]
end
Then run mix deps.get
in your shell to fetch the dependencies.
A module that uses Statix becomes a socket connection:
defmodule MyApp.Statix do
use Statix
end
Before using connection the connect/0
function needs to be invoked.
In general, this function is called when your application starts (for example, in its start/2
callback):
def start(_type, _args) do
:ok = MyApp.Statix.connect
# ...
end
Once the Statix connection is open, its increment/1,2
, decrement/1,2
, gauge/2
, set/2
, timing/2
, and measure/2
functions can be used to push metrics to the StatsD-compatible server.
Sampling is supported via the :sample_rate
option:
MyApp.Statix.increment("page_view", 1, sample_rate: 0.5)
The UDP packet will only be sent to the server about half of the time, but the resulting value will be adjusted on the server according to the given sample rate.
Tags are a way of adding dimensions to metrics:
MyApp.Statix.gauge("memory", 1, tags: ["region:east"])
Statix can be configured globally with:
config :statix,
prefix: "sample",
host: "stats.tld",
port: 8181,
telegraf: true
and on a per connection basis as well:
config :statix, MyApp.Statix,
port: 8811
The defaults are:
- prefix:
nil
- host:
"127.0.0.1"
- port:
8125
- telegraf:
false
(Use Telegraf's StatsD line protocol, which is slightly different than the rest)
Note: by default, configuration is evaluated once, at compile time.
If you plan using other configuration at runtime, you must specify the :runtime_config
option:
defmodule MyApp.Statix do
use Statix, runtime_config: true
end
This software is licensed under the ISC license.