Packages
sentry
12.0.2
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.ex
defmodule Sentry.Transport.Sender do
@moduledoc false
use GenServer
alias Sentry.{Envelope, Event, Transport, Transaction}
require Logger
@registry Sentry.Transport.SenderRegistry
## Public API
@spec start_link(keyword()) :: GenServer.on_start()
def start_link(options) when is_list(options) do
index = Keyword.fetch!(options, :index)
GenServer.start_link(__MODULE__, options, name: {:via, Registry, {@registry, index}})
end
@spec send_async(module(), Event.t()) :: :ok
def send_async(client, %Event{} = event) when is_atom(client) do
random_index = Enum.random(1..Transport.SenderPool.pool_size())
counter_key = Transport.SenderPool.increase_queued_events_counter()
GenServer.cast(
{:via, Registry, {@registry, random_index}},
{:send, client, event, counter_key}
)
end
@spec send_async(module(), Transaction.t()) :: :ok
def send_async(client, %Transaction{} = transaction) when is_atom(client) do
random_index = Enum.random(1..Transport.SenderPool.pool_size())
counter_key = Transport.SenderPool.increase_queued_transactions_counter()
GenServer.cast(
{:via, Registry, {@registry, random_index}},
{:send, client, transaction, counter_key}
)
end
## State
defstruct []
## Callbacks
@impl GenServer
def init(options) do
if function_exported?(Process, :set_label, 1) do
apply(Process, :set_label, [__MODULE__])
end
if rate_limiter_table_name = Keyword.get(options, :rate_limiter_table_name) do
Process.put(:rate_limiter_table_name, rate_limiter_table_name)
end
{:ok, %__MODULE__{}}
end
@impl GenServer
def handle_cast({:send, client, %Event{} = event, counter_key}, %__MODULE__{} = state) do
retries = Application.get_env(:sentry, :request_retries, Transport.default_retries())
_ =
event
|> Envelope.from_event()
|> Transport.encode_and_post_envelope(client, retries)
# We sent an event, so we can decrease the number of queued events.
Transport.SenderPool.decrease_queued_events_counter(counter_key)
{:noreply, state}
end
@impl GenServer
def handle_cast(
{:send, client, %Transaction{} = transaction, counter_key},
%__MODULE__{} = state
) do
retries = Application.get_env(:sentry, :request_retries, Transport.default_retries())
_ =
transaction
|> Envelope.from_transaction()
|> Transport.encode_and_post_envelope(client, retries)
# We sent a transaction, so we can decrease the number of queued transactions.
Transport.SenderPool.decrease_queued_transactions_counter(counter_key)
{:noreply, state}
end
end