@@ -185,9 +185,63 @@ defmodule Sentry.LoggerHandlerTest do
185185 if System . otp_release ( ) >= "26" do
186186 assert [ ] = event . exception
187187 assert [ _thread ] = event . threads
188+ assert event . extra . genserver_state == ":no_state"
189+ assert event . extra . last_message =~ "{:run, #Function"
188190 end
189191 end
190192
193+ test "an exit while calling another GenServer is reported nicely" ,
194+ % { sender_ref: ref , test_genserver: test_genserver } do
195+ # Get a PID and make sure it's done before using it.
196+ { pid , monitor_ref } = spawn_monitor ( fn -> :ok end )
197+ assert_receive { :DOWN , ^ monitor_ref , _ , _ , _ }
198+
199+ run_and_catch_exit ( test_genserver , fn ->
200+ GenServer . call ( pid , :ping )
201+ end )
202+
203+ assert_receive { ^ ref , event }
204+
205+ assert event . exception == [ ]
206+ assert event . extra . domain == [ :otp ]
207+ assert event . extra . logger_level == :error
208+ assert event . extra . logger_metadata == % { }
209+ assert event . extra . crash_reason =~ "{:noproc, {GenServer, :call"
210+ assert event . fingerprint == [ "noproc" , "genserver_call" , ":ping" ]
211+
212+ assert event . message . formatted == """
213+ exited in: GenServer.call(#{ inspect ( pid ) } , :ping, 5000)
214+ ** (EXIT) no process: the process is not alive or there's no process currently \
215+ associated with the given name, possibly because its application isn't started\
216+ """
217+
218+ assert [ % { stacktrace: stacktrace } ] = event . threads
219+ assert Enum . find ( stacktrace . frames , & ( & 1 . function == "GenServer.call/3" ) )
220+ end
221+
222+ test "a timeout while calling another GenServer is reported nicely" ,
223+ % { sender_ref: ref , test_genserver: test_genserver } do
224+ { :ok , agent } = Agent . start_link ( fn -> nil end )
225+
226+ run_and_catch_exit ( test_genserver , fn ->
227+ Agent . get ( agent , & & 1 , 0 )
228+ end )
229+
230+ assert_receive { ^ ref , event }
231+
232+ assert event . exception == [ ]
233+ assert event . extra . domain == [ :otp ]
234+ assert event . extra . logger_level == :error
235+ assert event . extra . logger_metadata == % { }
236+ assert event . extra . crash_reason =~ "{:timeout, {GenServer, :call"
237+ assert [ "timeout" , "genserver_call" , "{:get" <> _ ] = event . fingerprint
238+
239+ assert event . message . formatted =~ "exited in: GenServer.call(#{ inspect ( agent ) } , {:get, "
240+
241+ assert [ % { stacktrace: stacktrace } ] = event . threads
242+ assert Enum . find ( stacktrace . frames , & ( & 1 . function == "GenServer.call/3" ) )
243+ end
244+
191245 @ tag handler_config: % { metadata: [ :string , :number , :map , :list , :chardata ] }
192246 test "includes Logger metadata for keys configured to be included" ,
193247 % { sender_ref: ref , test_genserver: test_genserver } do
@@ -285,7 +339,7 @@ defmodule Sentry.LoggerHandlerTest do
285339 assert [ ] = event . exception
286340 assert [ thread ] = event . threads
287341
288- assert event . message . formatted =~ "** (stop) exited in: GenServer.call("
342+ assert event . message . formatted =~ "exited in: GenServer.call("
289343 assert event . message . formatted =~ "** (EXIT) time out"
290344 assert length ( thread . stacktrace . frames ) > 0
291345 end
0 commit comments