Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 23 additions & 2 deletions src/sentry/seer/autofix/autofix_agent.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
from sentry.sentry_apps.metrics import SentryAppEventType
from sentry.sentry_apps.tasks.sentry_apps import broadcast_webhooks_for_organization
from sentry.sentry_apps.utils.webhooks import SeerActionType
from sentry.utils import metrics

if TYPE_CHECKING:
from sentry.models.group import Group
Expand Down Expand Up @@ -294,6 +295,8 @@ def trigger_autofix_explorer(
},
)

metrics.incr("autofix.explorer.trigger", tags={"step": step.value, "referrer": referrer.value})

return run_id


Expand Down Expand Up @@ -407,6 +410,7 @@ def _get_relevant_repo(
def trigger_coding_agent_handoff(
group: Group,
run_id: int,
referrer: AutofixReferrer,
integration_id: int | None = None,
provider: str | None = None,
user_id: int | None = None,
Expand Down Expand Up @@ -482,7 +486,7 @@ def trigger_coding_agent_handoff(

prompt = generate_autofix_handoff_prompt(state, short_id=short_id)

return client.launch_coding_agents(
coding_agents = client.launch_coding_agents(
run_id=run_id,
integration_id=integration_id,
provider=provider,
Expand All @@ -493,8 +497,20 @@ def trigger_coding_agent_handoff(
auto_create_pr=auto_create_pr,
)

metrics.incr(
"autofix.explorer.trigger",
tags={"step": "coding_agent_handoff", "referrer": referrer.value},
)

return coding_agents


def trigger_push_changes(group: Group, run_id: int, state: SeerRunState | None = None):
def trigger_push_changes(
group: Group,
run_id: int,
referrer: AutofixReferrer,
state: SeerRunState | None = None,
):
client = get_autofix_explorer_client(group)

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

client.push_changes(run_id, blocking=False)

metrics.incr(
"autofix.explorer.trigger",
tags={"step": "open_pr", "referrer": referrer.value},
)
8 changes: 7 additions & 1 deletion src/sentry/seer/autofix/on_completion_hook.py
Original file line number Diff line number Diff line change
Expand Up @@ -416,7 +416,12 @@ def _push_changes(cls, group: Group, run_id: int, state: SeerRunState) -> None:
)

try:
trigger_push_changes(group, run_id, state=state)
trigger_push_changes(
group,
run_id,
referrer=AutofixReferrer.GROUP_AUTOFIX_ENDPOINT,
Comment thread
cursor[bot] marked this conversation as resolved.
Outdated
state=state,
)
except Exception:
logger.exception(
"autofix.on_completion_hook.push_changes_failed",
Expand Down Expand Up @@ -491,6 +496,7 @@ def _trigger_coding_agent_handoff(
result = trigger_coding_agent_handoff(
group=group,
run_id=run_id,
referrer=AutofixReferrer.ON_COMPLETION_HOOK,
integration_id=handoff_config.integration_id,
)
logger.info(
Expand Down
7 changes: 6 additions & 1 deletion src/sentry/seer/endpoints/group_ai_autofix.py
Original file line number Diff line number Diff line change
Expand Up @@ -252,6 +252,7 @@ def _post_explorer(self, request: Request, group: Group) -> Response:
result = trigger_coding_agent_handoff(
group=group,
run_id=run_id,
referrer=AutofixReferrer.GROUP_AUTOFIX_ENDPOINT,
integration_id=integration_id,
provider=provider,
user_id=request.user.id if request.user else None,
Expand All @@ -264,7 +265,11 @@ def _post_explorer(self, request: Request, group: Group) -> Response:
{"detail": "run_id is required for open_pr"}, status=status.HTTP_400_BAD_REQUEST
)
try:
trigger_push_changes(group, run_id)
trigger_push_changes(
group,
run_id,
referrer=AutofixReferrer.GROUP_AUTOFIX_ENDPOINT,
)
except SeerPermissionError:
return Response(status=status.HTTP_404_NOT_FOUND)
return Response({"run_id": run_id}, status=status.HTTP_202_ACCEPTED)
Expand Down
6 changes: 5 additions & 1 deletion src/sentry/seer/entrypoints/operator.py
Original file line number Diff line number Diff line change
Expand Up @@ -227,7 +227,11 @@ def trigger_autofix_explorer(
run_id=None,
)
elif stopping_point == AutofixStoppingPoint.OPEN_PR:
trigger_push_changes(group, run_id)
trigger_push_changes(
group,
run_id,
referrer=AutofixReferrer.SLACK,
)
else:
# NOTE: Stopping point here is really just what
# step to run next. Not the same as the stopping_point
Expand Down
42 changes: 37 additions & 5 deletions tests/sentry/seer/autofix/test_autofix_agent.py
Original file line number Diff line number Diff line change
Expand Up @@ -466,6 +466,7 @@ def test_trigger_coding_agent_handoff_success(
result = trigger_coding_agent_handoff(
group=self.group,
run_id=123,
referrer=AutofixReferrer.UNKNOWN,
integration_id=456,
)

Expand All @@ -491,6 +492,7 @@ def test_trigger_coding_agent_handoff_no_repos(self, mock_client_class, mock_get
result = trigger_coding_agent_handoff(
group=self.group,
run_id=123,
referrer=AutofixReferrer.UNKNOWN,
integration_id=456,
)

Expand Down Expand Up @@ -531,6 +533,7 @@ def test_trigger_coding_agent_handoff_generates_prompt_from_artifacts(
trigger_coding_agent_handoff(
group=self.group,
run_id=123,
referrer=AutofixReferrer.UNKNOWN,
integration_id=456,
)

Expand Down Expand Up @@ -564,6 +567,7 @@ def test_trigger_coding_agent_handoff_uses_group_title_for_branch(
trigger_coding_agent_handoff(
group=self.group,
run_id=123,
referrer=AutofixReferrer.UNKNOWN,
integration_id=456,
)

Expand Down Expand Up @@ -592,6 +596,7 @@ def test_trigger_coding_agent_handoff_fetches_auto_create_pr_from_preferences(
trigger_coding_agent_handoff(
group=self.group,
run_id=123,
referrer=AutofixReferrer.UNKNOWN,
integration_id=456,
)

Expand Down Expand Up @@ -619,6 +624,7 @@ def test_trigger_coding_agent_handoff_defaults_auto_create_pr_false(
trigger_coding_agent_handoff(
group=self.group,
run_id=123,
referrer=AutofixReferrer.UNKNOWN,
integration_id=456,
)

Expand All @@ -638,6 +644,7 @@ def test_trigger_coding_agent_handoff_no_preferences_returns_failure(
result = trigger_coding_agent_handoff(
group=self.group,
run_id=123,
referrer=AutofixReferrer.UNKNOWN,
integration_id=456,
)

Expand Down Expand Up @@ -678,7 +685,12 @@ def test_trigger_coding_agent_handoff_filters_to_relevant_repo(
)
mock_get_autofix_state.return_value = None

trigger_coding_agent_handoff(group=self.group, run_id=123, integration_id=456)
trigger_coding_agent_handoff(
group=self.group,
run_id=123,
referrer=AutofixReferrer.UNKNOWN,
integration_id=456,
)

repos = mock_client.launch_coding_agents.call_args.kwargs["repos"]
assert len(repos) == 1
Expand Down Expand Up @@ -712,7 +724,12 @@ def test_trigger_coding_agent_handoff_falls_back_to_first_repo_when_no_relevant_
)
mock_get_autofix_state.return_value = None

trigger_coding_agent_handoff(group=self.group, run_id=123, integration_id=456)
trigger_coding_agent_handoff(
group=self.group,
run_id=123,
referrer=AutofixReferrer.UNKNOWN,
integration_id=456,
)

repos = mock_client.launch_coding_agents.call_args.kwargs["repos"]
assert len(repos) == 1
Expand Down Expand Up @@ -760,7 +777,12 @@ def test_trigger_coding_agent_handoff_falls_back_when_relevant_repo_doesnt_match
)
mock_get_autofix_state.return_value = None

trigger_coding_agent_handoff(group=self.group, run_id=123, integration_id=456)
trigger_coding_agent_handoff(
group=self.group,
run_id=123,
referrer=AutofixReferrer.UNKNOWN,
integration_id=456,
)

repos = mock_client.launch_coding_agents.call_args.kwargs["repos"]
assert len(repos) == 1
Expand Down Expand Up @@ -822,7 +844,12 @@ def test_trigger_coding_agent_handoff_enriches_branch_name_from_autofix_state(
status=AutofixStatus.COMPLETED,
)

trigger_coding_agent_handoff(group=self.group, run_id=123, integration_id=456)
trigger_coding_agent_handoff(
group=self.group,
run_id=123,
referrer=AutofixReferrer.UNKNOWN,
integration_id=456,
)

repos = mock_client.launch_coding_agents.call_args.kwargs["repos"]
assert repos[0].branch_name == "main"
Expand Down Expand Up @@ -852,7 +879,12 @@ def test_trigger_coding_agent_handoff_keeps_branch_name_from_preferences_when_se
]
)

trigger_coding_agent_handoff(group=self.group, run_id=123, integration_id=456)
trigger_coding_agent_handoff(
group=self.group,
run_id=123,
referrer=AutofixReferrer.UNKNOWN,
integration_id=456,
)

mock_get_autofix_state.assert_not_called()
repos = mock_client.launch_coding_agents.call_args.kwargs["repos"]
Expand Down
Loading