Browse Source

feat(issue-platform): Support searching for issue platform issues using conditions (#42647)

Added in definitions for all issue platform columns, passed conditions
to the query and modified test cases a bit to validate the conditions
are properly being filtered on.
Dan Fuller 2 years ago
parent
commit
3f4fe7f388
3 changed files with 64 additions and 3 deletions
  1. 1 1
      src/sentry/issues/search.py
  2. 48 0
      src/sentry/snuba/events.py
  3. 15 2
      tests/snuba/search/test_backend.py

+ 1 - 1
src/sentry/issues/search.py

@@ -210,7 +210,7 @@ def _query_params_for_generic(
             dataset=snuba.Dataset.IssuePlatform,
             selected_columns=selected_columns,
             filter_keys=filters,
-            conditions=[],
+            conditions=conditions,
             aggregations=aggregations,
             condition_resolver=functools.partial(
                 snuba.get_snuba_column_name, dataset=snuba.Dataset.IssuePlatform

+ 48 - 0
src/sentry/snuba/events.py

@@ -83,6 +83,7 @@ class Columns(Enum):
         event_name="culprit",
         transaction_name=None,
         discover_name="culprit",
+        issue_platform_name="culprit",
         alias="culprit",
     )
     LOCATION = Column(
@@ -90,6 +91,7 @@ class Columns(Enum):
         event_name="location",
         transaction_name=None,
         discover_name="location",
+        issue_platform_name="location",
         alias="location",
     )
     MESSAGE = Column(
@@ -97,6 +99,7 @@ class Columns(Enum):
         event_name="message",
         transaction_name="transaction_name",
         discover_name="message",
+        issue_platform_name="message",
         alias="message",
     )
     PLATFORM = Column(
@@ -104,6 +107,7 @@ class Columns(Enum):
         event_name="platform",
         transaction_name="platform",
         discover_name="platform",
+        issue_platform_name="platform",
         alias="platform.name",
     )
     ENVIRONMENT = Column(
@@ -111,6 +115,7 @@ class Columns(Enum):
         event_name="environment",
         transaction_name="environment",
         discover_name="environment",
+        issue_platform_name="environment",
         alias="environment",
     )
     RELEASE = Column(
@@ -118,6 +123,7 @@ class Columns(Enum):
         event_name="tags[sentry:release]",
         transaction_name="release",
         discover_name="release",
+        issue_platform_name="release",
         alias="release",
     )
     DIST = Column(
@@ -125,6 +131,7 @@ class Columns(Enum):
         event_name="tags[sentry:dist]",
         transaction_name="dist",
         discover_name="dist",
+        issue_platform_name="dist",
         alias="dist",
     )
     TITLE = Column(
@@ -132,6 +139,7 @@ class Columns(Enum):
         event_name="title",
         transaction_name="transaction_name",
         discover_name="title",
+        issue_platform_name="search_title",
         alias="title",
     )
     TYPE = Column(
@@ -146,6 +154,7 @@ class Columns(Enum):
         event_name="tags.key",
         transaction_name="tags.key",
         discover_name="tags.key",
+        issue_platform_name="tags.key",
         alias="tags.key",
     )
     TAGS_VALUE = Column(
@@ -153,6 +162,7 @@ class Columns(Enum):
         event_name="tags.value",
         transaction_name="tags.value",
         discover_name="tags.value",
+        issue_platform_name="tags.value",
         alias="tags.value",
     )
     TAGS_KEYS = Column(
@@ -160,6 +170,7 @@ class Columns(Enum):
         event_name="tags_key",
         transaction_name="tags_key",
         discover_name="tags_key",
+        issue_platform_name="tags_key",
         alias="tags_key",
     )
     TAGS_VALUES = Column(
@@ -167,6 +178,7 @@ class Columns(Enum):
         event_name="tags_value",
         transaction_name="tags_value",
         discover_name="tags_value",
+        issue_platform_name="tags_value",
         alias="tags_value",
     )
     TRANSACTION = Column(
@@ -181,6 +193,7 @@ class Columns(Enum):
         event_name="tags[sentry:user]",
         transaction_name="user",
         discover_name="user",
+        issue_platform_name="user",
         alias="user",
     )
     USER_ID = Column(
@@ -188,6 +201,7 @@ class Columns(Enum):
         event_name="user_id",
         transaction_name="user_id",
         discover_name="user_id",
+        issue_platform_name="user_id",
         alias="user.id",
     )
     USER_EMAIL = Column(
@@ -195,6 +209,7 @@ class Columns(Enum):
         event_name="email",
         transaction_name="user_email",
         discover_name="email",
+        issue_platform_name="user_email",
         alias="user.email",
     )
     USER_USERNAME = Column(
@@ -202,6 +217,7 @@ class Columns(Enum):
         event_name="username",
         transaction_name="user_name",
         discover_name="username",
+        issue_platform_name="user_name",
         alias="user.username",
     )
     USER_IP_ADDRESS = Column(
@@ -209,6 +225,7 @@ class Columns(Enum):
         event_name="ip_address",
         transaction_name="ip_address",
         discover_name="ip_address",
+        issue_platform_name="ip_address_v4",
         alias="user.ip",
     )
     USER_DISPLAY = Column(
@@ -223,6 +240,7 @@ class Columns(Enum):
         event_name="sdk_name",
         transaction_name="sdk_name",
         discover_name="sdk_name",
+        issue_platform_name="sdk_name",
         alias="sdk.name",
     )
     SDK_VERSION = Column(
@@ -230,6 +248,7 @@ class Columns(Enum):
         event_name="sdk_version",
         transaction_name="sdk_version",
         discover_name="sdk_version",
+        issue_platform_name="sdk_version",
         alias="sdk.version",
     )
 
@@ -238,6 +257,7 @@ class Columns(Enum):
         event_name="http_method",
         transaction_name="http_method",
         discover_name="http_method",
+        issue_platform_name="http_method",
         alias="http.method",
     )
     HTTP_REFERER = Column(
@@ -245,6 +265,7 @@ class Columns(Enum):
         event_name="http_referer",
         transaction_name="http_referer",
         discover_name="http_referer",
+        issue_platform_name="http_referer",
         alias="http.referer",
     )
     HTTP_URL = Column(
@@ -252,6 +273,7 @@ class Columns(Enum):
         event_name="tags[url]",
         transaction_name="tags[url]",
         discover_name="tags[url]",
+        issue_platform_name="tags[url]",
         alias="http.url",
     )
     HTTP_STATUS_CODE = Column(
@@ -259,6 +281,7 @@ class Columns(Enum):
         event_name="contexts[response.status_code]",
         transaction_name="contexts[response.status_code]",
         discover_name="contexts[response.status_code]",
+        issue_platform_name="contexts[response.status_code",
         alias="http.status_code",
     )
     OS_BUILD = Column(
@@ -266,6 +289,7 @@ class Columns(Enum):
         event_name="contexts[os.build]",
         transaction_name="contexts[os.build]",
         discover_name="contexts[os.build]",
+        issue_platform_name="contexts[os.build]",
         alias="os.build",
     )
     OS_KERNEL_VERSION = Column(
@@ -273,6 +297,7 @@ class Columns(Enum):
         event_name="contexts[os.kernel_version]",
         transaction_name="contexts[os.kernel_version]",
         discover_name="contexts[os.kernel_version]",
+        issue_platform_name="contexts[os.kernel_version]",
         alias="os.kernel_version",
     )
     DEVICE_ARCH = Column(
@@ -280,6 +305,7 @@ class Columns(Enum):
         event_name="contexts[device.arch]",
         transaction_name="contexts[device.arch]",
         discover_name="contexts[device.arch]",
+        issue_platform_name="contexts[device.arch]",
         alias="device.arch",
     )
     DEVICE_BATTERY_LEVEL = Column(
@@ -287,6 +313,7 @@ class Columns(Enum):
         event_name="contexts[device.battery_level]",
         transaction_name="contexts[device.battery_level]",
         discover_name="contexts[device.battery_level]",
+        issue_platform_name="contexts[device.battery_level]",
         alias="device.battery_level",
     )
     DEVICE_BRAND = Column(
@@ -294,6 +321,7 @@ class Columns(Enum):
         event_name="contexts[device.brand]",
         transaction_name="contexts[device.brand]",
         discover_name="contexts[device.brand]",
+        issue_platform_name="contexts[device.brand]",
         alias="device.brand",
     )
     DEVICE_CHARGING = Column(
@@ -301,6 +329,7 @@ class Columns(Enum):
         event_name="contexts[device.charging]",
         transaction_name="contexts[device.charging]",
         discover_name="contexts[device.charging]",
+        issue_platform_name="contexts[device.charging]",
         alias="device.charging",
     )
     DEVICE_LOCALE = Column(
@@ -308,6 +337,7 @@ class Columns(Enum):
         event_name="contexts[device.locale]",
         transaction_name="contexts[device.locale]",
         discover_name="contexts[device.locale]",
+        issue_platform_name="contexts[device.locale]",
         alias="device.locale",
     )
     DEVICE_MODEL_ID = Column(
@@ -315,6 +345,7 @@ class Columns(Enum):
         event_name="contexts[device.model_id]",
         transaction_name="contexts[device.model_id]",
         discover_name="contexts[device.model_id]",
+        issue_platform_name="contexts[device.model_id]",
         alias="device.model_id",
     )
     DEVICE_NAME = Column(
@@ -322,6 +353,7 @@ class Columns(Enum):
         event_name="contexts[device.name]",
         transaction_name="contexts[device.name]",
         discover_name="contexts[device.name]",
+        issue_platform_name="contexts[device.name]",
         alias="device.name",
     )
     DEVICE_ONLINE = Column(
@@ -329,6 +361,7 @@ class Columns(Enum):
         event_name="contexts[device.online]",
         transaction_name="contexts[device.online]",
         discover_name="contexts[device.online]",
+        issue_platform_name="contexts[device.online]",
         alias="device.online",
     )
     DEVICE_ORIENTATION = Column(
@@ -336,6 +369,7 @@ class Columns(Enum):
         event_name="contexts[device.orientation]",
         transaction_name="contexts[device.orientation]",
         discover_name="contexts[device.orientation]",
+        issue_platform_name="contexts[device.orientation]",
         alias="device.orientation",
     )
     DEVICE_SCREEN_DENSITY = Column(
@@ -343,6 +377,7 @@ class Columns(Enum):
         event_name="contexts[device.screen_density]",
         transaction_name="contexts[device.screen_density]",
         discover_name="contexts[device.screen_density]",
+        issue_platform_name="contexts[device.screen_density]",
         alias="device.screen_density",
     )
     DEVICE_SCREEN_DPI = Column(
@@ -350,6 +385,7 @@ class Columns(Enum):
         event_name="contexts[device.screen_dpi]",
         transaction_name="contexts[device.screen_dpi]",
         discover_name="contexts[device.screen_dpi]",
+        issue_platform_name="contexts[device.screen_dpi]",
         alias="device.screen_dpi",
     )
     DEVICE_SCREEN_HEIGHT_PIXELS = Column(
@@ -357,6 +393,7 @@ class Columns(Enum):
         event_name="contexts[device.screen_height_pixels]",
         transaction_name="contexts[device.screen_height_pixels]",
         discover_name="contexts[device.screen_height_pixels]",
+        issue_platform_name="contexts[device.screen_heigh_pixels]",
         alias="device.screen_height_pixels",
     )
     DEVICE_SCREEN_WIDTH_PIXELS = Column(
@@ -364,6 +401,7 @@ class Columns(Enum):
         event_name="contexts[device.screen_width_pixels]",
         transaction_name="contexts[device.screen_width_pixels]",
         discover_name="contexts[device.screen_width_pixels]",
+        issue_platform_name="contexts[device.screen_width_pixels]",
         alias="device.screen_width_pixels",
     )
     DEVICE_SIMULATOR = Column(
@@ -371,6 +409,7 @@ class Columns(Enum):
         event_name="contexts[device.simulator]",
         transaction_name="contexts[device.simulator]",
         discover_name="contexts[device.simulator]",
+        issue_platform_name="contexts[device.simulator]",
         alias="device.simulator",
     )
     DEVICE_UUID = Column(
@@ -378,6 +417,7 @@ class Columns(Enum):
         event_name="contexts[device.uuid]",
         transaction_name="contexts[device.uuid]",
         discover_name="contexts[device.uuid]",
+        issue_platform_name="contexts[device.uuid]",
         alias="device.uuid",
     )
     GEO_COUNTRY_CODE = Column(
@@ -385,6 +425,7 @@ class Columns(Enum):
         event_name="geo_country_code",
         transaction_name="contexts[geo.country_code]",
         discover_name="geo_country_code",
+        issue_platform_name="contexts[geo.country_code]",
         alias="geo.country_code",
     )
     GEO_REGION = Column(
@@ -392,6 +433,7 @@ class Columns(Enum):
         event_name="geo_region",
         transaction_name="contexts[geo.region]",
         discover_name="geo_region",
+        issue_platform_name="contexts[geo.region]",
         alias="geo.region",
     )
     GEO_CITY = Column(
@@ -399,6 +441,7 @@ class Columns(Enum):
         event_name="geo_city",
         transaction_name="contexts[geo.city]",
         discover_name="geo_city",
+        issue_platform_name="contexts[geo.city]",
         alias="geo.city",
     )
     ERROR_TYPE = Column(
@@ -434,6 +477,7 @@ class Columns(Enum):
         event_name="received",
         transaction_name=None,
         discover_name="received",
+        issue_platform_name="receive_timestamp",
         alias="error.received",
     )
     STACK_ABS_PATH = Column(
@@ -504,6 +548,7 @@ class Columns(Enum):
         event_name="contexts.key",
         transaction_name="contexts.key",
         discover_name=None,
+        issue_platform_name="contexts.key",
         alias="contexts.key",
     )
     CONTEXTS_VALUE = Column(
@@ -511,6 +556,7 @@ class Columns(Enum):
         event_name="contexts.value",
         transaction_name="contexts.value",
         discover_name=None,
+        issue_platform_name="contexts.value",
         alias="contexts.value",
     )
     # Transactions specific columns
@@ -597,6 +643,7 @@ class Columns(Enum):
         event_name="contexts[trace.trace_id]",
         transaction_name="trace_id",
         discover_name="contexts[trace.trace_id]",
+        issue_platform_name="contexts[trace.trace_id]",
         alias="trace",
     )
     SPAN_ID = Column(
@@ -627,6 +674,7 @@ class Columns(Enum):
         event_name="contexts[trace.client_sample_rate]",
         transaction_name="contexts[trace.client_sample_rate]",
         discover_name="contexts[trace.client_sample_rate]",
+        issue_platform_name="contexts[trace.client_sample_rate]",
         alias="trace.client_sample_rate",
     )
 

