Skip to content

Commit

Permalink
wip poc multiple towers
Browse files Browse the repository at this point in the history
  • Loading branch information
grzuy committed Sep 20, 2024
1 parent bf82434 commit 602bcc5
Show file tree
Hide file tree
Showing 6 changed files with 62 additions and 22 deletions.
11 changes: 6 additions & 5 deletions lib/tower.ex
Original file line number Diff line number Diff line change
Expand Up @@ -264,11 +264,12 @@ defmodule Tower do
Note that `Tower.attach/0` is not a precondition for `Tower` `handle_*` functions to work
properly and inform reporters. They are independent.
"""
@spec attach() :: :ok
def attach do
:ok = Tower.LoggerHandler.attach()
:ok = Tower.BanditExceptionHandler.attach()
:ok = Tower.ObanExceptionHandler.attach()
@spec attach(atom()) :: :ok
def attach(opts \\ []) do
{:ok, config} = Tower.Config.from_opts(opts)

Check warning on line 269 in lib/tower.ex

View workflow job for this annotation

GitHub Actions / main (1.15, 25.3.2.12)

variable "config" is unused (if the variable is not meant to be used, prefix it with an underscore)

Check warning on line 269 in lib/tower.ex

View workflow job for this annotation

GitHub Actions / main (1.15, 24.3.4.17)

variable "config" is unused (if the variable is not meant to be used, prefix it with an underscore)
:ok = Tower.LoggerHandler.attach(Module.concat(name, :LoggerHandler))
:ok = Tower.BanditExceptionHandler.attach(Module.concat(name, :BanditExceptionHandler))
:ok = Tower.ObanExceptionHandler.attach(Module.concat(name, :ObanExceptionHandler))
end

@doc """
Expand Down
10 changes: 5 additions & 5 deletions lib/tower/bandit_exception_handler.ex
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,19 @@ defmodule Tower.BanditExceptionHandler do

require Logger

@handler_id __MODULE__
@default_handler_id __MODULE__

def attach do
def attach(handler_id \\ @default_handler_id) do
:telemetry.attach(
@handler_id,
handler_id,
[:bandit, :request, :exception],
&__MODULE__.handle_event/4,
_handler_config = []
)
end

def detach do
:telemetry.detach(@handler_id)
def detach(handler_id \\ @default_handler_id) do
:telemetry.detach(handler_id)
end

def handle_event(
Expand Down
4 changes: 2 additions & 2 deletions lib/tower/ephemeral_reporter.ex
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ defmodule Tower.EphemeralReporter do
Returns the list of all stored events.
"""
@spec events() :: [Tower.Event.t()]
def events do
Agent.get(__MODULE__, & &1)
def events(agent \\ __MODULE__) do
Agent.get(agent, & &1)
end
end
10 changes: 5 additions & 5 deletions lib/tower/logger_handler.ex
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
defmodule Tower.LoggerHandler do
@moduledoc false

@handler_id Tower
@default_handler_id __MODULE__
@own_logs_domain [:tower, :logger_handler]

require Logger

@spec attach() :: :ok | {:error, term()}
def attach do
def attach(handler_id \\ @default_handler_id) do
:logger.add_handler(
@handler_id,
handler_id,
__MODULE__,
%{
level: :all,
Expand All @@ -24,8 +24,8 @@ defmodule Tower.LoggerHandler do
end

@spec detach() :: :ok | {:error, term()}
def detach do
:logger.remove_handler(@handler_id)
def detach(handler_id \\ @default_handler_id) do
:logger.remove_handler(handler_id)
end

# :logger callbacks
Expand Down
10 changes: 5 additions & 5 deletions lib/tower/oban_exception_handler.ex
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,19 @@ defmodule Tower.ObanExceptionHandler do

require Logger

@handler_id __MODULE__
@default_handler_id __MODULE__

def attach do
def attach(handler_id \\ @default_handler_id) do
:telemetry.attach(
@handler_id,
handler_id,
[:oban, :job, :exception],
&__MODULE__.handle_event/4,
_handler_config = []
)
end

def detach do
:telemetry.detach(@handler_id)
def detach(handler_id \\ @default_handler_id) do
:telemetry.detach(handler_id)
end

def handle_event(
Expand Down
39 changes: 39 additions & 0 deletions test/tower_multiple_test.exs
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
defmodule TowerMultipleTest do
use ExUnit.Case

# use AssertEventually, timeout: 100, interval: 10

# import ExUnit.CaptureLog, only: [capture_log: 1]

test "multiple towers" do
{:ok, ephemeral_reporter_1} = Tower.EphemeralReporter.start_link([])
{:ok, ephemeral_reporter_2} = Tower.EphemeralReporter.start_link([])

assert [] = Tower.EphemeralReporter.events(ephemeral_reporter_1)
assert [] = Tower.EphemeralReporter.events(ephemeral_reporter_2)

spawn(fn -> 1 / 0 end)
Process.sleep(200)

assert [] = Tower.EphemeralReporter.events(ephemeral_reporter_1)
assert [] = Tower.EphemeralReporter.events(ephemeral_reporter_2)

Tower.attach(Tower1, reporters: [{Tower.EphemeralReporter, ephemeral_reporter_1}])
Tower.attach(Tower2, reporters: [{Tower.EphemeralReporter, ephemeral_reporter_2}])

spawn(fn -> 1 / 0 end)
Process.sleep(200)

assert [_event] = Tower.EphemeralReporter.events(ephemeral_reporter_1)
assert [_event] = Tower.EphemeralReporter.events(ephemeral_reporter_2)

:ok = Tower.detach(Tower1)

spawn(fn -> 1 / 0 end)
Process.sleep(200)

assert [_event] = Tower.EphemeralReporter.events(ephemeral_reporter_1)
assert [_event1, _event2] = Tower.EphemeralReporter.events(ephemeral_reporter_2)
# :ok = Tower.EphemeralReporter.stop(ephemeral_reporter_1)
end
end

0 comments on commit 602bcc5

Please sign in to comment.