diff --git a/lib/new_relic/transaction/erlang_trace.ex b/lib/new_relic/transaction/erlang_trace.ex index 038a02e6..ed17221b 100644 --- a/lib/new_relic/transaction/erlang_trace.ex +++ b/lib/new_relic/transaction/erlang_trace.ex @@ -11,12 +11,6 @@ defmodule NewRelic.Transaction.ErlangTrace do import NewRelic.ConditionalCompile - # Before elixir 1.15, tasks were spawned with :proc_lib, - # but starting with elixir 1.15 tasks are spawned with Task.Supervised. - # See https://github.com/elixir-lang/elixir/commit/ecdf68438160928f01769b3ed76e184ad451c9fe - before_elixir_version("1.15.0", @spawn_module(:proc_lib)) - after_elixir_version("1.15.0", @spawn_module(Task.Supervised)) - def start_link(_) do GenServer.start_link(__MODULE__, :ok, name: __MODULE__) end @@ -55,18 +49,20 @@ defmodule NewRelic.Transaction.ErlangTrace do # Trace messages def handle_info( - {:trace_ts, source, :return_from, {@spawn_module, :spawn_link, _}, pid, timestamp}, + {:trace_ts, source, :return_from, {module, :spawn_link, _}, pid, timestamp}, state - ) do + ) + when module in [:proc_lib, Task.Supervised] do Transaction.Reporter.track_spawn(source, pid, NewRelic.Util.time_to_ms(timestamp)) overload_protection(state.overload) {:noreply, state} end def handle_info( - {:trace_ts, source, :return_from, {@spawn_module, :start_link, _}, {:ok, pid}, timestamp}, + {:trace_ts, source, :return_from, {module, :start_link, _}, {:ok, pid}, timestamp}, state - ) do + ) + when module in [:proc_lib, Task.Supervised] do Transaction.Reporter.track_spawn(source, pid, NewRelic.Util.time_to_ms(timestamp)) overload_protection(state.overload) {:noreply, state} @@ -98,8 +94,20 @@ defmodule NewRelic.Transaction.ErlangTrace do end defp trace_proc_lib_spawn_link do - :erlang.trace_pattern({@spawn_module, :spawn_link, :_}, [{:_, [], [{:return_trace}]}], []) - :erlang.trace_pattern({@spawn_module, :start_link, :_}, [{:_, [], [{:return_trace}]}], []) + :erlang.trace_pattern({:proc_lib, :spawn_link, :_}, [{:_, [], [{:return_trace}]}], []) + :erlang.trace_pattern({:proc_lib, :start_link, :_}, [{:_, [], [{:return_trace}]}], []) + + # Starting with elixir 1.15 tasks are spawned with Task.Supervised. + # See https://github.com/elixir-lang/elixir/commit/ecdf68438160928f01769b3ed76e184ad451c9fe + after_elixir_version( + "1.15.0", + :erlang.trace_pattern({Task.Supervised, :spawn_link, :_}, [{:_, [], [{:return_trace}]}], []) + ) + + after_elixir_version( + "1.15.0", + :erlang.trace_pattern({Task.Supervised, :start_link, :_}, [{:_, [], [{:return_trace}]}], []) + ) end defp overload_protection(%{backoff: backoff} = overload) do