Pular para o conteúdo principal
O AppSignal usa a instrumentação Telemetry do Ecto para obter informações sobre queries executadas no seu app, anexando um handler que é chamado sempre que uma query é executada.

Instrumentação automática

A instrumentação Ecto se conecta automaticamente aos seus repos Ecto se a configuração :otp_app estiver definida como o nome do OTP app da sua aplicação. O instalador configura isso automaticamente para você.
config :appsignal, :config,
  otp_app: :my_app, # Defina isto com o nome do seu OTP app
  name: "My app",
  push_api_key: "your-api-key",
  env: Mix.env
A integração então usa a configuração do seu app para descobrir quais repos estão configurados, pois seu app terá uma linha de configuração como esta em config/config.exs:
config :my_app,
  ecto_repos: [AppsignalPhoenixExample.Repo]

Desabilitar a instrumentação automática

Para desabilitar a instrumentação automática do Ecto, defina a opção de configuração instrument_ecto como false.

Instrumentando preloads do Ecto

Como queries de preload do Ecto usam internamente vários processos Elixir para executar as diferentes consultas ao banco de dados envolvidas, algumas alterações manuais no seu código são necessárias para que o AppSignal as instrumente corretamente. No topo do seu módulo de repo Ecto, substitua use Ecto.Repo por use Appsignal.Ecto.Repo, como no exemplo a seguir:
defmodule MyApp.Repo do
  # substitua `use Ecto.Repo` por `use Appsignal.Ecto.Repo`
  use Appsignal.Ecto.Repo,
    otp_app: :my_app,
    adapter: Ecto.Adapters.Postgres
end
Se o seu módulo de repo Ecto tiver sua própria implementação da função default_options/1, certifique-se de chamar super dentro dela para mesclar suas opções padrão com as da instrumentação de repo Ecto do AppSignal:
defmodule MyApp.Repo do
  use Appsignal.Ecto.Repo, ...

  def default_options(operation) do
    super(operation) ++ [
      # ... suas opções padrão aqui ...
    ]
  end
end

Anexação manual do handler

Para repos que não estão listados na configuração :ecto_repos, você pode anexar um handler manualmente ao iniciar o supervisor do seu app. Na maioria das aplicações, isso é feito na função start/2 da sua aplicação.
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
Neste exemplo, anexamos o handler de Telemetry à nossa aplicação Phoenix chamando Appsignal.Ecto.attach/2. O primeiro argumento é o nome do OTP app ao qual o repo pertence, e o segundo argumento é o módulo do repo.

Métricas

Além de instrumentar suas queries Ecto, o AppSignal for Elixir coleta métricas sobre o desempenho dos seus repos Ecto:
  • ecto_query_time: O tempo que o banco de dados gasta executando cada query, tagueado por repo e hostname, e para cada tabela por repo e source.
  • ecto_queue_time: O tempo gasto esperando por uma conexão de banco de dados do pool, tagueado por repo e hostname.
  • ecto_decode_time: O tempo gasto decodificando os resultados da query em termos Elixir, tagueado por repo e hostname, e para cada tabela por repo e source.
  • ecto_idle_time: O tempo que a conexão ficou ociosa no pool antes de ser retirada, tagueado por repo e hostname.
  • ecto_total_time: A soma de queue, query e decode time, tagueado por repo e hostname, e para cada tabela por repo e source.
O AppSignal usa essas métricas para criar o magic dashboard do Ecto, que mostra insights-chave sobre o desempenho dos seus repos Ecto:
Magic dashboard mostrando métricas-chave do Ecto