+ 15 - 2
tests/snuba/search/test_backend.py

@@ -2307,7 +2307,7 @@ class EventsGenericSnubaSearchTest(SharedSnubaTest, OccurrenceTestMixin):
         super().setUp()
         self.base_datetime = (datetime.utcnow() - timedelta(days=3)).replace(tzinfo=pytz.utc)
 
-        occurrence, group_info = process_event_and_issue_occurrence(
+        _, group_info = process_event_and_issue_occurrence(
             self.build_occurrence_data(),
             {
                 "event_id": uuid.uuid4().hex,
@@ -2321,7 +2321,7 @@ class EventsGenericSnubaSearchTest(SharedSnubaTest, OccurrenceTestMixin):
         )
         self.profile_group_1 = group_info.group
 
-        occurrence, group_info = process_event_and_issue_occurrence(
+        _, group_info = process_event_and_issue_occurrence(
             self.build_occurrence_data(fingerprint=["put-me-in-group-2"]),
             {
                 "event_id": uuid.uuid4().hex,
@@ -2335,6 +2335,19 @@ class EventsGenericSnubaSearchTest(SharedSnubaTest, OccurrenceTestMixin):
         )
         self.profile_group_2 = group_info.group
 
+        process_event_and_issue_occurrence(
+            self.build_occurrence_data(fingerprint=["put-me-in-group-3"]),
+            {
+                "event_id": uuid.uuid4().hex,
+                "project_id": self.project.id,
+                "title": "some other problem",
+                "platform": "python",
+                "tags": {"my_tag": "2"},
+                "timestamp": before_now(minutes=2).isoformat(),
+                "message_timestamp": before_now(minutes=2).isoformat(),
+            },
+        )
+
         error_event_data = {
             "timestamp": iso_format(self.base_datetime - timedelta(days=20)),
             "message": "bar",