Skip to content

Commit b5cefad

Browse files
committed
feat: workaround for missing Logger messages
1 parent 260a1bc commit b5cefad

File tree

2 files changed

+49
-3
lines changed

2 files changed

+49
-3
lines changed

lib/tower_error_tracker/reporter.ex

+27
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,33 @@ defmodule TowerErrorTracker.Reporter do
1919
:ok
2020
end
2121

22+
def report_event(
23+
%Tower.Event{
24+
kind: :message,
25+
reason: reason,
26+
level: level,
27+
stacktrace: stacktrace,
28+
log_event: %{meta: %{mfa: {m, f, a}, file: file, line: line}}
29+
} = event
30+
)
31+
when is_nil(stacktrace) or length(stacktrace) == 0 do
32+
ErrorTracker.report(
33+
{:message, "[#{level}] #{reason}"},
34+
[{m, f, a, [file: file, line: line]}],
35+
context(event)
36+
)
37+
38+
:ok
39+
end
40+
41+
def report_event(
42+
%Tower.Event{kind: :message, reason: reason, level: level, stacktrace: stacktrace} = event
43+
) do
44+
ErrorTracker.report({:message, "[#{level}] #{reason}"}, stacktrace || [], context(event))
45+
46+
:ok
47+
end
48+
2249
def report_event(_event) do
2350
:ignore
2451
end

test/tower_error_tracker_test.exs

+22-3
Original file line numberDiff line numberDiff line change
@@ -219,16 +219,35 @@ defmodule TowerErrorTrackerTest do
219219
)
220220
end
221221

222-
test "Logger messages not reported because not supported by ErrorTracker" do
222+
test "Logger messages reported as special custom exceptions (because messages not supported by ErrorTracker)" do
223223
in_unlinked_process(fn ->
224224
require Logger
225225

226226
capture_log(fn ->
227-
Logger.emergency("Panic!")
227+
Logger.emergency("Emergency!")
228+
229+
Logger.critical("Critical!")
228230
end)
229231
end)
230232

231-
assert [] = TestApp.Repo.all(ErrorTracker.Error) |> TestApp.Repo.preload(:occurrences)
233+
# Testing that both are reported as separate errors and NOT as seprate occurrences of the same error
234+
assert_eventually(
235+
[
236+
%{
237+
kind: "message",
238+
reason: reason1,
239+
occurrences: [_]
240+
},
241+
%{
242+
kind: "message",
243+
reason: reason2,
244+
occurrences: [_]
245+
}
246+
] = TestApp.Repo.all(ErrorTracker.Error) |> TestApp.Repo.preload(:occurrences)
247+
)
248+
249+
# tower 0.7 async reporting doesn't necessary report them ordered
250+
assert Enum.sort([reason1, reason2]) == ["[critical] Critical!", "[emergency] Emergency!"]
232251
end
233252

234253
defp in_unlinked_process(fun) when is_function(fun, 0) do

0 commit comments

Comments
 (0)