Просмотр исходного кода

feat(empty-stacktraces): Flag-protect issue search for the empty_stacktrace.js_console tag (#39617)

Disallow searching for issues with the empty_stacktrace.js_console tag if the `organizations:javascript-console-error-tag` is not set.
Snigdha Sharma 2 лет назад
Родитель
Сommit
fd82705c51

+ 8 - 1
src/sentry/api/endpoints/organization_tags.py

@@ -2,7 +2,7 @@ import sentry_sdk
 from rest_framework.request import Request
 from rest_framework.response import Response
 
-from sentry import tagstore
+from sentry import features, tagstore
 from sentry.api.base import region_silo_endpoint
 from sentry.api.bases import NoProjects, OrganizationEventsEndpointBase
 from sentry.api.serializers import serialize
@@ -29,6 +29,13 @@ class OrganizationTagsEndpoint(OrganizationEventsEndpointBase):
                     # Defaults to True, because the frontend caches these tags globally
                     include_transactions=request.GET.get("include_transactions", "1") == "1",
                 )
+                if not features.has(
+                    "organizations:javascript-console-error-tag",
+                    organization,
+                    actor=None,
+                ):
+                    results = [tag for tag in results if tag != "empty_stacktrace.js_console"]
+
                 # Setting the tag for now since the measurement is still experimental
                 sentry_sdk.set_tag("custom_tags.count", len(results))
                 sentry_sdk.set_tag(

+ 11 - 2
src/sentry/api/issue_search.py

@@ -142,7 +142,15 @@ def convert_query_values(search_filters, projects, user, environments):
     :return: New collection of `SearchFilters`, which may have converted values.
     """
 
-    def convert_search_filter(search_filter):
+    def convert_search_filter(search_filter, organization):
+        if search_filter.key.name == "empty_stacktrace.js_console":
+            if not features.has(
+                "organizations:javascript-console-error-tag", organization, actor=None
+            ):
+                raise InvalidSearchQuery(
+                    "The empty_stacktrace.js_console filter is not supported for this organization"
+                )
+
         if search_filter.key.name in value_converters:
             converter = value_converters[search_filter.key.name]
             new_value = converter(
@@ -162,4 +170,5 @@ def convert_query_values(search_filters, projects, user, environments):
             )
         return search_filter
 
-    return [convert_search_filter(search_filter) for search_filter in search_filters]
+    organization = projects[0].organization
+    return [convert_search_filter(search_filter, organization) for search_filter in search_filters]

+ 16 - 0
tests/sentry/api/test_issue_search.py

@@ -158,6 +158,22 @@ class ParseSearchQueryTest(unittest.TestCase):
         ]
 
 
+class ConvertJavaScriptConsoleTagTest(TestCase):
+    def test_valid(self):
+        filters = [SearchFilter(SearchKey("empty_stacktrace.js_console"), "=", SearchValue(True))]
+        with self.feature("organizations:javascript-console-error-tag"):
+            result = convert_query_values(filters, [self.project], self.user, None)
+            assert result[0].value.raw_value is True
+
+    def test_invalid(self):
+        filters = [SearchFilter(SearchKey("empty_stacktrace.js_console"), "=", SearchValue(True))]
+        with self.feature({"organizations:javascript-console-error-tag": False}) and pytest.raises(
+            InvalidSearchQuery,
+            match="The empty_stacktrace.js_console filter is not supported for this organization",
+        ):
+            convert_query_values(filters, [self.project], self.user, None)
+
+
 class ConvertQueryValuesTest(TestCase):
     def test_valid_converter(self):
         filters = [SearchFilter(SearchKey("assigned_to"), "=", SearchValue("me"))]

+ 2 - 0
tests/snuba/api/endpoints/test_organization_tags.py

@@ -3,11 +3,13 @@ from unittest import mock
 from django.urls import reverse
 
 from sentry.testutils import APITestCase, SnubaTestCase
+from sentry.testutils.helpers import apply_feature_flag_on_cls
 from sentry.testutils.helpers.datetime import before_now, iso_format
 from sentry.testutils.silo import region_silo_test
 
 
 @region_silo_test
+@apply_feature_flag_on_cls("organizations:javascript-console-error-tag")
 class OrganizationTagsTest(APITestCase, SnubaTestCase):
     def setUp(self):
         super().setUp()