Skip to content

Commit 211a29f

Browse files
authored
Fix stacktraces with no frames (#787)
1 parent 3232555 commit 211a29f

File tree

2 files changed

+28
-10
lines changed

2 files changed

+28
-10
lines changed

lib/sentry/client.ex

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -287,18 +287,24 @@ defmodule Sentry.Client do
287287
defp render_exception(%Interfaces.Exception{} = exception) do
288288
exception
289289
|> Map.from_struct()
290+
|> render_stacktrace()
290291
|> update_if_present(:mechanism, &Map.from_struct/1)
291-
|> update_if_present(:stacktrace, fn %Interfaces.Stacktrace{frames: frames} ->
292-
%{frames: Enum.map(frames, &Map.from_struct/1)}
293-
end)
294292
end
295293

296294
defp render_thread(%Interfaces.Thread{} = thread) do
297295
thread
298296
|> Map.from_struct()
299-
|> update_if_present(:stacktrace, fn %Interfaces.Stacktrace{frames: frames} ->
300-
%{frames: frames && Enum.map(frames, &Map.from_struct/1)}
301-
end)
297+
|> render_stacktrace()
298+
end
299+
300+
defp render_stacktrace(map) do
301+
case map do
302+
%{stacktrace: %{frames: %Interfaces.Stacktrace{frames: [_ | _]} = stacktrace}} ->
303+
%{stacktrace | frames: Enum.map(stacktrace.frames, &Map.from_struct/1)}
304+
305+
map_without_stacktrace ->
306+
Map.delete(map_without_stacktrace, :stacktrace)
307+
end
302308
end
303309

304310
defp remove_nils(map) when is_map(map) do
@@ -356,8 +362,11 @@ defmodule Sentry.Client do
356362

357363
defp update_if_present(map, key, fun) do
358364
case Map.pop(map, key) do
359-
{nil, _} -> map
360-
{value, map} -> Map.put(map, key, fun.(value))
365+
{nil, _} ->
366+
map
367+
368+
{value, map} ->
369+
Map.put(map, key, fun.(value))
361370
end
362371
end
363372

test/sentry/client_test.exs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,13 +84,22 @@ defmodule Sentry.ClientTest do
8484
:code.purge(RaisingJSONClient)
8585
end
8686

87-
test "renders threads with stacktrace :frames field set to nil if empty" do
87+
test "renders threads with stacktrace property deleted if :frames field set to nil if empty" do
8888
event =
8989
Event.create_event(message: "No frames in stacktrace", stacktrace: [])
9090

9191
client = Client.render_event(event)
9292

93-
assert %{frames: nil} = get_in(client.threads, [Access.at(0), :stacktrace])
93+
assert is_nil(get_in(client.threads, [Access.at(0), :stacktrace]))
94+
end
95+
96+
test "renders exception with stacktrace property deleted if :frames field set to nil if empty" do
97+
event =
98+
Event.transform_exception(%RuntimeError{message: "foo"}, stacktrace: [])
99+
100+
client = Client.render_event(event)
101+
102+
assert is_nil(get_in(client.exception, [Access.at(0), :stacktrace]))
94103
end
95104

96105
test "removes non-payload fields" do

0 commit comments

Comments
 (0)