From 5e5f4410449a91aca85d735dac8c2314a2c3e95f Mon Sep 17 00:00:00 2001 From: Rahul Saini Date: Fri, 3 Mar 2023 15:54:44 -0800 Subject: [PATCH 01/22] modelid:300, modelid:100, legacy queries --- src/sentry/api/endpoints/organization_stats.py | 2 +- src/sentry/api/endpoints/project_stats.py | 2 +- src/sentry/digests/notifications.py | 9 +++++++-- src/sentry/models/groupsnooze.py | 1 + src/sentry/rules/conditions/event_frequency.py | 1 + src/sentry/tsdb/base.py | 1 + src/sentry/tsdb/dummy.py | 1 + src/sentry/tsdb/inmemory.py | 1 + src/sentry/tsdb/redis.py | 1 + src/sentry/tsdb/snuba.py | 10 +++++++++- 10 files changed, 24 insertions(+), 5 deletions(-) diff --git a/src/sentry/api/endpoints/organization_stats.py b/src/sentry/api/endpoints/organization_stats.py index 677a183c8caac8..4346775b221633 100644 --- a/src/sentry/api/endpoints/organization_stats.py +++ b/src/sentry/api/endpoints/organization_stats.py @@ -91,8 +91,8 @@ def get(self, request: Request, organization) -> Response: data = tsdb.get_range( model=stat_model, keys=keys, - **self._parse_args(request, **query_kwargs), tenant_ids={"organization_id": organization.id}, + **self._parse_args(request, **query_kwargs), ) if group == "organization": diff --git a/src/sentry/api/endpoints/project_stats.py b/src/sentry/api/endpoints/project_stats.py index cbbf728e6fbdd3..3fdddd238c0199 100644 --- a/src/sentry/api/endpoints/project_stats.py +++ b/src/sentry/api/endpoints/project_stats.py @@ -64,8 +64,8 @@ def get(self, request: Request, project) -> Response: data = tsdb.get_range( model=stat_model, keys=[project.id], - **self._parse_args(request, **query_kwargs), tenant_ids={"organization_id": project.organization_id}, + **self._parse_args(request, **query_kwargs), )[project.id] return Response(data) diff --git a/src/sentry/digests/notifications.py b/src/sentry/digests/notifications.py index f659ccb9923294..5f5875f128fde7 100644 --- a/src/sentry/digests/notifications.py +++ b/src/sentry/digests/notifications.py @@ -76,6 +76,7 @@ def fetch_state(project: Project, records: Sequence[Record]) -> Mapping[str, Any end = records[0].datetime groups = Group.objects.in_bulk(record.value.event.group_id for record in records) + tenant_ids = {"organization_id": project.organization_id} return { "project": project, "groups": groups, @@ -87,10 +88,14 @@ def fetch_state(project: Project, records: Sequence[Record]) -> Mapping[str, Any list(groups.keys()), start, end, - tenant_ids={"organization_id": project.organization_id}, + tenant_ids=tenant_ids, ), "user_counts": tsdb.get_distinct_counts_totals( - tsdb.models.users_affected_by_group, list(groups.keys()), start, end + tsdb.models.users_affected_by_group, + list(groups.keys()), + start, + end, + tenant_ids=tenant_ids, ), } diff --git a/src/sentry/models/groupsnooze.py b/src/sentry/models/groupsnooze.py index 166f77c072779b..1a9152a6de6690 100644 --- a/src/sentry/models/groupsnooze.py +++ b/src/sentry/models/groupsnooze.py @@ -119,6 +119,7 @@ def test_user_rates(self): keys=[self.group_id], start=start, end=end, + tenant_ids={"organization_id": self.group.project.organization_id}, )[self.group_id] if rate >= self.user_count: diff --git a/src/sentry/rules/conditions/event_frequency.py b/src/sentry/rules/conditions/event_frequency.py index ea0ae9bfc722e5..aa8049241e58b1 100644 --- a/src/sentry/rules/conditions/event_frequency.py +++ b/src/sentry/rules/conditions/event_frequency.py @@ -258,6 +258,7 @@ def query_hook( environment_id=environment_id, use_cache=True, jitter_value=event.group_id, + tenant_ids={"organization_id": event.group.project.organization_id}, ) return totals[event.group_id] diff --git a/src/sentry/tsdb/base.py b/src/sentry/tsdb/base.py index 47c451a04e26f5..bc446957cbfed0 100644 --- a/src/sentry/tsdb/base.py +++ b/src/sentry/tsdb/base.py @@ -461,6 +461,7 @@ def get_distinct_counts_totals( environment_id=None, use_cache=False, jitter_value=None, + tenant_ids=None, ): """ Count distinct items during a time range. diff --git a/src/sentry/tsdb/dummy.py b/src/sentry/tsdb/dummy.py index 38845dd4231dcd..ae6cee1683c75e 100644 --- a/src/sentry/tsdb/dummy.py +++ b/src/sentry/tsdb/dummy.py @@ -57,6 +57,7 @@ def get_distinct_counts_totals( environment_id=None, use_cache=False, jitter_value=None, + tenant_ids=None, ): self.validate_arguments([model], [environment_id]) return {k: 0 for k in keys} diff --git a/src/sentry/tsdb/inmemory.py b/src/sentry/tsdb/inmemory.py index 5bdcac8abec2f5..77fe973167cc3a 100644 --- a/src/sentry/tsdb/inmemory.py +++ b/src/sentry/tsdb/inmemory.py @@ -138,6 +138,7 @@ def get_distinct_counts_totals( environment_id=None, use_cache=False, jitter_value=None, + tenant_ids=None, ): self.validate_arguments([model], [environment_id]) diff --git a/src/sentry/tsdb/redis.py b/src/sentry/tsdb/redis.py index d321f2da7e7489..ed2b04e162e8e5 100644 --- a/src/sentry/tsdb/redis.py +++ b/src/sentry/tsdb/redis.py @@ -455,6 +455,7 @@ def get_distinct_counts_totals( environment_id=None, use_cache=False, jitter_value=None, + tenant_ids=None, ): """ Count distinct items during a time range. diff --git a/src/sentry/tsdb/snuba.py b/src/sentry/tsdb/snuba.py index b8f652e44b041f..e37349f7e8cc04 100644 --- a/src/sentry/tsdb/snuba.py +++ b/src/sentry/tsdb/snuba.py @@ -326,6 +326,7 @@ def get_data( conditions, use_cache, jitter_value, + tenant_ids, ) def __get_data_snql( @@ -496,6 +497,7 @@ def __get_data_legacy( conditions=None, use_cache=False, jitter_value=None, + tenant_ids=None, ): """ Normalizes all the TSDB parameters and sends a query to snuba. @@ -587,6 +589,9 @@ def __get_data_legacy( orderby.append(model_group) if keys: + referrer = f"tsdb-modelid:{model.value}" + tenant_ids = tenant_ids or dict() + tenant_ids["referrer"] = referrer query_func_without_selected_columns = functools.partial( snuba.query, dataset=model_dataset, @@ -599,9 +604,10 @@ def __get_data_legacy( rollup=rollup, limit=limit, orderby=orderby, - referrer=f"tsdb-modelid:{model.value}", + referrer=referrer, is_grouprelease=(model == TSDBModel.frequent_releases_by_group), use_cache=use_cache, + tenant_ids=tenant_ids, ) if model_query_settings.selected_columns: result = query_func_without_selected_columns( @@ -771,6 +777,7 @@ def get_distinct_counts_totals( environment_id=None, use_cache=False, jitter_value=None, + tenant_ids=None, ): return self.get_data( model, @@ -782,6 +789,7 @@ def get_distinct_counts_totals( aggregation="uniq", use_cache=use_cache, jitter_value=jitter_value, + tenant_ids=tenant_ids, ) def get_distinct_counts_union( From 1e01ace4622c8f76febde7016a4f63ee5b7ef4aa Mon Sep 17 00:00:00 2001 From: Rahul Saini Date: Fri, 3 Mar 2023 16:18:38 -0800 Subject: [PATCH 02/22] get_release_tags + group serializer --- src/sentry/api/serializers/models/group.py | 9 ++++++++- src/sentry/tagstore/snuba/backend.py | 4 +++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/sentry/api/serializers/models/group.py b/src/sentry/api/serializers/models/group.py index deb7e1cdd1180b..1e31bad76bf1e1 100644 --- a/src/sentry/api/serializers/models/group.py +++ b/src/sentry/api/serializers/models/group.py @@ -1007,6 +1007,12 @@ def _execute_error_seen_stats_query( filters = {"project_id": project_ids, "group_id": group_ids} if environment_ids: filters["environment"] = environment_ids + + referrer = "serializers.GroupSerializerSnuba._execute_error_seen_stats_query" + org_id = item_list[0].project.organization_id if item_list else None + tenant_ids = {"organization_id": org_id} if org_id else dict() + tenant_ids["referrer"] = referrer + return aliased_query( dataset=Dataset.Events, start=start, @@ -1015,7 +1021,8 @@ def _execute_error_seen_stats_query( conditions=conditions, filter_keys=filters, aggregations=aggregations, - referrer="serializers.GroupSerializerSnuba._execute_error_seen_stats_query", + referrer=referrer, + tenant_ids=tenant_ids, ) @staticmethod diff --git a/src/sentry/tagstore/snuba/backend.py b/src/sentry/tagstore/snuba/backend.py index 8d210c5b484e1b..ca09e82d636269 100644 --- a/src/sentry/tagstore/snuba/backend.py +++ b/src/sentry/tagstore/snuba/backend.py @@ -736,6 +736,7 @@ def get_release_tags(self, organization_id, project_ids, environment_id, version ["max", SEEN_COLUMN, "last_seen"], ] start = self.get_min_start_date(organization_id, project_ids, environment_id, versions) + referrer = "tagstore.get_release_tags" result = snuba.query( dataset=Dataset.Events, start=start, @@ -744,7 +745,8 @@ def get_release_tags(self, organization_id, project_ids, environment_id, version filter_keys=filters, aggregations=aggregations, orderby="-times_seen", - referrer="tagstore.get_release_tags", + referrer=referrer, + tenant_ids={"organization_id": organization_id, "referrer": referrer}, ) values = [] From b29da144b23d5e0cb9a3d1a060fd2fde288e79a3 Mon Sep 17 00:00:00 2001 From: Rahul Saini Date: Mon, 6 Mar 2023 15:57:36 -0800 Subject: [PATCH 03/22] Add referrer to tenant ids at query level instead --- src/sentry/utils/snuba.py | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/src/sentry/utils/snuba.py b/src/sentry/utils/snuba.py index 287781577cf7e1..bc2933af233e1c 100644 --- a/src/sentry/utils/snuba.py +++ b/src/sentry/utils/snuba.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import functools import logging import os @@ -568,7 +570,7 @@ def _prepare_start_end( return start, end -def _prepare_query_params(query_params): +def _prepare_query_params(query_params: SnubaQueryParams, referrer: str | None = None): kwargs = deepcopy(query_params.kwargs) query_params_conditions = deepcopy(query_params.conditions) @@ -626,6 +628,10 @@ def _prepare_query_params(query_params): ) kwargs = {k: v for k, v in kwargs.items() if v is not None} + if referrer: + kwargs["tenant_ids"] = kwargs["tenant_ids"] if "tenant_ids" in kwargs else dict() + kwargs["tenant_ids"]["referrer"] = referrer + kwargs.update(OVERRIDE_OPTIONS) return kwargs, forward, reverse @@ -709,6 +715,11 @@ def raw_query( Sends a query to snuba. See `SnubaQueryParams` docstring for param descriptions. """ + + if referrer: + kwargs["tenant_ids"] = kwargs["tenant_ids"] if "tenant_ids" in kwargs else dict() + kwargs["tenant_ids"]["referrer"] = referrer + snuba_params = SnubaQueryParams( dataset=dataset, start=start, @@ -743,6 +754,10 @@ def raw_snql_query( if "consistent" in OVERRIDE_OPTIONS: request.flags.consistent = OVERRIDE_OPTIONS["consistent"] + if referrer: + request.tenant_ids = request.tenant_ids or dict() + request.tenant_ids["referrer"] = referrer + params: SnubaQueryBody = (request, lambda x: x, lambda x: x) return _apply_cache_and_build_results([params], referrer=referrer, use_cache=use_cache)[0] @@ -759,6 +774,12 @@ def bulk_snql_query( if "consistent" in OVERRIDE_OPTIONS: for request in requests: request.flags.consistent = OVERRIDE_OPTIONS["consistent"] + + for request in requests: + if referrer: + request.tenant_ids = request.tenant_ids or dict() + request.tenant_ids["referrer"] = referrer + params: SnubaQuery = [(request, lambda x: x, lambda x: x) for request in requests] return _apply_cache_and_build_results(params, referrer=referrer, use_cache=use_cache) @@ -778,7 +799,7 @@ def bulk_raw_query( referrer: Optional[str] = None, use_cache: Optional[bool] = False, ) -> ResultSet: - params = [_prepare_query_params(param) for param in snuba_param_list] + params = [_prepare_query_params(param, referrer) for param in snuba_param_list] return _apply_cache_and_build_results(params, referrer=referrer, use_cache=use_cache) From 95cb90217fccfab6ee319e929fdde9f6592750a3 Mon Sep 17 00:00:00 2001 From: Rahul Saini Date: Mon, 6 Mar 2023 16:04:25 -0800 Subject: [PATCH 04/22] remove hardcoded referrer --- src/sentry/api/endpoints/group_hashes_split.py | 7 ++----- src/sentry/api/endpoints/grouping_level_new_issues.py | 2 +- src/sentry/api/endpoints/grouping_levels.py | 2 +- src/sentry/api/endpoints/organization_events_span_ops.py | 2 +- src/sentry/api/endpoints/project_dynamic_sampling.py | 4 ++-- src/sentry/api/serializers/models/group.py | 1 - .../ingest/transaction_clusterer/datasource/snuba.py | 2 +- src/sentry/release_health/release_monitor/metrics.py | 2 +- src/sentry/snuba/metrics/fields/base.py | 2 +- src/sentry/snuba/sessions.py | 4 ++-- src/sentry/tagstore/snuba/backend.py | 2 +- src/sentry/tsdb/snuba.py | 2 -- 12 files changed, 13 insertions(+), 19 deletions(-) diff --git a/src/sentry/api/endpoints/group_hashes_split.py b/src/sentry/api/endpoints/group_hashes_split.py index 3250c1a4c8b385..868877dbb46dc9 100644 --- a/src/sentry/api/endpoints/group_hashes_split.py +++ b/src/sentry/api/endpoints/group_hashes_split.py @@ -164,7 +164,7 @@ def _get_full_hierarchical_hashes(group: Group, hash: str) -> Optional[Sequence[ dataset="events", app_id="grouping", query=query, - tenant_ids={"referrer": referrer, "organization_id": group.project.organization_id}, + tenant_ids={"organization_id": group.project.organization_id}, ) data = snuba.raw_snql_query(request, referrer)["data"] if not data: @@ -395,10 +395,7 @@ def _render_trees(group: Group, user): dataset="events", app_id="grouping", query=query, - tenant_ids={ - "referrer": referrer, - "organization_id": group.project.organization_id, - }, + tenant_ids={"organization_id": group.project.organization_id}, ) for row in snuba.raw_snql_query(request, referrer)["data"]: if len(row["hash_slice"]) == 0: diff --git a/src/sentry/api/endpoints/grouping_level_new_issues.py b/src/sentry/api/endpoints/grouping_level_new_issues.py index 712d86b37a42ec..3e2837a17b2582 100644 --- a/src/sentry/api/endpoints/grouping_level_new_issues.py +++ b/src/sentry/api/endpoints/grouping_level_new_issues.py @@ -200,7 +200,7 @@ def _query_snuba(group: Group, id: int, offset=None, limit=None): dataset="events", app_id="grouping", query=query, - tenant_ids={"referrer": referrer, "organization_id": group.project.organization_id}, + tenant_ids={"organization_id": group.project.organization_id}, ) return snuba.raw_snql_query(request, referrer)["data"] diff --git a/src/sentry/api/endpoints/grouping_levels.py b/src/sentry/api/endpoints/grouping_levels.py index 9c25ad0a89e0a3..d9558e9858555e 100644 --- a/src/sentry/api/endpoints/grouping_levels.py +++ b/src/sentry/api/endpoints/grouping_levels.py @@ -132,7 +132,7 @@ def get_levels_overview(group: Group): dataset="events", app_id="grouping", query=query, - tenant_ids={"referrer": referrer, "organization_id": group.project.organization_id}, + tenant_ids={"organization_id": group.project.organization_id}, ) res = snuba.raw_snql_query(request, referrer) diff --git a/src/sentry/api/endpoints/organization_events_span_ops.py b/src/sentry/api/endpoints/organization_events_span_ops.py index 7c110efb11ea64..a676e120010293 100644 --- a/src/sentry/api/endpoints/organization_events_span_ops.py +++ b/src/sentry/api/endpoints/organization_events_span_ops.py @@ -40,7 +40,7 @@ def data_fn(offset: int, limit: int) -> Any: ) referrer = "api.organization-events-span-ops" snql_query = builder.get_snql_query() - snql_query.tenant_ids = {"referrer": referrer, "organization_id": organization.id} + snql_query.tenant_ids = {"organization_id": organization.id} results = raw_snql_query(snql_query, referrer) return [SpanOp(op=row["spans_op"], count=row["count"]) for row in results["data"]] diff --git a/src/sentry/api/endpoints/project_dynamic_sampling.py b/src/sentry/api/endpoints/project_dynamic_sampling.py index 994ae8fe057f94..56b99ea178fa89 100644 --- a/src/sentry/api/endpoints/project_dynamic_sampling.py +++ b/src/sentry/api/endpoints/project_dynamic_sampling.py @@ -117,7 +117,7 @@ def __project_stats_query(self, query, projects_in_org, org_id, query_time_range dataset=Dataset.Discover.value, app_id="default", query=snuba_query, - tenant_ids={"referrer": referrer, "organization_id": org_id}, + tenant_ids={"organization_id": org_id}, ), referrer, ) @@ -277,7 +277,7 @@ def __fetch_randomly_sampled_transactions(self, project, query, sample_size, que dataset=Dataset.Discover.value, app_id="default", query=snuba_query, - tenant_ids={"referrer": referrer, "organization_id": project.organization_id}, + tenant_ids={"organization_id": project.organization_id}, ), referrer, )["data"] diff --git a/src/sentry/api/serializers/models/group.py b/src/sentry/api/serializers/models/group.py index 1e31bad76bf1e1..0da052c95858f1 100644 --- a/src/sentry/api/serializers/models/group.py +++ b/src/sentry/api/serializers/models/group.py @@ -1011,7 +1011,6 @@ def _execute_error_seen_stats_query( referrer = "serializers.GroupSerializerSnuba._execute_error_seen_stats_query" org_id = item_list[0].project.organization_id if item_list else None tenant_ids = {"organization_id": org_id} if org_id else dict() - tenant_ids["referrer"] = referrer return aliased_query( dataset=Dataset.Events, diff --git a/src/sentry/ingest/transaction_clusterer/datasource/snuba.py b/src/sentry/ingest/transaction_clusterer/datasource/snuba.py index 2394896d105c43..eb6e0bc8952925 100644 --- a/src/sentry/ingest/transaction_clusterer/datasource/snuba.py +++ b/src/sentry/ingest/transaction_clusterer/datasource/snuba.py @@ -28,7 +28,7 @@ def fetch_unique_transaction_names( groupby=[Column("transaction")], limit=Limit(limit), ), - tenant_ids={"referrer": referrer, "organization_id": project.organization_id}, + tenant_ids={"organization_id": project.organization_id}, ) snuba_response = raw_snql_query(snuba_request, referrer) diff --git a/src/sentry/release_health/release_monitor/metrics.py b/src/sentry/release_health/release_monitor/metrics.py index 7485841b5b27e0..c8716534b608ed 100644 --- a/src/sentry/release_health/release_monitor/metrics.py +++ b/src/sentry/release_health/release_monitor/metrics.py @@ -152,7 +152,7 @@ def fetch_project_release_health_totals( dataset=Dataset.Metrics.value, app_id="release_health", query=query, - tenant_ids={"referrer": referrer, "organization_id": org_id}, + tenant_ids={"organization_id": org_id}, ) with metrics.timer("release_monitor.fetch_project_release_health_totals.query"): data = raw_snql_query(request, referrer)["data"] diff --git a/src/sentry/snuba/metrics/fields/base.py b/src/sentry/snuba/metrics/fields/base.py index affff6a872a2c7..73b05a4b9b127d 100644 --- a/src/sentry/snuba/metrics/fields/base.py +++ b/src/sentry/snuba/metrics/fields/base.py @@ -149,7 +149,7 @@ def run_metrics_query( dataset=Dataset.Metrics.value, app_id="metrics", query=query, - tenant_ids={"referrer": referrer, "organization_id": org_id}, + tenant_ids={"organization_id": org_id}, ) result = raw_snql_query(request, referrer, use_cache=True) return cast(List[SnubaDataType], result["data"]) diff --git a/src/sentry/snuba/sessions.py b/src/sentry/snuba/sessions.py index 2cbb128cef1b39..2ae4558fde5758 100644 --- a/src/sentry/snuba/sessions.py +++ b/src/sentry/snuba/sessions.py @@ -160,7 +160,7 @@ def _check_releases_have_health_data( dataset="sessions", app_id="default", query=query, - tenant_ids={"referrer": referrer, "organization_id": organization_id}, + tenant_ids={"organization_id": organization_id}, ) data = snuba.raw_snql_query(request, referrer)["data"] return {row["release"] for row in data} @@ -274,7 +274,7 @@ def _get_project_releases_count( dataset="sessions", app_id="default", query=query, - tenant_ids={"referrer": referrer, "organization_id": organization_id}, + tenant_ids={"organization_id": organization_id}, ) data = snuba.raw_snql_query(request, referrer)["data"] return data[0]["count"] if data else 0 diff --git a/src/sentry/tagstore/snuba/backend.py b/src/sentry/tagstore/snuba/backend.py index ca09e82d636269..d855f378a469a3 100644 --- a/src/sentry/tagstore/snuba/backend.py +++ b/src/sentry/tagstore/snuba/backend.py @@ -746,7 +746,7 @@ def get_release_tags(self, organization_id, project_ids, environment_id, version aggregations=aggregations, orderby="-times_seen", referrer=referrer, - tenant_ids={"organization_id": organization_id, "referrer": referrer}, + tenant_ids={"organization_id": organization_id}, ) values = [] diff --git a/src/sentry/tsdb/snuba.py b/src/sentry/tsdb/snuba.py index e37349f7e8cc04..31307a9e080853 100644 --- a/src/sentry/tsdb/snuba.py +++ b/src/sentry/tsdb/snuba.py @@ -444,7 +444,6 @@ def __get_data_snql( referrer = f"tsdb-modelid:{model.value}" tenant_ids = tenant_ids or dict() - tenant_ids["referrer"] = referrer snql_request = Request( dataset=model_dataset.value, app_id="tsdb.get_data", @@ -591,7 +590,6 @@ def __get_data_legacy( if keys: referrer = f"tsdb-modelid:{model.value}" tenant_ids = tenant_ids or dict() - tenant_ids["referrer"] = referrer query_func_without_selected_columns = functools.partial( snuba.query, dataset=model_dataset, From 446bfeb780a14e66bec6dcbb30c98024c4dc0441 Mon Sep 17 00:00:00 2001 From: Rahul Saini Date: Mon, 6 Mar 2023 16:09:49 -0800 Subject: [PATCH 05/22] undo referrer abstractions --- src/sentry/tagstore/snuba/backend.py | 3 +-- src/sentry/tsdb/snuba.py | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/sentry/tagstore/snuba/backend.py b/src/sentry/tagstore/snuba/backend.py index d855f378a469a3..ecd03e2cf678aa 100644 --- a/src/sentry/tagstore/snuba/backend.py +++ b/src/sentry/tagstore/snuba/backend.py @@ -736,7 +736,6 @@ def get_release_tags(self, organization_id, project_ids, environment_id, version ["max", SEEN_COLUMN, "last_seen"], ] start = self.get_min_start_date(organization_id, project_ids, environment_id, versions) - referrer = "tagstore.get_release_tags" result = snuba.query( dataset=Dataset.Events, start=start, @@ -745,7 +744,7 @@ def get_release_tags(self, organization_id, project_ids, environment_id, version filter_keys=filters, aggregations=aggregations, orderby="-times_seen", - referrer=referrer, + referrer="tagstore.get_release_tags", tenant_ids={"organization_id": organization_id}, ) diff --git a/src/sentry/tsdb/snuba.py b/src/sentry/tsdb/snuba.py index 31307a9e080853..2a68de1e6bbeaf 100644 --- a/src/sentry/tsdb/snuba.py +++ b/src/sentry/tsdb/snuba.py @@ -588,7 +588,6 @@ def __get_data_legacy( orderby.append(model_group) if keys: - referrer = f"tsdb-modelid:{model.value}" tenant_ids = tenant_ids or dict() query_func_without_selected_columns = functools.partial( snuba.query, @@ -602,7 +601,7 @@ def __get_data_legacy( rollup=rollup, limit=limit, orderby=orderby, - referrer=referrer, + referrer=f"tsdb-modelid:{model.value}", is_grouprelease=(model == TSDBModel.frequent_releases_by_group), use_cache=use_cache, tenant_ids=tenant_ids, From fc5c3dbf99b7dec4c3942da8d464333b44c0f7a4 Mon Sep 17 00:00:00 2001 From: Rahul Saini Date: Mon, 6 Mar 2023 16:33:11 -0800 Subject: [PATCH 06/22] get_tag_key and get_tag_keys_for_projects --- src/sentry/api/endpoints/organization_tags.py | 1 + .../api/endpoints/project_tagkey_details.py | 20 +++++++++++--- .../api/endpoints/project_tagkey_values.py | 7 ++++- .../data_export/processors/issues_by_tag.py | 15 +++++++++-- src/sentry/tagstore/base.py | 6 +++-- src/sentry/tagstore/snuba/backend.py | 27 ++++++++++++++++--- src/sentry/web/frontend/group_tag_export.py | 6 ++++- 7 files changed, 69 insertions(+), 13 deletions(-) diff --git a/src/sentry/api/endpoints/organization_tags.py b/src/sentry/api/endpoints/organization_tags.py index 9f9e588dbfa4c9..47db36e9385995 100644 --- a/src/sentry/api/endpoints/organization_tags.py +++ b/src/sentry/api/endpoints/organization_tags.py @@ -28,6 +28,7 @@ def get(self, request: Request, organization) -> Response: use_cache=request.GET.get("use_cache", "0") == "1", # Defaults to True, because the frontend caches these tags globally include_transactions=request.GET.get("include_transactions", "1") == "1", + tenant_ids={"organization_id": organization.id}, ) if not features.has( "organizations:javascript-console-error-tag", diff --git a/src/sentry/api/endpoints/project_tagkey_details.py b/src/sentry/api/endpoints/project_tagkey_details.py index fe12b640ea09c4..ffaacb9eca805a 100644 --- a/src/sentry/api/endpoints/project_tagkey_details.py +++ b/src/sentry/api/endpoints/project_tagkey_details.py @@ -32,7 +32,12 @@ def get(self, request: Request, project, key) -> Response: raise ResourceDoesNotExist try: - tagkey = tagstore.get_tag_key(project.id, environment_id, lookup_key) + tagkey = tagstore.get_tag_key( + project.id, + environment_id, + lookup_key, + tenant_ids={"organization_id": project.organization_id}, + ) except tagstore.TagKeyNotFound: raise ResourceDoesNotExist @@ -55,7 +60,7 @@ def delete(self, request: Request, project, key) -> Response: eventstream_state = eventstream.start_delete_tag(project.id, key) - deleted = self.get_tag_keys_for_deletion(project.id, lookup_key) + deleted = self.get_tag_keys_for_deletion(project, lookup_key) # NOTE: By sending the `end_delete_tag` message here we are making # the assumption that the `delete_tag_key` does its work @@ -77,8 +82,15 @@ def delete(self, request: Request, project, key) -> Response: return Response(status=204) - def get_tag_keys_for_deletion(self, project_id, key): + def get_tag_keys_for_deletion(self, project, key): try: - return [tagstore.get_tag_key(project_id=project_id, key=key, environment_id=None)] + return [ + tagstore.get_tag_key( + project_id=project.id, + key=key, + environment_id=None, + tenant_ids={"organization_id": project.organization_id}, + ) + ] except tagstore.TagKeyNotFound: return [] diff --git a/src/sentry/api/endpoints/project_tagkey_values.py b/src/sentry/api/endpoints/project_tagkey_values.py index f46774d93acf1a..15a0d59f5cf215 100644 --- a/src/sentry/api/endpoints/project_tagkey_values.py +++ b/src/sentry/api/endpoints/project_tagkey_values.py @@ -36,7 +36,12 @@ def get(self, request: Request, project, key) -> Response: raise ResourceDoesNotExist try: - tagkey = tagstore.get_tag_key(project.id, environment_id, lookup_key) + tagkey = tagstore.get_tag_key( + project.id, + environment_id, + lookup_key, + tenant_ids={"organization_id": project.organization_id}, + ) except tagstore.TagKeyNotFound: raise ResourceDoesNotExist diff --git a/src/sentry/data_export/processors/issues_by_tag.py b/src/sentry/data_export/processors/issues_by_tag.py index 35622067b5d2d8..34564f1a52a6b1 100644 --- a/src/sentry/data_export/processors/issues_by_tag.py +++ b/src/sentry/data_export/processors/issues_by_tag.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from sentry import tagstore from sentry.models import EventUser, Group, Project, get_group_with_redirect @@ -9,7 +11,14 @@ class IssuesByTagProcessor: Processor for exports of issues data based on a provided tag """ - def __init__(self, project_id, group_id, key, environment_id): + def __init__( + self, + project_id, + group_id, + key, + environment_id, + tenant_ids: dict[str, str | int] | None = None, + ): self.project = self.get_project(project_id) self.group = self.get_group(group_id, self.project) self.key = key @@ -18,7 +27,9 @@ def __init__(self, project_id, group_id, key, environment_id): self.lookup_key = self.get_lookup_key(self.key) # Ensure the tag key exists, as it may have been deleted try: - tagstore.get_tag_key(self.project.id, environment_id, self.lookup_key) + tagstore.get_tag_key( + self.project.id, environment_id, self.lookup_key, tenant_ids=tenant_ids + ) except tagstore.TagKeyNotFound: raise ExportError("Requested key does not exist") self.callbacks = self.get_callbacks(self.key, self.group.project_id) diff --git a/src/sentry/tagstore/base.py b/src/sentry/tagstore/base.py index 9cf1aafd20a273..8525ae3321b428 100644 --- a/src/sentry/tagstore/base.py +++ b/src/sentry/tagstore/base.py @@ -122,7 +122,9 @@ def get_tag_value_label(self, key, value): return label @raises([TagKeyNotFound]) - def get_tag_key(self, project_id, environment_id, key, status=TagKeyStatus.VISIBLE): + def get_tag_key( + self, project_id, environment_id, key, status=TagKeyStatus.VISIBLE, tenant_ids=None + ): """ >>> get_tag_key(1, 2, "key1") """ @@ -137,7 +139,7 @@ def get_tag_keys( raise NotImplementedError def get_tag_keys_for_projects( - self, projects, environments, start, end, status=TagKeyStatus.VISIBLE + self, projects, environments, start, end, status=TagKeyStatus.VISIBLE, tenant_ids=None ): """ >>> get_tag_key([1], [2]) diff --git a/src/sentry/tagstore/snuba/backend.py b/src/sentry/tagstore/snuba/backend.py index ecd03e2cf678aa..5a1958fb03514e 100644 --- a/src/sentry/tagstore/snuba/backend.py +++ b/src/sentry/tagstore/snuba/backend.py @@ -136,7 +136,15 @@ def __get_tag_key(self, project_id, group_id, environment_id, key): return GroupTagKey(group_id=group_id, **data) def __get_tag_key_and_top_values( - self, project_id, group, environment_id, key, limit=3, raise_on_empty=True, **kwargs + self, + project_id, + group, + environment_id, + key, + limit=3, + raise_on_empty=True, + tenant_ids=None, + **kwargs, ): tag = f"tags[{key}]" filters = {"project_id": get_project_list(project_id)} @@ -168,6 +176,7 @@ def __get_tag_key_and_top_values( limit=limit, totals=True, referrer="tagstore.__get_tag_key_and_top_values", + tenant_ids=tenant_ids, ) if raise_on_empty and (not result or totals.get("count", 0) == 0): @@ -375,9 +384,19 @@ def __get_tag_value(self, project_id, group_id, environment_id, key, value): else: return GroupTagValue(group_id=group_id, **fix_tag_value_data(data)) - def get_tag_key(self, project_id, environment_id, key, status=TagKeyStatus.VISIBLE, **kwargs): + def get_tag_key( + self, + project_id, + environment_id, + key, + status=TagKeyStatus.VISIBLE, + tenant_ids=None, + **kwargs, + ): assert status is TagKeyStatus.VISIBLE - return self.__get_tag_key_and_top_values(project_id, None, environment_id, key, **kwargs) + return self.__get_tag_key_and_top_values( + project_id, None, environment_id, key, tenant_ids=tenant_ids, **kwargs + ) def get_tag_keys( self, @@ -401,6 +420,7 @@ def get_tag_keys_for_projects( status=TagKeyStatus.VISIBLE, use_cache=False, include_transactions=False, + tenant_ids=None, ): max_unsampled_projects = _max_unsampled_projects # We want to disable FINAL in the snuba query to reduce load. @@ -420,6 +440,7 @@ def get_tag_keys_for_projects( include_values_seen=False, use_cache=use_cache, include_transactions=include_transactions, + tenant_ids=tenant_ids, **optimize_kwargs, ) diff --git a/src/sentry/web/frontend/group_tag_export.py b/src/sentry/web/frontend/group_tag_export.py index 3892cf99e363b3..5f071c4825aa46 100644 --- a/src/sentry/web/frontend/group_tag_export.py +++ b/src/sentry/web/frontend/group_tag_export.py @@ -31,7 +31,11 @@ def get(self, request: Request, organization, project, group_id, key) -> Respons try: processor = IssuesByTagProcessor( - project_id=project.id, group_id=group_id, key=key, environment_id=environment_id + project_id=project.id, + group_id=group_id, + key=key, + environment_id=environment_id, + tenant_ids={"organization_id": project.organization_id}, ) except ExportError: raise Http404 From 8296b007752d54bc7bbcd841dd60bf15c9317d71 Mon Sep 17 00:00:00 2001 From: Rahul Saini Date: Mon, 6 Mar 2023 16:49:53 -0800 Subject: [PATCH 07/22] get_tag_keys and get_group_tag_keys --- src/sentry/api/endpoints/group_details.py | 7 ++++++- src/sentry/api/endpoints/group_tags.py | 6 +++++- src/sentry/api/endpoints/project_tags.py | 7 ++++++- src/sentry/tagstore/base.py | 12 +++++++++--- src/sentry/tagstore/snuba/backend.py | 24 ++++++++++++++++++++--- 5 files changed, 47 insertions(+), 9 deletions(-) diff --git a/src/sentry/api/endpoints/group_details.py b/src/sentry/api/endpoints/group_details.py index 461bd86fc00566..b547c40969ee55 100644 --- a/src/sentry/api/endpoints/group_details.py +++ b/src/sentry/api/endpoints/group_details.py @@ -185,7 +185,12 @@ def get(self, request: Request, group) -> Response: } ) - tags = tagstore.get_group_tag_keys(group, environment_ids, limit=100) + tags = tagstore.get_group_tag_keys( + group, + environment_ids, + limit=100, + tenant_ids={"organization_id": group.project.organization_id}, + ) user_reports = ( UserReport.objects.filter(group_id=group.id) diff --git a/src/sentry/api/endpoints/group_tags.py b/src/sentry/api/endpoints/group_tags.py index d2b0afcccd6ff9..ee1d4c89f279c5 100644 --- a/src/sentry/api/endpoints/group_tags.py +++ b/src/sentry/api/endpoints/group_tags.py @@ -39,7 +39,11 @@ def get(self, request: Request, group: Group) -> Response: environment_ids = [e.id for e in get_environments(request, group.project.organization)] tag_keys = tagstore.get_group_tag_keys_and_top_values( - group, environment_ids, keys=keys, value_limit=value_limit + group, + environment_ids, + keys=keys, + value_limit=value_limit, + tenant_ids={"organization_id": group.project.organization_id}, ) data = serialize(tag_keys, request.user) diff --git a/src/sentry/api/endpoints/project_tags.py b/src/sentry/api/endpoints/project_tags.py index b945f72aaa55e2..65a159ebb088d6 100644 --- a/src/sentry/api/endpoints/project_tags.py +++ b/src/sentry/api/endpoints/project_tags.py @@ -26,7 +26,12 @@ def get(self, request: Request, project) -> Response: kwargs.update(denylist=DS_DENYLIST) tag_keys = sorted( - tagstore.get_tag_keys(project.id, environment_id, **kwargs), + tagstore.get_tag_keys( + project.id, + environment_id, + tenant_ids={"organization_id": project.organization_id}, + **kwargs, + ), key=lambda x: x.key, ) diff --git a/src/sentry/tagstore/base.py b/src/sentry/tagstore/base.py index 8525ae3321b428..66abfb683680ad 100644 --- a/src/sentry/tagstore/base.py +++ b/src/sentry/tagstore/base.py @@ -131,7 +131,12 @@ def get_tag_key( raise NotImplementedError def get_tag_keys( - self, project_id, environment_id, status=TagKeyStatus.VISIBLE, include_values_seen=False + self, + project_id, + environment_id, + status=TagKeyStatus.VISIBLE, + include_values_seen=False, + tenant_ids=None, ): """ >>> get_tag_keys(1, 2) @@ -166,7 +171,7 @@ def get_group_tag_key(self, group, environment_id, key): """ raise NotImplementedError - def get_group_tag_keys(self, group, environment_ids, limit=None, keys=None): + def get_group_tag_keys(self, group, environment_ids, limit=None, keys=None, tenant_ids=None): """ >>> get_group_tag_key(group, 2, [3]) """ @@ -320,6 +325,7 @@ def get_group_tag_keys_and_top_values( environment_ids, keys=None, value_limit=TOP_VALUES_DEFAULT_LIMIT, + tenant_ids=None, **kwargs, ): @@ -328,7 +334,7 @@ def get_group_tag_keys_and_top_values( environment_ids = environment_ids[:1] # If keys is unspecified, we will grab all tag keys for this group. - tag_keys = self.get_group_tag_keys(group, environment_ids, keys=keys) + tag_keys = self.get_group_tag_keys(group, environment_ids, keys=keys, tenant_ids=tenant_ids) environment_id = environment_ids[0] if environment_ids else None for tk in tag_keys: diff --git a/src/sentry/tagstore/snuba/backend.py b/src/sentry/tagstore/snuba/backend.py index e0dd81827c9612..b751383f93ff58 100644 --- a/src/sentry/tagstore/snuba/backend.py +++ b/src/sentry/tagstore/snuba/backend.py @@ -217,6 +217,7 @@ def __get_tag_keys( include_values_seen=True, include_transactions=False, denylist=None, + tenant_ids=None, **kwargs, ): return self.__get_tag_keys_for_projects( @@ -230,6 +231,7 @@ def __get_tag_keys( include_values_seen=include_values_seen, include_transactions=include_transactions, denylist=denylist, + tenant_ids=tenant_ids, ) def __get_tag_keys_for_projects( @@ -405,10 +407,15 @@ def get_tag_keys( status=TagKeyStatus.VISIBLE, include_values_seen=False, denylist=None, + tenant_ids=None, ): assert status is TagKeyStatus.VISIBLE return self.__get_tag_keys( - project_id, None, environment_id and [environment_id], denylist=denylist + project_id, + None, + environment_id and [environment_id], + denylist=denylist, + tenant_ids=tenant_ids, ) def get_tag_keys_for_projects( @@ -458,7 +465,9 @@ def get_group_tag_key(self, group, environment_id, key): group.project_id, group, environment_id, key, limit=TOP_VALUES_DEFAULT_LIMIT ) - def get_group_tag_keys(self, group, environment_ids, limit=None, keys=None, **kwargs): + def get_group_tag_keys( + self, group, environment_ids, limit=None, keys=None, tenant_ids=None, **kwargs + ): """Get tag keys for a specific group""" return self.__get_tag_keys( group.project_id, @@ -468,6 +477,7 @@ def get_group_tag_keys(self, group, environment_ids, limit=None, keys=None, **kw limit=limit, keys=keys, include_values_seen=False, + tenant_ids=tenant_ids, **kwargs, ) @@ -682,6 +692,7 @@ def get_group_tag_keys_and_top_values( environment_ids: Sequence[int], keys: Optional[Sequence[str]] = None, value_limit: int = TOP_VALUES_DEFAULT_LIMIT, + tenant_ids=None, **kwargs, ): # Similar to __get_tag_key_and_top_values except we get the top values @@ -690,7 +701,9 @@ def get_group_tag_keys_and_top_values( # num_keys * limit. # First get totals and unique counts by key. - keys_with_counts = self.get_group_tag_keys(group, environment_ids, keys=keys) + keys_with_counts = self.get_group_tag_keys( + group, environment_ids, keys=keys, tenant_ids=tenant_ids + ) # Then get the top values with first_seen/last_seen/count for each filters = {"project_id": get_project_list(group.project_id)} @@ -721,6 +734,7 @@ def get_group_tag_keys_and_top_values( orderby="-count", limitby=[value_limit, "tags_key"], referrer="tagstore._get_tag_keys_and_top_values", + tenant_ids=tenant_ids, ) # Then supplement the key objects with the top values for each. @@ -1510,3 +1524,7 @@ def get_group_event_filter(self, project_id, group_id, environment_ids, tags, st return None return {"event_id__in": event_id_set} + if not event_id_set: + return None + + return {"event_id__in": event_id_set} From 977aa3895161da86f3ab359d53d3cb69bd6acc7b Mon Sep 17 00:00:00 2001 From: Rahul Saini Date: Mon, 6 Mar 2023 16:58:22 -0800 Subject: [PATCH 08/22] get_groups_user_counts --- src/sentry/api/serializers/models/group.py | 13 +++++++++++-- src/sentry/models/group.py | 6 +++++- src/sentry/tagstore/base.py | 4 +++- src/sentry/tagstore/snuba/backend.py | 7 ++++++- 4 files changed, 25 insertions(+), 5 deletions(-) diff --git a/src/sentry/api/serializers/models/group.py b/src/sentry/api/serializers/models/group.py index 0da052c95858f1..62288c5bf0ec66 100644 --- a/src/sentry/api/serializers/models/group.py +++ b/src/sentry/api/serializers/models/group.py @@ -811,8 +811,12 @@ def __seen_stats_impl( project_id = issue_list[0].project_id item_ids = [g.id for g in issue_list] + tenant_ids = {"organization_id": issue_list[0].project.organization_id} user_counts: Mapping[int, int] = user_counts_func( - [project_id], item_ids, environment_ids=environment and [environment.id] + [project_id], + item_ids, + environment_ids=environment and [environment.id], + tenant_ids=tenant_ids, ) first_seen: MutableMapping[int, datetime] = {} last_seen: MutableMapping[int, datetime] = {} @@ -820,7 +824,12 @@ def __seen_stats_impl( if environment is not None: environment_seen_stats = environment_seen_stats_func( - [project_id], item_ids, [environment.id], "environment", environment.name + [project_id], + item_ids, + [environment.id], + "environment", + environment.name, + tenant_ids=tenant_ids, ) for item_id, value in environment_seen_stats.items(): first_seen[item_id] = value.first_seen diff --git a/src/sentry/models/group.py b/src/sentry/models/group.py index 1589c273a14f9d..2025c02cd8dfb3 100644 --- a/src/sentry/models/group.py +++ b/src/sentry/models/group.py @@ -627,7 +627,11 @@ def get_email_subject(self): def count_users_seen(self): return tagstore.get_groups_user_counts( - [self.project_id], [self.id], environment_ids=None, start=self.first_seen + [self.project_id], + [self.id], + environment_ids=None, + start=self.first_seen, + tenant_ids={"organization_id": self.project.organization_id}, )[self.id] @classmethod diff --git a/src/sentry/tagstore/base.py b/src/sentry/tagstore/base.py index 66abfb683680ad..7f32b8f9fea2d7 100644 --- a/src/sentry/tagstore/base.py +++ b/src/sentry/tagstore/base.py @@ -260,7 +260,9 @@ def get_group_tag_value_qs(self, project_id, group_id, environment_id, key, valu """ raise NotImplementedError - def get_groups_user_counts(self, project_ids, group_ids, environment_ids, start=None, end=None): + def get_groups_user_counts( + self, project_ids, group_ids, environment_ids, start=None, end=None, tenant_ids=None + ): """ >>> get_groups_user_counts([1, 2], [2, 3], [4, 5]) `start` and `end` are only used by the snuba backend diff --git a/src/sentry/tagstore/snuba/backend.py b/src/sentry/tagstore/snuba/backend.py index b751383f93ff58..de03f681200bc6 100644 --- a/src/sentry/tagstore/snuba/backend.py +++ b/src/sentry/tagstore/snuba/backend.py @@ -868,6 +868,7 @@ def __get_groups_user_counts( dataset=Dataset.Events, extra_aggregations=None, referrer="tagstore.__get_groups_user_counts", + tenant_ids=None, ): filters = {"project_id": project_ids, "group_id": group_ids} if environment_ids: @@ -887,11 +888,14 @@ def __get_groups_user_counts( aggregations=aggregations, orderby="-count", referrer=referrer, + tenant_ids=tenant_ids, ) return defaultdict(int, {k: v for k, v in result.items() if v}) - def get_groups_user_counts(self, project_ids, group_ids, environment_ids, start=None, end=None): + def get_groups_user_counts( + self, project_ids, group_ids, environment_ids, start=None, end=None, tenant_ids=None + ): return self.__get_groups_user_counts( project_ids, group_ids, @@ -901,6 +905,7 @@ def get_groups_user_counts(self, project_ids, group_ids, environment_ids, start= Dataset.Events, [], "tagstore.get_groups_user_counts", + tenant_ids=tenant_ids, ) def get_perf_groups_user_counts( From aee4d56e288e0cbb888b1c760ce1471fb22dfce8 Mon Sep 17 00:00:00 2001 From: Rahul Saini Date: Mon, 6 Mar 2023 17:00:14 -0800 Subject: [PATCH 09/22] get_group_list_tag_value --- src/sentry/tagstore/base.py | 4 +++- src/sentry/tagstore/snuba/backend.py | 7 ++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/sentry/tagstore/base.py b/src/sentry/tagstore/base.py index 7f32b8f9fea2d7..7010b0a8642d13 100644 --- a/src/sentry/tagstore/base.py +++ b/src/sentry/tagstore/base.py @@ -190,7 +190,9 @@ def get_group_tag_values(self, group, environment_id, key): """ raise NotImplementedError - def get_group_list_tag_value(self, project_ids, group_id_list, environment_ids, key, value): + def get_group_list_tag_value( + self, project_ids, group_id_list, environment_ids, key, value, tenant_ids=None + ): """ >>> get_group_list_tag_value([1, 2], [1, 2, 3, 4, 5], [3], "key1", "value1") """ diff --git a/src/sentry/tagstore/snuba/backend.py b/src/sentry/tagstore/snuba/backend.py index de03f681200bc6..0db61ce4200046 100644 --- a/src/sentry/tagstore/snuba/backend.py +++ b/src/sentry/tagstore/snuba/backend.py @@ -503,6 +503,7 @@ def __get_group_list_tag_value( extra_conditions, extra_aggregations, referrer, + tenant_ids=None, ): filters = {"project_id": project_ids, "group_id": group_id_list} if environment_ids: @@ -521,6 +522,7 @@ def __get_group_list_tag_value( filter_keys=filters, aggregations=aggregations, referrer=referrer, + tenant_ids=tenant_ids, ) return { @@ -530,7 +532,9 @@ def __get_group_list_tag_value( for group_id, data in result.items() } - def get_group_list_tag_value(self, project_ids, group_id_list, environment_ids, key, value): + def get_group_list_tag_value( + self, project_ids, group_id_list, environment_ids, key, value, tenant_ids=None + ): return self.__get_group_list_tag_value( project_ids, group_id_list, @@ -541,6 +545,7 @@ def get_group_list_tag_value(self, project_ids, group_id_list, environment_ids, [DEFAULT_TYPE_CONDITION], [], "tagstore.get_group_list_tag_value", + tenant_ids=tenant_ids, ) def get_perf_group_list_tag_value( From c86cc61e3974e307593ad2ee2a56748ec22f187a Mon Sep 17 00:00:00 2001 From: Rahul Saini Date: Mon, 6 Mar 2023 17:04:12 -0800 Subject: [PATCH 10/22] rest of group serializers --- src/sentry/tagstore/base.py | 8 ++++---- src/sentry/tagstore/snuba/backend.py | 12 ++++++++---- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/sentry/tagstore/base.py b/src/sentry/tagstore/base.py index 7010b0a8642d13..367548738a03ec 100644 --- a/src/sentry/tagstore/base.py +++ b/src/sentry/tagstore/base.py @@ -199,12 +199,12 @@ def get_group_list_tag_value( raise NotImplementedError def get_perf_group_list_tag_value( - self, project_ids, group_id_list, environment_ids, key, value + self, project_ids, group_id_list, environment_ids, key, value, tenant_ids=None ): raise NotImplementedError def get_generic_group_list_tag_value( - self, project_ids, group_id_list, environment_ids, key, value + self, project_ids, group_id_list, environment_ids, key, value, tenant_ids=None ): raise NotImplementedError @@ -272,12 +272,12 @@ def get_groups_user_counts( raise NotImplementedError def get_perf_groups_user_counts( - self, project_ids, group_ids, environment_ids, start=None, end=None + self, project_ids, group_ids, environment_ids, start=None, end=None, tenant_ids=None ): raise NotImplementedError def get_generic_groups_user_counts( - self, project_ids, group_ids, environment_ids, start=None, end=None + self, project_ids, group_ids, environment_ids, start=None, end=None, tenant_ids=None ): raise NotImplementedError diff --git a/src/sentry/tagstore/snuba/backend.py b/src/sentry/tagstore/snuba/backend.py index 0db61ce4200046..c6dede0d734ce3 100644 --- a/src/sentry/tagstore/snuba/backend.py +++ b/src/sentry/tagstore/snuba/backend.py @@ -549,7 +549,7 @@ def get_group_list_tag_value( ) def get_perf_group_list_tag_value( - self, project_ids, group_id_list, environment_ids, key, value + self, project_ids, group_id_list, environment_ids, key, value, tenant_ids=None ): filters = {"project_id": project_ids} if environment_ids: @@ -570,6 +570,7 @@ def get_perf_group_list_tag_value( ["max", SEEN_COLUMN, "last_seen"], ], referrer="tagstore.get_perf_group_list_tag_value", + tenant_ids=tenant_ids, ) return { @@ -578,7 +579,7 @@ def get_perf_group_list_tag_value( } def get_generic_group_list_tag_value( - self, project_ids, group_id_list, environment_ids, key, value + self, project_ids, group_id_list, environment_ids, key, value, tenant_ids=None ): translated_params = _translate_filter_keys(project_ids, group_id_list, environment_ids) organization_id = get_organization_id_from_project_ids(project_ids) @@ -613,6 +614,7 @@ def get_generic_group_list_tag_value( where=where_conditions, groupby=[Column("group_id")], ), + tenant_ids=tenant_ids, ) result_snql = raw_snql_query( snuba_request, referrer="tagstore.get_generic_group_list_tag_value", use_cache=True @@ -914,7 +916,7 @@ def get_groups_user_counts( ) def get_perf_groups_user_counts( - self, project_ids, group_ids, environment_ids, start=None, end=None + self, project_ids, group_ids, environment_ids, start=None, end=None, tenant_ids=None ): filters_keys = {"project_id": project_ids} if environment_ids: @@ -932,6 +934,7 @@ def get_perf_groups_user_counts( ], groupby=["group_id"], referrer="tagstore.get_perf_groups_user_counts", + tenant_ids=tenant_ids, ) return defaultdict( @@ -944,7 +947,7 @@ def get_perf_groups_user_counts( ) def get_generic_groups_user_counts( - self, project_ids, group_ids, environment_ids, start=None, end=None + self, project_ids, group_ids, environment_ids, start=None, end=None, tenant_ids=None ): translated_params = _translate_filter_keys(project_ids, group_ids, environment_ids) organization_id = get_organization_id_from_project_ids(project_ids) @@ -978,6 +981,7 @@ def get_generic_groups_user_counts( groupby=[Column("group_id")], orderby=[OrderBy(Column("count"), Direction.DESC)], ), + tenant_ids=tenant_ids, ) result_snql = raw_snql_query( From 28e6c96e97266c856be6415dd766839bb82eae82 Mon Sep 17 00:00:00 2001 From: Rahul Saini Date: Mon, 6 Mar 2023 17:10:49 -0800 Subject: [PATCH 11/22] get_tag_value and get_tag_values --- .../api/endpoints/organization_metrics.py | 1 + src/sentry/tagstore/base.py | 4 ++-- src/sentry/tagstore/snuba/backend.py | 19 ++++++++++++++----- 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/src/sentry/api/endpoints/organization_metrics.py b/src/sentry/api/endpoints/organization_metrics.py index d3dca6e817ae8e..1aea6e9eb3bc7f 100644 --- a/src/sentry/api/endpoints/organization_metrics.py +++ b/src/sentry/api/endpoints/organization_metrics.py @@ -130,6 +130,7 @@ def get(self, request: Request, organization, tag_name) -> Response: tag_name, metric_names, use_case_id=get_use_case_id(request.GET.get("useCase", "release-health")), + tenant_ids={"organization_id": organization.id}, ) except (InvalidParams, DerivedMetricParseException) as exc: msg = str(exc) diff --git a/src/sentry/tagstore/base.py b/src/sentry/tagstore/base.py index 367548738a03ec..ad8d81128f373b 100644 --- a/src/sentry/tagstore/base.py +++ b/src/sentry/tagstore/base.py @@ -152,13 +152,13 @@ def get_tag_keys_for_projects( raise NotImplementedError @raises([TagValueNotFound]) - def get_tag_value(self, project_id, environment_id, key, value): + def get_tag_value(self, project_id, environment_id, key, value, tenant_ids=None): """ >>> get_tag_value(1, 2, "key1", "value1") """ raise NotImplementedError - def get_tag_values(self, project_id, environment_id, key): + def get_tag_values(self, project_id, environment_id, key, tenant_ids=None): """ >>> get_tag_values(1, 2, "key1") """ diff --git a/src/sentry/tagstore/snuba/backend.py b/src/sentry/tagstore/snuba/backend.py index c6dede0d734ce3..240f04cb1e05b4 100644 --- a/src/sentry/tagstore/snuba/backend.py +++ b/src/sentry/tagstore/snuba/backend.py @@ -356,7 +356,7 @@ def __get_tag_keys_for_projects( results.add(ctor(**params)) return results - def __get_tag_value(self, project_id, group_id, environment_id, key, value): + def __get_tag_value(self, project_id, group_id, environment_id, key, value, tenant_ids=None): tag = f"tags[{key}]" filters = {"project_id": get_project_list(project_id)} if environment_id: @@ -376,6 +376,7 @@ def __get_tag_value(self, project_id, group_id, environment_id, key, value): filter_keys=filters, aggregations=aggregations, referrer="tagstore.__get_tag_value", + tenant_ids=tenant_ids, ) if not data["times_seen"] > 0: raise TagValueNotFound if group_id is None else GroupTagValueNotFound @@ -451,12 +452,20 @@ def get_tag_keys_for_projects( **optimize_kwargs, ) - def get_tag_value(self, project_id, environment_id, key, value): - return self.__get_tag_value(project_id, None, environment_id, key, value) + def get_tag_value(self, project_id, environment_id, key, value, tenant_ids=None): + return self.__get_tag_value( + project_id, None, environment_id, key, value, tenant_ids=tenant_ids + ) - def get_tag_values(self, project_id, environment_id, key): + def get_tag_values(self, project_id, environment_id, key, tenant_ids=None): key = self.__get_tag_key_and_top_values( - project_id, None, environment_id, key, limit=None, raise_on_empty=False + project_id, + None, + environment_id, + key, + limit=None, + raise_on_empty=False, + tenant_ids=tenant_ids, ) return set(key.top_values) From 34f591b7e52efda9d97641960682bba2899856b1 Mon Sep 17 00:00:00 2001 From: Rahul Saini Date: Mon, 6 Mar 2023 17:15:55 -0800 Subject: [PATCH 12/22] more random unused? getters --- .../api/endpoints/group_tagkey_details.py | 7 +++- .../api/endpoints/group_tagkey_values.py | 7 +++- src/sentry/tagstore/base.py | 12 ++++--- src/sentry/tagstore/snuba/backend.py | 32 +++++++++++++++---- 4 files changed, 45 insertions(+), 13 deletions(-) diff --git a/src/sentry/api/endpoints/group_tagkey_details.py b/src/sentry/api/endpoints/group_tagkey_details.py index 8210d05a9adad4..ea9f197afd4edd 100644 --- a/src/sentry/api/endpoints/group_tagkey_details.py +++ b/src/sentry/api/endpoints/group_tagkey_details.py @@ -33,7 +33,12 @@ def get(self, request: Request, group, key) -> Response: raise ResourceDoesNotExist try: - group_tag_key = tagstore.get_group_tag_key(group, environment_id, lookup_key) + group_tag_key = tagstore.get_group_tag_key( + group, + environment_id, + lookup_key, + tenant_ids={"organization_id": group.project.organization_id}, + ) except tagstore.GroupTagKeyNotFound: raise ResourceDoesNotExist diff --git a/src/sentry/api/endpoints/group_tagkey_values.py b/src/sentry/api/endpoints/group_tagkey_values.py index 6940e8a20d793f..4e639449406a3c 100644 --- a/src/sentry/api/endpoints/group_tagkey_values.py +++ b/src/sentry/api/endpoints/group_tagkey_values.py @@ -29,7 +29,12 @@ def get(self, request: Request, group, key) -> Response: environment_ids = [e.id for e in get_environments(request, group.project.organization)] try: - tagstore.get_group_tag_key(group, None, lookup_key) + tagstore.get_group_tag_key( + group, + None, + lookup_key, + tenant_ids={"organization_id": group.project.organization_id}, + ) except tagstore.GroupTagKeyNotFound: raise ResourceDoesNotExist sort = request.GET.get("sort") diff --git a/src/sentry/tagstore/base.py b/src/sentry/tagstore/base.py index ad8d81128f373b..673479a016a544 100644 --- a/src/sentry/tagstore/base.py +++ b/src/sentry/tagstore/base.py @@ -165,7 +165,7 @@ def get_tag_values(self, project_id, environment_id, key, tenant_ids=None): raise NotImplementedError @raises([GroupTagKeyNotFound]) - def get_group_tag_key(self, group, environment_id, key): + def get_group_tag_key(self, group, environment_id, key, tenant_ids=None): """ >>> get_group_tag_key(group, 3, "key1") """ @@ -178,13 +178,15 @@ def get_group_tag_keys(self, group, environment_ids, limit=None, keys=None, tena raise NotImplementedError @raises([GroupTagValueNotFound]) - def get_group_tag_value(self, project_id, group_id, environment_id, key, value): + def get_group_tag_value( + self, project_id, group_id, environment_id, key, value, tenant_ids=None + ): """ >>> get_group_tag_value(1, 2, 3, "key1", "value1") """ raise NotImplementedError - def get_group_tag_values(self, group, environment_id, key): + def get_group_tag_values(self, group, environment_id, key, tenant_ids=None): """ >>> get_group_tag_values(group, 3, "key1") """ @@ -208,7 +210,9 @@ def get_generic_group_list_tag_value( ): raise NotImplementedError - def get_group_event_filter(self, project_id, group_id, environment_ids, tags, start, end): + def get_group_event_filter( + self, project_id, group_id, environment_ids, tags, start, end, tenant_ids=None + ): """ >>> get_group_event_filter(1, 2, 3, {'key1': 'value1', 'key2': 'value2'}) """ diff --git a/src/sentry/tagstore/snuba/backend.py b/src/sentry/tagstore/snuba/backend.py index 240f04cb1e05b4..b4fea26cc1efff 100644 --- a/src/sentry/tagstore/snuba/backend.py +++ b/src/sentry/tagstore/snuba/backend.py @@ -469,9 +469,14 @@ def get_tag_values(self, project_id, environment_id, key, tenant_ids=None): ) return set(key.top_values) - def get_group_tag_key(self, group, environment_id, key): + def get_group_tag_key(self, group, environment_id, key, tenant_ids=None): return self.__get_tag_key_and_top_values( - group.project_id, group, environment_id, key, limit=TOP_VALUES_DEFAULT_LIMIT + group.project_id, + group, + environment_id, + key, + limit=TOP_VALUES_DEFAULT_LIMIT, + tenant_ids=tenant_ids, ) def get_group_tag_keys( @@ -490,14 +495,24 @@ def get_group_tag_keys( **kwargs, ) - def get_group_tag_value(self, project_id, group_id, environment_id, key, value): - return self.__get_tag_value(project_id, group_id, environment_id, key, value) + def get_group_tag_value( + self, project_id, group_id, environment_id, key, value, tenant_ids=None + ): + return self.__get_tag_value( + project_id, group_id, environment_id, key, value, tenant_ids=tenant_ids + ) - def get_group_tag_values(self, group, environment_id, key): + def get_group_tag_values(self, group, environment_id, key, tenant_ids=None): # NB this uses a 'top' values function, but the limit is None so it should # return all values for this key. key = self.__get_tag_key_and_top_values( - group.project_id, group, environment_id, key, limit=None, raise_on_empty=False + group.project_id, + group, + environment_id, + key, + limit=None, + raise_on_empty=False, + tenant_ids=tenant_ids, ) return set(key.top_values) @@ -1519,7 +1534,9 @@ def get_group_tag_value_qs(self, project_id, group_id, environment_id, key, valu # search backend. raise NotImplementedError - def get_group_event_filter(self, project_id, group_id, environment_ids, tags, start, end): + def get_group_event_filter( + self, project_id, group_id, environment_ids, tags, start, end, tenant_ids=None + ): filters = {"project_id": get_project_list(project_id), "group_id": [group_id]} if environment_ids: filters["environment"] = environment_ids @@ -1539,6 +1556,7 @@ def get_group_event_filter(self, project_id, group_id, environment_ids, tags, st filter_keys=filters, limit=1000, referrer="tagstore.get_group_event_filter", + tenant_ids=tenant_ids, ) event_id_set = {row["event_id"] for row in result["data"]} From 379f9e55e6e34e4fda35e4a58fc4f458a9656fd2 Mon Sep 17 00:00:00 2001 From: Rahul Saini Date: Mon, 6 Mar 2023 17:24:31 -0800 Subject: [PATCH 13/22] more paginators --- src/sentry/api/endpoints/group_tagkey_values.py | 6 +++--- .../api/endpoints/organization_tagkey_values.py | 1 + .../api/endpoints/project_tagkey_values.py | 5 +++-- .../data_export/processors/issues_by_tag.py | 1 + src/sentry/tagstore/base.py | 16 ++++++++-------- src/sentry/tagstore/snuba/backend.py | 15 ++++++++++++--- 6 files changed, 28 insertions(+), 16 deletions(-) diff --git a/src/sentry/api/endpoints/group_tagkey_values.py b/src/sentry/api/endpoints/group_tagkey_values.py index 4e639449406a3c..86e0dcd3479cc5 100644 --- a/src/sentry/api/endpoints/group_tagkey_values.py +++ b/src/sentry/api/endpoints/group_tagkey_values.py @@ -27,13 +27,13 @@ def get(self, request: Request, group, key) -> Response: lookup_key = tagstore.prefix_reserved_key(key) environment_ids = [e.id for e in get_environments(request, group.project.organization)] - + tenant_ids = {"organization_id": group.project.organization_id} try: tagstore.get_group_tag_key( group, None, lookup_key, - tenant_ids={"organization_id": group.project.organization_id}, + tenant_ids=tenant_ids, ) except tagstore.GroupTagKeyNotFound: raise ResourceDoesNotExist @@ -53,7 +53,7 @@ def get(self, request: Request, group, key) -> Response: serializer_cls = None paginator = tagstore.get_group_tag_value_paginator( - group, environment_ids, lookup_key, order_by=order_by + group, environment_ids, lookup_key, order_by=order_by, tenant_ids=tenant_ids ) return self.paginate( diff --git a/src/sentry/api/endpoints/organization_tagkey_values.py b/src/sentry/api/endpoints/organization_tagkey_values.py index 90acb8bd8d1f11..66f2768d42c4d4 100644 --- a/src/sentry/api/endpoints/organization_tagkey_values.py +++ b/src/sentry/api/endpoints/organization_tagkey_values.py @@ -46,6 +46,7 @@ def get(self, request: Request, organization, key) -> Response: include_transactions=request.GET.get("includeTransactions") == "1", include_sessions=request.GET.get("includeSessions") == "1", include_replays=request.GET.get("includeReplays") == "1", + tenant_ids={"organization_id": organization.id}, ) return self.paginate( diff --git a/src/sentry/api/endpoints/project_tagkey_values.py b/src/sentry/api/endpoints/project_tagkey_values.py index 15a0d59f5cf215..55dbeb319c5876 100644 --- a/src/sentry/api/endpoints/project_tagkey_values.py +++ b/src/sentry/api/endpoints/project_tagkey_values.py @@ -28,7 +28,7 @@ def get(self, request: Request, project, key) -> Response: :auth: required """ lookup_key = tagstore.prefix_reserved_key(key) - + tenant_ids = {"organization_id": project.organization_id} try: environment_id = self._get_environment_id_from_request(request, project.organization_id) except Environment.DoesNotExist: @@ -40,7 +40,7 @@ def get(self, request: Request, project, key) -> Response: project.id, environment_id, lookup_key, - tenant_ids={"organization_id": project.organization_id}, + tenant_ids=tenant_ids, ) except tagstore.TagKeyNotFound: raise ResourceDoesNotExist @@ -55,6 +55,7 @@ def get(self, request: Request, project, key) -> Response: end=end, query=request.GET.get("query"), order_by="-last_seen", + tenant_ids=tenant_ids, ) return self.paginate( diff --git a/src/sentry/data_export/processors/issues_by_tag.py b/src/sentry/data_export/processors/issues_by_tag.py index 34564f1a52a6b1..753c67a31e7f4c 100644 --- a/src/sentry/data_export/processors/issues_by_tag.py +++ b/src/sentry/data_export/processors/issues_by_tag.py @@ -112,6 +112,7 @@ def get_raw_data(self, limit=1000, offset=0): callbacks=self.callbacks, limit=limit, offset=offset, + tenant_ids={"organization_id": self.project.organization_id}, ) def get_serialized_data(self, limit=1000, offset=0): diff --git a/src/sentry/tagstore/base.py b/src/sentry/tagstore/base.py index 673479a016a544..e60329acfff9c8 100644 --- a/src/sentry/tagstore/base.py +++ b/src/sentry/tagstore/base.py @@ -219,12 +219,7 @@ def get_group_event_filter( raise NotImplementedError def get_tag_value_paginator( - self, - project_id, - environment_id, - key, - query=None, - order_by="-last_seen", + self, project_id, environment_id, key, query=None, order_by="-last_seen", tenant_ids=None ): """ >>> get_tag_value_paginator(1, 2, 'environment', query='prod') @@ -240,6 +235,7 @@ def get_tag_value_paginator_for_projects( end, query=None, order_by="-last_seen", + tenant_ids=None, ): """ Includes tags and also snuba columns, with the arrayjoin when they are nested. @@ -248,13 +244,17 @@ def get_tag_value_paginator_for_projects( """ raise NotImplementedError - def get_group_tag_value_iter(self, group, environment_ids, key, callbacks=(), offset=0): + def get_group_tag_value_iter( + self, group, environment_ids, key, callbacks=(), offset=0, tenant_ids=None + ): """ >>> get_group_tag_value_iter(group, 2, 3, 'environment') """ raise NotImplementedError - def get_group_tag_value_paginator(self, group, environment_ids, key, order_by="-id"): + def get_group_tag_value_paginator( + self, group, environment_ids, key, order_by="-id", tenant_ids=None + ): """ >>> get_group_tag_value_paginator(group, 3, 'environment') """ diff --git a/src/sentry/tagstore/snuba/backend.py b/src/sentry/tagstore/snuba/backend.py index b4fea26cc1efff..3d32e16bffcff2 100644 --- a/src/sentry/tagstore/snuba/backend.py +++ b/src/sentry/tagstore/snuba/backend.py @@ -1025,6 +1025,7 @@ def get_tag_value_paginator( end=None, query=None, order_by="-last_seen", + tenant_ids=None, ): return self.get_tag_value_paginator_for_projects( get_project_list(project_id), @@ -1034,6 +1035,7 @@ def get_tag_value_paginator( end=end, query=query, order_by=order_by, + tenant_ids=tenant_ids, ) def _get_semver_versions_for_package(self, projects, organization_id, package): @@ -1240,6 +1242,7 @@ def get_tag_value_paginator_for_projects( include_transactions=False, include_sessions=False, include_replays=False, + tenant_ids=None, ): from sentry.api.paginator import SequencePaginator @@ -1423,6 +1426,7 @@ def get_tag_value_paginator_for_projects( sample=1_000_000, arrayjoin=snuba.get_arrayjoin(snuba_key), referrer="tagstore.get_tag_value_paginator_for_projects", + tenant_ids=tenant_ids, ) if include_transactions: @@ -1464,7 +1468,7 @@ def score_field_to_int(tv: TagValue) -> int: ) def get_group_tag_value_iter( - self, group, environment_ids, key, callbacks=(), limit=1000, offset=0 + self, group, environment_ids, key, callbacks=(), limit=1000, offset=0, tenant_ids=None ): filters = { "project_id": get_project_list(group.project_id), @@ -1488,6 +1492,7 @@ def get_group_tag_value_iter( limit=limit, referrer="tagstore.get_group_tag_value_iter", offset=offset, + tenant_ids=tenant_ids, ) group_tag_values = [ @@ -1500,7 +1505,9 @@ def get_group_tag_value_iter( return group_tag_values - def get_group_tag_value_paginator(self, group, environment_ids, key, order_by="-id"): + def get_group_tag_value_paginator( + self, group, environment_ids, key, order_by="-id", tenant_ids=None + ): from sentry.api.paginator import SequencePaginator if order_by in ("-last_seen", "-first_seen", "-times_seen"): @@ -1511,7 +1518,9 @@ def get_group_tag_value_paginator(self, group, environment_ids, key, order_by="- else: raise ValueError("Unsupported order_by: %s" % order_by) - group_tag_values = self.get_group_tag_value_iter(group, environment_ids, key) + group_tag_values = self.get_group_tag_value_iter( + group, environment_ids, key, tenant_ids=tenant_ids + ) desc = order_by.startswith("-") score_field = order_by.lstrip("-") From 309757aaa819bf84e5234cceda31a4ef9f98101b Mon Sep 17 00:00:00 2001 From: Rahul Saini Date: Mon, 6 Mar 2023 17:33:42 -0800 Subject: [PATCH 14/22] finished --- .../api/endpoints/group_tagkey_details.py | 8 ++++---- .../organization_user_issues_search.py | 1 + src/sentry/tagstore/base.py | 10 ++++++---- src/sentry/tagstore/snuba/backend.py | 20 +++++++++++++------ 4 files changed, 25 insertions(+), 14 deletions(-) diff --git a/src/sentry/api/endpoints/group_tagkey_details.py b/src/sentry/api/endpoints/group_tagkey_details.py index ea9f197afd4edd..65111d041e9123 100644 --- a/src/sentry/api/endpoints/group_tagkey_details.py +++ b/src/sentry/api/endpoints/group_tagkey_details.py @@ -23,7 +23,7 @@ def get(self, request: Request, group, key) -> Response: :auth: required """ lookup_key = tagstore.prefix_reserved_key(key) - + tenant_ids = {"organization_id": group.project.organization_id} try: environment_id = self._get_environment_id_from_request( request, group.project.organization_id @@ -37,19 +37,19 @@ def get(self, request: Request, group, key) -> Response: group, environment_id, lookup_key, - tenant_ids={"organization_id": group.project.organization_id}, + tenant_ids=tenant_ids, ) except tagstore.GroupTagKeyNotFound: raise ResourceDoesNotExist if group_tag_key.count is None: group_tag_key.count = tagstore.get_group_tag_value_count( - group.project_id, group.id, environment_id, lookup_key + group.project_id, group.id, environment_id, lookup_key, tenant_ids=tenant_ids ) if group_tag_key.top_values is None: group_tag_key.top_values = tagstore.get_top_group_tag_values( - group, environment_id, lookup_key + group, environment_id, lookup_key, tenant_ids=tenant_ids ) return Response(serialize(group_tag_key, request.user)) diff --git a/src/sentry/api/endpoints/organization_user_issues_search.py b/src/sentry/api/endpoints/organization_user_issues_search.py index 1e23517b1d004f..fef2c6417cabb0 100644 --- a/src/sentry/api/endpoints/organization_user_issues_search.py +++ b/src/sentry/api/endpoints/organization_user_issues_search.py @@ -38,6 +38,7 @@ def get(self, request: Request, organization) -> Response: project_ids=list({e.project_id for e in event_users}), event_users=event_users, limit=limit, + tenant_ids={"organization_id": organization.id}, ) ).order_by("-last_seen")[:limit] else: diff --git a/src/sentry/tagstore/base.py b/src/sentry/tagstore/base.py index e60329acfff9c8..fec424185bbbe9 100644 --- a/src/sentry/tagstore/base.py +++ b/src/sentry/tagstore/base.py @@ -285,13 +285,15 @@ def get_generic_groups_user_counts( ): raise NotImplementedError - def get_group_tag_value_count(self, group, environment_id, key): + def get_group_tag_value_count(self, group, environment_id, key, tenant_ids=None): """ >>> get_group_tag_value_count(group, 3, 'key1') """ raise NotImplementedError - def get_top_group_tag_values(self, group, environment_id, key, limit=TOP_VALUES_DEFAULT_LIMIT): + def get_top_group_tag_values( + self, group, environment_id, key, limit=TOP_VALUES_DEFAULT_LIMIT, tenant_ids=None + ): """ >>> get_top_group_tag_values(group, 3, 'key1') """ @@ -315,13 +317,13 @@ def get_release_tags(self, organization_id, project_ids, environment_id, version """ raise NotImplementedError - def get_group_ids_for_users(self, project_ids, event_users, limit=100): + def get_group_ids_for_users(self, project_ids, event_users, limit=100, tenant_ids=None): """ >>> get_group_ids_for_users([1,2], [EventUser(1), EventUser(2)]) """ raise NotImplementedError - def get_group_tag_values_for_users(self, event_users, limit=100): + def get_group_tag_values_for_users(self, event_users, limit=100, tenant_ids=None): """ >>> get_group_tag_values_for_users([EventUser(1), EventUser(2)]) """ diff --git a/src/sentry/tagstore/snuba/backend.py b/src/sentry/tagstore/snuba/backend.py index 3d32e16bffcff2..6597b73394ad1d 100644 --- a/src/sentry/tagstore/snuba/backend.py +++ b/src/sentry/tagstore/snuba/backend.py @@ -656,7 +656,7 @@ def get_generic_group_list_tag_value( } def get_group_seen_values_for_environments( - self, project_ids, group_id_list, environment_ids, start=None, end=None + self, project_ids, group_id_list, environment_ids, start=None, end=None, tenant_ids=None ): # Get the total times seen, first seen, and last seen across multiple environments filters = {"project_id": project_ids, "group_id": group_id_list} @@ -678,6 +678,7 @@ def get_group_seen_values_for_environments( filter_keys=filters, aggregations=aggregations, referrer="tagstore.get_group_seen_values_for_environments", + tenant_ids=tenant_ids, ) return {issue: fix_tag_value_data(data) for issue, data in result.items()} @@ -694,7 +695,7 @@ def apply_group_filters_conditions(self, group: Group, conditions, filters): dataset = Dataset.IssuePlatform return dataset, conditions, filters - def get_group_tag_value_count(self, group, environment_id, key): + def get_group_tag_value_count(self, group, environment_id, key, tenant_ids=None): tag = f"tags[{key}]" filters = {"project_id": get_project_list(group.project_id)} if environment_id: @@ -711,10 +712,15 @@ def get_group_tag_value_count(self, group, environment_id, key): filter_keys=filters, aggregations=aggregations, referrer="tagstore.get_group_tag_value_count", + tenant_ids=tenant_ids, ) - def get_top_group_tag_values(self, group, environment_id, key, limit=TOP_VALUES_DEFAULT_LIMIT): - tag = self.__get_tag_key_and_top_values(group.project_id, group, environment_id, key, limit) + def get_top_group_tag_values( + self, group, environment_id, key, limit=TOP_VALUES_DEFAULT_LIMIT, tenant_ids=None + ): + tag = self.__get_tag_key_and_top_values( + group.project_id, group, environment_id, key, limit, tenant_ids=tenant_ids + ) return tag.top_values def get_group_tag_keys_and_top_values( @@ -837,7 +843,7 @@ def get_min_start_date(self, organization_id, project_ids, environment_id, versi return None - def get_group_ids_for_users(self, project_ids, event_users, limit=100): + def get_group_ids_for_users(self, project_ids, event_users, limit=100, tenant_ids=None): filters = {"project_id": project_ids} conditions = [ ["tags[sentry:user]", "IN", [_f for _f in [eu.tag_value for eu in event_users] if _f]] @@ -853,10 +859,11 @@ def get_group_ids_for_users(self, project_ids, event_users, limit=100): limit=limit, orderby="-last_seen", referrer="tagstore.get_group_ids_for_users", + tenant_ids=tenant_ids, ) return set(result.keys()) - def get_group_tag_values_for_users(self, event_users, limit=100): + def get_group_tag_values_for_users(self, event_users, limit=100, tenant_ids=None): """While not specific to a group_id, this is currently only used in issues, so the Events dataset is used""" filters = {"project_id": [eu.project_id for eu in event_users]} conditions = [ @@ -877,6 +884,7 @@ def get_group_tag_values_for_users(self, event_users, limit=100): orderby="-last_seen", limit=limit, referrer="tagstore.get_group_tag_values_for_users", + tenant_ids=tenant_ids, ) values = [] From 50b6cd5f16d6acfccf1ea55db2c39ff225ff2574 Mon Sep 17 00:00:00 2001 From: Rahul Saini Date: Mon, 6 Mar 2023 17:33:55 -0800 Subject: [PATCH 15/22] finished --- src/sentry/tagstore/base.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sentry/tagstore/base.py b/src/sentry/tagstore/base.py index fec424185bbbe9..af4815c956f01b 100644 --- a/src/sentry/tagstore/base.py +++ b/src/sentry/tagstore/base.py @@ -357,6 +357,6 @@ def get_group_tag_keys_and_top_values( return tag_keys def get_group_seen_values_for_environments( - self, project_ids, group_id_list, environment_ids, start=None, end=None + self, project_ids, group_id_list, environment_ids, start=None, end=None, tenant_ids=None ): raise NotImplementedError From 90e95ba1ba7f0f19a2773e2d1891b6d27237fb85 Mon Sep 17 00:00:00 2001 From: Rahul Saini Date: Tue, 7 Mar 2023 11:08:52 -0800 Subject: [PATCH 16/22] kwargs bug --- src/sentry/utils/snuba.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/sentry/utils/snuba.py b/src/sentry/utils/snuba.py index bc2933af233e1c..358bf0b5af074c 100644 --- a/src/sentry/utils/snuba.py +++ b/src/sentry/utils/snuba.py @@ -717,6 +717,7 @@ def raw_query( """ if referrer: + kwargs = kwargs or dict() kwargs["tenant_ids"] = kwargs["tenant_ids"] if "tenant_ids" in kwargs else dict() kwargs["tenant_ids"]["referrer"] = referrer From 81a3e3242833a5690b6b447cc4fbb35dfc7f70d4 Mon Sep 17 00:00:00 2001 From: Rahul Saini Date: Tue, 7 Mar 2023 11:29:59 -0800 Subject: [PATCH 17/22] kwargs bug fixed fr --- src/sentry/utils/snuba.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/sentry/utils/snuba.py b/src/sentry/utils/snuba.py index 358bf0b5af074c..004c11390e8330 100644 --- a/src/sentry/utils/snuba.py +++ b/src/sentry/utils/snuba.py @@ -717,8 +717,7 @@ def raw_query( """ if referrer: - kwargs = kwargs or dict() - kwargs["tenant_ids"] = kwargs["tenant_ids"] if "tenant_ids" in kwargs else dict() + kwargs["tenant_ids"] = kwargs.get("tenant_ids") or dict() kwargs["tenant_ids"]["referrer"] = referrer snuba_params = SnubaQueryParams( From 5f757d703fee6b524fafd7b64a43979f0582eb39 Mon Sep 17 00:00:00 2001 From: Rahul Saini Date: Tue, 7 Mar 2023 11:35:59 -0800 Subject: [PATCH 18/22] undo swap --- src/sentry/api/endpoints/organization_stats.py | 2 +- src/sentry/api/endpoints/project_stats.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sentry/api/endpoints/organization_stats.py b/src/sentry/api/endpoints/organization_stats.py index 4346775b221633..677a183c8caac8 100644 --- a/src/sentry/api/endpoints/organization_stats.py +++ b/src/sentry/api/endpoints/organization_stats.py @@ -91,8 +91,8 @@ def get(self, request: Request, organization) -> Response: data = tsdb.get_range( model=stat_model, keys=keys, - tenant_ids={"organization_id": organization.id}, **self._parse_args(request, **query_kwargs), + tenant_ids={"organization_id": organization.id}, ) if group == "organization": diff --git a/src/sentry/api/endpoints/project_stats.py b/src/sentry/api/endpoints/project_stats.py index 3fdddd238c0199..cbbf728e6fbdd3 100644 --- a/src/sentry/api/endpoints/project_stats.py +++ b/src/sentry/api/endpoints/project_stats.py @@ -64,8 +64,8 @@ def get(self, request: Request, project) -> Response: data = tsdb.get_range( model=stat_model, keys=[project.id], - tenant_ids={"organization_id": project.organization_id}, **self._parse_args(request, **query_kwargs), + tenant_ids={"organization_id": project.organization_id}, )[project.id] return Response(data) From b25eb1e2ad5c50a1f69617d43b3c3fc27c60f3f0 Mon Sep 17 00:00:00 2001 From: Rahul Saini Date: Tue, 7 Mar 2023 11:50:57 -0800 Subject: [PATCH 19/22] Fix query_builder --- src/sentry/search/events/builder/discover.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/sentry/search/events/builder/discover.py b/src/sentry/search/events/builder/discover.py index 5155fc8f3f8b73..e25b307ce47d85 100644 --- a/src/sentry/search/events/builder/discover.py +++ b/src/sentry/search/events/builder/discover.py @@ -1440,6 +1440,7 @@ def get_snql_query(self) -> Request: limitby=self.limitby, ), flags=Flags(turbo=self.turbo), + tenant_ids={"organization_id": self.params.organization.id}, ) @classmethod From 0d8fc1b8ef2d5ece5fa013e8e4d4a629ecc24ece Mon Sep 17 00:00:00 2001 From: Rahul Saini Date: Tue, 7 Mar 2023 14:48:17 -0800 Subject: [PATCH 20/22] remove dead code --- src/sentry/tagstore/snuba/backend.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/sentry/tagstore/snuba/backend.py b/src/sentry/tagstore/snuba/backend.py index 6597b73394ad1d..1ce0f461786524 100644 --- a/src/sentry/tagstore/snuba/backend.py +++ b/src/sentry/tagstore/snuba/backend.py @@ -1582,7 +1582,3 @@ def get_group_event_filter( return None return {"event_id__in": event_id_set} - if not event_id_set: - return None - - return {"event_id__in": event_id_set} From f44e9290295db03037846517a10a1c3c660db164 Mon Sep 17 00:00:00 2001 From: Rahul Saini Date: Tue, 7 Mar 2023 15:02:38 -0800 Subject: [PATCH 21/22] undo builder change for now --- src/sentry/search/events/builder/discover.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/sentry/search/events/builder/discover.py b/src/sentry/search/events/builder/discover.py index e25b307ce47d85..5155fc8f3f8b73 100644 --- a/src/sentry/search/events/builder/discover.py +++ b/src/sentry/search/events/builder/discover.py @@ -1440,7 +1440,6 @@ def get_snql_query(self) -> Request: limitby=self.limitby, ), flags=Flags(turbo=self.turbo), - tenant_ids={"organization_id": self.params.organization.id}, ) @classmethod From 847409c2e27062659845d88c15b862439f238633 Mon Sep 17 00:00:00 2001 From: Rahul Saini Date: Tue, 7 Mar 2023 15:36:39 -0800 Subject: [PATCH 22/22] get_tag_values special case fix --- src/sentry/api/endpoints/organization_metrics.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/sentry/api/endpoints/organization_metrics.py b/src/sentry/api/endpoints/organization_metrics.py index 1aea6e9eb3bc7f..d3dca6e817ae8e 100644 --- a/src/sentry/api/endpoints/organization_metrics.py +++ b/src/sentry/api/endpoints/organization_metrics.py @@ -130,7 +130,6 @@ def get(self, request: Request, organization, tag_name) -> Response: tag_name, metric_names, use_case_id=get_use_case_id(request.GET.get("useCase", "release-health")), - tenant_ids={"organization_id": organization.id}, ) except (InvalidParams, DerivedMetricParseException) as exc: msg = str(exc)