Skip to content

Commit a321010

Browse files
Merge pull request #274 from getsentry/improve-retries-sleepy
Reduce Logger noise in HTTP Client
2 parents 1e203be + fef1b55 commit a321010

File tree

2 files changed

+42
-25
lines changed

2 files changed

+42
-25
lines changed

lib/sentry/client.ex

Lines changed: 27 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ defmodule Sentry.Client do
8989
{endpoint, auth_headers} ->
9090
{:ok,
9191
Task.Supervisor.async_nolink(Sentry.TaskSupervisor, fn ->
92-
try_request(:post, endpoint, auth_headers, body)
92+
try_request(endpoint, auth_headers, {event, body})
9393
|> maybe_call_after_send_event(event)
9494
end)}
9595

@@ -101,7 +101,7 @@ defmodule Sentry.Client do
101101
defp do_send_event(event, body, :sync) do
102102
case get_headers_and_endpoint() do
103103
{endpoint, auth_headers} ->
104-
try_request(:post, endpoint, auth_headers, body)
104+
try_request(endpoint, auth_headers, {event, body})
105105
|> maybe_call_after_send_event(event)
106106

107107
_ ->
@@ -113,7 +113,7 @@ defmodule Sentry.Client do
113113
case get_headers_and_endpoint() do
114114
{endpoint, auth_headers} ->
115115
Task.Supervisor.start_child(Sentry.TaskSupervisor, fn ->
116-
try_request(:post, endpoint, auth_headers, body)
116+
try_request(endpoint, auth_headers, {event, body})
117117
|> maybe_call_after_send_event(event)
118118
end)
119119

@@ -124,20 +124,27 @@ defmodule Sentry.Client do
124124
end
125125
end
126126

127-
defp try_request(method, url, headers, body, current_attempt \\ 1)
127+
defp try_request(url, headers, event_body_tuple, current_attempt \\ 1)
128128

129-
defp try_request(_, _, _, _, current_attempt)
129+
defp try_request(_, _, _, current_attempt)
130130
when current_attempt > @max_attempts,
131131
do: :error
132132

133-
defp try_request(method, url, headers, body, current_attempt) do
134-
case request(method, url, headers, body) do
133+
defp try_request(url, headers, {event, body}, current_attempt) do
134+
case request(url, headers, body) do
135135
{:ok, id} ->
136136
{:ok, id}
137137

138-
:error ->
139-
sleep(current_attempt)
140-
try_request(method, url, headers, body, current_attempt + 1)
138+
{:error, error} ->
139+
if(current_attempt == 1) do
140+
log_api_error("Event ID: #{event.event_id} - #{inspect(error)} - #{body}")
141+
else
142+
log_api_error("Event ID: #{event.event_id} - #{inspect(error)}")
143+
end
144+
145+
if current_attempt < @max_attempts, do: sleep(current_attempt)
146+
147+
try_request(url, headers, {event, body}, current_attempt + 1)
141148
end
142149
end
143150

@@ -146,27 +153,26 @@ defmodule Sentry.Client do
146153
147154
Hackney options can be set via the `hackney_opts` configuration option.
148155
"""
149-
@spec request(atom(), String.t(), list({String.t(), String.t()}), String.t()) ::
156+
@spec request(String.t(), list({String.t(), String.t()}), String.t()) ::
150157
{:ok, String.t()} | :error
151-
def request(method, url, headers, body) do
158+
def request(url, headers, body) do
152159
hackney_opts =
153160
Config.hackney_opts()
154161
|> Keyword.put_new(:pool, @hackney_pool_name)
155162

156-
with {:ok, 200, _, client} <- :hackney.request(method, url, headers, body, hackney_opts),
163+
with {:ok, 200, _, client} <- :hackney.request(:post, url, headers, body, hackney_opts),
157164
{:ok, body} <- :hackney.body(client),
158165
{:ok, json} <- Poison.decode(body) do
159166
{:ok, Map.get(json, "id")}
160167
else
161168
{:ok, status, headers, client} ->
162169
:hackney.skip_body(client)
163170
error_header = :proplists.get_value("X-Sentry-Error", headers, "")
164-
log_api_error("#{body}\nReceived #{status} from Sentry server: #{error_header}")
165-
:error
171+
error = "Received #{status} from Sentry server: #{error_header}"
172+
{:error, error}
166173

167174
e ->
168-
log_api_error("#{inspect(e)}\n#{body}")
169-
:error
175+
{:error, e}
170176
end
171177
end
172178

@@ -329,13 +335,10 @@ defmodule Sentry.Client do
329335
end)
330336
end
331337

332-
defp sleep(attempt_number) do
333-
# sleep 2^n seconds
334-
:math.pow(2, attempt_number)
335-
|> Kernel.*(1000)
336-
|> Kernel.round()
337-
|> :timer.sleep()
338-
end
338+
defp sleep(1), do: :timer.sleep(2000)
339+
defp sleep(2), do: :timer.sleep(4000)
340+
defp sleep(3), do: :timer.sleep(8000)
341+
defp sleep(_), do: :timer.sleep(8000)
339342

340343
defp sample_event?(1), do: true
341344
defp sample_event?(1.0), do: true

test/support/test_client.exs

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,21 @@ defmodule Sentry.TestClient do
1010
|> Poison.encode()
1111
|> case do
1212
{:ok, body} ->
13-
Sentry.Client.request(:post, endpoint, [], body)
13+
case Sentry.Client.request(endpoint, [], body) do
14+
{:ok, id} ->
15+
{:ok, id}
16+
17+
{:error, error} ->
18+
Logger.warn(fn ->
19+
[
20+
"Failed to send Sentry event.",
21+
?\n,
22+
"Event ID: #{event.event_id} - #{inspect(error)} - #{body}"
23+
]
24+
end)
25+
26+
:error
27+
end
1428

1529
{:error, error} ->
1630
Logger.error("Error sending in Sentry.TestClient: #{inspect(error)}")

0 commit comments

Comments
 (0)