Skip to content

Commit 48e71c7

Browse files
authored
chore(bug-prediction): Require repo owner and name (#107919)
[seer PR](https://github.com/getsentry/seer/pull/4817) which sends these was deployed
1 parent 2407e50 commit 48e71c7

8 files changed

Lines changed: 75 additions & 39 deletions

File tree

src/sentry/seer/fetch_issues/by_error_type.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,10 +45,10 @@ def fetch_issues(
4545
provider: str,
4646
external_id: str,
4747
exception_type: str,
48+
owner: str,
49+
name: str,
4850
max_num_issues: int = utils.MAX_NUM_ISSUES_DEFAULT,
4951
num_days_ago: int = utils.MAX_NUM_DAYS_AGO_DEFAULT,
50-
owner: str | None = None,
51-
name: str | None = None,
5252
run_id: int | None = None,
5353
) -> utils.SeerResponse | utils.SeerResponseError:
5454
repo_projects = utils.get_repo_and_projects(

src/sentry/seer/fetch_issues/by_function_name.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -267,9 +267,9 @@ def fetch_issues(
267267
external_id: str,
268268
filename: str,
269269
function_name: str,
270+
owner: str,
271+
name: str,
270272
max_num_issues_per_file: int = MAX_NUM_ISSUES_PER_FILE_DEFAULT,
271-
owner: str | None = None,
272-
name: str | None = None,
273273
run_id: int | None = None,
274274
) -> utils.SeerResponse | utils.SeerResponseError:
275275
"""

src/sentry/seer/fetch_issues/by_text_query.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,11 +48,11 @@ def fetch_issues(
4848
provider: str,
4949
external_id: str,
5050
query: str,
51+
owner: str,
52+
name: str,
5153
sort_by: str = SORT_BY_DEFAULT,
5254
limit: int = utils.MAX_NUM_ISSUES_DEFAULT,
5355
max_num_days_ago: int = utils.MAX_NUM_DAYS_AGO_DEFAULT,
54-
owner: str | None = None,
55-
name: str | None = None,
5656
run_id: int | None = None,
5757
) -> utils.SeerResponse | utils.SeerResponseError:
5858
"""

src/sentry/seer/fetch_issues/utils.py

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,9 @@
55
from typing import Any, TypedDict
66

77
import sentry_sdk
8-
from django.db.models import Q
98

109
from sentry.api.serializers import serialize
1110
from sentry.api.serializers.models.event import EventSerializer
12-
from sentry.constants import ObjectStatus
1311
from sentry.integrations.models.repository_project_path_config import RepositoryProjectPathConfig
1412
from sentry.models.group import Group
1513
from sentry.models.project import Project
@@ -65,8 +63,8 @@ def get_repo_and_projects(
6563
organization_id: int,
6664
provider: str,
6765
external_id: str,
68-
owner: str | None = None,
69-
name: str | None = None,
66+
owner: str,
67+
name: str,
7068
run_id: int | None = None,
7169
) -> RepoProjects:
7270
"""
@@ -81,15 +79,7 @@ def get_repo_and_projects(
8179
"run_id": run_id,
8280
}
8381
)
84-
if owner and name:
85-
repo = filter_repo_by_provider(organization_id, provider, external_id, owner, name).first()
86-
else: # TODO(kddubey): remove this branch once seer supplies owner and name
87-
repo = Repository.objects.filter(
88-
Q(provider=provider) | Q(provider=f"integrations:{provider}"),
89-
organization_id=organization_id,
90-
external_id=external_id,
91-
status=ObjectStatus.ACTIVE,
92-
).first()
82+
repo = filter_repo_by_provider(organization_id, provider, external_id, owner, name).first()
9383
if repo is None:
9484
raise Repository.DoesNotExist
9585
repo_configs = list(

tests/sentry/seer/fetch_issues/test_by_error_type.py

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@ def test_simple(self) -> None:
4646
organization_id=self.organization.id,
4747
provider="integrations:github",
4848
external_id="1",
49+
owner="getsentry",
50+
name="sentryA",
4951
exception_type="KeyError",
5052
)
5153
assert "error" not in seer_response
@@ -66,6 +68,8 @@ def test_simple(self) -> None:
6668
organization_id=self.organization.id,
6769
provider="integrations:github",
6870
external_id="1",
71+
owner="getsentry",
72+
name="sentryA",
6973
exception_type="ValueError",
7074
)
7175
assert seer_response == {"issues": [], "issues_full": []}
@@ -158,6 +162,8 @@ def test_multiple_projects(self) -> None:
158162
organization_id=self.organization.id,
159163
provider="integrations:github",
160164
external_id="1",
165+
owner="getsentry",
166+
name="sentryA",
161167
exception_type="KeyError",
162168
)
163169
assert "error" not in seer_response
@@ -208,6 +214,8 @@ def test_last_seen_filter(self) -> None:
208214
organization_id=self.organization.id,
209215
provider="integrations:github",
210216
external_id="1",
217+
owner="getsentry",
218+
name="sentryA",
211219
exception_type="KeyError",
212220
)
213221
assert "error" not in seer_response
@@ -220,6 +228,8 @@ def test_last_seen_filter(self) -> None:
220228
organization_id=self.organization.id,
221229
provider="integrations:github",
222230
external_id="1",
231+
owner="getsentry",
232+
name="sentryA",
223233
exception_type="KeyError",
224234
num_days_ago=9,
225235
)
@@ -284,6 +294,8 @@ def test_multiple_exception_types(self) -> None:
284294
organization_id=self.organization.id,
285295
provider="integrations:github",
286296
external_id="1",
297+
owner="getsentry",
298+
name="sentryA",
287299
exception_type="KeyError",
288300
)
289301
assert "error" not in seer_response
@@ -297,6 +309,8 @@ def test_multiple_exception_types(self) -> None:
297309
organization_id=self.organization.id,
298310
provider="integrations:github",
299311
external_id="1",
312+
owner="getsentry",
313+
name="sentryA",
300314
exception_type="ValueError",
301315
)
302316
assert "error" not in seer_response
@@ -335,7 +349,11 @@ def test_fetch_issues_from_repo_projects_returns_groups(self) -> None:
335349

336350
# Get repo projects
337351
repo_projects = get_repo_and_projects(
338-
organization_id=self.organization.id, provider="integrations:github", external_id="1"
352+
organization_id=self.organization.id,
353+
provider="integrations:github",
354+
external_id="1",
355+
owner="getsentry",
356+
name="sentryA",
339357
)
340358

341359
# Test the internal function directly
@@ -361,7 +379,11 @@ def test_fetch_issues_from_repo_projects_empty_result(self) -> None:
361379

362380
# Get repo projects but don't create any matching events
363381
repo_projects = get_repo_and_projects(
364-
organization_id=self.organization.id, provider="integrations:github", external_id="1"
382+
organization_id=self.organization.id,
383+
provider="integrations:github",
384+
external_id="1",
385+
owner="getsentry",
386+
name="sentryA",
365387
)
366388

367389
# Test the internal function directly
@@ -412,6 +434,8 @@ def _assert_exception_type_matches(
412434
organization_id=self.organization.id,
413435
provider="integrations:github",
414436
external_id="1",
437+
owner="getsentry",
438+
name="sentryA",
415439
exception_type=search_exception_type,
416440
)
417441
assert "error" not in seer_response
@@ -511,6 +535,8 @@ def test_normalized_matching_multiple_groups(self) -> None:
511535
organization_id=self.organization.id,
512536
provider="integrations:github",
513537
external_id="1",
538+
owner="getsentry",
539+
name="sentryA",
514540
exception_type="valueerror",
515541
)
516542
assert "error" not in seer_response
@@ -522,6 +548,8 @@ def test_normalized_matching_multiple_groups(self) -> None:
522548
organization_id=self.organization.id,
523549
provider="integrations:github",
524550
external_id="1",
551+
owner="getsentry",
552+
name="sentryA",
525553
exception_type="type error",
526554
)
527555
assert "error" not in seer_response
@@ -533,6 +561,8 @@ def test_normalized_matching_multiple_groups(self) -> None:
533561
organization_id=self.organization.id,
534562
provider="integrations:github",
535563
external_id="1",
564+
owner="getsentry",
565+
name="sentryA",
536566
exception_type="runtimeerror",
537567
)
538568
assert seer_response == {"issues": [], "issues_full": []}

tests/sentry/seer/fetch_issues/test_by_function_name.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -305,6 +305,8 @@ def test_successful_fetch(self):
305305
organization_id=self.organization.id,
306306
provider="integrations:github",
307307
external_id=self.gh_repo.external_id,
308+
owner="getsentry",
309+
name="sentry",
308310
filename="test.py",
309311
function_name="target_function",
310312
)
@@ -338,6 +340,8 @@ def test_custom_max_num_issues(self):
338340
organization_id=self.organization.id,
339341
provider="integrations:github",
340342
external_id=self.gh_repo.external_id,
343+
owner="getsentry",
344+
name="sentry",
341345
filename="test.py",
342346
function_name="target_function",
343347
max_num_issues_per_file=10,
@@ -367,6 +371,8 @@ def test_with_run_id(self):
367371
organization_id=self.organization.id,
368372
provider="integrations:github",
369373
external_id=self.gh_repo.external_id,
374+
owner="getsentry",
375+
name="sentry",
370376
filename="test.py",
371377
function_name="target_function",
372378
run_id=12345,
@@ -393,6 +399,8 @@ def test_fetch_issues_end_to_end_with_metadata_and_message(self):
393399
organization_id=self.organization.id,
394400
provider="integrations:github",
395401
external_id=self.gh_repo.external_id,
402+
owner="getsentry",
403+
name="sentry",
396404
filename="test.py",
397405
function_name="target_function",
398406
)
@@ -515,6 +523,8 @@ def test_fetch_issues_from_repo_projects_returns_groups(self):
515523
organization_id=self.organization.id,
516524
provider="integrations:github",
517525
external_id=self.gh_repo.external_id,
526+
owner="getsentry",
527+
name="sentry",
518528
)
519529

520530
# Test the internal function directly with real search behavior
@@ -539,6 +549,8 @@ def test_fetch_issues_from_repo_projects_empty_result(self):
539549
organization_id=self.organization.id,
540550
provider="integrations:github",
541551
external_id=self.gh_repo.external_id,
552+
owner="getsentry",
553+
name="sentry",
542554
)
543555

544556
# Test the internal function with non-matching criteria

tests/sentry/seer/fetch_issues/test_by_text_query.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,8 @@ def test_fetch_issues_message_substring_search(self):
9494
organization_id=self.organization.id,
9595
provider="integrations:github",
9696
external_id=self.gh_repo.external_id,
97+
owner="getsentry",
98+
name="sentry",
9799
query="hello",
98100
)
99101
assert "error" not in seer_response
@@ -106,6 +108,8 @@ def test_fetch_issues_message_substring_search(self):
106108
organization_id=self.organization.id,
107109
provider="integrations:github",
108110
external_id=self.gh_repo.external_id,
111+
owner="getsentry",
112+
name="sentry",
109113
query="auth",
110114
)
111115
assert "error" not in seer_response
@@ -144,6 +148,8 @@ def test_fetch_issues_no_match(self):
144148
organization_id=self.organization.id,
145149
provider="integrations:github",
146150
external_id=self.gh_repo.external_id,
151+
owner="getsentry",
152+
name="sentry",
147153
query="nonexistent_keyword_xyz123",
148154
)
149155

@@ -165,6 +171,8 @@ def test_fetch_issues_culprit_search(self):
165171
organization_id=self.organization.id,
166172
provider="integrations:github",
167173
external_id=self.gh_repo.external_id,
174+
owner="getsentry",
175+
name="sentry",
168176
query="database conn",
169177
)
170178

@@ -189,6 +197,8 @@ def test_fetch_issues_limit_parameter(self):
189197
organization_id=self.organization.id,
190198
provider="integrations:github",
191199
external_id=self.gh_repo.external_id,
200+
owner="getsentry",
201+
name="sentry",
192202
query="common.py",
193203
limit=limit,
194204
)
@@ -213,6 +223,8 @@ def test_fetch_issues_from_repo_projects_returns_groups(self):
213223
organization_id=self.organization.id,
214224
provider="integrations:github",
215225
external_id=self.gh_repo.external_id,
226+
owner="getsentry",
227+
name="sentry",
216228
)
217229

218230
# Test the internal function directly with a query that should match the created event
@@ -236,6 +248,8 @@ def test_fetch_issues_from_repo_projects_empty_result(self):
236248
organization_id=self.organization.id,
237249
provider="integrations:github",
238250
external_id=self.gh_repo.external_id,
251+
owner="getsentry",
252+
name="sentry",
239253
)
240254

241255
# Test the internal function with a query that won't match anything

tests/sentry/seer/fetch_issues/test_utils.py

Lines changed: 8 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ def test_get_repo_and_projects_success(self):
2929
organization_id=self.organization.id,
3030
provider="integrations:github",
3131
external_id="123",
32+
owner="getsentry",
33+
name="sentry",
3234
)
3335

3436
assert isinstance(result, RepoProjects)
@@ -56,6 +58,8 @@ def test_get_repo_and_projects_multiple_projects(self):
5658
organization_id=self.organization.id,
5759
provider="integrations:github",
5860
external_id="123",
61+
owner="getsentry",
62+
name="sentry",
5963
)
6064

6165
assert len(result.repo_configs) == 2
@@ -76,6 +80,8 @@ def test_get_repo_and_projects_no_configs(self):
7680
organization_id=self.organization.id,
7781
provider="integrations:github",
7882
external_id="123",
83+
owner="getsentry",
84+
name="sentry",
7985
)
8086

8187
def test_get_repo_and_projects_unprefixed_provider(self):
@@ -87,24 +93,6 @@ def test_get_repo_and_projects_unprefixed_provider(self):
8793
)
8894
self.create_code_mapping(project=self.project, repo=repo)
8995

90-
result = get_repo_and_projects(
91-
organization_id=self.organization.id,
92-
provider="github",
93-
external_id="123",
94-
)
95-
96-
assert result.repo == repo
97-
assert len(result.projects) == 1
98-
99-
def test_get_repo_and_projects_with_owner_and_name(self):
100-
repo = self.create_repo(
101-
project=self.project,
102-
name="getsentry/sentry",
103-
provider="integrations:github",
104-
external_id="123",
105-
)
106-
self.create_code_mapping(project=self.project, repo=repo)
107-
10896
result = get_repo_and_projects(
10997
organization_id=self.organization.id,
11098
provider="github",
@@ -144,6 +132,8 @@ def test_get_repo_and_projects_repo_not_found(self):
144132
organization_id=self.organization.id,
145133
provider="integrations:github",
146134
external_id="nonexistent",
135+
owner="getsentry",
136+
name="sentry",
147137
)
148138

149139

0 commit comments

Comments
 (0)