Packages
appsignal
1.11.1
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/phoenix/channel.ex
if Appsignal.phoenix?() do
defmodule Appsignal.Phoenix.Channel do
@transaction Application.get_env(:appsignal, :appsignal_transaction, Appsignal.Transaction)
@moduledoc """
Instrumentation for channel events
## Instrumenting a channel's `handle_in/3`
Currently, incoming channel requests can be instrumented, by adding
code to the `handle_in` function of your application. We use
[function decorators](https://github.com/arjan/decorator) to
minimize the amount of code you have to add to your channel.
defmodule SomeApp.MyChannel do
use Appsignal.Instrumentation.Decorators
@decorate channel_action
def handle_in("ping", _payload, socket) do
# your code here..
end
end
Channel events will be displayed under the "Background jobs" tab,
showing the channel module and the action argument that you entered.
### Adding channel payloads
Channel payloads aren't included by default, but can be added by using
`Appsignal.Transaction.set_sample_data/2` using the "params" key:
defmodule SomeApp.MyChannel do
use Appsignal.Instrumentation.Decorators
@decorate channel_action
def handle_in("ping", payload, socket) do
Appsignal.Transaction.set_sample_data(
"params", Appsignal.Utils.MapFilter.filter_parameters(payload)
)
# your code here..
end
end
## Instrumenting without decorators
You can also decide not to use function decorators. In that case,
use the `channel_action/4` function directly, passing in a name for
the channel action, the socket and the actual code that you are
executing in the channel handler:
defmodule SomeApp.MyChannel do
import Appsignal.Phoenix.Channel, only: [channel_action: 4]
def handle_in("ping" = action, _payload, socket) do
channel_action(__MODULE__, action, socket, fn ->
# do some heave processing here...
reply = perform_work()
{:reply, {:ok, reply}, socket}
end)
end
end
### Adding channel payloads
To add channel payloads, use `channel_action/5`:
defmodule SomeApp.MyChannel do
import Appsignal.Phoenix.Channel, only: [channel_action: 5]
def handle_in("ping" = action, payload, socket) do
channel_action(__MODULE__, action, socket, payload, fn ->
# do some heave processing here...
reply = perform_work()
{:reply, {:ok, reply}, socket}
end)
end
end
"""
@doc """
Record a channel action. Meant to be called from the 'channel_action' instrumentation decorator.
"""
@spec channel_action(atom, String.t(), Phoenix.Socket.t(), fun) :: any
def channel_action(module, name, %Phoenix.Socket{} = socket, function) do
channel_action(module, name, %Phoenix.Socket{} = socket, %{}, function)
end
@spec channel_action(atom, String.t(), Phoenix.Socket.t(), map, fun) :: any
def channel_action(module, name, %Phoenix.Socket{} = socket, params, function) do
transaction = @transaction.start(@transaction.generate_id(), :channel)
action_str = "#{module}##{name}"
<<"Elixir.", action::binary>> = action_str
@transaction.set_action(transaction, action)
result = function.()
resp = @transaction.finish(transaction)
if resp == :sample do
transaction
|> @transaction.set_sample_data(
"params",
Appsignal.Utils.MapFilter.filter_parameters(params)
)
|> @transaction.set_sample_data(
"environment",
request_environment(socket)
)
end
@transaction.complete(transaction)
result
end
@doc """
Given the `Appsignal.Transaction` and a `Phoenix.Socket`, add the
socket metadata to the transaction.
"""
@spec set_metadata(Appsignal.Transaction.t(), Phoenix.Socket.t()) :: Appsignal.Transaction.t()
def set_metadata(transaction, socket) do
IO.warn(
"Appsignal.Channel.set_metadata/1 is deprecated. Set params and environment data directly with Appsignal.Transaction.set_sample_data/2 instead."
)
transaction
|> @transaction.set_sample_data(
"params",
Appsignal.Utils.MapFilter.filter_parameters(socket.assigns)
)
|> @transaction.set_sample_data("environment", request_environment(socket))
end
@socket_fields ~w(id channel endpoint handler ref topic transport)a
@spec request_environment(Phoenix.Socket.t()) :: map
defp request_environment(socket) do
@socket_fields
|> Enum.into(%{}, fn k -> {k, Map.get(socket, k)} end)
end
end
end