Passer au contenu principal
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.
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
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 :
config :my_app,
  ecto_repos: [AppsignalPhoenixExample.Repo]

Désactiver l’instrumentation automatique

Pour désactiver l’instrumentation Ecto automatique, définissez l’option de configuration instrument_ecto sur false.

Instrumenter les preloads Ecto

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

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

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

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 :
Magic Dashboard affichant les principales métriques Ecto