-
-
Notifications
You must be signed in to change notification settings - Fork 4.5k
feat(issue-platform): update GroupSerializers et. al to query snuba for Issue stats #42865
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
e6d7592
cb23531
bc86e35
aa73959
b43f067
50b8733
abbe8bc
5d1ae11
ab96bdf
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||
---|---|---|---|---|
|
@@ -375,6 +375,12 @@ def _seen_stats_performance( | |||
) -> Mapping[Group, SeenStats]: | ||||
pass | ||||
|
||||
@abstractmethod | ||||
def _seen_stats_generic( | ||||
self, generic_issue_list: Sequence[Group], user | ||||
) -> Mapping[Group, SeenStats]: | ||||
pass | ||||
|
||||
def _expand(self, key) -> bool: | ||||
if self.expand is None: | ||||
return False | ||||
|
@@ -460,11 +466,20 @@ def _get_seen_stats( | |||
perf_issues = [ | ||||
group for group in item_list if GroupCategory.PERFORMANCE == group.issue_category | ||||
] | ||||
generic_issues = [ | ||||
group | ||||
for group in item_list | ||||
if group.issue_category | ||||
and group.issue_category not in (GroupCategory.ERROR, GroupCategory.PERFORMANCE) | ||||
] | ||||
|
||||
# bulk query for the seen_stats by type | ||||
error_stats = (self._seen_stats_error(error_issues, user) if error_issues else {}) or {} | ||||
perf_stats = (self._seen_stats_performance(perf_issues, user) if perf_issues else {}) or {} | ||||
agg_stats = {**error_stats, **perf_stats} | ||||
generic_stats = ( | ||||
self._seen_stats_generic(generic_issues, user) if generic_issues else {} | ||||
) or {} | ||||
agg_stats = {**error_stats, **perf_stats, **generic_stats} | ||||
# combine results back | ||||
return {group: agg_stats.get(group, {}) for group in item_list} | ||||
|
||||
|
@@ -747,6 +762,15 @@ def _seen_stats_performance( | |||
tagstore.get_perf_group_list_tag_value, | ||||
) | ||||
|
||||
def _seen_stats_generic( | ||||
self, generic_issue_list: Sequence[Group], user | ||||
) -> Mapping[Group, SeenStats]: | ||||
return self.__seen_stats_impl( | ||||
generic_issue_list, | ||||
tagstore.get_generic_groups_user_counts, | ||||
tagstore.get_generic_group_list_tag_value, | ||||
) | ||||
|
||||
def __seen_stats_impl( | ||||
self, | ||||
issue_list: Sequence[Group], | ||||
|
@@ -918,6 +942,22 @@ def _seen_stats_performance( | |||
self.environment_ids, | ||||
) | ||||
|
||||
def _seen_stats_generic( | ||||
self, generic_issue_list: Sequence[Group], user | ||||
) -> Mapping[Group, SeenStats]: | ||||
return self._parse_seen_stats_results( | ||||
self._execute_generic_seen_stats_query( | ||||
item_list=generic_issue_list, | ||||
start=self.start, | ||||
end=self.end, | ||||
conditions=self.conditions, | ||||
environment_ids=self.environment_ids, | ||||
), | ||||
generic_issue_list, | ||||
bool(self.start or self.end or self.conditions), | ||||
self.environment_ids, | ||||
) | ||||
|
||||
@staticmethod | ||||
def _execute_error_seen_stats_query( | ||||
item_list, start=None, end=None, conditions=None, environment_ids=None | ||||
|
@@ -974,6 +1014,32 @@ def _execute_perf_seen_stats_query( | |||
referrer="serializers.GroupSerializerSnuba._execute_perf_seen_stats_query", | ||||
) | ||||
|
||||
@staticmethod | ||||
def _execute_generic_seen_stats_query( | ||||
item_list, start=None, end=None, conditions=None, environment_ids=None | ||||
): | ||||
project_ids = list({item.project_id for item in item_list}) | ||||
group_ids = [item.id for item in item_list] | ||||
aggregations = [ | ||||
|
def _prepare_query_params(query_params): |
I created a couple tickets to start porting over some of these new queries to SnQL but those will likely get tackled a bit down the line.
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -440,25 +440,35 @@ def get_group_tag_values(self, group, environment_id, key): | |
) | ||
return set(key.top_values) | ||
|
||
def get_group_list_tag_value(self, project_ids, group_id_list, environment_ids, key, value): | ||
tag = f"tags[{key}]" | ||
def __get_group_list_tag_value( | ||
self, | ||
project_ids, | ||
group_id_list, | ||
environment_ids, | ||
key, | ||
value, | ||
dataset, | ||
extra_conditions, | ||
extra_aggregations, | ||
referrer, | ||
): | ||
filters = {"project_id": project_ids, "group_id": group_id_list} | ||
if environment_ids: | ||
filters["environment"] = environment_ids | ||
conditions = [[tag, "=", value], DEFAULT_TYPE_CONDITION] | ||
aggregations = [ | ||
conditions = (extra_conditions if extra_conditions else []) + [[f"tags[{key}]", "=", value]] | ||
aggregations = (extra_aggregations if extra_aggregations else []) + [ | ||
["count()", "", "times_seen"], | ||
["min", SEEN_COLUMN, "first_seen"], | ||
["max", SEEN_COLUMN, "last_seen"], | ||
] | ||
|
||
result = snuba.query( | ||
dataset=Dataset.Events, | ||
dataset=dataset, | ||
groupby=["group_id"], | ||
conditions=conditions, | ||
filter_keys=filters, | ||
aggregations=aggregations, | ||
referrer="tagstore.get_group_list_tag_value", | ||
referrer=referrer, | ||
) | ||
|
||
return { | ||
|
@@ -468,6 +478,19 @@ def get_group_list_tag_value(self, project_ids, group_id_list, environment_ids, | |
for group_id, data in result.items() | ||
} | ||
|
||
def get_group_list_tag_value(self, project_ids, group_id_list, environment_ids, key, value): | ||
return self.__get_group_list_tag_value( | ||
project_ids, | ||
group_id_list, | ||
environment_ids, | ||
key, | ||
value, | ||
Dataset.Events, | ||
[DEFAULT_TYPE_CONDITION], | ||
[], | ||
"tagstore.get_group_list_tag_value", | ||
) | ||
|
||
def get_perf_group_list_tag_value( | ||
self, project_ids, group_id_list, environment_ids, key, value | ||
): | ||
|
@@ -497,6 +520,21 @@ def get_perf_group_list_tag_value( | |
for group_id, data in result.items() | ||
} | ||
|
||
def get_generic_group_list_tag_value( | ||
self, project_ids, group_id_list, environment_ids, key, value | ||
): | ||
return self.__get_group_list_tag_value( | ||
project_ids, | ||
group_id_list, | ||
environment_ids, | ||
key, | ||
value, | ||
Dataset.IssuePlatform, | ||
[], | ||
[], | ||
"tagstore.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 | ||
): | ||
|
@@ -724,26 +762,51 @@ def get_group_tag_values_for_users(self, event_users, limit=100): | |
) | ||
return values | ||
|
||
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, | ||
dataset=Dataset.Events, | ||
extra_aggregations=None, | ||
referrer="tagstore.__get_groups_user_counts", | ||
): | ||
filters = {"project_id": project_ids, "group_id": group_ids} | ||
if environment_ids: | ||
filters["environment"] = environment_ids | ||
aggregations = [["uniq", "tags[sentry:user]", "count"]] | ||
|
||
aggregations = (extra_aggregations if extra_aggregations else []) + [ | ||
["uniq", "tags[sentry:user]", "count"] | ||
] | ||
|
||
result = snuba.query( | ||
dataset=Dataset.Events, | ||
dataset=dataset, | ||
start=start, | ||
end=end, | ||
groupby=["group_id"], | ||
conditions=None, | ||
filter_keys=filters, | ||
aggregations=aggregations, | ||
orderby="-count", | ||
referrer="tagstore.get_groups_user_counts", | ||
referrer=referrer, | ||
) | ||
|
||
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): | ||
return self.__get_groups_user_counts( | ||
project_ids, | ||
group_ids, | ||
environment_ids, | ||
start, | ||
end, | ||
Dataset.Events, | ||
[], | ||
"tagstore.get_groups_user_counts", | ||
) | ||
|
||
def get_perf_groups_user_counts( | ||
self, project_ids, group_ids, environment_ids, start=None, end=None | ||
): | ||
|
@@ -774,6 +837,20 @@ def get_perf_groups_user_counts( | |
}, | ||
) | ||
|
||
def get_generic_groups_user_counts( | ||
|
||
self, project_ids, group_ids, environment_ids, start=None, end=None | ||
): | ||
return self.__get_groups_user_counts( | ||
project_ids, | ||
group_ids, | ||
environment_ids, | ||
start, | ||
end, | ||
Dataset.IssuePlatform, | ||
[], | ||
"tagstore.get_generic_groups_user_counts", | ||
) | ||
|
||
def get_tag_value_paginator( | ||
self, | ||
project_id, | ||
|
Uh oh!
There was an error while loading. Please reload this page.