Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
5e5f441
modelid:300, modelid:100, legacy queries
rahul-kumar-saini Mar 3, 2023
1e01ace
get_release_tags + group serializer
rahul-kumar-saini Mar 4, 2023
b29da14
Add referrer to tenant ids at query level instead
rahul-kumar-saini Mar 6, 2023
95cb902
remove hardcoded referrer
rahul-kumar-saini Mar 7, 2023
446bfeb
undo referrer abstractions
rahul-kumar-saini Mar 7, 2023
fc5c3db
get_tag_key and get_tag_keys_for_projects
rahul-kumar-saini Mar 7, 2023
d0c93a2
Merge branch 'master' into rahul/feat/tagstore_tenant_ids
rahul-kumar-saini Mar 7, 2023
8296b00
get_tag_keys and get_group_tag_keys
rahul-kumar-saini Mar 7, 2023
977aa38
get_groups_user_counts
rahul-kumar-saini Mar 7, 2023
aee4d56
get_group_list_tag_value
rahul-kumar-saini Mar 7, 2023
c86cc61
rest of group serializers
rahul-kumar-saini Mar 7, 2023
28e6c96
get_tag_value and get_tag_values
rahul-kumar-saini Mar 7, 2023
34f591b
more random unused? getters
rahul-kumar-saini Mar 7, 2023
379f9e5
more paginators
rahul-kumar-saini Mar 7, 2023
309757a
finished
rahul-kumar-saini Mar 7, 2023
50b6cd5
finished
rahul-kumar-saini Mar 7, 2023
932eaed
merge conflict
rahul-kumar-saini Mar 7, 2023
90e95ba
kwargs bug
rahul-kumar-saini Mar 7, 2023
81a3e32
kwargs bug fixed fr
rahul-kumar-saini Mar 7, 2023
5f757d7
undo swap
rahul-kumar-saini Mar 7, 2023
b25eb1e
Fix query_builder
rahul-kumar-saini Mar 7, 2023
0d8fc1b
remove dead code
rahul-kumar-saini Mar 7, 2023
f44e929
undo builder change for now
rahul-kumar-saini Mar 7, 2023
847409c
get_tag_values special case fix
rahul-kumar-saini Mar 7, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion src/sentry/api/endpoints/group_details.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
13 changes: 9 additions & 4 deletions src/sentry/api/endpoints/group_tagkey_details.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -33,18 +33,23 @@ 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=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))
11 changes: 8 additions & 3 deletions src/sentry/api/endpoints/group_tagkey_values.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,14 @@ 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)
tagstore.get_group_tag_key(
group,
None,
lookup_key,
tenant_ids=tenant_ids,
)
except tagstore.GroupTagKeyNotFound:
raise ResourceDoesNotExist
sort = request.GET.get("sort")
Expand All @@ -48,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(
Expand Down
6 changes: 5 additions & 1 deletion src/sentry/api/endpoints/group_tags.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
1 change: 1 addition & 0 deletions src/sentry/api/endpoints/organization_tagkey_values.py
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down
1 change: 1 addition & 0 deletions src/sentry/api/endpoints/organization_tags.py
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
20 changes: 16 additions & 4 deletions src/sentry/api/endpoints/project_tagkey_details.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -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
Expand All @@ -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 []
10 changes: 8 additions & 2 deletions src/sentry/api/endpoints/project_tagkey_values.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,15 +28,20 @@ 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:
# if the environment doesn't exist then the tag can't possibly exist
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=tenant_ids,
)
except tagstore.TagKeyNotFound:
raise ResourceDoesNotExist

Expand All @@ -50,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(
Expand Down
7 changes: 6 additions & 1 deletion src/sentry/api/endpoints/project_tags.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
)

Expand Down
13 changes: 11 additions & 2 deletions src/sentry/api/serializers/models/group.py
Original file line number Diff line number Diff line change
Expand Up @@ -811,16 +811,25 @@ 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}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just noting that we preload group projects here

prefetch_related_objects(item_list, "project__organization")
, so this won't cause an extra query.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm new to Django, are you saying I'm causing an extra query by doing .project.organization_id? How can I avoid this if so?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No, just noting for anyone else reading that it won't cause any extra load

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] = {}
times_seen: MutableMapping[int, int] = {}

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
Expand Down
16 changes: 14 additions & 2 deletions src/sentry/data_export/processors/issues_by_tag.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
from __future__ import annotations

from sentry import tagstore
from sentry.models import EventUser, Group, Project, get_group_with_redirect

Expand All @@ -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
Expand All @@ -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)
Expand Down Expand Up @@ -101,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):
Expand Down
6 changes: 5 additions & 1 deletion src/sentry/models/group.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Loading