From aead81cfa8f9c346cf20efacde3de7f5f472a7ef Mon Sep 17 00:00:00 2001 From: Rahul Saini Date: Wed, 1 Mar 2023 14:02:19 -0800 Subject: [PATCH 1/4] Add tenant_ids --- src/sentry/api/endpoints/group_details.py | 6 +++++- src/sentry/api/endpoints/group_stats.py | 5 ++++- .../endpoints/integrations/sentry_apps/interaction.py | 6 +++++- src/sentry/api/endpoints/organization_stats.py | 5 ++++- src/sentry/api/endpoints/project_group_stats.py | 5 ++++- src/sentry/api/endpoints/project_servicehook_stats.py | 7 ++++++- src/sentry/api/endpoints/project_stats.py | 5 ++++- src/sentry/api/endpoints/team_stats.py | 1 + src/sentry/api/serializers/models/group_stream.py | 6 ++++++ src/sentry/tsdb/base.py | 10 +++++++++- src/sentry/tsdb/dummy.py | 1 + src/sentry/tsdb/inmemory.py | 1 + src/sentry/tsdb/redis.py | 1 + .../utils/suspect_resolutions/metric_correlation.py | 1 + 14 files changed, 52 insertions(+), 8 deletions(-) diff --git a/src/sentry/api/endpoints/group_details.py b/src/sentry/api/endpoints/group_details.py index 1f9d1f791b6dee..461bd86fc00566 100644 --- a/src/sentry/api/endpoints/group_details.py +++ b/src/sentry/api/endpoints/group_details.py @@ -120,7 +120,11 @@ def _get_context_plugins(self, request: Request, group): @staticmethod def __group_hourly_daily_stats(group: Group, environment_ids: Sequence[int]): - get_range = functools.partial(tsdb.get_range, environment_ids=environment_ids) + get_range = functools.partial( + tsdb.get_range, + environment_ids=environment_ids, + tenant_ids={"organization_id": group.project.organization_id}, + ) model = get_issue_tsdb_group_model(group.issue_category) now = timezone.now() hourly_stats = tsdb.rollup( diff --git a/src/sentry/api/endpoints/group_stats.py b/src/sentry/api/endpoints/group_stats.py index 369f4a8e17b170..04d95bf2f5c57e 100644 --- a/src/sentry/api/endpoints/group_stats.py +++ b/src/sentry/api/endpoints/group_stats.py @@ -19,7 +19,10 @@ def get(self, request: Request, group) -> Response: raise ResourceDoesNotExist data = tsdb.get_range( - model=tsdb.models.group, keys=[group.id], **self._parse_args(request, environment_id) + model=tsdb.models.group, + keys=[group.id], + **self._parse_args(request, environment_id), + tenant_ids={"organization_id": group.project.organization_id}, )[group.id] return Response(data) diff --git a/src/sentry/api/endpoints/integrations/sentry_apps/interaction.py b/src/sentry/api/endpoints/integrations/sentry_apps/interaction.py index f6343055cac429..73d8e3b3dc32a5 100644 --- a/src/sentry/api/endpoints/integrations/sentry_apps/interaction.py +++ b/src/sentry/api/endpoints/integrations/sentry_apps/interaction.py @@ -29,7 +29,10 @@ def get(self, request: Request, sentry_app) -> Response: """ views = tsdb.get_range( - model=tsdb.models.sentry_app_viewed, keys=[sentry_app.id], **self._parse_args(request) + model=tsdb.models.sentry_app_viewed, + keys=[sentry_app.id], + **self._parse_args(request), + tenant_ids={"organization_id": sentry_app.owner.id}, )[sentry_app.id] component_interactions = tsdb.get_range( @@ -39,6 +42,7 @@ def get(self, request: Request, sentry_app) -> Response: for component in sentry_app.components.all() ], **self._parse_args(request), + tenant_ids={"organization_id": sentry_app.owner.id}, ) return Response( diff --git a/src/sentry/api/endpoints/organization_stats.py b/src/sentry/api/endpoints/organization_stats.py index 1b30573b5bffa8..677a183c8caac8 100644 --- a/src/sentry/api/endpoints/organization_stats.py +++ b/src/sentry/api/endpoints/organization_stats.py @@ -89,7 +89,10 @@ def get(self, request: Request, organization) -> Response: if stat_model is None: raise ValueError(f"Invalid group: {group}, stat: {stat}") data = tsdb.get_range( - model=stat_model, keys=keys, **self._parse_args(request, **query_kwargs) + model=stat_model, + keys=keys, + **self._parse_args(request, **query_kwargs), + tenant_ids={"organization_id": organization.id}, ) if group == "organization": diff --git a/src/sentry/api/endpoints/project_group_stats.py b/src/sentry/api/endpoints/project_group_stats.py index 1dfb1aa54f0fe6..ca304dcb926846 100644 --- a/src/sentry/api/endpoints/project_group_stats.py +++ b/src/sentry/api/endpoints/project_group_stats.py @@ -37,7 +37,10 @@ def get(self, request: Request, project) -> Response: return Response(status=204) data = tsdb.get_range( - model=tsdb.models.group, keys=group_ids, **self._parse_args(request, environment_id) + model=tsdb.models.group, + keys=group_ids, + **self._parse_args(request, environment_id), + tenant_ids={"organization_id": project.organization_id}, ) return Response({str(k): v for k, v in data.items()}) diff --git a/src/sentry/api/endpoints/project_servicehook_stats.py b/src/sentry/api/endpoints/project_servicehook_stats.py index b3682e6e839e35..1b8c27b40448a3 100644 --- a/src/sentry/api/endpoints/project_servicehook_stats.py +++ b/src/sentry/api/endpoints/project_servicehook_stats.py @@ -20,7 +20,12 @@ def get(self, request: Request, project, hook_id) -> Response: stats = {} for model, name in ((tsdb.models.servicehook_fired, "total"),): - result = tsdb.get_range(model=model, keys=[hook.id], **stat_args)[hook.id] + result = tsdb.get_range( + model=model, + keys=[hook.id], + **stat_args, + tenant_ids={"organization_id": project.organization_id}, + )[hook.id] for ts, count in result: stats.setdefault(int(ts), {})[name] = count diff --git a/src/sentry/api/endpoints/project_stats.py b/src/sentry/api/endpoints/project_stats.py index c754b819ab03ab..cbbf728e6fbdd3 100644 --- a/src/sentry/api/endpoints/project_stats.py +++ b/src/sentry/api/endpoints/project_stats.py @@ -62,7 +62,10 @@ def get(self, request: Request, project) -> Response: raise ValueError("Invalid stat: %s" % stat) data = tsdb.get_range( - model=stat_model, keys=[project.id], **self._parse_args(request, **query_kwargs) + model=stat_model, + keys=[project.id], + **self._parse_args(request, **query_kwargs), + tenant_ids={"organization_id": project.organization_id}, )[project.id] return Response(data) diff --git a/src/sentry/api/endpoints/team_stats.py b/src/sentry/api/endpoints/team_stats.py index 1f2c64ac0e15bc..f9a15d8d8cbc32 100644 --- a/src/sentry/api/endpoints/team_stats.py +++ b/src/sentry/api/endpoints/team_stats.py @@ -51,6 +51,7 @@ def get(self, request: Request, team) -> Response: model=tsdb.models.project, keys=[p.id for p in projects], **self._parse_args(request, environment_id), + tenant_ids={"organization_id": team.organization_id}, ).values() ) diff --git a/src/sentry/api/serializers/models/group_stream.py b/src/sentry/api/serializers/models/group_stream.py index b0efae12fbc7d2..64c64d971296d1 100644 --- a/src/sentry/api/serializers/models/group_stream.py +++ b/src/sentry/api/serializers/models/group_stream.py @@ -1,6 +1,7 @@ from __future__ import annotations import functools +import logging from abc import abstractmethod from dataclasses import dataclass from datetime import datetime, timedelta @@ -25,6 +26,8 @@ from sentry.utils.cache import cache from sentry.utils.hashlib import hash_values +logger = logging.getLogger("bruh.group.stream") + @dataclass class GroupStatsQueryArgs: @@ -158,6 +161,7 @@ def query_tsdb(self, groups: Sequence[Group], query_params, **kwargs): keys=[g.id for g in groups], environment_ids=environment and [environment.id], **query_params, + tenant_ids={"organization_id": environment.organization_id}, ) return stats @@ -344,6 +348,8 @@ def query_tsdb( generic_issue_ids.append(group.id) results = {} + + logger.error(f"ORG ID ADDED {self.organization_id}") get_range = functools.partial( snuba_tsdb.get_range, environment_ids=environment_ids, diff --git a/src/sentry/tsdb/base.py b/src/sentry/tsdb/base.py index 407d226605ad24..2fedc44209d2a0 100644 --- a/src/sentry/tsdb/base.py +++ b/src/sentry/tsdb/base.py @@ -355,7 +355,15 @@ def delete(self, models, keys, start=None, end=None, timestamp=None, environment raise NotImplementedError def get_range( - self, model, keys, start, end, rollup=None, environment_ids=None, use_cache=False + self, + model, + keys, + start, + end, + rollup=None, + environment_ids=None, + use_cache=False, + tenant_ids=None, ): """ To get a range of data for group ID=[1, 2, 3]: diff --git a/src/sentry/tsdb/dummy.py b/src/sentry/tsdb/dummy.py index 0038391cacc2e0..38845dd4231dcd 100644 --- a/src/sentry/tsdb/dummy.py +++ b/src/sentry/tsdb/dummy.py @@ -31,6 +31,7 @@ def get_range( environment_ids=None, use_cache=False, jitter_value=None, + tenant_ids=None, ): self.validate_arguments([model], environment_ids if environment_ids is not None else [None]) _, series = self.get_optimal_rollup_series(start, end, rollup) diff --git a/src/sentry/tsdb/inmemory.py b/src/sentry/tsdb/inmemory.py index e02faf63085bb3..5bdcac8abec2f5 100644 --- a/src/sentry/tsdb/inmemory.py +++ b/src/sentry/tsdb/inmemory.py @@ -70,6 +70,7 @@ def get_range( environment_ids=None, use_cache=False, jitter_value=None, + tenant_ids=None, ): self.validate_arguments([model], environment_ids if environment_ids is not None else [None]) diff --git a/src/sentry/tsdb/redis.py b/src/sentry/tsdb/redis.py index fcd9b8229a3056..d321f2da7e7489 100644 --- a/src/sentry/tsdb/redis.py +++ b/src/sentry/tsdb/redis.py @@ -272,6 +272,7 @@ def get_range( environment_ids=None, use_cache=False, jitter_value=None, + tenant_ids=None, ): """ To get a range of data for group ID=[1, 2, 3]: diff --git a/src/sentry/utils/suspect_resolutions/metric_correlation.py b/src/sentry/utils/suspect_resolutions/metric_correlation.py index 1244b92c1d3af4..0ad76dea1c0b67 100644 --- a/src/sentry/utils/suspect_resolutions/metric_correlation.py +++ b/src/sentry/utils/suspect_resolutions/metric_correlation.py @@ -44,6 +44,7 @@ def is_issue_error_rate_correlated( rollup=600, start=start_time, end=end_time, + tenant_ids={"organization_id": resolved_issue.project.organization_id}, ) x = [events for _, events in data[resolved_issue.id]] From 5ffa5a076e14844beb8eb9bec1acb2b5ccbd5c94 Mon Sep 17 00:00:00 2001 From: Rahul Saini Date: Wed, 1 Mar 2023 14:23:09 -0800 Subject: [PATCH 2/4] get_sums --- src/sentry/digests/notifications.py | 8 +++++++- src/sentry/models/groupsnooze.py | 1 + src/sentry/rules/conditions/event_frequency.py | 2 ++ src/sentry/tsdb/base.py | 2 ++ 4 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/sentry/digests/notifications.py b/src/sentry/digests/notifications.py index 52b6270f44e4d9..f659ccb9923294 100644 --- a/src/sentry/digests/notifications.py +++ b/src/sentry/digests/notifications.py @@ -82,7 +82,13 @@ def fetch_state(project: Project, records: Sequence[Record]) -> Mapping[str, Any "rules": Rule.objects.in_bulk( itertools.chain.from_iterable(record.value.rules for record in records) ), - "event_counts": tsdb.get_sums(tsdb.models.group, list(groups.keys()), start, end), + "event_counts": tsdb.get_sums( + tsdb.models.group, + list(groups.keys()), + start, + end, + tenant_ids={"organization_id": project.organization_id}, + ), "user_counts": tsdb.get_distinct_counts_totals( tsdb.models.users_affected_by_group, list(groups.keys()), start, end ), diff --git a/src/sentry/models/groupsnooze.py b/src/sentry/models/groupsnooze.py index d51da0608d7aab..166f77c072779b 100644 --- a/src/sentry/models/groupsnooze.py +++ b/src/sentry/models/groupsnooze.py @@ -98,6 +98,7 @@ def test_frequency_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.count: diff --git a/src/sentry/rules/conditions/event_frequency.py b/src/sentry/rules/conditions/event_frequency.py index 3be8a79420aebb..ea0ae9bfc722e5 100644 --- a/src/sentry/rules/conditions/event_frequency.py +++ b/src/sentry/rules/conditions/event_frequency.py @@ -235,6 +235,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 sums[event.group_id] @@ -364,6 +365,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}, )[event.group_id] if issue_count > avg_sessions_in_interval: # We want to better understand when and why this is happening, so we're logging it for now diff --git a/src/sentry/tsdb/base.py b/src/sentry/tsdb/base.py index 2fedc44209d2a0..47c451a04e26f5 100644 --- a/src/sentry/tsdb/base.py +++ b/src/sentry/tsdb/base.py @@ -387,6 +387,7 @@ def get_sums( environment_id=None, use_cache=False, jitter_value=None, + tenant_ids=None, ): range_set = self.get_range( model, @@ -397,6 +398,7 @@ def get_sums( environment_ids=[environment_id] if environment_id is not None else None, use_cache=use_cache, jitter_value=jitter_value, + tenant_ids=tenant_ids, ) sum_set = {key: sum(p for _, p in points) for (key, points) in range_set.items()} return sum_set From 291ed7ecba7740b53e4e73db89d577749fbd153c Mon Sep 17 00:00:00 2001 From: Rahul Saini Date: Wed, 1 Mar 2023 14:24:42 -0800 Subject: [PATCH 3/4] remove log --- src/sentry/api/serializers/models/group_stream.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/sentry/api/serializers/models/group_stream.py b/src/sentry/api/serializers/models/group_stream.py index 64c64d971296d1..ffceef381ce991 100644 --- a/src/sentry/api/serializers/models/group_stream.py +++ b/src/sentry/api/serializers/models/group_stream.py @@ -1,7 +1,6 @@ from __future__ import annotations import functools -import logging from abc import abstractmethod from dataclasses import dataclass from datetime import datetime, timedelta @@ -26,8 +25,6 @@ from sentry.utils.cache import cache from sentry.utils.hashlib import hash_values -logger = logging.getLogger("bruh.group.stream") - @dataclass class GroupStatsQueryArgs: @@ -349,7 +346,6 @@ def query_tsdb( results = {} - logger.error(f"ORG ID ADDED {self.organization_id}") get_range = functools.partial( snuba_tsdb.get_range, environment_ids=environment_ids, From 6fbd8337f74be03821e8d9a23549d20b4abf673a Mon Sep 17 00:00:00 2001 From: Rahul Saini Date: Wed, 1 Mar 2023 14:32:28 -0800 Subject: [PATCH 4/4] fix group_stream org id --- src/sentry/api/serializers/models/group_stream.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/sentry/api/serializers/models/group_stream.py b/src/sentry/api/serializers/models/group_stream.py index ffceef381ce991..c2c8c6422ad367 100644 --- a/src/sentry/api/serializers/models/group_stream.py +++ b/src/sentry/api/serializers/models/group_stream.py @@ -153,12 +153,13 @@ def query_tsdb(self, groups: Sequence[Group], query_params, **kwargs): except Environment.DoesNotExist: stats = {g.id: tsdb.make_series(0, **query_params) for g in groups} else: + org_id = groups[0].project.organization_id if groups else None stats = tsdb.get_range( model=tsdb.models.group, keys=[g.id for g in groups], environment_ids=environment and [environment.id], **query_params, - tenant_ids={"organization_id": environment.organization_id}, + tenant_ids={"organization_id": org_id} if org_id else None, ) return stats