Packages
sentry
10.5.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.ex
defmodule Sentry.Transport.Sender do
@moduledoc false
use GenServer
alias Sentry.{Envelope, Event, LoggerUtils, Transport}
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__, [], 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())
GenServer.cast({:via, Registry, {@registry, random_index}}, {:send, client, event})
end
## State
defstruct []
## Callbacks
@impl GenServer
def init([]) do
{:ok, %__MODULE__{}}
end
@impl GenServer
def handle_cast({:send, client, %Event{} = event}, %__MODULE__{} = state) do
event
|> Envelope.from_event()
|> Transport.post_envelope(client)
|> maybe_log_send_result([event])
{:noreply, state}
end
## Helpers
defp maybe_log_send_result(send_result, events) do
if Enum.any?(events, &(&1.source == :logger)) do
:ok
else
message =
case send_result do
{:error, {:invalid_json, error}} ->
"Unable to encode JSON Sentry error - #{inspect(error)}"
{:error, {:request_failure, last_error}} ->
case last_error do
{kind, data, stacktrace}
when kind in [:exit, :throw, :error] and is_list(stacktrace) ->
Exception.format(kind, data, stacktrace)
_other ->
"Error in HTTP Request to Sentry - #{inspect(last_error)}"
end
_ ->
nil
end
if message do
LoggerUtils.log(fn -> ["Failed to send Sentry event. ", message] end)
end
end
end
end