defmodule NewRelic.Instrumented.Task do
@moduledoc """
Provides a pre-instrumented convienince module to connect
non-linked `Task` processes to the Transaction that called them.
You may call these functions directly, or `alias` the module
and continue to use `Task` as normal.
Example usage:
```elixir
alias NewRelic.Instrumented.Task
Task.async_stream([1,2], fn n -> do_work(n) end)
```
"""
import NewRelic.Instrumented.Task.Wrappers
defdelegate async(fun),
to: Task
defdelegate async(module, function_name, args),
to: Task
defdelegate await(task, timeout \\ 5000),
to: Task
if Code.ensure_loaded?(Task) && Kernel.function_exported?(Task, :await_many, 2) do
defdelegate await_many(tasks, timeout \\ 5000),
to: Task
end
defdelegate child_spec(arg),
to: Task
defdelegate shutdown(task, timeout \\ 5000),
to: Task
defdelegate start_link(fun),
to: Task
defdelegate start_link(module, function_name, args),
to: Task
defdelegate yield(task, timeout \\ 5000),
to: Task
defdelegate yield_many(task, timeout \\ 5000),
to: Task
# These functions _don't_ link their Task so we connect them explicitly
def start(fun) do
Task.start(instrument(fun))
end
def start(module, function_name, args) do
{module, function_name, args} = instrument({module, function_name, args})
Task.start(module, function_name, args)
end
def async_stream(enumerable, fun, options \\ []) do
Task.async_stream(enumerable, instrument(fun), options)
end
def async_stream(enumerable, module, function_name, args, options \\ []) do
{module, function_name, args} = instrument({module, function_name, args})
Task.async_stream(enumerable, module, function_name, args, options)
end
end