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

# Instrumenter les requêtes Ecto

export const Compatibility = ({versions = [], label = "Available in"}) => {
  if (!Array.isArray(versions) || versions.length === 0) {
    return null;
  }
  const defaultPillStyle = {
    borderColor: "#d4d4d8",
    background: "#f4f4f5",
    color: "#3f3f46"
  };
  const pillStyles = {
    "AppSignal for Elixir": {
      background: "#f3e8ff",
      borderColor: "#d8b4fe",
      color: "#6b21a8"
    },
    "AppSignal for Front-end": {
      background: "#fef9c3",
      borderColor: "#fde047",
      color: "#854d0e"
    },
    "AppSignal for Go": {
      background: "#ccfbf1",
      borderColor: "#5eead4",
      color: "#115e59"
    },
    "AppSignal for JavaScript": {
      background: "#fef9c3",
      borderColor: "#fde047",
      color: "#854d0e"
    },
    "AppSignal for Node.js": {
      background: "#dcfce7",
      borderColor: "#86efac",
      color: "#166534"
    },
    "AppSignal for Python": {
      background: "#dbeafe",
      borderColor: "#93c5fd",
      color: "#1e40af"
    },
    "AppSignal for Ruby": {
      background: "#fee2e2",
      borderColor: "#fca5a5",
      color: "#991b1b"
    },
    "AppSignal for Rust": {
      background: "#ffedd5",
      borderColor: "#fdba74",
      color: "#9a3412"
    }
  };
  const getPillStyle = name => ({
    ...defaultPillStyle,
    ...pillStyles[name] || ({})
  });
  return <div className="not-prose my-4 rounded-lg border border-zinc-200 bg-zinc-50 px-4 py-3 text-sm dark:border-white/10 dark:bg-white/5">
      <div className="flex flex-wrap items-center gap-x-2 gap-y-1">
        <span className="font-semibold text-zinc-700 dark:text-zinc-200">
          {label}:
        </span>
        {versions.map((v, i) => <span key={`${v.name}-${v.version}-${i}`} className="inline-flex items-center gap-1 rounded-full border px-2 py-0.5 text-xs font-medium" style={getPillStyle(v.name)}>
            <span>{v.name}</span>
            <span className="opacity-70">
              {v.version}
              {v.exact ? "" : "+"}
            </span>
          </span>)}
      </div>
    </div>;
};

AppSignal utilise l'instrumentation Telemetry d'Ecto pour obtenir des informations sur les requêtes exécutées dans votre application en attachant un handler appelé chaque fois qu'une requête est exécutée.

## Instrumentation automatique

L'instrumentation Ecto s'accroche automatiquement à vos repos Ecto si la configuration `:otp_app` est définie sur le nom de l'app OTP de votre application. L'installeur configure cela automatiquement pour vous.

<CodeGroup>
  ```elixir Elixir theme={null}
  config :appsignal, :config,
    otp_app: :my_app, # Set this to the name of your OTP app
    name: "My app",
    push_api_key: "your-api-key",
    env: Mix.env
  ```
</CodeGroup>

L'intégration utilise ensuite la configuration de votre application pour savoir quels repos sont configurés, car votre application aura une ligne de configuration comme celle-ci dans `config/config.exs` :

<CodeGroup>
  ```elixir Elixir theme={null}
  config :my_app,
    ecto_repos: [AppsignalPhoenixExample.Repo]
  ```
</CodeGroup>

### Désactiver l'instrumentation automatique

<Compatibility versions={[{ name: "AppSignal for Elixir", version: "2.5.1" }]} />

