Packages
sentry
13.2.0
13.3.0
13.2.0
13.1.0
13.0.1
13.0.0
12.0.3
12.0.2
12.0.1
12.0.0
11.0.4
11.0.3
11.0.2
11.0.1
11.0.0
10.10.0
10.9.0
10.8.1
10.8.0
10.7.1
10.7.0
10.6.2
10.6.1
10.6.0
10.5.0
10.4.0
10.3.0
10.2.1
10.2.0
10.2.0-rc.2
10.2.0-rc.1
10.1.0
10.0.3
10.0.2
10.0.1
10.0.0
9.1.0
9.0.0
8.1.0
8.0.6
8.0.5
8.0.4
8.0.3
8.0.2
8.0.1
8.0.0
8.0.0-rc.2
8.0.0-rc.1
8.0.0-rc.0
retired
7.2.5
7.2.4
7.2.3
7.2.2
7.2.1
7.2.0
7.1.0
7.0.6
7.0.5
7.0.4
7.0.3
7.0.2
7.0.1
7.0.0
6.4.2
6.4.1
6.4.0
6.3.0
6.2.1
6.2.0
6.1.0
6.0.5
6.0.4
6.0.3
6.0.2
6.0.1
6.0.0
5.0.1
5.0.0
4.0.3
4.0.2
4.0.1
4.0.0
3.0.0
2.2.0
2.1.0
2.0.2
2.0.1
2.0.0
1.1.2
1.1.1
1.1.0
1.0.0
0.3.2
0.3.1
0.3.0
0.2.0
0.1.3
0.1.2
0.1.1
0.1.0
The Official Elixir client for Sentry
Current section
Files
Jump to
Current section
Files
lib/sentry/transport/sender_pool.ex
defmodule Sentry.Transport.SenderPool do
@moduledoc false
use Supervisor
@queued_events_key {__MODULE__, :queued_events}
@queued_transactions_key {__MODULE__, :queued_transactions}
@spec start_link(keyword()) :: Supervisor.on_start()
def start_link([] = _opts) do
Supervisor.start_link(__MODULE__, [])
end
@impl true
def init([]) do
queued_events_counter = :counters.new(1, [])
:persistent_term.put(@queued_events_key, queued_events_counter)
queued_transactions_counter = :counters.new(1, [])
:persistent_term.put(@queued_transactions_key, queued_transactions_counter)
children =
for index <- 1..pool_size() do
Supervisor.child_spec({Sentry.Transport.Sender, index: index},
id: {Sentry.Transport.Sender, index}
)
end
Supervisor.init(children, strategy: :one_for_one)
end
@spec pool_size() :: pos_integer()
def pool_size do
if pool_size = :persistent_term.get({:sentry, :sender_pool_size}, nil) do
pool_size
else
value = max(System.schedulers_online(), 8)
:persistent_term.put({:sentry, :sender_pool_size}, value)
value
end
end
# Returns the key used, so callers can pass it to decrease_* later
@spec increase_queued_events_counter() :: term()
def increase_queued_events_counter do
key = queued_events_key()
counter = :persistent_term.get(key)
:counters.add(counter, 1, 1)
key
end
@spec increase_queued_transactions_counter() :: term()
def increase_queued_transactions_counter do
key = queued_transactions_key()
counter = :persistent_term.get(key)
:counters.add(counter, 1, 1)
key
end
# Accept optional key to decrement the correct counter (used by Sender)
@spec decrease_queued_events_counter(term()) :: :ok
def decrease_queued_events_counter(key \\ nil) do
key = key || queued_events_key()
counter = :persistent_term.get(key)
:counters.sub(counter, 1, 1)
end
@spec decrease_queued_transactions_counter(term()) :: :ok
def decrease_queued_transactions_counter(key \\ nil) do
key = key || queued_transactions_key()
counter = :persistent_term.get(key)
:counters.sub(counter, 1, 1)
end
@spec get_queued_events_counter() :: non_neg_integer()
def get_queued_events_counter do
counter = :persistent_term.get(queued_events_key())
:counters.get(counter, 1)
end
# Allow per-process override of counter keys (for test isolation)
defp queued_events_key do
Process.get(:sentry_queued_events_key, @queued_events_key)
end
defp queued_transactions_key do
Process.get(:sentry_queued_transactions_key, @queued_transactions_key)
end
end