Skip to main content
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.
Ecto-Abfrageereignisse werden an die aktuelle AppSignal-Transaktion angehängt. Phoenix- und Plug-Anwendungen starten diese Transaktion automatisch für jede Anfrage. In reinen Elixir-Projekten wird keine Transaktion für Sie gestartet, sodass Abfrageereignisse erst gemeldet werden, sobald Sie selbst eine starten. Siehe Neue Transaktionen starten.

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

Automatische Instrumentierung deaktivieren

Um die automatische Ecto-Instrumentierung zu deaktivieren, setzen Sie die Konfigurationsoption instrument_ecto auf false.

Ecto-Preloads instrumentieren

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

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

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 Intelligence dashboard zu erstellen, das wichtige Einblicke in die Performance Ihrer Ecto-Repos zeigt:
Intelligence dashboard mit wichtigen Ecto-Metriken

Das Ecto Intelligence dashboard in AppSignal