From 491da5e0926f8a907f8c88cb1263895b3cdedd37 Mon Sep 17 00:00:00 2001 From: Radu Woinaroski <5281987+RaduW@users.noreply.github.com> Date: Wed, 15 Nov 2023 18:09:06 +0100 Subject: [PATCH] add support for profile.id --- src/sentry/snuba/metrics/extraction.py | 3 ++- tests/sentry/snuba/test_extraction.py | 24 ++++++++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/src/sentry/snuba/metrics/extraction.py b/src/sentry/snuba/metrics/extraction.py index c7401815b3ba3c..5a999d92de94af 100644 --- a/src/sentry/snuba/metrics/extraction.py +++ b/src/sentry/snuba/metrics/extraction.py @@ -55,7 +55,7 @@ RuleCondition = Union["LogicalRuleCondition", "ComparingRuleCondition", "NotRuleCondition"] # Maps from Discover's field names to event protocol paths. See Relay's -# ``FieldValueProvider`` for supported fields. All fields need to be prefixed +# ``Getter`` implementation for ``Event`` for supported fields. All fields need to be prefixed # with "event.". # List of UI supported search fields is defined in sentry/static/app/utils/fields/index.ts _SEARCH_TO_PROTOCOL_FIELDS = { @@ -111,6 +111,7 @@ "transaction.op": "contexts.trace.op", "http.status_code": "contexts.response.status_code", "unreal.crash_type": "contexts.unreal.crash_type", + "profile.id": "contexts.profile.profile_id", # Computed fields "transaction.duration": "duration", "release.build": "release.build", diff --git a/tests/sentry/snuba/test_extraction.py b/tests/sentry/snuba/test_extraction.py index 27ce32766b0295..ee15706057e32f 100644 --- a/tests/sentry/snuba/test_extraction.py +++ b/tests/sentry/snuba/test_extraction.py @@ -6,6 +6,7 @@ from sentry.snuba.dataset import Dataset from sentry.snuba.metrics.extraction import ( OnDemandMetricSpec, + SearchQueryConverter, apdex_tag_spec, cleanup_query, failure_tag_spec, @@ -653,3 +654,26 @@ def test_to_standard_metrics_query(dirty, clean): clean_tokens = parse_search_query(clean) assert cleaned_up_tokens == clean_tokens + + +@pytest.mark.parametrize( + "query, expected", + [ + ( + "has:profile.id", + { + "op": "not", + "inner": {"op": "eq", "name": "event.contexts.profile.profile_id", "value": None}, + }, + ), + ( + "profile.id:abc123", + {"op": "eq", "name": "event.contexts.profile.profile_id", "value": "abc123"}, + ), + ], +) +def test_search_query_converter(query, expected): + tokens = parse_search_query(query) + converter = SearchQueryConverter(tokens) + condition = converter.convert() + assert expected == condition