Tools for integrating Ecto with Spandex.
Due to some recent changes in Ecto, we can no longer effectively trace the execution of parallel preloads. All other queries work fine, but until we figure something out that leverages either telemetry or until the task feature listed here is added to the language, we won't be able to support tracing parallel preloads.
Add spandex_ecto to your list of dependencies in mix.exs:
def deps do
[
{:spandex_ecto, "~> 0.9", organization: "fresha"},
]
endConfigure SpandexEcto globally in your application config:
# config/config.exs
config :spandex_ecto, SpandexEcto.EctoLogger,
service: :ecto, # Optional
tracer: MyApp.Tracer, # RequiredThen attach it to your repository's telemetry events:
# lib/my_app/application.ex
:ok = :telemetry.attach(
"spandex-query-tracer",
# this should match your repo's telemetry prefix
[:my_app, :repo, :query],
&SpandexEcto.TelemetryAdapter.handle_event/4,
nil
)You can override the global configuration by passing overrides to :telemetry.attach/4 (useful for projects with multiple Ecto repos):
# lib/my_app/application.ex
:ok = :telemetry.attach(
"spandex-query-tracer-other-repo",
[:my_app, :other_repo, :query],
&SpandexEcto.TelemetryAdapter.handle_event/4,
# this config will override the global config
service: :other_db,
tracer: MyApp.OtherRepoTracer
)NOTE: If you are upgrading from Ecto 2, make sure to remove the
loggersentry from your configuration after adding:telemetry.attach/4.
The following configuration options are supported:
| Option | Description | Default |
|---|---|---|
tracer |
Tracer instance to use for reporting traces (required) | |
service |
Service name for Ecto traces | ecto |
truncate |
Maximum length of a query (excess will be truncated) | 5000 |
To integrate SpandexEcto with pre-:telemetry versions of Ecto you need to add SpandexEcto.EctoLogger as a logger to your repository.
Be aware that this is a compile time configuration. As such, if you change this you may need to mix compile --force and/or mix deps.compile --force ecto.
# config/config.exs
config :my_app, MyApp.Repo,
loggers: [
{Ecto.LogEntry, :log, [:info]},
{SpandexEcto.EctoLogger, :trace, ["database_name"]}
]By default, SpandexEcto uses the query as name for the span's resource. In
order get a better feeling for the context of your spans, you can label your
span's resources using the option :telemetry_options
of almost all of Ecto.Repo's repository functions.
Repo.all(query, telemetry_options: [spandex_resource: "users-with-addresses"])
Repo.get!(User, id, telemetry_options: [spandex_resource: "get-user"])