Browse Source

fix(functions): Handle function fingerprint search correctly (#51919)

Fingerprints are numberic but are being filtered on like strings at the
moment.
Tony Xiao 1 year ago
parent
commit
260af6b45d

+ 13 - 0
src/sentry/search/events/datasets/profile_functions.py

@@ -152,11 +152,24 @@ class ProfileFunctionsDatasetConfig(DatasetConfig):
         self,
     ) -> Mapping[str, Callable[[SearchFilter], Optional[WhereType]]]:
         return {
+            "fingerprint": self._fingerprint_filter_converter,
             "message": self._message_filter_converter,
             PROJECT_ALIAS: self._project_slug_filter_converter,
             PROJECT_NAME_ALIAS: self._project_slug_filter_converter,
         }
 
+    def _fingerprint_filter_converter(self, search_filter: SearchFilter) -> Optional[WhereType]:
+        try:
+            return Condition(
+                self.builder.column("fingerprint"),
+                Op.EQ if search_filter.operator in EQUALITY_OPERATORS else Op.NEQ,
+                int(search_filter.value.value),
+            )
+        except ValueError:
+            raise InvalidSearchQuery(
+                "Invalid value for fingerprint condition. Accepted values are numeric."
+            )
+
     def _message_filter_converter(self, search_filter: SearchFilter) -> Optional[WhereType]:
         value = search_filter.value.value
         if search_filter.value.is_wildcard():

+ 10 - 0
tests/sentry/search/events/builder/test_profile_functions.py

@@ -60,6 +60,16 @@ def params():
             Condition(Column("name"), Op("!="), ""),
             id="not empty function",
         ),
+        pytest.param(
+            "fingerprint:123",
+            Condition(Column("fingerprint"), Op("="), 123),
+            id="fingerprint",
+        ),
+        pytest.param(
+            "!fingerprint:123",
+            Condition(Column("fingerprint"), Op("!="), 123),
+            id="not fingerprint",
+        ),
     ],
 )
 @django_db_all