defmodule NewRelic.Instrumented.Task.Supervisor do @moduledoc """ Provides a pre-instrumented convienince module to connect non-linked `Task.Supervisor` processes to the Transaction that called them. You may call these functions directly, or `alias` the `NewRelic.Instrumented.Task` module and continue to use `Task` as normal. Example usage: ```elixir alias NewRelic.Instrumented.Task Task.Supervisor.async_nolink( MySupervisor, [1,2], fn n -> do_work(n) end ) ``` """ import NewRelic.Instrumented.Task.Wrappers defdelegate async(supervisor, fun, options \\ []), to: Task.Supervisor defdelegate async(supervisor, module, fun, args, options \\ []), to: Task.Supervisor defdelegate children(supervisor), to: Task.Supervisor defdelegate start_link(options), to: Task.Supervisor defdelegate terminate_child(supervisor, pid), to: Task.Supervisor # These functions _don't_ link their Task so we connect them explicitly def async_stream(supervisor, enumerable, fun, options \\ []) do Task.Supervisor.async_stream(supervisor, enumerable, instrument(fun), options) end def async_stream(supervisor, enumerable, module, function, args, options \\ []) do {module, function, args} = instrument({module, function, args}) Task.Supervisor.async_stream(supervisor, enumerable, module, function, args, options) end def async_nolink(supervisor, fun, options \\ []) do Task.Supervisor.async_nolink(supervisor, instrument(fun), options) end def async_nolink(supervisor, module, fun, args, options \\ []) do {module, fun, args} = instrument({module, fun, args}) Task.Supervisor.async_nolink(supervisor, module, fun, args, options) end def async_stream_nolink(supervisor, enumerable, fun, options \\ []) do Task.Supervisor.async_stream_nolink(supervisor, enumerable, instrument(fun), options) end def async_stream_nolink(supervisor, enumerable, module, function, args, options \\ []) do {module, function, args} = instrument({module, function, args}) Task.Supervisor.async_stream_nolink(supervisor, enumerable, module, function, args, options) end def start_child(supervisor, fun, options \\ []) do Task.Supervisor.start_child(supervisor, instrument(fun), options) end def start_child(supervisor, module, fun, args, options \\ []) do {module, fun, args} = instrument({module, fun, args}) Task.Supervisor.start_child(supervisor, module, fun, args, options) end end