Pour désactiver l'instrumentation Ecto automatique, définissez [l'option de configuration `instrument_ecto`](/elixir/configuration/options#option-instrument_ecto) sur `false`.

## Instrumenter les preloads Ecto

<Compatibility versions={[{ name: "AppSignal for Elixir", version: "2.8.2" }]} />

Comme les requêtes de preload Ecto utilisent en interne plusieurs processus Elixir pour effectuer les différentes requêtes de base de données impliquées, certaines modifications manuelles de votre base de code sont nécessaires pour qu'AppSignal puisse les instrumenter correctement.

En haut du module de votre repo Ecto, remplacez `use Ecto.Repo` par `use Appsignal.Ecto.Repo`, comme dans l'exemple suivant :

<CodeGroup>
  ```elixir Elixir theme={null}
  defmodule MyApp.Repo do
    # replace `use Ecto.Repo` with `use Appsignal.Ecto.Repo`
    use Appsignal.Ecto.Repo,
      otp_app: :my_app,
      adapter: Ecto.Adapters.Postgres
  end
  ```
</CodeGroup>

Si le module de votre repo Ecto a sa propre implémentation de la fonction `default_options/1`, veillez à appeler `super` à l'intérieur pour fusionner ses options par défaut avec celles de l'instrumentation du repo Ecto d'AppSignal :

<CodeGroup>
  ```elixir Elixir theme={null}
  defmodule MyApp.Repo do
    use Appsignal.Ecto.Repo, ...

    def default_options(operation) do
      super(operation) ++ [
        # ... your default options here ...
      ]
    end
  end
  ```
</CodeGroup>

## Attachement manuel du handler

Pour les repos qui ne sont pas listés dans la configuration `:ecto_repos`, vous pouvez attacher un handler manuellement lors du démarrage du superviseur de votre application. Dans la plupart des applications, cela se fait dans la fonction `start/2` de votre application.

<CodeGroup>
  ```elixir Elixir theme={null}
  def start(_type, _args) do
    children = [
      AppsignalPhoenixExample.Repo,
      AppsignalPhoenixExampleWeb.Endpoint
    ]

    Appsignal.Ecto.attach(:my_otp_app, MyApp.Repo)

    opts = [strategy: :one_for_one, name: AppsignalPhoenixExample.Supervisor]
    Supervisor.start_link(children, opts)
  end
  ```
</CodeGroup>

Dans cet exemple, nous avons attaché le handler Telemetry à notre application Phoenix en appelant `Appsignal.Ecto.attach/2`. Le premier argument est le nom de l'app OTP à laquelle appartient le repo, et le second argument est le module du repo.

## Métriques

<Compatibility versions={[{ name: "AppSignal for Elixir", version: "2.17.2" }]} />

En plus d'instrumenter vos requêtes Ecto, AppSignal pour Elixir collecte
des métriques sur les performances de vos repos Ecto :

* `ecto_query_time` : Le temps que la base de données passe à exécuter chaque requête, tagué
  par `repo` et `hostname`, et pour chaque table par `repo` et `source`.

* `ecto_queue_time` : Le temps passé à attendre une connexion à la base de données depuis
  le pool, tagué par `repo` et `hostname`.

* `ecto_decode_time` : Le temps passé à décoder les résultats des requêtes en termes Elixir,
  tagué par `repo` et `hostname`, et pour chaque table par `repo` et `source`.

* `ecto_idle_time` : Le temps pendant lequel la connexion est restée inactive dans le pool avant d'être
  utilisée, tagué par `repo` et `hostname`.

* `ecto_total_time` : La somme du temps de queue, de query et de decode, taguée par `repo`
  et `hostname`, et pour chaque table par `repo` et `source`.

AppSignal utilise ces métriques pour créer le Magic Dashboard Ecto, qui
montre des informations clés sur les performances de vos repos Ecto :

<Frame caption="Le Magic Dashboard Ecto dans AppSignal">
  <img src="https://mintcdn.com/appsignal-715f5a51/nF8c1Rwq1cS7b5hg/assets/images/screenshots/elixir/integrations/ecto/automated-dashboard.png?fit=max&auto=format&n=nF8c1Rwq1cS7b5hg&q=85&s=a53723c44b296164b7ad992951faa48d" alt="Magic Dashboard affichant les principales métriques Ecto" width="2382" height="1698" data-path="assets/images/screenshots/elixir/integrations/ecto/automated-dashboard.png" />
</Frame>
