diff --git a/core/commands/repository/interactors/fetch_repository.py b/core/commands/repository/interactors/fetch_repository.py index 99961c3bd3..14a4e0eb92 100644 --- a/core/commands/repository/interactors/fetch_repository.py +++ b/core/commands/repository/interactors/fetch_repository.py @@ -1,3 +1,4 @@ +import sentry_sdk from asgiref.sync import sync_to_async from shared.django_apps.codecov_auth.models import Owner from shared.django_apps.core.models import Repository @@ -7,23 +8,32 @@ class FetchRepositoryInteractor(BaseInteractor): @sync_to_async + @sentry_sdk.trace def execute( self, owner: Owner, name: str, okta_authenticated_accounts: list[int], exclude_okta_enforced_repos: bool = True, - ): + ) -> Repository | None: queryset = Repository.objects.viewable_repos(self.current_owner) if exclude_okta_enforced_repos: queryset = queryset.exclude_accounts_enforced_okta( okta_authenticated_accounts ) - return ( + # TODO(swatinem): We should find a way to avoid these combinators: + # The `with_recent_coverage` combinator is quite expensive. + # We only need that in case we want to query these props via graphql: + # `coverageAnalytics.{percentCovered,commitSha,hits,misses,lines}` + # Similarly, `with_oldest_commit_at` is only needed for `oldestCommitAt`. + + repo = ( queryset.filter(author=owner, name=name) .with_recent_coverage() .with_oldest_commit_at() .select_related("author") .first() ) + + return repo diff --git a/core/commands/repository/repository.py b/core/commands/repository/repository.py index 6620efbb35..0b1c61a427 100644 --- a/core/commands/repository/repository.py +++ b/core/commands/repository/repository.py @@ -27,7 +27,7 @@ def fetch_repository( name: str, okta_authenticated_accounts: list[int], exclude_okta_enforced_repos: bool = True, - ) -> Repository: + ) -> Repository | None: return self.get_interactor(FetchRepositoryInteractor).execute( owner, name, diff --git a/graphql_api/types/coverage_analytics/coverage_analytics.py b/graphql_api/types/coverage_analytics/coverage_analytics.py index caa3ce7781..9285f52ef5 100644 --- a/graphql_api/types/coverage_analytics/coverage_analytics.py +++ b/graphql_api/types/coverage_analytics/coverage_analytics.py @@ -54,7 +54,6 @@ def resolve_coverage_analytics_result_type( @coverage_analytics_bindable.field("percentCovered") -@sentry_sdk.trace def resolve_percent_covered( parent: CoverageAnalyticsProps, info: GraphQLResolveInfo ) -> Optional[float]: diff --git a/graphql_api/types/owner/owner.py b/graphql_api/types/owner/owner.py index 7876797f1d..241007e891 100644 --- a/graphql_api/types/owner/owner.py +++ b/graphql_api/types/owner/owner.py @@ -2,6 +2,7 @@ from hashlib import sha1 from typing import Any, Coroutine, Iterable, List, Optional +import sentry_sdk import shared.rate_limits as rate_limits import stripe import yaml @@ -168,7 +169,7 @@ async def resolve_repository( # This means we do not want to filter out the Okta enforced repos exclude_okta_enforced_repos = not is_impersonation - repository: Optional[Repository] = await command.fetch_repository( + repository: Repository | None = await command.fetch_repository( owner, name, okta_authenticated_accounts, @@ -178,6 +179,17 @@ async def resolve_repository( if repository is None: return NotFoundError() + sentry_sdk.set_tags( + { + "owner_username": repository.author.username, + "owner_service": repository.author.service, + "owner_plan": repository.author.plan, + "owner_id": repository.author.ownerid, + "repo_name": repository.name, + "repo_id": repository.repoid, + } + ) + current_owner = info.context["request"].current_owner has_products_enabled = ( repository.bundle_analysis_enabled diff --git a/graphql_api/types/repository/repository.py b/graphql_api/types/repository/repository.py index a220d0c638..594440bdc4 100644 --- a/graphql_api/types/repository/repository.py +++ b/graphql_api/types/repository/repository.py @@ -2,6 +2,7 @@ from datetime import datetime from typing import Any, Dict, List, Optional +import sentry_sdk import shared.rate_limits as rate_limits import yaml from ariadne import ObjectType, UnionType @@ -74,9 +75,14 @@ def resolve_author(repository: Repository, info: GraphQLResolveInfo) -> Owner: @repository_bindable.field("commit") -def resolve_commit(repository: Repository, info: GraphQLResolveInfo, id: int) -> Commit: +def resolve_commit(repository: Repository, info: GraphQLResolveInfo, id: str) -> Commit: loader = CommitLoader.loader(info, repository.pk) - return loader.load(id) + commit = loader.load(id) + + if commit: + sentry_sdk.set_tag("commit_sha", id) + + return commit @repository_bindable.field("uploadToken") @@ -305,12 +311,9 @@ def resolve_is_github_rate_limited( @repository_bindable.field("coverageAnalytics") def resolve_coverage_analytics( - repository: Repository, - info: GraphQLResolveInfo, + repository: Repository, info: GraphQLResolveInfo ) -> CoverageAnalyticsProps: - return CoverageAnalyticsProps( - repository=repository, - ) + return CoverageAnalyticsProps(repository=repository) @repository_bindable.field("testAnalytics")