Current section

Files

Jump to
ecto_profiler lib handler trace_handler.ex
Raw

lib/handler/trace_handler.ex

defmodule EctoProfiler.TraceHandler do
@moduledoc """
Documentation for EctoProfiler.
"""
use EctoProfiler.Helper
@root_module EctoProfiler
@doc """
Handler for data. Checks all modules and selects only first module of yours app in trace list.
It writes data to mnesia `TraceProfiler` table.
"""
@spec handle([tuple()], [module()], Ecto.LogEntry.t) :: {:atomic, nonempty_list(tuple())} | nil
def handle(trace_list, modules_list, entry) do
Enum.reverse(trace_list)
|> Enum.find(fn({module, _, _, _}) -> Enum.member?(modules_list -- [@root_module], module) end)
|> write_profiling_data(entry.query_time, trace_list)
end
defp write_profiling_data(nil, _, _), do: nil
defp write_profiling_data({module, func, arity, _}, extra_query_time, trace) do
with {:atomic, [{TraceProfiler, _, _, query_time, calls}]}
<- :mnesia.transaction(fn -> :mnesia.read(TraceProfiler, trace) end)
do
:mnesia.transaction(fn ->
:mnesia.write({TraceProfiler, trace, {module, func, arity}, time(extra_query_time) + query_time, calls + 1})
end)
else
{:atomic, []} -> :mnesia.transaction(fn ->
:mnesia.write({TraceProfiler, trace, {module, func, arity}, time(extra_query_time), 1})
end)
end
end
end