Zum Hauptinhalt springen
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.
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
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:
config :my_app,
  ecto_repos: [AppsignalPhoenixExample.Repo]

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:
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
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:
defmodule MyApp.Repo do
  use Appsignal.Ecto.Repo, ...

  def default_options(operation) do
    super(operation) ++ [
      # ... your default options here ...
    ]
  end
end

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