Skip to content

Commit ee79088

Browse files
committed
Support MFA for stacktrace
Left the alternative `last_non_ecto` implementation taking a parameter for length. Goal is to make it easier to just increase the length without needing to implement a new function or use a 3rd party package.
1 parent 56943fb commit ee79088

File tree

2 files changed

+21
-13
lines changed

2 files changed

+21
-13
lines changed

integration_test/sql/logging.exs

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -138,11 +138,9 @@ defmodule Ecto.Integration.LoggingTest do
138138
:ok
139139
end) =~ stacktrace_entry(__ENV__.line)
140140

141-
# Bigger stacktrace size
142-
# This fails because we don't receive per-query :stacktrace ecto-sql side,
143-
# only the global config from adapter_meta
141+
# Requires upstream change in Ecto to pass
144142
out = capture_log(fn ->
145-
TestRepo.all(Post, Keyword.put(@stacktrace_opts, :stacktrace, 2))
143+
TestRepo.all(Post, Keyword.put(@stacktrace_opts, :stacktrace, {Ecto.Adapters.SQL, :last_non_ecto, [2]}))
146144

147145
:ok
148146
end)
@@ -201,8 +199,6 @@ defmodule Ecto.Integration.LoggingTest do
201199
TestRepo.insert_all(Logging, source_query, log: :info)
202200
end)
203201

204-
IO.inspect(log, label: :log)
205-
206202
param_regex = ~r/\[(?<int>.+), \"(?<uuid>.+)\"\]/
207203
param_logs = Regex.named_captures(param_regex, log)
208204

lib/ecto/adapters/sql.ex

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1287,23 +1287,33 @@ defmodule Ecto.Adapters.SQL do
12871287
{true, level} ->
12881288
Logger.log(
12891289
level,
1290-
fn -> log_iodata(measurements, repo, source, query, log_params, result, stacktrace, stacktrace_size(stacktrace_config)) end,
1290+
fn -> log_iodata(measurements, repo, source, query, log_params, result, stacktrace, stacktrace_mfa(stacktrace_config, opts)) end,
12911291
ansi_color: sql_color(query)
12921292
)
12931293

12941294
{opts_level, args_level} ->
12951295
Logger.log(
12961296
opts_level || args_level,
1297-
fn -> log_iodata(measurements, repo, source, query, log_params, result, stacktrace, stacktrace_size(stacktrace_config)) end,
1297+
fn -> log_iodata(measurements, repo, source, query, log_params, result, stacktrace, stacktrace_mfa(stacktrace_config, opts)) end,
12981298
ansi_color: sql_color(query)
12991299
)
13001300
end
13011301

13021302
:ok
13031303
end
13041304

1305-
defp stacktrace_size(val) when is_integer(val), do: val
1306-
defp stacktrace_size(_), do: 1
1305+
defp stacktrace_mfa(stacktrace_config, opts) do
1306+
case Keyword.get(opts, :log_stacktrace_mfa) do
1307+
{_, _, _} = mfa ->
1308+
mfa
1309+
1310+
_ ->
1311+
case stacktrace_config do
1312+
{_, _, _} = mfa -> mfa
1313+
_ -> {__MODULE__, :last_non_ecto, [1]}
1314+
end
1315+
end
1316+
end
13071317

13081318
defp log_measurements([{_, nil} | rest], total, acc),
13091319
do: log_measurements(rest, total, acc)
@@ -1355,8 +1365,10 @@ defmodule Ecto.Adapters.SQL do
13551365
end
13561366
end
13571367

1358-
defp log_stacktrace([_ | _] = stacktrace, repo, size) do
1359-
for {{module, function, arity, info}, idx} <- Enum.with_index(last_non_ecto(Enum.reverse(stacktrace), repo, size)) do
1368+
defp log_stacktrace([_ | _] = stacktrace, repo, {module, function, args}) do
1369+
entries = apply(module, function, args ++ [Enum.reverse(stacktrace), repo])
1370+
1371+
for {{module, function, arity, info}, idx} <- Enum.with_index(entries) do
13601372
[
13611373
?\n,
13621374
IO.ANSI.light_black(),
@@ -1381,7 +1393,7 @@ defmodule Ecto.Adapters.SQL do
13811393

13821394
@repo_modules [Ecto.Repo.Queryable, Ecto.Repo.Schema, Ecto.Repo.Transaction]
13831395

1384-
defp last_non_ecto(stacktrace, repo, size) do
1396+
def last_non_ecto(size, stacktrace, repo) do
13851397
stacktrace
13861398
|> last_non_ecto_entries(repo, [])
13871399
|> Enum.take(size)

0 commit comments

Comments
 (0)