diff --git a/.changesets/make--appsignal-ecto-repo--s--default_options-1--function-overridable.md b/.changesets/make--appsignal-ecto-repo--s--default_options-1--function-overridable.md new file mode 100644 index 000000000..8f4b90df6 --- /dev/null +++ b/.changesets/make--appsignal-ecto-repo--s--default_options-1--function-overridable.md @@ -0,0 +1,18 @@ +--- +bump: patch +type: fix +--- + +Make `Appsignal.Ecto.Repo`'s `default_options/1` function overridable. If your Ecto repo uses `Appsignal.Ecto.Repo` and implements its own `default_options/1`, it must call `super` to merge its default options with those of `Appsignal.Ecto.Repo`: + +```elixir +defmodule MyEctoRepo + use Appsignal.Ecto.Repo + + def default_options(operation) do + super(operation) ++ [ + # ... your default options here ... + ] + end +end +``` diff --git a/lib/appsignal/ecto_repo.ex b/lib/appsignal/ecto_repo.ex index ba0fc14c3..a28f6d99f 100644 --- a/lib/appsignal/ecto_repo.ex +++ b/lib/appsignal/ecto_repo.ex @@ -5,13 +5,15 @@ defmodule Appsignal.Ecto.Repo do quote do use unquote(@ecto_repo), unquote(opts) - def default_options(atom) do - Appsignal.Ecto.Repo.default_options(atom) + def default_options(operation) do + super(operation) ++ Appsignal.Ecto.Repo.default_options() end + + defoverridable default_options: 1 end end - def default_options(_atom) do + def default_options(_operation \\ nil) do [ telemetry_options: [ _appsignal_current_span: Appsignal.Tracer.current_span() diff --git a/test/appsignal/ecto_repo_test.exs b/test/appsignal/ecto_repo_test.exs index 1c8e51a89..805f12c84 100644 --- a/test/appsignal/ecto_repo_test.exs +++ b/test/appsignal/ecto_repo_test.exs @@ -4,6 +4,17 @@ defmodule Appsignal.TestEctoRepo do adapter: Ecto.Adapters.Postgres end +defmodule Appsignal.TestEctoRepoWithOverride do + use Appsignal.Ecto.Repo + + def default_options(operation) do + super(operation) ++ + [ + foo: "bar" + ] + end +end + defmodule Appsignal.EctoRepoTest do use ExUnit.Case alias Appsignal.Ecto.Repo @@ -23,6 +34,15 @@ defmodule Appsignal.EctoRepoTest do ] end + test "use Appsignal.Ecto.Repo can have overriden default options" do + assert Appsignal.TestEctoRepoWithOverride.default_options(:all) == [ + telemetry_options: [ + _appsignal_current_span: nil + ], + foo: "bar" + ] + end + describe "use Appsignal.Ecto.Repo, with a root span" do setup do %{span: Appsignal.Tracer.create_span("http_request")} diff --git a/test/support/fake_ecto_repo.ex b/test/support/fake_ecto_repo.ex index e892023ae..1b5ebd303 100644 --- a/test/support/fake_ecto_repo.ex +++ b/test/support/fake_ecto_repo.ex @@ -4,6 +4,11 @@ defmodule FakeEctoRepo do def get_received_opts do unquote(opts) end + + # As implemented in `Ecto.Repo`: + # https://github.com/elixir-ecto/ecto/blob/9df9b35044d74322cdd5c263b6d593ba98a19c44/lib/ecto/repo.ex#L260-L261 + def default_options(_operation), do: [] + defoverridable default_options: 1 end end end