Current section
Files
Jump to
Current section
Files
lib/server_new_relic.ex
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