Skip to content

Commit 537e3da

Browse files
committed
discard events when rate limited
1 parent 787b496 commit 537e3da

File tree

3 files changed

+23
-3
lines changed

3 files changed

+23
-3
lines changed

lib/sentry/client_report/sender.ex

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ defmodule Sentry.ClientReport.Sender do
3131
| Sentry.CheckIn.t()
3232
| ClientReport.t()
3333
| Sentry.Event.t()
34+
| Sentry.Transaction.t()
3435
def record_discarded_events(reason, event_items, genserver)
3536
when is_list(event_items) do
3637
# We silently ignore events whose reasons aren't valid because we have to add it to the allowlist in Snuba

lib/sentry/transport.ex

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ defmodule Sentry.Transport do
4848
retries_left,
4949
envelope_items
5050
) do
51-
case request(client, endpoint, headers, payload) do
51+
case request(client, endpoint, headers, payload, envelope_items) do
5252
{:ok, id} ->
5353
{:ok, id}
5454

@@ -79,8 +79,19 @@ defmodule Sentry.Transport do
7979
end
8080
end
8181

82-
defp request(client, endpoint, headers, body) do
83-
with {:ok, 200, _headers, body} <-
82+
defp check_rate_limited(envelope_items) do
83+
rate_limited? =
84+
Enum.any?(envelope_items, fn item ->
85+
category = Envelope.get_data_category(item)
86+
RateLimiter.rate_limited?(category)
87+
end)
88+
89+
if rate_limited?, do: {:error, :rate_limited}, else: :ok
90+
end
91+
92+
defp request(client, endpoint, headers, body, envelope_items) do
93+
with :ok <- check_rate_limited(envelope_items),
94+
{:ok, 200, _headers, body} <-
8495
client_post_and_validate_return_value(client, endpoint, headers, body),
8596
{:ok, json} <- Sentry.JSON.decode(body, Config.json_library()) do
8697
{:ok, Map.get(json, "id")}
@@ -91,6 +102,9 @@ defmodule Sentry.Transport do
91102
{:ok, status, headers, body} ->
92103
{:error, {:http, {status, headers, body}}}
93104

105+
{:error, :rate_limited} ->
106+
{:error, :rate_limited}
107+
94108
{:error, reason} ->
95109
{:error, {:request_failure, reason}}
96110
end

test/support/case.ex

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,11 @@ defmodule Sentry.Case do
1010
setup context do
1111
config_before = all_config()
1212

13+
# Clear rate limiter state before each test
14+
if Process.whereis(Sentry.Transport.RateLimiter) do
15+
:ets.delete_all_objects(Sentry.Transport.RateLimiter)
16+
end
17+
1318
on_exit(fn ->
1419
assert config_before == all_config()
1520
end)

0 commit comments

Comments
 (0)