Browse Source

fix(issues) Fix 500 error in group events on invalid queries (#17534)

Invalid user filtering queries should not trigger 500 errors.

Fixes SENTRY-FA1
Mark Story 5 years ago
parent
commit
1049a1c2fb

+ 9 - 5
src/sentry/api/endpoints/group_events.py

@@ -4,6 +4,7 @@ import six
 
 from datetime import timedelta
 from django.utils import timezone
+from rest_framework.exceptions import ParseError
 from rest_framework.response import Response
 from functools import partial
 
@@ -11,7 +12,7 @@ from functools import partial
 from sentry import eventstore
 from sentry.api.base import DocSection, EnvironmentMixin
 from sentry.api.bases import GroupEndpoint
-from sentry.api.event_search import get_filter
+from sentry.api.event_search import get_filter, InvalidSearchQuery
 from sentry.api.exceptions import ResourceDoesNotExist
 from sentry.api.helpers.environments import get_environments
 from sentry.api.helpers.events import get_direct_hit_response
@@ -67,12 +68,12 @@ class GroupEventsEndpoint(GroupEndpoint, EnvironmentMixin):
         try:
             start, end = get_date_range_from_params(request.GET, optional=True)
         except InvalidParams as e:
-            return Response({"detail": six.text_type(e)}, status=400)
+            raise ParseError(detail=six.text_type(e))
 
         try:
             return self._get_events_snuba(request, group, environments, query, tags, start, end)
         except GroupEventsError as exc:
-            return Response({"detail": six.text_type(exc)}, status=400)
+            raise ParseError(detail=six.text_type(exc))
 
     def _get_events_snuba(self, request, group, environments, query, tags, start, end):
         default_end = timezone.now()
@@ -91,11 +92,14 @@ class GroupEventsEndpoint(GroupEndpoint, EnvironmentMixin):
             params["environment"] = [env.name for env in environments]
 
         full = request.GET.get("full", False)
-        snuba_filter = get_filter(request.GET.get("query", None), params)
+        try:
+            snuba_filter = get_filter(request.GET.get("query", None), params)
+        except InvalidSearchQuery as e:
+            raise ParseError(detail=six.text_type(e))
+
         snuba_filter.conditions.append(["event.type", "!=", "transaction"])
 
         data_fn = partial(eventstore.get_events, referrer="api.group-events", filter=snuba_filter)
-
         serializer = EventSerializer() if full else SimpleEventSerializer()
         return self.paginate(
             request=request,

+ 10 - 0
tests/snuba/api/endpoints/test_group_events.py

@@ -307,6 +307,16 @@ class GroupEventsTest(APITestCase, SnubaTestCase):
         )
         assert response.status_code == 400
 
+    def test_invalid_query(self):
+        self.login_as(user=self.user)
+        first_seen = timezone.now() - timedelta(days=5)
+        group = self.create_group(first_seen=first_seen)
+        response = self.client.get(
+            u"/api/0/issues/{}/events/".format(group.id),
+            data={"statsPeriod": "7d", "query": "foo(bar"},
+        )
+        assert response.status_code == 400
+
     def test_multiple_group(self):
         self.login_as(user=self.user)