Skip to content

Commit 7f94740

Browse files
committed
chore(autofix): Add some metrics for explorer autofix triggers
Emit some metrics for when explorer autofix is triggered along with referrers so we know what triggered it.
1 parent 28331f1 commit 7f94740

File tree

5 files changed

+78
-10
lines changed

5 files changed

+78
-10
lines changed

src/sentry/seer/autofix/autofix_agent.py

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
from sentry.sentry_apps.metrics import SentryAppEventType
3636
from sentry.sentry_apps.tasks.sentry_apps import broadcast_webhooks_for_organization
3737
from sentry.sentry_apps.utils.webhooks import SeerActionType
38+
from sentry.utils import metrics
3839

3940
if TYPE_CHECKING:
4041
from sentry.models.group import Group
@@ -294,6 +295,8 @@ def trigger_autofix_explorer(
294295
},
295296
)
296297

298+
metrics.incr("autofix.explorer.trigger", tags={"step": step.value, "referrer": referrer.value})
299+
297300
return run_id
298301

299302

@@ -407,6 +410,7 @@ def _get_relevant_repo(
407410
def trigger_coding_agent_handoff(
408411
group: Group,
409412
run_id: int,
413+
referrer: AutofixReferrer,
410414
integration_id: int | None = None,
411415
provider: str | None = None,
412416
user_id: int | None = None,
@@ -482,7 +486,7 @@ def trigger_coding_agent_handoff(
482486

483487
prompt = generate_autofix_handoff_prompt(state, short_id=short_id)
484488

485-
return client.launch_coding_agents(
489+
coding_agents = client.launch_coding_agents(
486490
run_id=run_id,
487491
integration_id=integration_id,
488492
provider=provider,
@@ -493,8 +497,20 @@ def trigger_coding_agent_handoff(
493497
auto_create_pr=auto_create_pr,
494498
)
495499

500+
metrics.incr(
501+
"autofix.explorer.trigger",
502+
tags={"step": "coding_agent_handoff", "referrer": referrer.value},
503+
)
504+
505+
return coding_agents
506+
496507

497-
def trigger_push_changes(group: Group, run_id: int, state: SeerRunState | None = None):
508+
def trigger_push_changes(
509+
group: Group,
510+
run_id: int,
511+
referrer: AutofixReferrer,
512+
state: SeerRunState | None = None,
513+
):
498514
client = get_autofix_explorer_client(group)
499515

500516
if state is None:
@@ -508,3 +524,8 @@ def trigger_push_changes(group: Group, run_id: int, state: SeerRunState | None =
508524
raise SeerPermissionError("Unknown run id for group")
509525

510526
client.push_changes(run_id, blocking=False)
527+
528+
metrics.incr(
529+
"autofix.explorer.trigger",
530+
tags={"step": "open_pr", "referrer": referrer.value},
531+
)

src/sentry/seer/autofix/on_completion_hook.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -416,7 +416,12 @@ def _push_changes(cls, group: Group, run_id: int, state: SeerRunState) -> None:
416416
)
417417

418418
try:
419-
trigger_push_changes(group, run_id, state=state)
419+
trigger_push_changes(
420+
group,
421+
run_id,
422+
referrer=AutofixReferrer.GROUP_AUTOFIX_ENDPOINT,
423+
state=state,
424+
)
420425
except Exception:
421426
logger.exception(
422427
"autofix.on_completion_hook.push_changes_failed",
@@ -491,6 +496,7 @@ def _trigger_coding_agent_handoff(
491496
result = trigger_coding_agent_handoff(
492497
group=group,
493498
run_id=run_id,
499+
referrer=AutofixReferrer.ON_COMPLETION_HOOK,
494500
integration_id=handoff_config.integration_id,
495501
)
496502
logger.info(

src/sentry/seer/endpoints/group_ai_autofix.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -252,6 +252,7 @@ def _post_explorer(self, request: Request, group: Group) -> Response:
252252
result = trigger_coding_agent_handoff(
253253
group=group,
254254
run_id=run_id,
255+
referrer=AutofixReferrer.GROUP_AUTOFIX_ENDPOINT,
255256
integration_id=integration_id,
256257
provider=provider,
257258
user_id=request.user.id if request.user else None,
@@ -264,7 +265,11 @@ def _post_explorer(self, request: Request, group: Group) -> Response:
264265
{"detail": "run_id is required for open_pr"}, status=status.HTTP_400_BAD_REQUEST
265266
)
266267
try:
267-
trigger_push_changes(group, run_id)
268+
trigger_push_changes(
269+
group,
270+
run_id,
271+
referrer=AutofixReferrer.GROUP_AUTOFIX_ENDPOINT,
272+
)
268273
except SeerPermissionError:
269274
return Response(status=status.HTTP_404_NOT_FOUND)
270275
return Response({"run_id": run_id}, status=status.HTTP_202_ACCEPTED)

src/sentry/seer/entrypoints/operator.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,11 @@ def trigger_autofix_explorer(
227227
run_id=None,
228228
)
229229
elif stopping_point == AutofixStoppingPoint.OPEN_PR:
230-
trigger_push_changes(group, run_id)
230+
trigger_push_changes(
231+
group,
232+
run_id,
233+
referrer=AutofixReferrer.SLACK,
234+
)
231235
else:
232236
# NOTE: Stopping point here is really just what
233237
# step to run next. Not the same as the stopping_point

tests/sentry/seer/autofix/test_autofix_agent.py

Lines changed: 37 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -466,6 +466,7 @@ def test_trigger_coding_agent_handoff_success(
466466
result = trigger_coding_agent_handoff(
467467
group=self.group,
468468
run_id=123,
469+
referrer=AutofixReferrer.UNKNOWN,
469470
integration_id=456,
470471
)
471472

@@ -491,6 +492,7 @@ def test_trigger_coding_agent_handoff_no_repos(self, mock_client_class, mock_get
491492
result = trigger_coding_agent_handoff(
492493
group=self.group,
493494
run_id=123,
495+
referrer=AutofixReferrer.UNKNOWN,
494496
integration_id=456,
495497
)
496498

@@ -531,6 +533,7 @@ def test_trigger_coding_agent_handoff_generates_prompt_from_artifacts(
531533
trigger_coding_agent_handoff(
532534
group=self.group,
533535
run_id=123,
536+
referrer=AutofixReferrer.UNKNOWN,
534537
integration_id=456,
535538
)
536539

@@ -564,6 +567,7 @@ def test_trigger_coding_agent_handoff_uses_group_title_for_branch(
564567
trigger_coding_agent_handoff(
565568
group=self.group,
566569
run_id=123,
570+
referrer=AutofixReferrer.UNKNOWN,
567571
integration_id=456,
568572
)
569573

@@ -592,6 +596,7 @@ def test_trigger_coding_agent_handoff_fetches_auto_create_pr_from_preferences(
592596
trigger_coding_agent_handoff(
593597
group=self.group,
594598
run_id=123,
599+
referrer=AutofixReferrer.UNKNOWN,
595600
integration_id=456,
596601
)
597602

@@ -619,6 +624,7 @@ def test_trigger_coding_agent_handoff_defaults_auto_create_pr_false(
619624
trigger_coding_agent_handoff(
620625
group=self.group,
621626
run_id=123,
627+
referrer=AutofixReferrer.UNKNOWN,
622628
integration_id=456,
623629
)
624630

@@ -638,6 +644,7 @@ def test_trigger_coding_agent_handoff_no_preferences_returns_failure(
638644
result = trigger_coding_agent_handoff(
639645
group=self.group,
640646
run_id=123,
647+
referrer=AutofixReferrer.UNKNOWN,
641648
integration_id=456,
642649
)
643650

@@ -678,7 +685,12 @@ def test_trigger_coding_agent_handoff_filters_to_relevant_repo(
678685
)
679686
mock_get_autofix_state.return_value = None
680687

681-
trigger_coding_agent_handoff(group=self.group, run_id=123, integration_id=456)
688+
trigger_coding_agent_handoff(
689+
group=self.group,
690+
run_id=123,
691+
referrer=AutofixReferrer.UNKNOWN,
692+
integration_id=456,
693+
)
682694

683695
repos = mock_client.launch_coding_agents.call_args.kwargs["repos"]
684696
assert len(repos) == 1
@@ -712,7 +724,12 @@ def test_trigger_coding_agent_handoff_falls_back_to_first_repo_when_no_relevant_
712724
)
713725
mock_get_autofix_state.return_value = None
714726

715-
trigger_coding_agent_handoff(group=self.group, run_id=123, integration_id=456)
727+
trigger_coding_agent_handoff(
728+
group=self.group,
729+
run_id=123,
730+
referrer=AutofixReferrer.UNKNOWN,
731+
integration_id=456,
732+
)
716733

717734
repos = mock_client.launch_coding_agents.call_args.kwargs["repos"]
718735
assert len(repos) == 1
@@ -760,7 +777,12 @@ def test_trigger_coding_agent_handoff_falls_back_when_relevant_repo_doesnt_match
760777
)
761778
mock_get_autofix_state.return_value = None
762779

763-
trigger_coding_agent_handoff(group=self.group, run_id=123, integration_id=456)
780+
trigger_coding_agent_handoff(
781+
group=self.group,
782+
run_id=123,
783+
referrer=AutofixReferrer.UNKNOWN,
784+
integration_id=456,
785+
)
764786

765787
repos = mock_client.launch_coding_agents.call_args.kwargs["repos"]
766788
assert len(repos) == 1
@@ -822,7 +844,12 @@ def test_trigger_coding_agent_handoff_enriches_branch_name_from_autofix_state(
822844
status=AutofixStatus.COMPLETED,
823845
)
824846

825-
trigger_coding_agent_handoff(group=self.group, run_id=123, integration_id=456)
847+
trigger_coding_agent_handoff(
848+
group=self.group,
849+
run_id=123,
850+
referrer=AutofixReferrer.UNKNOWN,
851+
integration_id=456,
852+
)
826853

827854
repos = mock_client.launch_coding_agents.call_args.kwargs["repos"]
828855
assert repos[0].branch_name == "main"
@@ -852,7 +879,12 @@ def test_trigger_coding_agent_handoff_keeps_branch_name_from_preferences_when_se
852879
]
853880
)
854881

855-
trigger_coding_agent_handoff(group=self.group, run_id=123, integration_id=456)
882+
trigger_coding_agent_handoff(
883+
group=self.group,
884+
run_id=123,
885+
referrer=AutofixReferrer.UNKNOWN,
886+
integration_id=456,
887+
)
856888

857889
mock_get_autofix_state.assert_not_called()
858890
repos = mock_client.launch_coding_agents.call_args.kwargs["repos"]

0 commit comments

Comments
 (0)