From 5384636c2a44d618aca02facc0547e86361450b1 Mon Sep 17 00:00:00 2001 From: William Mak Date: Wed, 24 Jun 2026 16:51:23 -0400 Subject: [PATCH 1/3] feat(validate): use the filter mode - This uses filter mode which should mean we get less false negatives when validating fields --- .../endpoints/organization_events_validate.py | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/sentry/api/endpoints/organization_events_validate.py b/src/sentry/api/endpoints/organization_events_validate.py index bc9b2943ed5f..b3e9041faf3a 100644 --- a/src/sentry/api/endpoints/organization_events_validate.py +++ b/src/sentry/api/endpoints/organization_events_validate.py @@ -10,6 +10,11 @@ from sentry_protos.snuba.v1.endpoint_trace_item_attributes_pb2 import TraceItemAttributeNamesRequest from sentry_protos.snuba.v1.request_common_pb2 import RequestMeta from sentry_protos.snuba.v1.trace_item_attribute_pb2 import AttributeKey +from sentry_protos.snuba.v1.trace_item_filter_pb2 import ( + ExistsFilter, + OrFilter, + TraceItemFilter, +) from sentry.api.api_publish_status import ApiPublishStatus from sentry.api.base import cell_silo_endpoint @@ -84,12 +89,22 @@ def _check_attributes_by_type( return set() requested_names = set(attribute.internal_name for attribute in attributes) - # TODO(wmak): Need to update snuba here so we can pass the list of attributes, snuba currently does a hasAll if we - # pass names in a OrFilter which means only rows with _all_ attributes will return attrs_request = TraceItemAttributeNamesRequest( meta=meta, limit=10_000, type=attr_type, + filter_mode=TraceItemAttributeNamesRequest.FilterMode.FILTER_MODE_MATCH_ANY, + # This filter doesn't actually matter snuba just recollects all the columns + intersecting_attributes_filter=TraceItemFilter( + or_filter=OrFilter( + filters=[ + TraceItemFilter( + exists_filter=ExistsFilter(key=AttributeKey(type=attr_type, name=name)) + ) + for name in requested_names + ] + ) + ), ) attrs_response = snuba_rpc.attribute_names_rpc(attrs_request) return { From 8dc8370cb93e543edcc58d1b1bcfbc061e98ecc1 Mon Sep 17 00:00:00 2001 From: William Mak Date: Wed, 24 Jun 2026 17:14:45 -0400 Subject: [PATCH 2/3] fix: s/Filter/Match/ --- src/sentry/api/endpoints/organization_events_validate.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/sentry/api/endpoints/organization_events_validate.py b/src/sentry/api/endpoints/organization_events_validate.py index b3e9041faf3a..86413a556d63 100644 --- a/src/sentry/api/endpoints/organization_events_validate.py +++ b/src/sentry/api/endpoints/organization_events_validate.py @@ -89,11 +89,13 @@ def _check_attributes_by_type( return set() requested_names = set(attribute.internal_name for attribute in attributes) + # TODO(wmak): Need to update snuba here so we can pass the list of attributes, snuba currently does a hasAll if we + # pass names in a OrFilter which means only rows with _all_ attributes will return attrs_request = TraceItemAttributeNamesRequest( meta=meta, limit=10_000, type=attr_type, - filter_mode=TraceItemAttributeNamesRequest.FilterMode.FILTER_MODE_MATCH_ANY, + match_mode=TraceItemAttributeNamesRequest.MatchMode.MATCH_MODE_ANY, # This filter doesn't actually matter snuba just recollects all the columns intersecting_attributes_filter=TraceItemFilter( or_filter=OrFilter( From 75aa8f7a2dad8d3fed7341e35d96fa7c7fc95fb5 Mon Sep 17 00:00:00 2001 From: William Mak Date: Thu, 25 Jun 2026 14:05:14 -0400 Subject: [PATCH 3/3] chore: update sentry-protos version --- pyproject.toml | 2 +- uv.lock | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index ff0b1f6d520b..ceb0b3577e38 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -92,7 +92,7 @@ dependencies = [ "sentry-ophio>=1.1.3", # sentry-options is only used in getsentry for now "sentry-options>=1.0.13", - "sentry-protos>=0.33.1", + "sentry-protos>=0.34.0", "sentry-redis-tools>=0.5.0", "sentry-relay>=0.9.27", "sentry-scm==0.22.0", diff --git a/uv.lock b/uv.lock index 94517c6a7f44..4b10360ec97e 100644 --- a/uv.lock +++ b/uv.lock @@ -2412,7 +2412,7 @@ requires-dist = [ { name = "sentry-kafka-schemas", specifier = ">=2.1.36" }, { name = "sentry-ophio", specifier = ">=1.1.3" }, { name = "sentry-options", specifier = ">=1.0.13" }, - { name = "sentry-protos", specifier = ">=0.33.1" }, + { name = "sentry-protos", specifier = ">=0.34.0" }, { name = "sentry-redis-tools", specifier = ">=0.5.0" }, { name = "sentry-relay", specifier = ">=0.9.27" }, { name = "sentry-scm", specifier = "==0.22.0" }, @@ -2596,7 +2596,7 @@ wheels = [ [[package]] name = "sentry-protos" -version = "0.33.1" +version = "0.34.1" source = { registry = "https://pypi.devinfra.sentry.io/simple" } dependencies = [ { name = "grpc-stubs", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, @@ -2604,7 +2604,7 @@ dependencies = [ { name = "protobuf", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] wheels = [ - { url = "https://pypi.devinfra.sentry.io/wheels/sentry_protos-0.33.1-py3-none-any.whl", hash = "sha256:fe5522af805ae47da7a85820712a63bffee5d9aa27bb9c69c47cd4d10022142d" }, + { url = "https://pypi.devinfra.sentry.io/wheels/sentry_protos-0.34.1-py3-none-any.whl", hash = "sha256:f9f471047cb81e0ae6b5931c5929ef134c809d2372e95280a08a5e4d315d551b" }, ] [[package]]