From f69bc5d1b21193065919e8e2d988e5591494f61c Mon Sep 17 00:00:00 2001 From: Gonzalo <456459+grzuy@users.noreply.github.com> Date: Wed, 12 Mar 2025 11:40:04 -0300 Subject: [PATCH 1/2] feat: Tower.async with rescuing for reporters --- lib/tower.ex | 27 +++++++++++++++++++++++++-- test/tower_test.exs | 2 +- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/lib/tower.ex b/lib/tower.ex index 22b0b6a3..c93f7df0 100644 --- a/lib/tower.ex +++ b/lib/tower.ex @@ -561,7 +561,7 @@ defmodule Tower do reporter.report_event(event) rescue exception -> - async(fn -> + in_unlinked_task(fn -> raise ReportEventError, reporter: reporter, original: {:error, exception, __STACKTRACE__} @@ -573,7 +573,30 @@ defmodule Tower do Application.fetch_env!(:tower, :reporters) end - defp async(fun) do + def async(fun) do + in_unlinked_task(fn -> + try do + fun.() + rescue + exception -> + in_unlinked_task(fn -> + raise ReportEventError, + reporter: reporter_from_stacktrace(__STACKTRACE__), + original: {:error, exception, __STACKTRACE__} + end) + end + end) + end + + defp reporter_from_stacktrace([{m, _f, _a, _} | _]) do + m + end + + defp reporter_from_stacktrace(_stacktrace) do + nil + end + + defp in_unlinked_task(fun) do Tower.TaskSupervisor |> Task.Supervisor.start_child(fun) end diff --git a/test/tower_test.exs b/test/tower_test.exs index c339cd2f..a96dce5e 100644 --- a/test/tower_test.exs +++ b/test/tower_test.exs @@ -588,7 +588,7 @@ defmodule TowerTest do @impl true def report_event(_event) do - raise "I have a bug" + Tower.async(fn -> raise "I have a bug" end) end end From ba438f127f94dd6d0d068f0395885809b7445ba3 Mon Sep 17 00:00:00 2001 From: Gonzalo <456459+grzuy@users.noreply.github.com> Date: Thu, 13 Mar 2025 13:22:04 -0300 Subject: [PATCH 2/2] explicit reporter module --- lib/tower.ex | 12 ++---------- test/tower_test.exs | 2 +- 2 files changed, 3 insertions(+), 11 deletions(-) diff --git a/lib/tower.ex b/lib/tower.ex index c93f7df0..22173f37 100644 --- a/lib/tower.ex +++ b/lib/tower.ex @@ -573,7 +573,7 @@ defmodule Tower do Application.fetch_env!(:tower, :reporters) end - def async(fun) do + def async(reporter, fun) do in_unlinked_task(fn -> try do fun.() @@ -581,21 +581,13 @@ defmodule Tower do exception -> in_unlinked_task(fn -> raise ReportEventError, - reporter: reporter_from_stacktrace(__STACKTRACE__), + reporter: reporter, original: {:error, exception, __STACKTRACE__} end) end end) end - defp reporter_from_stacktrace([{m, _f, _a, _} | _]) do - m - end - - defp reporter_from_stacktrace(_stacktrace) do - nil - end - defp in_unlinked_task(fun) do Tower.TaskSupervisor |> Task.Supervisor.start_child(fun) diff --git a/test/tower_test.exs b/test/tower_test.exs index a96dce5e..82c8bbcb 100644 --- a/test/tower_test.exs +++ b/test/tower_test.exs @@ -588,7 +588,7 @@ defmodule TowerTest do @impl true def report_event(_event) do - Tower.async(fn -> raise "I have a bug" end) + Tower.async(__MODULE__, fn -> raise "I have a bug" end) end end