Skip to content

Commit 83d062f

Browse files
authored
ref(rate limits): Tag DD metric w/ rate limit type (#33621)
* ref(rate limits): Tag DD metric w/ rate limit type
1 parent 5c84f12 commit 83d062f

File tree

2 files changed

+66
-5
lines changed

2 files changed

+66
-5
lines changed

src/sentry/middleware/stats.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,15 +66,21 @@ def _record_time(request: Request, status_code: int) -> None:
6666
if not view_path:
6767
return
6868

69+
rate_limit_type = getattr(
70+
getattr(request, "rate_limit_metadata", None), "rate_limit_type", None
71+
)
72+
6973
tags = getattr(request, "_metric_tags", {})
7074
tags.update(
7175
{
7276
"method": request.method,
7377
"status_code": status_code,
7478
"ui_request": is_frontend_request(request),
79+
"rate_limit_type": getattr(rate_limit_type, "value", None)
80+
if rate_limit_type
81+
else None,
7582
}
7683
)
77-
7884
metrics.incr("view.response", instance=view_path, tags=tags, skip_internal=False)
7985

8086
start_time = getattr(request, "_start_time", None)

tests/sentry/middleware/test_stats.py

Lines changed: 59 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,25 @@
22

33
from django.test import RequestFactory
44
from exam import fixture
5+
from rest_framework.permissions import AllowAny
6+
from rest_framework.response import Response
57

8+
from sentry.api.base import Endpoint
9+
from sentry.middleware.ratelimit import RatelimitMiddleware
610
from sentry.middleware.stats import RequestTimingMiddleware, add_request_metric_tags
711
from sentry.testutils import TestCase
812
from sentry.testutils.helpers.faux import Mock
13+
from sentry.types.ratelimit import RateLimit, RateLimitCategory
14+
15+
16+
class RateLimitedEndpoint(Endpoint):
17+
permission_classes = (AllowAny,)
18+
19+
enforce_rate_limit = True
20+
rate_limits = {"GET": {RateLimitCategory.IP: RateLimit(0, 10)}}
21+
22+
def get(self):
23+
return Response({"ok": True})
924

1025

1126
class RequestTimingMiddlewareTest(TestCase):
@@ -23,7 +38,35 @@ def test_records_default_api_metrics(self, incr):
2338
incr.assert_called_with(
2439
"view.response",
2540
instance=request._view_path,
26-
tags={"method": "GET", "status_code": 200, "ui_request": False},
41+
tags={
42+
"method": "GET",
43+
"status_code": 200,
44+
"ui_request": False,
45+
"rate_limit_type": None,
46+
},
47+
skip_internal=False,
48+
)
49+
50+
@patch("sentry.utils.metrics.incr")
51+
def test_records_default_api_metrics_with_rate_limit_type(self, incr):
52+
rate_limit_middleware = RatelimitMiddleware(None)
53+
test_endpoint = RateLimitedEndpoint.as_view()
54+
request = self.factory.get("/")
55+
request._view_path = "/"
56+
response = Mock(status_code=429)
57+
58+
rate_limit_middleware.process_view(request, test_endpoint, [], {})
59+
self.middleware.process_response(request, response)
60+
61+
incr.assert_called_with(
62+
"view.response",
63+
instance=request._view_path,
64+
tags={
65+
"method": "GET",
66+
"status_code": 429,
67+
"ui_request": False,
68+
"rate_limit_type": "fixed_window",
69+
},
2770
skip_internal=False,
2871
)
2972

@@ -39,7 +82,7 @@ def test_records_ui_request(self, incr):
3982
incr.assert_called_with(
4083
"view.response",
4184
instance=request._view_path,
42-
tags={"method": "GET", "status_code": 200, "ui_request": True},
85+
tags={"method": "GET", "status_code": 200, "ui_request": True, "rate_limit_type": None},
4386
skip_internal=False,
4487
)
4588

@@ -56,7 +99,13 @@ def test_records_endpoint_specific_metrics(self, incr):
5699
incr.assert_called_with(
57100
"view.response",
58101
instance=request._view_path,
59-
tags={"method": "GET", "status_code": 200, "ui_request": False, "a": "b"},
102+
tags={
103+
"method": "GET",
104+
"status_code": 200,
105+
"ui_request": False,
106+
"a": "b",
107+
"rate_limit_type": None,
108+
},
60109
skip_internal=False,
61110
)
62111

@@ -74,6 +123,12 @@ def test_add_request_metric_tags(self, incr):
74123
incr.assert_called_with(
75124
"view.response",
76125
instance=request._view_path,
77-
tags={"method": "GET", "status_code": 200, "ui_request": False, "foo": "bar"},
126+
tags={
127+
"method": "GET",
128+
"status_code": 200,
129+
"ui_request": False,
130+
"foo": "bar",
131+
"rate_limit_type": None,
132+
},
78133
skip_internal=False,
79134
)

0 commit comments

Comments
 (0)