Current section
Files
Jump to
Current section
Files
lib/metrix/recurring/erlang_stats.ex
defmodule ElixirTools.Metrix.Recurring.ErlangStats do
@moduledoc """
Sends periodically Erlang metrics to a ElixirTools.Metrix Adapter
"""
use GenServer
alias __MODULE__
alias ElixirTools.Metrix.Recurring.ErlangStats.Metrics
@typep send_opt :: {:metrics_module, module} | {:metrics_adapter_module, module}
@valid_metric_types ~w(count increment decrement gauge histogram timing)a
# client
@spec start_link(any) :: {:ok, pid}
def start_link(_) do
GenServer.start_link(ErlangStats, %{}, name: ErlangStats)
end
@doc """
Collects the erlang statistics and sends them to the adapter.
"""
@spec send_metrics([send_opt]) :: :ok
def send_metrics(opts \\ []) do
metrics_module = opts[:metrics_module] || ErlangStats.Metrics
metrics = metrics_module.all()
for {type, metrics_for_type} <- metrics do
Enum.each(metrics_for_type, &send_sample(type, &1.measure(), opts))
end
:ok
end
@spec send_sample(atom, Metrics.on_measure(), [send_opt]) :: :ok
defp send_sample(metric_type, {:ok, metric, value, tags}, opts)
when metric_type in @valid_metric_types do
metrics_adapter_module = opts[:metrics_adapter_module] || ElixirTools.Metrix
apply(metrics_adapter_module, metric_type, [metric, value, tags])
end
defp send_sample(_, _, _), do: :noop
# server
@impl true
def init(_) do
send(self(), :loop_send)
{:ok, nil}
end
@impl true
def handle_info(:loop_send, state) do
Process.send_after(self(), :loop_send, 1000)
send_metrics()
{:noreply, state}
end
end