defmodule CoreUtils.ServerNewRelic do defmacro __using__(opts) do opts = Keyword.merge( opts, quote( do: [ before: [&CoreUtils.ServerNewRelic.Callbacks.before_service/2], after: [&CoreUtils.ServerNewRelic.Callbacks.after_service/2] ] ) ) quote do use GenAMQP.Server, unquote(opts) end end defmodule Callbacks do require Logger alias CoreUtils.StructUtil def before_service(event, payload) do NewRelixir.CurrentTransaction.set(event) start = System.monotonic_time() Process.put(:start, start) data = Poison.decode!(payload, keys: :atoms) request_id = case data do %{} = data -> Map.get(data, :request_id) _ -> nil end Process.put(:request_id, request_id) Logger.info("Data arrived in request [#{request_id}] and service [#{event}] = #{payload}") data end def after_service(event, response) do stop = System.monotonic_time() start = Process.get(:start) elapsed_microseconds = System.convert_time_unit(stop - start, :native, :microsecond) NewRelixir.Transaction.record_web(event, elapsed_microseconds) resp = response |> StructUtil.nested_parse() |> Poison.encode!() request_id = Process.get(:request_id) Logger.info("Response sent in request [#{request_id}] and service [#{event}] = #{resp}") resp end end end