Skip to content

Commit 0df7f45

Browse files
authored
fix(logs): Expect log_item as rate limit category (#4798)
The data category for rate limiting logs is `log_item`, not `log`. Closes #4797
1 parent 5747863 commit 0df7f45

File tree

4 files changed

+62
-4
lines changed

4 files changed

+62
-4
lines changed

sentry_sdk/_types.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -269,7 +269,7 @@ class SDKInfo(TypedDict):
269269
"metric_bucket",
270270
"monitor",
271271
"span",
272-
"log",
272+
"log_item",
273273
]
274274
SessionStatus = Literal["ok", "exited", "crashed", "abnormal"]
275275

sentry_sdk/envelope.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -273,7 +273,7 @@ def data_category(self):
273273
elif ty == "event":
274274
return "error"
275275
elif ty == "log":
276-
return "log"
276+
return "log_item"
277277
elif ty == "client_report":
278278
return "internal"
279279
elif ty == "profile":

tests/test_envelope.py

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from sentry_sdk.envelope import Envelope
1+
from sentry_sdk.envelope import Envelope, Item, PayloadRef
22
from sentry_sdk.session import Session
33
from sentry_sdk import capture_event
44
import sentry_sdk.client
@@ -239,3 +239,24 @@ def test_envelope_without_headers():
239239

240240
assert len(items) == 1
241241
assert items[0].payload.get_bytes() == b'{"started": "2020-02-07T14:16:00Z"}'
242+
243+
244+
def test_envelope_item_data_category_mapping():
245+
"""Test that envelope items map to correct data categories for rate limiting."""
246+
test_cases = [
247+
("event", "error"),
248+
("transaction", "transaction"),
249+
("log", "log_item"),
250+
("session", "session"),
251+
("attachment", "attachment"),
252+
("client_report", "internal"),
253+
("profile", "profile"),
254+
("profile_chunk", "profile_chunk"),
255+
("statsd", "metric_bucket"),
256+
("check_in", "monitor"),
257+
("unknown_type", "default"),
258+
]
259+
260+
for item_type, expected_category in test_cases:
261+
item = Item(payload=PayloadRef(json={"test": "data"}), type=item_type)
262+
assert item.data_category == expected_category

tests/test_transport.py

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -611,7 +611,7 @@ def test_metric_bucket_limits(capturing_server, response_code, make_client):
611611
assert capturing_server.captured[0].path == "/api/132/envelope/"
612612
capturing_server.clear_captured()
613613

614-
assert set(client.transport._disabled_until) == set(["metric_bucket"])
614+
assert set(client.transport._disabled_until) == {"metric_bucket"}
615615

616616
client.transport.capture_envelope(envelope)
617617
client.capture_event({"type": "transaction"})
@@ -629,6 +629,43 @@ def test_metric_bucket_limits(capturing_server, response_code, make_client):
629629
]
630630

631631

632+
@pytest.mark.parametrize("response_code", [200, 429])
633+
def test_log_item_limits(capturing_server, response_code, make_client):
634+
client = make_client()
635+
capturing_server.respond_with(
636+
code=response_code,
637+
headers={
638+
"X-Sentry-Rate-Limits": "4711:log_item:organization:quota_exceeded:custom"
639+
},
640+
)
641+
642+
envelope = Envelope()
643+
envelope.add_item(Item(payload=b"{}", type="log"))
644+
client.transport.capture_envelope(envelope)
645+
client.flush()
646+
647+
assert len(capturing_server.captured) == 1
648+
assert capturing_server.captured[0].path == "/api/132/envelope/"
649+
capturing_server.clear_captured()
650+
651+
assert set(client.transport._disabled_until) == {"log_item"}
652+
653+
client.transport.capture_envelope(envelope)
654+
client.capture_event({"type": "transaction"})
655+
client.flush()
656+
657+
assert len(capturing_server.captured) == 2
658+
659+
envelope = capturing_server.captured[0].envelope
660+
assert envelope.items[0].type == "transaction"
661+
envelope = capturing_server.captured[1].envelope
662+
assert envelope.items[0].type == "client_report"
663+
report = parse_json(envelope.items[0].get_bytes())
664+
assert report["discarded_events"] == [
665+
{"category": "log_item", "reason": "ratelimit_backoff", "quantity": 1},
666+
]
667+
668+
632669
@pytest.mark.parametrize("response_code", [200, 429])
633670
def test_metric_bucket_limits_with_namespace(
634671
capturing_server, response_code, make_client

0 commit comments

Comments
 (0)