> ## 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-Abfragen instrumentieren

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 nutzt die Telemetry-Instrumentierung von Ecto, um Informationen über in Ihrer App ausgeführte Abfragen zu erhalten, indem ein Handler angehängt wird, der bei jeder Ausführung einer Abfrage aufgerufen wird.

## Automatische Instrumentierung

Die Ecto-Instrumentierung hakt sich automatisch in Ihre Ecto-Repos ein, wenn die Konfiguration `:otp_app` auf den OTP-App-Namen Ihrer App gesetzt ist. Der Installer konfiguriert dies automatisch für Sie.

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

Die Integration verwendet dann die Konfiguration Ihrer App, um herauszufinden, welche Repos konfiguriert sind, da Ihre App eine Konfigurationszeile wie diese in `config/config.exs` haben wird:

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

### Automatische Instrumentierung deaktivieren

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

Um die automatische Ecto-Instrumentierung zu deaktivieren, setzen Sie [die Konfigurationsoption `instrument_ecto`](/elixir/configuration/options#option-instrument_ecto) auf `false`.

## Ecto-Preloads instrumentieren

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

Da Ecto-Preload-Abfragen intern mehrere Elixir-Prozesse verwenden, um die verschiedenen beteiligten Datenbankabfragen durchzuführen, sind einige manuelle Änderungen an Ihrer Codebasis erforderlich, damit AppSignal sie korrekt instrumentieren kann.

Ersetzen Sie am Anfang Ihres Ecto-Repo-Moduls `use Ecto.Repo` durch `use Appsignal.Ecto.Repo`, wie im folgenden Beispiel:

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

Wenn Ihr Ecto-Repo-Modul eine eigene Implementierung der Funktion `default_options/1` hat, stellen Sie sicher, dass Sie `super` darin aufrufen, um ihre Standardoptionen mit denen der Ecto-Repo-Instrumentierung von AppSignal zu kombinieren:

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

## Manuelles Anhängen des Handlers

Für Repos, die nicht in der Konfiguration `:ecto_repos` aufgeführt sind, können Sie einen Handler manuell anhängen, wenn Sie den Supervisor Ihrer App starten. In den meisten Anwendungen erfolgt dies in der `start/2`-Funktion Ihrer Anwendung.

<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 diesem Beispiel haben wir den Telemetry-Handler an unsere Phoenix-Anwendung angehängt, indem wir `Appsignal.Ecto.attach/2` aufgerufen haben. Das erste Argument ist der Name der OTP-App, zu der das Repo gehört, und das zweite Argument ist das Modul des Repos.

## Metriken

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

Zusätzlich zur Instrumentierung Ihrer Ecto-Abfragen sammelt AppSignal für Elixir
Metriken zur Performance Ihrer Ecto-Repos:

* `ecto_query_time`: Die Zeit, die die Datenbank für die Ausführung jeder Abfrage benötigt, getaggt
  nach `repo` und `hostname`, und für jede Tabelle nach `repo` und `source`.

* `ecto_queue_time`: Die Zeit, die mit dem Warten auf eine Datenbankverbindung aus dem
  Pool verbracht wird, getaggt nach `repo` und `hostname`.

* `ecto_decode_time`: Die Zeit, die mit dem Dekodieren von Abfrageergebnissen in Elixir-Terme verbracht wird,
  getaggt nach `repo` und `hostname`, und für jede Tabelle nach `repo` und `source`.

* `ecto_idle_time`: Die Zeit, die die Verbindung im Pool im Leerlauf war, bevor sie
  ausgecheckt wurde, getaggt nach `repo` und `hostname`.

* `ecto_total_time`: Die Summe aus Queue-, Query- und Decode-Zeit, getaggt nach `repo`
  und `hostname`, und für jede Tabelle nach `repo` und `source`.

AppSignal verwendet diese Metriken, um das Ecto-Magic-Dashboard zu erstellen, das
wichtige Einblicke in die Performance Ihrer Ecto-Repos zeigt:

<Frame caption="Das 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 mit wichtigen Ecto-Metriken" width="2382" height="1698" data-path="assets/images/screenshots/elixir/integrations/ecto/automated-dashboard.png" />
</Frame>
