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

# Intégrer AppSignal dans Plug

<Tip>
  **Remarque** : La prise en charge des namespaces personnalisés a été ajoutée dans la version 1.3.0 du
  paquet AppSignal pour Elixir.
</Tip>

Le paquet AppSignal pour Elixir s'intègre à Plug. Pour mettre en place
l'intégration, veuillez suivre notre [guide d'installation](/elixir/installation).

Cette page décrit comment configurer AppSignal dans une application Plug, et comment
ajouter de l'instrumentation pour les événements à l'intérieur des requêtes. Pour plus d'informations sur
l'instrumentation personnalisée, lisez la documentation sur l'[instrumentation
Elixir](/elixir/instrumentation).

Vous trouverez plus d'informations dans la [documentation du paquet Hex
AppSignal][hex-appsignal].

## Installation

L'instrumentation AppSignal pour Plug fait partie d'un paquet séparé, qui dépend du paquet principal `appsignal`. Ajoutez le paquet `appsignal_plug` à votre fichier `mix.exs`.

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

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

Si vous utilisez déjà notre paquet `appsignal_phoenix`, il n'est pas nécessaire d'ajouter le paquet `appsignal_plug` car il est déjà une dépendance du paquet `appsignal_phoenix`. Voir également notre [guide d'intégration Phoenix](/elixir/installation/umbrella#phoenix).

## Requêtes HTTP entrantes

Nous commencerons avec une petite application Plug qui accepte les requêtes `GET` sur `/` et
renvoie un message de bienvenue. Pour commencer à journaliser les requêtes HTTP dans cette application, nous
utiliserons le module `Appsignal.Plug`.

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

    plug :match
    plug :dispatch

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

Cela créera une transaction pour chaque requête HTTP effectuée sur le
endpoint.

## Instrumentation personnalisée

Bien que `Appsignal.Plug` démarrera des transactions pour vous, il n'instrumentera pas
encore les événements dans votre application. Pour ce faire, nous devons ajouter de l'instrumentation
personnalisée.

Cette application d'exemple ressemble à celle utilisée précédemment, mais elle a une fonction lente
(nommée `slow/0`) pour laquelle nous souhaitons ajouter de l'instrumentation. Pour ce faire, nous devons
utiliser le helper `Appsignal.instrument/2-3` dans notre fonction appelée :

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

Cela ajoutera un événement pour la fonction `slow/0` à la transaction courante
chaque fois qu'elle est appelée. Pour plus d'informations sur l'instrumentation personnalisée, lisez
la documentation sur l'[instrumentation Elixir](/elixir/instrumentation).

## Instrumentation pour les Plugs inclus

Les exceptions dans les Plugs inclus sont automatiquement attrapées par AppSignal, mais
les échantillons de performance doivent être configurés manuellement en utilisant les helpers
d'instrumentation personnalisés ou les décorateurs.

### Instrumentation de Plug avec des décorateurs

Pour ajouter de l'instrumentation aux Plugs, utilisez la fonction `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/
