Packages
new_relic_agent
1.18.0-rc.4
1.40.3
1.40.2
1.40.1
1.40.0
1.39.0
1.38.0
1.37.0
1.36.0
1.35.0
1.34.0
1.33.0
1.32.0
1.31.1
1.31.0
1.30.0
1.29.0
1.28.0
1.27.8
1.27.7
1.27.6
1.27.5
1.27.4
1.27.3
1.27.2
1.27.1
1.27.0
1.26.0
1.25.3
1.25.2
1.25.1
1.25.0
1.24.5
1.24.4
1.24.3
1.24.2
1.24.1
1.24.0
1.24.0-rc.10
1.24.0-rc.9
1.24.0-rc.8
1.24.0-rc.7
1.23.6
1.23.5
1.23.4
1.23.3
1.23.2
1.23.1
1.23.0
1.23.0-rc.6
1.23.0-rc.5
1.23.0-rc.4
1.23.0-rc.3
1.23.0-rc.2
1.23.0-rc.1
1.22.6
1.22.5
1.22.4
1.22.3
1.22.2
1.22.1
1.22.0
1.21.2
1.21.1
1.21.0
1.21.0-rc.3
1.21.0-rc.1
1.20.0
1.20.0-rc.1
1.19.7
1.19.6
1.19.5
1.19.4
1.19.3
1.19.2
1.19.1
1.19.0
1.18.5
1.18.4
1.18.3
1.18.2
1.18.1
1.18.0
1.18.0-rc.5
1.18.0-rc.4
1.18.0-rc.2
1.18.0-rc.1
1.17.1
1.17.0
1.17.0-rc.4
1.17.0-rc.3
1.17.0-rc.2
1.17.0-rc.1
1.17.0-rc.0
1.16.7
1.16.6
1.16.5
1.16.4
1.16.3
1.16.2
1.16.1
1.16.0
1.16.0-rc.2
1.16.0-rc.1
1.16.0-rc.0
1.15.0
1.15.0-rc.3
1.15.0-rc.2
1.15.0-rc.1
1.14.0
1.13.1
1.13.0
1.12.0
1.11.0
1.10.2
1.10.1
1.10.0
1.9.12
1.9.11
1.9.10
1.9.9
1.9.8
1.9.7
1.9.6
1.9.5
1.9.4
1.9.3
1.9.2
1.9.1
1.9.0
1.8.0
1.7.0
1.6.2
1.6.1
1.6.0
1.5.0
1.4.0
1.3.2
1.3.1
1.3.0
1.2.1
1.2.0
1.1.0
1.0.5
1.0.4
1.0.3
1.0.2
1.0.1
1.0.0
New Relic's Open-Source Elixir Agent
Current section
Files
Jump to
Current section
Files
lib/new_relic/transaction.ex
defmodule NewRelic.Transaction do
@moduledoc """
Transaction Reporting
To enable Transaction reporting, you must instrument your Plug pipeline with a single line.
The `NewRelic.Transaction` macro injects the required plugs to wire up automatic
Transaction reporting.
Be sure to `use` this as early in your Plug pipeline as possible to ensure the most
accurate response times.
```elixir
defmodule MyApp do
use Plug.Router
use NewRelic.Transaction
# ...
end
```
To ignore reporting the current transaction, call:
```elixir
NewRelic.ignore_transaction()
```
Inside a Transaction, the agent will track work across processes that are spawned as
well as work done inside a Task Supervisor. When using `Task.Supervisor.async_nolink`
you can signal to the agent not to track the work done inside the Task, which will
exclude it from the current Transaction. To do this, send in an additional option:
```elixir
Task.Supervisor.async_nolink(
MyTaskSupervisor,
fn -> do_work() end,
new_relic: :no_track
)
```
"""
defmacro __using__(_) do
quote do
plug(NewRelic.Transaction.Plug)
plug(NewRelic.DistributedTrace.Plug)
use NewRelic.Transaction.ErrorHandler
end
end
@doc """
If you send a custom error response in your own `Plug.ErrorHandler`,
you **MUST** manually alert the agent of the error!
```elixir
defmodule MyPlug do
# ...
use Plug.ErrorHandler
def handle_errors(conn, error) do
NewRelic.Transaction.handle_errors(conn, error)
send_resp(conn, 500, "Oops!")
end
end
```
"""
def handle_errors(conn, error) do
NewRelic.DistributedTrace.Tracker.cleanup(self())
NewRelic.Transaction.Plug.add_stop_attrs(conn)
NewRelic.Transaction.Reporter.fail(error)
NewRelic.Transaction.Reporter.complete(self(), :async)
end
@doc false
def start_transaction(category, name) do
NewRelic.Transaction.Reporter.start_other_transaction(category, name)
NewRelic.DistributedTrace.generate_new_context()
|> NewRelic.DistributedTrace.track_transaction(transport_type: "Other")
:ok
end
@doc false
def stop_transaction() do
NewRelic.Transaction.Reporter.complete(self(), :sync)
:ok
end
@doc false
def ignore_transaction() do
NewRelic.Transaction.Reporter.ignore_transaction()
NewRelic.DistributedTrace.Tracker.cleanup(self())
end
end