defmodule Untangle.Time do
use Decorator.Define, time: 0
require Logger
def time(fn_body, context) do
quote do
if Untangle.log_level?(:debug) do
# skip the measuring depending on log level
start = :erlang.monotonic_time()
result = unquote(fn_body)
finish = :erlang.monotonic_time()
time = :erlang.convert_time_unit(finish - start, :native, :microsecond)
if time > Application.get_env(:untangle, :time_slow_min, 10_000),
do:
Logger.debug(
"#{time / 1_000} ms to run #{unquote(context.module)}.#{unquote(context.name)}/#{unquote(context.arity)}"
)
result
else
unquote(fn_body)
end
end
end
end