Skip to content

Commit 2a08ac6

Browse files
Merge pull request #517 from ruslandoga/allow-logging-from-http-request-tasks
allow logging from tasks
2 parents 76b23db + adce8fb commit 2a08ac6

File tree

2 files changed

+55
-46
lines changed

2 files changed

+55
-46
lines changed

lib/sentry/client.ex

Lines changed: 38 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,6 @@ defmodule Sentry.Client do
8989
def send_event(%Event{} = event, opts \\ []) do
9090
result = Keyword.get(opts, :result, Config.send_result())
9191
sample_rate = Keyword.get(opts, :sample_rate) || Config.sample_rate()
92-
should_log = event.event_source != :logger
9392

9493
event = maybe_call_before_send_event(event)
9594

@@ -101,12 +100,12 @@ defmodule Sentry.Client do
101100
:unsampled
102101

103102
{%Event{}, true} ->
104-
encode_and_send(event, result, should_log)
103+
encode_and_send(event, result)
105104
end
106105
end
107106

108-
@spec encode_and_send(Event.t(), result(), boolean()) :: send_event_result()
109-
defp encode_and_send(event, result, should_log) do
107+
@spec encode_and_send(Event.t(), result()) :: send_event_result()
108+
defp encode_and_send(event, result) do
110109
result =
111110
Sentry.Envelope.new()
112111
|> Sentry.Envelope.add_event(event)
@@ -123,9 +122,7 @@ defmodule Sentry.Client do
123122
Sentry.put_last_event_id_and_source(event.event_id, event.event_source)
124123
end
125124

126-
if should_log do
127-
maybe_log_result(result)
128-
end
125+
maybe_log_result(result, event)
129126

130127
result
131128
end
@@ -138,6 +135,7 @@ defmodule Sentry.Client do
138135
Task.Supervisor.async_nolink(Sentry.TaskSupervisor, fn ->
139136
try_request(endpoint, auth_headers, {event, body}, Config.send_max_attempts())
140137
|> maybe_call_after_send_event(event)
138+
|> maybe_log_result(event)
141139
end)}
142140

143141
{:error, :invalid_dsn} ->
@@ -165,6 +163,7 @@ defmodule Sentry.Client do
165163
Task.Supervisor.start_child(Sentry.TaskSupervisor, fn ->
166164
try_request(endpoint, auth_headers, {event, body}, Config.send_max_attempts())
167165
|> maybe_call_after_send_event(event)
166+
|> maybe_log_result(event)
168167
end)
169168

170169
{:ok, ""}
@@ -269,7 +268,7 @@ defmodule Sentry.Client do
269268
end
270269
end
271270

272-
@spec maybe_call_after_send_event(send_event_result, Event.t()) :: Event.t()
271+
@spec maybe_call_after_send_event(send_event_result, Event.t()) :: send_event_result
273272
def maybe_call_after_send_event(result, event) do
274273
case Config.after_send_event() do
275274
function when is_function(function, 2) ->
@@ -348,34 +347,39 @@ defmodule Sentry.Client do
348347
end
349348
end
350349

351-
def maybe_log_result(result) do
352-
message =
353-
case result do
354-
{:error, :invalid_dsn} ->
355-
"Cannot send Sentry event because of invalid DSN"
350+
@spec maybe_log_result(send_event_result, Event.t()) :: send_event_result
351+
def maybe_log_result(result, event) do
352+
if should_log?(event) do
353+
message =
354+
case result do
355+
{:error, :invalid_dsn} ->
356+
"Cannot send Sentry event because of invalid DSN"
356357

357-
{:error, {:invalid_json, error}} ->
358-
"Unable to encode JSON Sentry error - #{inspect(error)}"
358+
{:error, {:invalid_json, error}} ->
359+
"Unable to encode JSON Sentry error - #{inspect(error)}"
359360

360-
{:error, {:request_failure, last_error}} ->
361-
"Error in HTTP Request to Sentry - #{inspect(last_error)}"
361+
{:error, {:request_failure, last_error}} ->
362+
"Error in HTTP Request to Sentry - #{inspect(last_error)}"
362363

363-
{:error, error} ->
364-
inspect(error)
364+
{:error, error} ->
365+
inspect(error)
365366

366-
_ ->
367-
nil
368-
end
367+
_ ->
368+
nil
369+
end
369370

370-
if message != nil do
371-
Logger.log(
372-
Config.log_level(),
373-
fn ->
374-
["Failed to send Sentry event. ", message]
375-
end,
376-
domain: [:sentry]
377-
)
371+
if message do
372+
Logger.log(
373+
Config.log_level(),
374+
fn ->
375+
["Failed to send Sentry event. ", message]
376+
end,
377+
domain: [:sentry]
378+
)
379+
end
378380
end
381+
382+
result
379383
end
380384

381385
@spec authorization_headers(String.t(), String.t()) :: list({String.t(), String.t()})
@@ -421,4 +425,8 @@ defmodule Sentry.Client do
421425
defp sample_event?(sample_rate) do
422426
:rand.uniform() < sample_rate
423427
end
428+
429+
defp should_log?(%Event{event_source: event_source}) do
430+
event_source != :logger
431+
end
424432
end

test/client_test.exs

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -330,22 +330,23 @@ defmodule Sentry.ClientTest do
330330
log_level: :error
331331
)
332332

333-
capture_log(fn ->
334-
try do
335-
apply(Event, :not_a_function, [])
336-
rescue
337-
e ->
338-
{:ok, task} =
339-
Sentry.capture_exception(
340-
e,
341-
stacktrace: __STACKTRACE__,
342-
result: :async
343-
)
344-
345-
assert_receive "API called"
346-
Task.shutdown(task)
347-
end
348-
end) =~ "[error] Failed to send Sentry event"
333+
assert capture_log(fn ->
334+
try do
335+
apply(Event, :not_a_function, [])
336+
rescue
337+
e ->
338+
{:ok, %{ref: ref}} =
339+
Sentry.capture_exception(
340+
e,
341+
stacktrace: __STACKTRACE__,
342+
result: :async
343+
)
344+
345+
assert_receive "API called"
346+
assert_receive {^ref, {:error, {:request_failure, _}}}
347+
assert_receive {:DOWN, ^ref, :process, _pid, :normal}
348+
end
349+
end) =~ "[error] Failed to send Sentry event"
349350
end
350351

351352
test "logs JSON parsing errors at configured log_level" do

0 commit comments

Comments
 (0)