Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
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
24 changes: 24 additions & 0 deletions codecov_cli/opentelemetry.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,31 @@
_SKIP_TAG_KEYS = {"branch", "flags", "commit_sha", "env_vars"}


def _frame_in_cli(frame):
module = frame.get("module") or ""
if module == "codecov_cli" or module.startswith("codecov_cli."):
return True
path = (frame.get("abs_path") or frame.get("filename") or "").replace("\\", "/")
return "/codecov_cli/" in path or path.startswith("codecov_cli/")


def _originates_in_cli(event):
"""Return True if any exception stack frame comes from the codecov_cli package."""
for exc in (event.get("exception") or {}).get("values") or []:
frames = (exc.get("stacktrace") or {}).get("frames") or []
if any(_frame_in_cli(frame) for frame in frames):
return True
return False


def _before_send(event, hint):
# When the CLI is invoked programmatically (e.g. via CliRunner in a script),
# sentry_sdk.init installs a process-wide excepthook. Unhandled exceptions
# raised purely by the host script, with no codecov_cli frames, are not CLI
# failures, so we don't report them as CLI crashes.
if (event.get("exception") or {}).get("values") and not _originates_in_cli(event):
return None

messages = []
if "message" in event and event.get("message") is not None:
messages.append(event.get("message"))
Expand Down
45 changes: 45 additions & 0 deletions tests/test_opentelemetry.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
from codecov_cli.opentelemetry import _before_send


def _exc_event(frames, value="boom"):
return {
"exception": {
"values": [
{
"type": "Error",
"value": value,
"stacktrace": {"frames": frames},
}
]
}
}


def test_before_send_keeps_cli_exceptions():
event = _exc_event(
[
{"module": "__main__", "filename": "<string>"},
{"module": "codecov_cli.services.upload", "filename": "upload.py"},
]
)
assert _before_send(event, {}) is event


def test_before_send_keeps_cli_exceptions_by_path():
event = _exc_event(
[{"abs_path": "/site-packages/codecov_cli/main.py", "filename": "main.py"}]
)
assert _before_send(event, {}) is event


def test_before_send_drops_host_script_exceptions():
event = _exc_event(
[{"module": "__main__", "filename": "<string>", "abs_path": "<string>"}],
value="No module named 'prevent_cli.fallbacks'",
)
assert _before_send(event, {}) is None


def test_before_send_keeps_messages():
event = {"message": "something happened"}
assert _before_send(event, {}) is event
4 changes: 2 additions & 2 deletions uv.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading