O pacote AppSignal for Elixir se integra ao Phoenix. Para configurar a
integração, siga nosso guia de instalação.
Esta página descreverá outras maneiras de configurar o AppSignal para o framework
Phoenix. Para adicionar mais instrumentação personalizada à sua aplicação
Phoenix, leia a documentação de instrumentação
Elixir.
Mais informações podem ser encontradas na documentação do pacote Hex do
AppSignal.
Instalação
- A instrumentação do AppSignal para Phoenix faz parte de um
pacote separado, que depende do pacote
appsignal principal. Adicione o pacote appsignal_phoenix ao seu arquivo mix.exs.
# mix.exs
defmodule AppsignalPhoenixExample.MixProject do
# ...
defp deps do
[
{:phoenix, "~> 1.5.3"},
{:appsignal_phoenix, "~> 2.0"}
# ...
]
end
end
- Em seguida, execute
mix deps.get.
- Em seguida, execute
mix appsignal.install YOUR_PUSH_API_KEY.
Após a instalação e configuração, o pacote AppSignal for Phoenix começa automaticamente a instrumentar requisições HTTP, ou seja, nenhuma configuração adicional é necessária.
Para obter insights mais profundos, o AppSignal pode ser configurado para instrumentar channels e live views.
Channels
Requisições de channel recebidas podem ser instrumentadas envolvendo o código nas suas
funções handle_in/3 com Appsignal.Phoenix.Channel.instrument/5:
defmodule AppsignalPhoenixExampleWeb.RoomChannel do
use Phoenix.Channel
# ...
def handle_in("new_msg", %{"body" => body} = params, socket) do
Appsignal.Phoenix.Channel.instrument(__MODULE__, "new_msg", params, socket, fn ->
broadcast!(socket, "new_msg", %{body: body})
{:noreply, socket}
end)
end
end
Como alternativa, você pode usar function decorators para instrumentar channels. Embora
sejam menos flexíveis do que a função de instrumentação, os decorators minimizam a quantidade
de código que você precisa adicionar aos channels da sua aplicação.
defmodule SomeApp.MyChannel do
use Appsignal.Instrumentation.Decorators
@decorate channel_action()
def handle_in("ping", _payload, socket) do
# seu código aqui..
end
end
Eventos de channels serão exibidos na aba “Background jobs”, mostrando o
módulo do channel e o argumento de ação que você inseriu.
LiveView
Existem duas maneiras diferentes de instrumentar live views. Você pode usar nossos
handlers automáticos de telemetria ou instrumentar manualmente seus
handlers de live view com nossas funções helper.
Handlers automáticos de telemetria
Nota: A integração LiveView Telemetry está disponível a partir do AppSignal for
Phoenix versão 2.1.0.
A integração LiveView Telemetry do AppSignal instrumenta automaticamente os eventos de live view.
Para configurá-la, chame Appsignal.Phoenix.LiveView.attach/0 para anexar os handlers do LiveView Telemetry.
Recomendamos chamar esta função no application.ex do seu app:
defmodule AppsignalPhoenixExample.Application do
# ...
def start(_type, _args) do
Appsignal.Phoenix.LiveView.attach() # <--- anexa os handlers do LiveView Telemetry
children = [
# Inicia o repositório Ecto
AppsignalPhoenixExample.Repo,
# Inicia o supervisor de Telemetry
AppsignalPhoenixExampleWeb.Telemetry,
# Inicia o sistema PubSub
{Phoenix.PubSub, name: AppsignalPhoenixExample.PubSub},
# Inicia o Endpoint (http/https)
AppsignalPhoenixExampleWeb.Endpoint
# Inicia um worker chamando: AppsignalPhoenixExample.Worker.start_link(arg)
# {AppsignalPhoenixExample.Worker, arg}
]
# Veja https://hexdocs.pm/elixir/Supervisor.html
# para outras estratégias e opções suportadas
opts = [strategy: :one_for_one, name: AppsignalPhoenixExample.Supervisor]
Supervisor.start_link(children, opts)
end
end
O AppSignal agora instrumentará automaticamente todos os eventos mount, handle_event e handle_param no namespace live_view, o que significa que você receberá insights tanto de desempenho quanto de erros nas suas live views.
Funções helper manuais
Se você já configurou a instrumentação automática por telemetria acima,
não precisa instrumentar manualmente os handlers de live view.
Nota: As funções helper de LiveView estão disponíveis a partir do AppSignal for
Elixir versão 1.13.0.
Uma ação de LiveView também pode ser instrumentada manualmente envolvendo seu conteúdo em um
bloco Appsignal.Phoenix.LiveView.instrument/4.
Dada uma live view que atualiza seu próprio estado a cada segundo, podemos adicionar
instrumentação AppSignal envolvendo tanto as funções mount/2 quanto handle_info/2
com uma chamada a Appsignal.Phoenix.LiveView.instrument/4:
defmodule AppsignalPhoenixExampleWeb.ClockLive do
use Phoenix.LiveView
import Appsignal.Phoenix.LiveView, only: [instrument: 4]
def render(assigns) do
AppsignalPhoenixExampleWeb.ClockView.render("index.html", assigns)
end
def mount(_session, socket) do
# Envolva o conteúdo da função mount/2 com uma chamada a
# Appsignal.Phoenix.LiveView.instrument/4
instrument(__MODULE__, "mount", socket, fn ->
:timer.send_interval(1000, self(), :tick)
{:ok, assign(socket, state: Time.utc_now())}
end)
end
def handle_info(:tick, socket) do
# Envolva o conteúdo da função handle_info/2 com uma chamada a
# Appsignal.Phoenix.LiveView.instrument/4:
instrument(__MODULE__, "tick", socket, fn ->
{:ok, assign(socket, state: Time.utc_now())}
end)
end
end
Chamar uma dessas funções no seu app agora criará automaticamente uma
amostra que é enviada ao AppSignal. Essas amostras são exibidas no namespace
:live_view.
Instrumentação de Plugs incluídos
Exceções em Plugs incluídos são automaticamente capturadas pelo AppSignal, mas
as amostras de desempenho precisam ser configuradas manualmente usando os helpers de
instrumentação personalizada ou decorators. Veja a documentação do
Plug
para mais informações.
Instrumentação personalizada
Adicione instrumentação personalizada para
acompanhar código mais complexo e obter breakdowns mais completos de requisições lentas.