Current section
Files
Jump to
Current section
Files
lib/exometer_statix.ex
defmodule ExometerStatix do
@moduledoc """
Documentation for ExometerStatix.
"""
alias ExometerStatix.Client
@type_map [
:gauge, ~w(gauge gauges),
:counter, ~w(count counter counters),
:timer, ~w(timer timers timing timings),
:histogram, ~w(histogram histograms),
]
@defalut_type :gauge
@host "127.0.0.1"
@port 8_125
@prefix nil
# @spec exometer_init(term) :: {:ok, nil} | {:error, binary}
def exometer_init(opts) do
init_statix(opts)
case Client.connect() do
:ok -> {:ok, %{type_map: invert_type_map(@type_map)}}
_ -> {:error, "connection failure"}
end
end
@doc false
def exometer_report(metric, datapoint, _extra, value, %{type_map: type_map} = state) do
key = metric ++ [datapoint]
name = Enum.join(key, ".")
type = report_type(key, type_map)
report(type, name, value)
{:ok, state}
end
@doc false
def exometer_subscribe(_metric, _datapoint, _interval, _opts, state) do
{:ok, state}
end
@doc false
def exometer_unsubscribe(_metric, _datapoint, _extra, state) do
{:ok, state}
end
@doc false
def exometer_call(_msg, _from, state) do
{:ok, state}
end
@doc false
def exometer_cast(_msg, state) do
{:ok, state}
end
@doc false
def exometer_info(_msg, state) do
{:ok, state}
end
@doc false
def exometer_newentry(_entry, state) do
{:ok, state}
end
@doc false
def exometer_setopts(_metric, _options, _status, state) do
{:ok, state}
end
@doc false
def exometer_terminate(_reason, _state) do
:ignore
end
defp init_statix(opts) do
Application.put_env(:statix, Client,
host: Keyword.get(opts, :host, @host),
port: Keyword.get(opts, :port, @port),
prefix: prefix(Keyword.get(opts, :prefix, @prefix)),
)
end
defp invert_type_map(type_map) do
type_map
|> Enum.chunk(2)
|> Enum.map(fn([k,v]) -> Enum.map(v, fn(vv) -> {vv, k} end) end)
|> List.flatten
|> Enum.into(%{})
end
defp report_type(key, type_map) do
case Enum.find(key, fn(k) -> type_map[Atom.to_string(k)] end) do
nil -> @defalut_type
t -> type_map[Atom.to_string(t)]
end
end
defp report(:gauge, n, v), do: Client.gauge(n, v)
defp report(:timer, n, v), do: Client.timing(n, v)
defp report(:counter, n, v), do: Client.increment(n, v)
defp report(:histogram, n, v), do: Client.histogram(n, v)
defp prefix(v) when is_atom(v), do: Atom.to_string(v)
defp prefix(v), do: v
end