|
@@ -14,6 +14,7 @@ from sentry.api.bases.group import GroupEndpoint
|
|
|
from sentry.api.serializers import serialize
|
|
|
from sentry.grouping.grouping_info import get_grouping_info
|
|
|
from sentry.models.group import Group
|
|
|
+from sentry.models.grouphash import GroupHash
|
|
|
from sentry.seer.similarity.similar_issues import get_similarity_data_from_seer
|
|
|
from sentry.seer.similarity.types import SeerSimilarIssueData, SimilarIssuesEmbeddingsRequest
|
|
|
from sentry.seer.similarity.utils import (
|
|
@@ -40,22 +41,29 @@ class GroupSimilarIssuesEmbeddingsEndpoint(GroupEndpoint):
|
|
|
"GET": ApiPublishStatus.PRIVATE,
|
|
|
}
|
|
|
|
|
|
+ def get_group_hashes_for_group_id(self, group_id: int) -> set[str]:
|
|
|
+ hashes = GroupHash.objects.filter(group_id=group_id)
|
|
|
+ return {hash.hash for hash in hashes}
|
|
|
+
|
|
|
def get_formatted_results(
|
|
|
self,
|
|
|
similar_issues_data: Sequence[SeerSimilarIssueData],
|
|
|
user: User | AnonymousUser,
|
|
|
+ group_id: int,
|
|
|
) -> Sequence[tuple[Mapping[str, Any], Mapping[str, Any]] | None]:
|
|
|
"""
|
|
|
Format the responses using to be used by the frontend by changing the field names and
|
|
|
changing the cosine distances into cosine similarities.
|
|
|
"""
|
|
|
+ hashes = self.get_group_hashes_for_group_id(group_id)
|
|
|
group_data = {}
|
|
|
for similar_issue_data in similar_issues_data:
|
|
|
- formatted_response: FormattedSimilarIssuesEmbeddingsData = {
|
|
|
- "exception": round(1 - similar_issue_data.stacktrace_distance, 4),
|
|
|
- "shouldBeGrouped": "Yes" if similar_issue_data.should_group else "No",
|
|
|
- }
|
|
|
- group_data[similar_issue_data.parent_group_id] = formatted_response
|
|
|
+ if similar_issue_data.parent_hash not in hashes:
|
|
|
+ formatted_response: FormattedSimilarIssuesEmbeddingsData = {
|
|
|
+ "exception": round(1 - similar_issue_data.stacktrace_distance, 4),
|
|
|
+ "shouldBeGrouped": "Yes" if similar_issue_data.should_group else "No",
|
|
|
+ }
|
|
|
+ group_data[similar_issue_data.parent_group_id] = formatted_response
|
|
|
|
|
|
serialized_groups = {
|
|
|
int(g["id"]): g
|
|
@@ -122,6 +130,6 @@ class GroupSimilarIssuesEmbeddingsEndpoint(GroupEndpoint):
|
|
|
|
|
|
if not results:
|
|
|
return Response([])
|
|
|
- formatted_results = self.get_formatted_results(results, request.user)
|
|
|
+ formatted_results = self.get_formatted_results(results, request.user, group.id)
|
|
|
|
|
|
return Response(formatted_results)
|