Packages
appsignal
2.5.3
2.17.4
2.17.3
2.17.2
2.17.1
2.17.0
2.16.0
2.15.11
2.15.10
2.15.9
2.15.8
2.15.7
2.15.6
2.15.5
2.15.4
2.15.3
2.15.2
2.15.1
2.15.0
2.14.1
2.14.0
2.13.4
2.13.3
2.13.2
2.13.1
2.13.0
2.12.3
2.12.2
2.12.1
2.12.0
2.11.0
2.10.2
2.10.1
2.10.0
2.9.2
2.9.1
2.9.0
2.8.3
2.8.2
2.8.1
2.8.0
2.7.13
2.7.12
2.7.11
2.7.10
2.7.9
2.7.8
2.7.7
2.7.6
2.7.5
2.7.4
2.7.3
2.7.2
2.7.1
2.7.0
2.7.0-beta.1
2.6.1
2.6.0
2.5.3
2.5.2
2.5.1
2.5.0
2.4.3
2.4.2
2.4.1
2.4.0
2.3.1
2.3.0
2.2.19
2.2.18
2.2.17
2.2.16
2.2.15
2.2.14
2.2.13
2.2.12
retired
2.2.11
2.2.10
2.2.9
2.2.8
2.2.7
2.2.6
2.2.5
2.2.4
2.2.3
2.2.2
2.2.1
2.2.0
2.1.15
2.1.14
2.1.13
2.1.12
2.1.11
2.1.10
2.1.9
2.1.8
2.1.7
2.1.7-beta.1
2.1.6
2.1.5
2.1.4
2.1.3
2.1.2
2.1.1
2.1.0
2.0.8
2.0.7
2.0.6
2.0.6-beta.1
2.0.5
retired
2.0.4
retired
2.0.3
retired
2.0.2
retired
2.0.1
retired
2.0.0
retired
2.0.0-beta.11
2.0.0-beta.10
2.0.0-beta.9
2.0.0-beta.8
2.0.0-beta.7
2.0.0-beta.6
2.0.0-beta.5
2.0.0-beta.4
2.0.0-beta.3
2.0.0-beta.2
2.0.0-beta.1
2.0.0-alpha.7
2.0.0-alpha.6
2.0.0-alpha.5
2.0.0-alpha.4
2.0.0-alpha.3
2.0.0-alpha.2
2.0.0-alpha.1
1.13.5
1.13.4
1.13.3
1.13.2
1.13.1
1.13.0
1.13.0-beta.2
1.13.0-beta.1
1.12.1
1.12.0
1.12.0-beta.3
1.12.0-beta.2
1.12.0-beta.1
1.11.8
1.11.7
1.11.6
1.11.5
1.11.4
1.11.3
1.11.2
1.11.1
1.11.0
1.11.0-beta.1
1.10.13
1.10.12
1.10.11
1.10.10
1.10.9
1.10.8
1.10.7
1.10.6
1.10.5
1.10.4
1.10.3
1.10.2
1.10.1
1.10.0
1.9.4
1.9.3
1.9.2
1.9.1
1.9.1-beta.1
1.9.0
1.9.0-beta.1
1.9.0-alpha.1
1.8.2
1.8.1
1.8.1-beta.2
1.8.1-beta.1
1.8.0
1.7.2
1.7.1
1.7.0
1.7.0-beta.2
1.7.0-beta.1
1.7.0-alpha.4
1.7.0-alpha.3
1.7.0-alpha.2
1.7.0-alpha.1
1.6.7
1.6.6
1.6.6-beta.2
1.6.6-beta.1
1.6.5
1.6.4
1.6.3
1.6.2
1.6.1
1.6.0
1.6.0-beta.1
1.6.0-alpha.1
1.5.1
1.5.0
1.5.0-beta.2
1.5.0-beta.1
1.4.11-beta.1
1.4.10
1.4.9
1.4.8
1.4.7
1.4.6
1.4.5
1.4.4
1.4.3
1.4.2
1.4.1
1.4.0
1.4.0-alpha.1
1.3.6
1.3.6-beta.1
1.3.5
1.3.4
1.3.4-beta.1
1.3.3
1.3.2
1.3.1
1.3.0
1.3.0-beta.3
1.3.0-beta.2
1.3.0-beta.1
1.2.3
1.2.2
1.2.1
1.2.0
1.1.1
1.1.0
1.0.4
1.0.3
1.0.2
1.0.1
1.0.0
1.0.0-rc.1
0.13.0
0.12.3
0.12.2
0.12.1
0.12.0
0.11.6
0.11.5
0.11.4
0.11.3
0.11.2
0.11.1
0.11.0
0.10.0
0.9.2
0.9.1
0.9.0
0.8.0
0.7.1
0.7.0
0.6.2
0.6.1
0.6.0
0.5.0
0.4.0
0.3.0
0.2.0
0.1.0
0.0.9
0.0.8
0.0.7
0.0.6
0.0.5
0.0.4
0.0.3
0.0.2
0.0.1
Collects error and performance data from your Elixir applications and sends it to AppSignal
Current section
Files
Jump to
Current section
Files
lib/appsignal/instrumentation.ex
defmodule Appsignal.Instrumentation do
require Appsignal.Utils
@tracer Appsignal.Utils.compile_env(:appsignal, :appsignal_tracer, Appsignal.Tracer)
@span Appsignal.Utils.compile_env(:appsignal, :appsignal_span, Appsignal.Span)
@spec instrument(function()) :: any()
@doc false
def instrument(fun) do
span = @tracer.create_span("background_job", @tracer.current_span)
result = call_with_optional_argument(fun, span)
@tracer.close_span(span)
result
end
@spec instrument(String.t(), function()) :: any()
@doc """
Instrument a function.
def call do
Appsignal.instrument("foo.bar", fn ->
:timer.sleep(1000)
end)
end
When passing a function that takes an argument, the function is called with
the created span to allow adding extra information.
def call(params) do
Appsignal.instrument("foo.bar", fn span ->
Appsignal.Span.set_sample_data(span, "params", params)
:timer.sleep(1000)
end)
end
"""
def instrument(name, fun) do
instrument(name, name, fun)
end
@spec instrument(String.t(), String.t(), function()) :: any()
@doc """
Instrument a function, and set the `"appsignal:category"` attribute to the
value passed as the `category` argument.
"""
def instrument(name, category, fun) do
instrument(fn span ->
_ =
span
|> @span.set_name(name)
|> @span.set_attribute("appsignal:category", category)
call_with_optional_argument(fun, span)
end)
end
@deprecated "Use Appsignal.instrument/3 instead."
def instrument(_, name, category, fun) do
instrument(name, category, fun)
end
@spec instrument_root(String.t(), String.t(), function()) :: any()
@doc false
def instrument_root(namespace, name, fun) do
span = @tracer.create_span(namespace, nil)
span
|> @span.set_name(name)
|> @span.set_attribute("appsignal:category", name)
result = fun.()
@tracer.close_span(span)
result
end
@spec set_error(Exception.t(), Exception.stacktrace()) :: Appsignal.Span.t() | nil
@doc """
Set an error in the current root span.
"""
def set_error(%_{__exception__: true} = exception, stacktrace) do
@span.add_error(@tracer.root_span(), exception, stacktrace)
end
@spec set_error(Exception.kind(), any(), Exception.stacktrace()) :: Appsignal.Span.t() | nil
@doc """
Set an error in the current root span by passing a `kind` and `reason`.
"""
def set_error(kind, reason, stacktrace) do
@span.add_error(@tracer.root_span(), kind, reason, stacktrace)
end
@spec send_error(Exception.t(), Exception.stacktrace()) :: Appsignal.Span.t() | nil
@doc """
Send an error in a newly created `Appsignal.Span`.
"""
def send_error(%_{__exception__: true} = exception, stacktrace) do
send_error(exception, stacktrace, & &1)
end
@spec send_error(Exception.t(), Exception.stacktrace(), function()) :: Appsignal.Span.t() | nil
@doc """
Send an error in a newly created `Appsignal.Span`. Calls the passed function
with the created `Appsignal.Span` before closing it.
"""
def send_error(%_{__exception__: true} = exception, stacktrace, fun) when is_function(fun) do
@span.create_root("http_request", self())
|> @span.add_error(exception, stacktrace)
|> fun.()
|> @span.close()
end
@spec send_error(Exception.kind(), any(), Exception.stacktrace()) :: Appsignal.Span.t() | nil
def send_error(kind, reason, stacktrace) do
send_error(kind, reason, stacktrace, & &1)
end
def send_error(kind, reason, stacktrace, fun) do
@span.create_root("http_request", self())
|> @span.add_error(kind, reason, stacktrace)
|> fun.()
|> @span.close()
end
defp call_with_optional_argument(fun, _argument) when is_function(fun, 0), do: fun.()
defp call_with_optional_argument(fun, argument) when is_function(fun, 1), do: fun.(argument)
end