> ## Documentation Index
> Fetch the complete documentation index at: https://docs.appsignal.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Integrando o AppSignal ao Plug

<Tip>
  **Nota**: O suporte para namespaces personalizados foi adicionado na versão 1.3.0 do
  pacote AppSignal for Elixir.
</Tip>

O pacote AppSignal for Elixir se integra ao Plug. Para configurar a
integração, siga nosso [guia de instalação](/elixir/installation).

Esta página descreve como configurar o AppSignal em uma aplicação Plug e como
adicionar instrumentação para eventos dentro das requisições. Para mais informações sobre
instrumentação personalizada, leia a documentação de [instrumentação
Elixir](/elixir/instrumentation).

Mais informações podem ser encontradas na [documentação do pacote Hex do
AppSignal][hex-appsignal].

## Instalação

A instrumentação do AppSignal para Plug faz parte de um pacote separado, que depende do pacote `appsignal` principal. Adicione o pacote `appsignal_plug` ao seu arquivo `mix.exs`.

<CodeGroup>
  ```elixir Elixir theme={null}
  # mix.exs
  defmodule AppsignalPlugExample.MixProject do
    # ...

    defp deps do
      [
        {:plug, "~> 1.0"}, # Ou plug_cowboy ~> 2.0
        {:appsignal_plug, "~> 2.0"}
        # ...
      ]
    end
  end
  ```
</CodeGroup>

Se você já usa nosso pacote `appsignal_phoenix`, não é necessário adicionar o pacote `appsignal_plug`, pois ele já é uma dependência do pacote `appsignal_phoenix`. Veja também nosso [guia de integração com Phoenix](/elixir/installation/umbrella#phoenix).

## Requisições HTTP de entrada

Vamos começar com um pequeno app Plug que aceita requisições `GET` em `/` e
retorna uma mensagem de boas-vindas. Para começar a registrar requisições HTTP neste app, usaremos
o módulo `Appsignal.Plug`.

<CodeGroup>
  ```elixir Elixir theme={null}
  defmodule AppsignalPlugExample do
    use Plug.Router
    use Appsignal.Plug # <- Adicione isto

    plug :match
    plug :dispatch

    get "/" do
      send_resp(conn, 200, "Welcome")
    end
  end
  ```
</CodeGroup>

Isso criará uma transação para cada requisição HTTP que for realizada no
endpoint.

## Instrumentação personalizada

Embora `Appsignal.Plug` inicie transações para você, ele ainda não instrumenta
eventos no seu app. Para isso, precisamos adicionar alguma instrumentação
personalizada.

Este exemplo de app parece com o que usamos antes, mas tem uma função lenta
(apropriadamente chamada `slow/0`) para a qual gostaríamos de adicionar instrumentação. Para isso, precisamos
usar o helper `Appsignal.instrument/2-3` na nossa função chamada:

<CodeGroup>
  ```elixir Elixir theme={null}
  defmodule AppsignalPlugExample do
    use Plug.Router

    plug :match
    plug :dispatch

    get "/" do
      slow()
      send_resp(conn, 200, "Welcome")
    end

    defp slow do
      Appsignal.instrument("slow", fn ->
        :timer.sleep(1000)
      end)
    end

    use Appsignal.Plug
  end
  ```
</CodeGroup>

Isso adicionará um evento para a função `slow/0` à transação atual
sempre que ela for chamada. Para mais informações sobre instrumentação personalizada, leia
a documentação de [instrumentação Elixir](/elixir/instrumentation).

## 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.

### Instrumentação de Plugs com decorators

Para adicionar instrumentação a Plugs, use a função `Appsignal.instrument/2`:

<CodeGroup>
  ```elixir Elixir theme={null}
  defmodule SlowPlugWithDecorators do
    import Plug.Conn

    def init(opts), do: opts

    def call(conn, _) do
      Appsignal.instrument("SlowPlugWithDecorators", fn ->
        :timer.sleep(1000)
        conn
      end)
    end
  end
  ```
</CodeGroup>

[hex-appsignal]: https://hexdocs.pm/appsignal/
