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

# Ecto-queries instrumenteren

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 gebruikt de Telemetry-instrumentatie van Ecto om informatie te verkrijgen over queries die in uw app worden uitgevoerd, door een handler te koppelen die wordt aangeroepen telkens wanneer een query wordt uitgevoerd.

## Automatische instrumentatie

De Ecto-instrumentatie haakt automatisch in op uw Ecto-repo's als de configuratie `:otp_app` is ingesteld op de OTP-naam van uw app. De installer configureert dit automatisch voor u.

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

De integratie gebruikt vervolgens de configuratie van uw app om uit te zoeken welke repo's zijn geconfigureerd, aangezien uw app een configuratieregel zoals deze in `config/config.exs` heeft:

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

### Automatische instrumentatie uitschakelen

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

Om automatische Ecto-instrumentatie uit te schakelen, stelt u [de configuratieoptie `instrument_ecto`](/elixir/configuration/options#option-instrument_ecto) in op `false`.

## Ecto-preloads instrumenteren

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

Aangezien Ecto-preload-queries intern verschillende Elixir-processen gebruiken om de betrokken databasequeries uit te voeren, zijn enkele handmatige wijzigingen in uw codebase nodig om AppSignal ze correct te laten instrumenteren.

Vervang bovenaan uw Ecto-repo-module `use Ecto.Repo` door `use Appsignal.Ecto.Repo`, zoals in het volgende voorbeeld:

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

Als uw Ecto-repo-module zijn eigen implementatie van de functie `default_options/1` heeft, zorg er dan voor dat u `super` daarin aanroept om de standaardopties ervan samen te voegen met die van AppSignal's Ecto-repo-instrumentatie:

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

## Handmatige handler-koppeling

Voor repo's die niet in de `:ecto_repos`-configuratie staan, kunt u een handler handmatig koppelen bij het starten van de supervisor van uw app. In de meeste applicaties wordt dit gedaan in de `start/2`-functie van uw applicatie.

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

In dit voorbeeld hebben we de Telemetry-handler aan onze Phoenix-applicatie gekoppeld door `Appsignal.Ecto.attach/2` aan te roepen. Het eerste argument is de naam van de OTP-app waartoe de repo behoort, en het tweede argument is de module van de repo.

## Metrics

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

Naast het instrumenteren van uw Ecto-queries verzamelt AppSignal voor Elixir
metrics over de performance van uw Ecto-repo's:

* `ecto_query_time`: De tijd die de database besteedt aan het uitvoeren van elke query, getagd
  met `repo` en `hostname`, en voor elke tabel met `repo` en `source`.

* `ecto_queue_time`: De tijd besteed aan het wachten op een databaseverbinding uit de
  pool, getagd met `repo` en `hostname`.

* `ecto_decode_time`: De tijd besteed aan het decoderen van query-resultaten naar Elixir-termen,
  getagd met `repo` en `hostname`, en voor elke tabel met `repo` en `source`.

* `ecto_idle_time`: De tijd dat de verbinding inactief was in de pool voordat deze werd
  opgehaald, getagd met `repo` en `hostname`.

* `ecto_total_time`: De som van queue-, query- en decodeertijd, getagd met `repo`
  en `hostname`, en voor elke tabel met `repo` en `source`.

AppSignal gebruikt deze metrics om het Ecto magic dashboard te maken, dat
belangrijke inzichten toont in de performance van uw Ecto-repo's:

<Frame caption="Het Ecto magic dashboard in 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 met belangrijke Ecto-metrics" width="2382" height="1698" data-path="assets/images/screenshots/elixir/integrations/ecto/automated-dashboard.png" />
</Frame>
