Skip to content

Commit b563d7a

Browse files
authored
Fix error grouping issue (#133)
The errors are being grouped in a wrong way because a type mismatch comparison was done between the application name and the stacktrace application name. The fix is to convert the configured application name to a string and be able to compare it with the stacktrace application name. You can test it putting this script on the root project: <details> ```elixir Mix.install([ {:ecto_sql, "~> 3.0"}, {:postgrex, "~> 0.1"}, {:error_tracker, path: "."}, {:bandit, "~> 1.0"} ]) ### ErrorLogger config Application.put_env(:error_tracker, :repo, Repo) Application.put_env(:error_tracker, :otp_app, :myapp) Application.put_env(:error_tracker, :enabled, true) defmodule AddErrorTracker do use Ecto.Migration def up, do: ErrorTracker.Migration.up(version: 4) def down, do: ErrorTracker.Migration.down(version: 1) end ### Common config Application.put_env(:myapp, Repo, database: "mix_install_examples") defmodule Repo do use Ecto.Repo, adapter: Ecto.Adapters.Postgres, otp_app: :myapp end defmodule Migration0 do use Ecto.Migration def change do create table("posts") do add(:title, :string) timestamps(type: :utc_datetime_usec) end end end defmodule Post do use Ecto.Schema schema "posts" do field(:title, :string) timestamps(type: :utc_datetime_usec) end end defmodule Main do import Ecto.Query, warn: false def migrate do Repo.__adapter__().storage_down(Repo.config()) :ok = Repo.__adapter__().storage_up(Repo.config()) {:ok, _} = Repo.start_link([]) Ecto.Migrator.run(Repo, [{0, Migration0}, {1, AddErrorTracker}], :up, all: true, log_migrations_sql: :info) end def register_app_and_modules do :application.load({:application, :myapp, [ {:description, ~c"My sample application"}, {:vsn, ~c"0.1.0"}, {:modules, [Router]}, {:registered, [Router]}, {:applications, [:kernel, :stdlib]} ]}) end def run_http_server do Supervisor.start_link([{Bandit, [plug: Router, port: 1234]}], strategy: :one_for_one) end def make_requests do :inets.start() :httpc.request("http://localhost:1234/route1") :httpc.request("http://localhost:1234/route2") end def check_what_was_collected do ErrorTracker.Error |> Repo.all() |> IO.inspect() ErrorTracker.Occurrence |> Repo.all() |> Enum.map(&Enum.take(&1.stacktrace.lines, 2)) |> IO.inspect() end end defmodule Router do use Plug.Router use ErrorTracker.Integrations.Plug plug(:match) plug(:dispatch) get "/route1" do Repo.get!(Post, 1) send_resp(conn, 200, "Anything") end get "/route2" do Repo.get!(Post, 2) send_resp(conn, 200, "Anything") end end Main.migrate() Main.register_app_and_modules() Main.run_http_server() Main.make_requests() Main.check_what_was_collected() # <- demonstrates the issue Process.sleep(:infinity) ``` </details> This closes #132
1 parent 4763e55 commit b563d7a

File tree

2 files changed

+16
-6
lines changed

2 files changed

+16
-6
lines changed

lib/error_tracker/schemas/stacktrace.ex

+1-1
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ defmodule ErrorTracker.Stacktrace do
5555
application, just the first line.
5656
"""
5757
def source(stack = %__MODULE__{}) do
58-
client_app = Application.fetch_env!(:error_tracker, :otp_app)
58+
client_app = Application.fetch_env!(:error_tracker, :otp_app) |> to_string()
5959

6060
Enum.find(stack.lines, &(&1.application == client_app)) || List.first(stack.lines)
6161
end

test/error_tracker_test.exs

+15-5
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,10 @@ defmodule ErrorTrackerTest do
44
alias ErrorTracker.Error
55
alias ErrorTracker.Occurrence
66

7-
@relative_file_path Path.relative_to(__ENV__.file, File.cwd!())
7+
# We use this file path because for some reason the test scripts are not
8+
# handled as part of the application, so the last line of the app executed is
9+
# on the case module.
10+
@relative_file_path "test/support/case.ex"
811

912
describe inspect(&ErrorTracker.report/3) do
1013
setup context do
@@ -29,18 +32,25 @@ defmodule ErrorTrackerTest do
2932
test "reports badarith errors" do
3033
string_var = to_string(1)
3134

32-
%Occurrence{error: error = %Error{}} =
35+
%Occurrence{error: error = %Error{}, stacktrace: %{lines: [last_line | _]}} =
3336
report_error(fn -> 1 + string_var end)
3437

3538
assert error.kind == to_string(ArithmeticError)
3639
assert error.reason == "bad argument in arithmetic expression"
3740

3841
# Elixir 1.17.0 reports these errors differently than previous versions
3942
if Version.compare(System.version(), "1.17.0") == :lt do
40-
assert error.source_line =~ @relative_file_path
43+
assert last_line.module == "ErrorTrackerTest"
44+
assert last_line.function =~ "&ErrorTracker.report/3 reports badarith errors"
45+
assert last_line.arity == 1
46+
assert last_line.file
47+
assert last_line.line
4148
else
42-
assert error.source_function == "erlang.+/2"
43-
assert error.source_line == "(nofile)"
49+
assert last_line.module == "erlang"
50+
assert last_line.function == "+"
51+
assert last_line.arity == 2
52+
refute last_line.file
53+
refute last_line.line
4454
end
4555
end
4656

0 commit comments

Comments
 (0)