View Source NewRelic.Tracer (New Relic Elixir Agent v1.36.0)
Function Tracing
To enable function tracing in a particular module, use NewRelic.Tracer,
and annotate the functions you want to trace with @trace.
Traced functions will report as:
- Segments in Transaction Traces
- Span Events in Distributed Traces
- Special custom attributes on Transaction Events
Warning
Traced functions will not be tail-call-recursive. Don't use this for recursive functions.
Example
Trace a function:
defmodule MyModule do
use NewRelic.Tracer
@trace :my_function
def my_function do
# Will report as `MyModule.my_function/0`
end
@trace :alias
def my_function do
# Will report as `MyModule.my_function:alias/0`
end
endArguments
By default, arguments are inspected and recorded along with traces. You can opt-out of function argument tracing on individual tracers:
defmodule SecretModule do
use NewRelic.Tracer
@trace {:login, args: false}
def login(username, password) do
# do something secret...
end
endThis will prevent the argument values from becoming part of Transaction Traces.
This may also be configured globally via Application config. See NewRelic.Config for details.
External Service calls
Finch
Finch requests are auto-instrumented, so you don't need to use category: :external tracers or call set_span if you use Finch.
You may still want to use a normal tracer for functions that make HTTP requests if they do additional work worth instrumenting.
Automatic Finch instrumentation can not inject Distributed Trace headers, so that must still be done manually.
To manually instrument External Service calls you must give the trace annotation a category.
You may also call NewRelic.set_span/2 to provide better naming for metrics & spans, and additionally annotate the outgoing HTTP headers with the Distributed Tracing context to track calls across services.
defmodule MyExternalService do
use NewRelic.Tracer
@trace {:request, category: :external}
def request(method, url, headers) do
NewRelic.set_span(:http, url: url, method: method, component: "HttpClient")
headers ++ NewRelic.distributed_trace_headers(:http)
HttpClient.request(method, url, headers)
end
end