From 360649188db0655b354e83ebe3c1e57a16df25ee Mon Sep 17 00:00:00 2001 From: Jiri Podivin Date: Fri, 4 Sep 2026 14:24:04 +0200 Subject: [PATCH] Capture exceptions raised by tool calls in y_stream sweep Signed-off-by: Jiri Podivin --- Containerfile.tests | 3 ++- ymir/sweep/tests/unit/test_y_stream.py | 11 ++++++++--- ymir/sweep/y_stream.py | 3 +++ 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/Containerfile.tests b/Containerfile.tests index 823c5f7f2..0d0b6183c 100644 --- a/Containerfile.tests +++ b/Containerfile.tests @@ -43,7 +43,8 @@ RUN pip install --no-cache-dir \ rpm \ rpkg \ specfile \ - "logdetective-mcp>=0.5.0" + "logdetective-mcp>=0.5.0" \ + "sentry-sdk>=2.13.0" # Verify no malicious litellm_init.pth was introduced by compromised litellm packages (e.g. 1.82.7, 1.82.8) RUN MALICIOUS=$(find /usr /opt -name "litellm_init.pth" 2>/dev/null); \ diff --git a/ymir/sweep/tests/unit/test_y_stream.py b/ymir/sweep/tests/unit/test_y_stream.py index 9c539c534..cc73caa15 100644 --- a/ymir/sweep/tests/unit/test_y_stream.py +++ b/ymir/sweep/tests/unit/test_y_stream.py @@ -4,6 +4,8 @@ tests stub that tool and assert the verdict → SweepResult.action mapping. """ +from unittest.mock import patch + import pytest from ymir.common import CVEEligibilityResult, TriageEligibility @@ -137,10 +139,13 @@ async def test_never_with_error_is_error(monkeypatch): async def test_tool_raises_is_error(monkeypatch): _patch_tool(monkeypatch, raises=RuntimeError("Jira unreachable")) - result = await YStreamSweep().is_unblocked(make_issue(), _COMMENT_DATA) + with patch("ymir.sweep.y_stream.sentry_sdk.capture_exception") as mock_capture: + result = await YStreamSweep().is_unblocked(make_issue(), _COMMENT_DATA) - assert result.action == "error" - assert "Jira unreachable" in result.detail + assert result.action == "error" + assert "Jira unreachable" in result.detail + mock_capture.assert_called_once() + assert isinstance(mock_capture.call_args[0][0], RuntimeError) @pytest.mark.asyncio diff --git a/ymir/sweep/y_stream.py b/ymir/sweep/y_stream.py index 23eb1ffac..cd0d064ca 100644 --- a/ymir/sweep/y_stream.py +++ b/ymir/sweep/y_stream.py @@ -19,6 +19,8 @@ shipped" rule). """ +import sentry_sdk + from ymir.common import CVEEligibilityResult, TriageEligibility from ymir.common.constants import JiraLabels from ymir.supervisor.supervisor_types import FullIssue @@ -58,6 +60,7 @@ async def is_unblocked(self, issue: FullIssue, comment_data: CommentData) -> Swe try: output = await CheckCveTriageEligibilityTool().run(input={"issue_key": issue_key}) except Exception as exc: + sentry_sdk.capture_exception(exc) return SweepResult( issue_key=issue_key, action="error",