Skip to content

fix(platform): reduce Sentry noise by filtering expected errors and downgrading log levels#12430

Merged
majdyz merged 7 commits intodevfrom
fix/sentry-error-cleanup
Mar 16, 2026
Merged

fix(platform): reduce Sentry noise by filtering expected errors and downgrading log levels#12430
majdyz merged 7 commits intodevfrom
fix/sentry-error-cleanup

Conversation

@majdyz
Copy link
Copy Markdown
Contributor

@majdyz majdyz commented Mar 16, 2026

Summary

Reduces Sentry error noise by ~90% by filtering out expected/transient errors and downgrading inappropriate error-level logs to warnings. Most of the top Sentry issues are not actual bugs but expected conditions (user errors, transient infra, business logic) that were incorrectly logged at ERROR level, causing them to be captured as Sentry events.

Changes

1. Sentry before_send filter (metrics.py)

Added a before_send hook to filter known expected errors before they reach Sentry:

  • AMQP/RabbitMQ connection errors — transient during deploys/restarts
  • User credential errors — invalid API keys, missing auth headers (user error, not platform bug)
  • Insufficient balance — expected business logic
  • Blocked IP access — security check working as intended
  • Discord bot token errors — misconfiguration, not runtime error
  • Google metadata DNS errors — expected in non-GCP environments
  • Inactive email recipients — expected for bounced addresses
  • Unclosed client sessions/connectors — resource cleanup noise

2. Connection retry log levels (retry.py)

  • conn_retry final failure: errorwarning (these are infra retries, not bugs)
  • conn_retry wrapper final failure: errorwarning
  • Discord alert send failure: errorwarning

3. Block execution Sentry capture (manager.py)

  • Skip sentry_sdk.capture_exception() for ValueError subclasses (BlockExecutionError, BlockInputError, InsufficientBalanceError, etc.) — these are user-caused errors, not platform bugs
  • Downgrade executor shutdown/disconnect errors to warning

4. Scheduler log levels (scheduler.py)

  • Graph validation failure: errorwarning (expected for old/invalid graphs)
  • Unable to unschedule graph: errorwarning
  • Job listener failure: errorwarning
  • Async operation failure: errorwarning

5. Discord system alert (notifications.py)

  • Wrapped discord_system_alert endpoint with try/catch to prevent unhandled exceptions (fixes AUTOGPT-SERVER-743, AUTOGPT-SERVER-7MW)

6. Notification system log levels (notifications.py)

  • All batch processing errors: errorwarning
  • User email not found: errorwarning
  • Notification parsing errors: errorwarning
  • Email sending failures: errorwarning
  • Summary data gathering failure: errorwarning
  • Cleaned up unprofessional error messages

7. Cloud storage cleanup (cloud_storage.py)

  • Cleanup error: errorwarning

Sentry Issues Addressed

AMQP/RabbitMQ (~3.4M events total)

User Credential Errors (~15K events)

Business Logic / Validation (~120K events)

Discord Alert Failures (~24K events)

Notification System (~16K events)

Infrastructure / Transient (~20K events)

Executor Shutdown

Test plan

  • All pre-commit hooks pass (Ruff, isort, Black, Pyright typecheck)
  • All changed modules import successfully
  • Deploy to staging and verify Sentry event volume drops significantly
  • Verify legitimate errors still appear in Sentry

…owngrading log levels

- Add `before_send` hook to Sentry to filter known expected errors:
  AMQP/RabbitMQ connection errors, user credential errors (invalid API keys),
  insufficient balance, blocked IP access, Discord token errors,
  Google metadata DNS errors, inactive email recipients
- Downgrade connection retry failures from error to warning in conn_retry
- Stop sending user-caused ValueError exceptions to Sentry in block execution
- Downgrade scheduler job failures and graph validation errors to warning
- Wrap discord_system_alert to catch and warn instead of raising
- Downgrade all notification system errors to warning (batch processing,
  email sending, user lookup, preference handling)
- Downgrade cloud storage cleanup errors to warning
- Downgrade executor shutdown/disconnect errors to warning
@majdyz majdyz requested a review from a team as a code owner March 16, 2026 08:13
@majdyz majdyz removed the request for review from a team March 16, 2026 08:13
@majdyz majdyz requested review from Pwuts and Swiftyos March 16, 2026 08:13
@github-project-automation github-project-automation Bot moved this to 🆕 Needs initial review in AutoGPT development kanban Mar 16, 2026
@github-actions github-actions Bot added platform/backend AutoGPT Platform - Back end size/l labels Mar 16, 2026
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Mar 16, 2026

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

Walkthrough

This PR reduces Sentry noise and lowers log severity across executor, scheduler, notifications, retry, and utility modules; it adds a global Sentry before_send filter and prevents ValueError-derived validation/user exceptions from being sent to Sentry while preserving control flow and public APIs.

Changes

Cohort / File(s) Summary
Sentry filtering & metrics
autogpt_platform/backend/backend/util/metrics.py
Added _before_send(event, hint) to filter/drop noisy/transient Sentry events and wired before_send=_before_send into sentry_sdk.init.
Executor error handling
autogpt_platform/backend/backend/executor/manager.py
execute_node now avoids sending ValueError-derived user/validation exceptions (e.g., BlockExecutionError, InsufficientBalanceError, auth/disabled blocks) to Sentry while re-raising; several shutdown/cleanup error logs downgraded to warnings.
Scheduler logging
autogpt_platform/backend/backend/executor/scheduler.py
Multiple logger.error calls changed to logger.warning (job listener, run_async, graph validation handling); message minor formatting adjustments.
Notifications logging & tests
autogpt_platform/backend/backend/notifications/notifications.py, autogpt_platform/backend/backend/notifications/test_notifications.py
Many error-level logs changed to warnings; added defensive exception handling around Discord/system alerts; tests updated to expect warnings instead of errors.
Retry & alert logging
autogpt_platform/backend/backend/util/retry.py
Lowered logging severity for Discord alert failures and retry wrappers; added comment to avoid duplicate final-failure logging.
Cloud storage cleanup logging
autogpt_platform/backend/backend/util/cloud_storage.py
Changed cleanup exception logging from error to warning in cleanup_expired_files_async.

Sequence Diagram(s)

sequenceDiagram
    participant Client as Caller
    participant Scheduler as Scheduler
    participant Executor as Executor/manager
    participant Worker as Task/Block
    participant Sentry as Sentry (before_send)
    participant Notif as Notifications

    Client->>Scheduler: submit / schedule job
    Scheduler->>Executor: enqueue/run job
    Executor->>Worker: execute node / run block
    alt Block raises Validation (ValueError-derived)
        Worker-->>Executor: raise ValidationError
        Executor->>Sentry: skip capture (re-raise)
        Executor->>Notif: log/warn
    else Unexpected exception
        Worker-->>Executor: raise unexpected exception
        Executor->>Sentry: capture_exception(event)
        Sentry-->>Sentry: _before_send filters/drops event
        Sentry-->>Executor: delivered or suppressed
        Executor->>Notif: notify (alert failures logged as warnings)
    end
    Scheduler->>Executor: unschedule/cleanup (warnings on validation/cleanup paths)
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

Suggested labels

Review effort 3/5

Suggested reviewers

  • Bentlybro
  • Pwuts

Poem

🐰 I hopped through logs both loud and messy,

Nuzzled noisy errors down to something less stressy.
Warnings now whisper where alarms once roared,
Sentry sifts the static, keeping traces stored.
🥕

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 63.33% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and concisely summarizes the primary changes: reducing Sentry noise through filtering expected errors and downgrading log levels, which matches the changeset across all modified files.
Description check ✅ Passed The description is comprehensive and directly related to the changeset, providing detailed summaries of changes across all modified modules, specific Sentry issues addressed, and expected impact.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch fix/sentry-error-cleanup
📝 Coding Plan
  • Generate coding plan for human review comments

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Mar 16, 2026

🔍 PR Overlap Detection

This check compares your PR against all other open PRs targeting the same branch to detect potential merge conflicts early.

🔴 Merge Conflicts Detected

The following PRs have been tested and will have merge conflicts if merged after this PR. Consider coordinating with the authors.

🟢 Low Risk — File Overlap Only

These PRs touch the same files but different sections (click to expand)

Summary: 1 conflict(s), 0 medium risk, 2 low risk (out of 3 PRs with file overlap)


Auto-generated on push. Ignores: openapi.json, lock files.

Comment thread autogpt_platform/backend/backend/util/metrics.py
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (3)
autogpt_platform/backend/backend/util/retry.py (1)

184-186: Consider whether both log statements are needed.

This callback logs the final failure, and then the exception propagates to sync_wrapper/async_wrapper (lines 228/240) which log the same failure again. This results in duplicate warning logs for each final failure.

If the duplication is intentional (different context levels), this is fine. Otherwise, consider removing one of the log statements.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@autogpt_platform/backend/backend/util/retry.py` around lines 184 - 186, The
retry callback currently logs final failures via logger.warning when
retry_state.outcome.failed and retry_state.next_action is None, which duplicates
warnings already emitted later in sync_wrapper/async_wrapper; update the code to
avoid duplicate logging by either removing the logger.warning call in the retry
callback or lowering its level (e.g., to logger.debug) and keep the single
warning in sync_wrapper/async_wrapper (functions referenced: retry_state,
sync_wrapper, async_wrapper, and the retry callback block) so final failures are
logged only once at the desired context/level.
autogpt_platform/backend/backend/notifications/notifications.py (1)

1015-1018: Consider preserving traceback for debugging.

The change from logger.exception to logger.warning loses the traceback. Since the exception is re-raised and eventually caught by the @continuous_retry decorator (which logs with full traceback every 10th failure), this is likely acceptable. However, for transient issues that resolve quickly, the traceback context might never be captured.

If debugging becomes difficult, consider using logger.warning(..., exc_info=True) to preserve the traceback while keeping the warning level.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@autogpt_platform/backend/backend/notifications/notifications.py` around lines
1015 - 1018, Update the except block so the log keeps the traceback while
remaining at warning level: in the handler that currently does
logger.warning(f"Error processing message in {queue_name}: {e}") (the block that
then re-raises for message.process() and `@continuous_retry`), call logger.warning
with exc_info=True (preserving the exception traceback) or otherwise include the
exception info in the log call; keep the re-raise behavior unchanged.
autogpt_platform/backend/backend/util/metrics.py (1)

24-88: Well-structured Sentry filter with comprehensive coverage.

The filter correctly handles various expected error patterns. A few observations:

  1. InsufficientBalanceError message coverage gap: The filter checks for "insufficient balance" (line 54), but per autogpt_platform/backend/backend/util/exceptions.py:71-87, InsufficientBalanceError can also have the message "You have no credits left to run an agent." which won't match this pattern.

    While manager.py separately suppresses all ValueError subclasses (which includes InsufficientBalanceError), adding the alternate pattern here would provide defense-in-depth.

  2. Inactive email pattern (lines 72-73) requires both "marked as inactive" AND "inactive addresses" in the message—this is quite specific and may miss some Postmark error variations.

💡 Optional: Add alternate insufficient balance message pattern
         # Expected business logic — insufficient balance
-        if "insufficient balance" in exc_msg:
+        if "insufficient balance" in exc_msg or "no credits left" in exc_msg:
             return None
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@autogpt_platform/backend/backend/util/metrics.py` around lines 24 - 88,
Update the _before_send Sentry filter to catch the alternate
InsufficientBalanceError message and broaden the bounced-email check: add the
string "you have no credits left to run an agent." to the insufficient-balance
matching (in the block that currently checks "insufficient balance") and change
the inactive-email condition (currently requiring both "marked as inactive" AND
"inactive addresses") to match if either phrase appears (use any/pattern list),
so _before_send more robustly suppresses these known noisy errors.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@autogpt_platform/backend/backend/notifications/notifications.py`:
- Around line 1015-1018: Update the except block so the log keeps the traceback
while remaining at warning level: in the handler that currently does
logger.warning(f"Error processing message in {queue_name}: {e}") (the block that
then re-raises for message.process() and `@continuous_retry`), call logger.warning
with exc_info=True (preserving the exception traceback) or otherwise include the
exception info in the log call; keep the re-raise behavior unchanged.

In `@autogpt_platform/backend/backend/util/metrics.py`:
- Around line 24-88: Update the _before_send Sentry filter to catch the
alternate InsufficientBalanceError message and broaden the bounced-email check:
add the string "you have no credits left to run an agent." to the
insufficient-balance matching (in the block that currently checks "insufficient
balance") and change the inactive-email condition (currently requiring both
"marked as inactive" AND "inactive addresses") to match if either phrase appears
(use any/pattern list), so _before_send more robustly suppresses these known
noisy errors.

In `@autogpt_platform/backend/backend/util/retry.py`:
- Around line 184-186: The retry callback currently logs final failures via
logger.warning when retry_state.outcome.failed and retry_state.next_action is
None, which duplicates warnings already emitted later in
sync_wrapper/async_wrapper; update the code to avoid duplicate logging by either
removing the logger.warning call in the retry callback or lowering its level
(e.g., to logger.debug) and keep the single warning in
sync_wrapper/async_wrapper (functions referenced: retry_state, sync_wrapper,
async_wrapper, and the retry callback block) so final failures are logged only
once at the desired context/level.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 0920384f-ef26-4793-9277-54e3e58df9b0

📥 Commits

Reviewing files that changed from the base of the PR and between d9c16de and 2166bd8.

📒 Files selected for processing (6)
  • autogpt_platform/backend/backend/executor/manager.py
  • autogpt_platform/backend/backend/executor/scheduler.py
  • autogpt_platform/backend/backend/notifications/notifications.py
  • autogpt_platform/backend/backend/util/cloud_storage.py
  • autogpt_platform/backend/backend/util/metrics.py
  • autogpt_platform/backend/backend/util/retry.py
📜 Review details
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (6)
  • GitHub Check: types
  • GitHub Check: Seer Code Review
  • GitHub Check: test (3.11)
  • GitHub Check: test (3.12)
  • GitHub Check: test (3.13)
  • GitHub Check: Check PR Status
🧰 Additional context used
📓 Path-based instructions (4)
autogpt_platform/backend/**/*.py

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

autogpt_platform/backend/**/*.py: Use Python 3.11 (required; managed by Poetry via pyproject.toml) for backend development
Always run 'poetry run format' (Black + isort) before linting in backend development
Always run 'poetry run lint' (ruff) after formatting in backend development

Files:

  • autogpt_platform/backend/backend/util/retry.py
  • autogpt_platform/backend/backend/util/metrics.py
  • autogpt_platform/backend/backend/notifications/notifications.py
  • autogpt_platform/backend/backend/executor/manager.py
  • autogpt_platform/backend/backend/executor/scheduler.py
  • autogpt_platform/backend/backend/util/cloud_storage.py
autogpt_platform/backend/**/*.{py,txt}

📄 CodeRabbit inference engine (autogpt_platform/backend/CLAUDE.md)

Use poetry run prefix for all Python commands, including testing, linting, formatting, and migrations

Files:

  • autogpt_platform/backend/backend/util/retry.py
  • autogpt_platform/backend/backend/util/metrics.py
  • autogpt_platform/backend/backend/notifications/notifications.py
  • autogpt_platform/backend/backend/executor/manager.py
  • autogpt_platform/backend/backend/executor/scheduler.py
  • autogpt_platform/backend/backend/util/cloud_storage.py
autogpt_platform/backend/backend/**/*.py

📄 CodeRabbit inference engine (autogpt_platform/backend/CLAUDE.md)

Use Prisma ORM for database operations in PostgreSQL with pgvector for embeddings

Files:

  • autogpt_platform/backend/backend/util/retry.py
  • autogpt_platform/backend/backend/util/metrics.py
  • autogpt_platform/backend/backend/notifications/notifications.py
  • autogpt_platform/backend/backend/executor/manager.py
  • autogpt_platform/backend/backend/executor/scheduler.py
  • autogpt_platform/backend/backend/util/cloud_storage.py
autogpt_platform/**/*.py

📄 CodeRabbit inference engine (AGENTS.md)

Format Python code with poetry run format

Files:

  • autogpt_platform/backend/backend/util/retry.py
  • autogpt_platform/backend/backend/util/metrics.py
  • autogpt_platform/backend/backend/notifications/notifications.py
  • autogpt_platform/backend/backend/executor/manager.py
  • autogpt_platform/backend/backend/executor/scheduler.py
  • autogpt_platform/backend/backend/util/cloud_storage.py
🧠 Learnings (4)
📚 Learning: 2026-02-26T17:02:22.448Z
Learnt from: Pwuts
Repo: Significant-Gravitas/AutoGPT PR: 12211
File: .pre-commit-config.yaml:160-179
Timestamp: 2026-02-26T17:02:22.448Z
Learning: Keep the pre-commit hook pattern broad for autogpt_platform/backend to ensure OpenAPI schema changes are captured. Do not narrow to backend/api/ alone, since the generated schema depends on Pydantic models across multiple directories (backend/data/, backend/blocks/, backend/copilot/, backend/integrations/, backend/util/). Narrowing could miss schema changes and cause frontend type desynchronization.

Applied to files:

  • autogpt_platform/backend/backend/util/retry.py
  • autogpt_platform/backend/backend/util/metrics.py
  • autogpt_platform/backend/backend/notifications/notifications.py
  • autogpt_platform/backend/backend/executor/manager.py
  • autogpt_platform/backend/backend/executor/scheduler.py
  • autogpt_platform/backend/backend/util/cloud_storage.py
📚 Learning: 2026-03-05T15:42:08.207Z
Learnt from: ntindle
Repo: Significant-Gravitas/AutoGPT PR: 12297
File: .claude/skills/backend-check/SKILL.md:14-16
Timestamp: 2026-03-05T15:42:08.207Z
Learning: In Python files under autogpt_platform/backend (recursively), rely on poetry run format to perform formatting (Black + isort) and linting (ruff). Do not run poetry run lint as a separate step after poetry run format, since format already includes linting checks.

Applied to files:

  • autogpt_platform/backend/backend/util/retry.py
  • autogpt_platform/backend/backend/util/metrics.py
  • autogpt_platform/backend/backend/notifications/notifications.py
  • autogpt_platform/backend/backend/executor/manager.py
  • autogpt_platform/backend/backend/executor/scheduler.py
  • autogpt_platform/backend/backend/util/cloud_storage.py
📚 Learning: 2026-03-15T15:30:02.282Z
Learnt from: majdyz
Repo: Significant-Gravitas/AutoGPT PR: 12385
File: autogpt_platform/backend/backend/copilot/tools/helpers.py:149-185
Timestamp: 2026-03-15T15:30:02.282Z
Learning: In autogpt_platform/backend/backend/copilot/tools/helpers.py, within execute_block, when InsufficientBalanceError occurs after post-execution credit charging (concurrent balance drain after pre-check passed), this is treated as a non-fatal billing leak: log at ERROR level with structured JSON fields `{"billing_leak": True, "user_id": ..., "cost": ...}` for monitoring/alerting, then return BlockOutputResponse normally. Discarding the output would worsen UX since the block already executed with potential side effects. Reuse the credit_model obtained during the pre-execution balance check (guarded by `if cost > 0 and credit_model:`) for the post-execution charge; do not perform a second get_user_credit_model call.

Applied to files:

  • autogpt_platform/backend/backend/executor/manager.py
📚 Learning: 2026-02-04T16:49:42.490Z
Learnt from: CR
Repo: Significant-Gravitas/AutoGPT PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2026-02-04T16:49:42.490Z
Learning: Applies to autogpt_platform/backend/backend/blocks/**/*.py : Implement 'run' method with proper error handling in backend blocks

Applied to files:

  • autogpt_platform/backend/backend/executor/manager.py
🔇 Additional comments (18)
autogpt_platform/backend/backend/util/cloud_storage.py (1)

615-617: LGTM!

Downgrading to warning is appropriate here since cleanup failures are transient and recoverable—the operation will retry on the next cleanup cycle. The function already returns 0 gracefully, so this isn't a critical error path.

autogpt_platform/backend/backend/executor/scheduler.py (3)

97-99: LGTM!

Job failures logged by the listener are expected errors that will be handled by the job's error flow. Downgrading to warning is appropriate since the scheduler continues operating normally.


139-141: LGTM!

The exception is re-raised after logging, ensuring proper error propagation. Warning level is appropriate since the actual error handling occurs upstream.


188-202: LGTM!

Graph validation failures are user-caused errors (e.g., invalid graph configuration). Downgrading to warning is appropriate since these are expected operational scenarios, not platform bugs.

autogpt_platform/backend/backend/util/retry.py (2)

66-68: LGTM!

Discord alert failures are secondary to the primary error being handled. Warning level is appropriate since the alert is a best-effort notification.


227-241: LGTM on the log level change.

Downgrading to warning is consistent with the PR's noise reduction goal. The exception is still re-raised, so error handling continues normally.

autogpt_platform/backend/backend/util/metrics.py (1)

105-105: LGTM!

The before_send hook is correctly wired into Sentry initialization.

autogpt_platform/backend/backend/executor/manager.py (5)

377-385: LGTM! Good separation of user errors from platform errors.

Suppressing ValueError subclasses (BlockExecutionError, BlockInputError, InsufficientBalanceError) from Sentry is appropriate since these represent expected user/validation errors, not platform bugs. The exception is still re-raised to maintain normal error flow.


1483-1485: LGTM!

Discord alert failures are secondary to the primary operation. Warning level is appropriate.


1908-1916: LGTM!

Graceful shutdown scenarios where threads don't finish in time or disconnect fails are operational concerns, not critical errors. Warning level is appropriate since the service is intentionally stopping.


1931-1935: LGTM!

Errors during shutdown signaling are expected edge cases. Warning level is appropriate.


1964-1976: LGTM!

Both the timeout warning and executor shutdown errors are graceful degradation scenarios during service shutdown. Warning level is appropriate.

autogpt_platform/backend/backend/notifications/notifications.py (6)

418-421: Good defensive change.

Wrapping discord_send_alert in a try/except prevents Discord API failures from crashing the notification service or interrupting other operations. This is critical for service resilience.


306-310: LGTM on batch processing log level changes.

These scenarios (concurrent batch clearing, missing user emails, empty batch data, parsing errors) are expected operational states, not platform bugs. Warning level is appropriate since processing continues gracefully.

Also applies to: 321-324, 347-356, 375-378


521-554: LGTM!

Summary data gathering failures returning sensible defaults with a warning is a good fallback pattern. Users still receive a summary (with empty data) rather than no notification at all.


568-572: LGTM!

Consistent with other batch processing paths—concurrent clearing is an expected race condition scenario.


620-622: LGTM!

Missing user emails are expected scenarios (deleted users, unverified emails). Warning level with graceful return/continue is appropriate.

Also applies to: 657-659, 678-680, 954-956


752-754: LGTM on all batch chunk processing error paths.

These handle various email API failure scenarios (size limits, inactive recipients, malformed data). Warning level is appropriate since the code has proper remediation logic (removing bad notifications, disabling users, etc.).

Also applies to: 777-782, 796-798, 830-857, 866-870, 884-886, 892-903, 914-918

- Make "connection refused" filter AMQP-specific by checking exception
  module/type instead of broadly matching all ConnectionRefusedError
- Add "no credits left" as alternate insufficient balance pattern
- Broaden inactive email filter (OR instead of AND)
- Remove duplicate final-failure log in conn_retry on_retry callback
- Preserve traceback with exc_info=True in notification queue consumer
Comment thread autogpt_platform/backend/backend/executor/manager.py Outdated
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@autogpt_platform/backend/backend/util/metrics.py`:
- Around line 88-96: The current noisy_patterns check unconditionally drops any
log with "connection refused", which can hide non-AMQP outages; change the logic
around noisy_patterns/msg so that "connection refused" is only filtered when the
message is AMQP-related (e.g., contains "amqp", "amqpconnection",
"connection_forced" or other AMQP-specific tokens), mirroring the AMQP-only
scoping used in the exception branch; update the check that builds
noisy_patterns or add an additional conditional so only AMQP-related "connection
refused" messages return None while other "connection refused" logs are
preserved.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 62c69319-7740-46f1-86a6-835208193c1b

📥 Commits

Reviewing files that changed from the base of the PR and between 2166bd8 and 4a6fa5b.

📒 Files selected for processing (3)
  • autogpt_platform/backend/backend/notifications/notifications.py
  • autogpt_platform/backend/backend/util/metrics.py
  • autogpt_platform/backend/backend/util/retry.py
🚧 Files skipped from review as they are similar to previous changes (2)
  • autogpt_platform/backend/backend/util/retry.py
  • autogpt_platform/backend/backend/notifications/notifications.py
📜 Review details
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (6)
  • GitHub Check: types
  • GitHub Check: Seer Code Review
  • GitHub Check: test (3.13)
  • GitHub Check: test (3.12)
  • GitHub Check: test (3.11)
  • GitHub Check: Check PR Status
🧰 Additional context used
📓 Path-based instructions (4)
autogpt_platform/backend/**/*.py

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

autogpt_platform/backend/**/*.py: Use Python 3.11 (required; managed by Poetry via pyproject.toml) for backend development
Always run 'poetry run format' (Black + isort) before linting in backend development
Always run 'poetry run lint' (ruff) after formatting in backend development

Files:

  • autogpt_platform/backend/backend/util/metrics.py
autogpt_platform/backend/**/*.{py,txt}

📄 CodeRabbit inference engine (autogpt_platform/backend/CLAUDE.md)

Use poetry run prefix for all Python commands, including testing, linting, formatting, and migrations

Files:

  • autogpt_platform/backend/backend/util/metrics.py
autogpt_platform/backend/backend/**/*.py

📄 CodeRabbit inference engine (autogpt_platform/backend/CLAUDE.md)

Use Prisma ORM for database operations in PostgreSQL with pgvector for embeddings

Files:

  • autogpt_platform/backend/backend/util/metrics.py
autogpt_platform/**/*.py

📄 CodeRabbit inference engine (AGENTS.md)

Format Python code with poetry run format

Files:

  • autogpt_platform/backend/backend/util/metrics.py
🧠 Learnings (3)
📓 Common learnings
Learnt from: majdyz
Repo: Significant-Gravitas/AutoGPT PR: 12356
File: autogpt_platform/backend/backend/copilot/constants.py:9-12
Timestamp: 2026-03-10T08:39:13.707Z
Learning: In Significant-Gravitas/AutoGPT PR `#12356`, the `COPILOT_SYNTHETIC_ID_PREFIX = "copilot-"` check in `create_auto_approval_record` (human_review.py) is intentional and safe. The `graph_exec_id` passed to this function comes from server-side `PendingHumanReview` DB records (not from user input); the API only accepts `node_exec_id` from users. Synthetic `copilot-*` IDs are only ever created server-side in `run_block.py`. The prefix skip avoids a DB lookup for a `AgentGraphExecution` record that legitimately does not exist for CoPilot sessions, while `user_id` scoping is enforced at the auth layer and on the resulting auto-approval record.
📚 Learning: 2026-02-26T17:02:22.448Z
Learnt from: Pwuts
Repo: Significant-Gravitas/AutoGPT PR: 12211
File: .pre-commit-config.yaml:160-179
Timestamp: 2026-02-26T17:02:22.448Z
Learning: Keep the pre-commit hook pattern broad for autogpt_platform/backend to ensure OpenAPI schema changes are captured. Do not narrow to backend/api/ alone, since the generated schema depends on Pydantic models across multiple directories (backend/data/, backend/blocks/, backend/copilot/, backend/integrations/, backend/util/). Narrowing could miss schema changes and cause frontend type desynchronization.

Applied to files:

  • autogpt_platform/backend/backend/util/metrics.py
📚 Learning: 2026-03-05T15:42:08.207Z
Learnt from: ntindle
Repo: Significant-Gravitas/AutoGPT PR: 12297
File: .claude/skills/backend-check/SKILL.md:14-16
Timestamp: 2026-03-05T15:42:08.207Z
Learning: In Python files under autogpt_platform/backend (recursively), rely on poetry run format to perform formatting (Black + isort) and linting (ruff). Do not run poetry run lint as a separate step after poetry run format, since format already includes linting checks.

Applied to files:

  • autogpt_platform/backend/backend/util/metrics.py
🔇 Additional comments (1)
autogpt_platform/backend/backend/util/metrics.py (1)

41-50: Good AMQP-specific narrowing for exception-side connection refused.

This is a solid safeguard: it reduces noisy RabbitMQ errors without suppressing unrelated service failures.

Comment thread autogpt_platform/backend/backend/util/metrics.py
Comment thread autogpt_platform/backend/backend/util/metrics.py
majdyz added 2 commits March 16, 2026 15:38
- Use explicit exception types instead of broad isinstance(ValueError) in
  execute_node to avoid suppressing platform errors like NotFoundError
- Make metadata.google.internal filter GCP-aware (only filter in non-cloud envs)
- Scope log-side "connection refused" filter to AMQP-related messages only
Tests were checking mock_logger.error but the log calls were changed to
logger.warning. Update assertions to check mock_logger.warning instead.
Comment thread autogpt_platform/backend/backend/util/metrics.py Outdated
Sentry's LoggingIntegration stores log messages under event["logentry"],
not event["message"]. The previous check was dead code that never matched.
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@autogpt_platform/backend/backend/executor/manager.py`:
- Around line 389-400: The current exception whitelist omits plain ValueError
causing expected user/input ValueErrors raised by execute_node to be treated as
unexpected; update the isinstance check around variable ex (the block starting
with if not isinstance(ex, (...))) to include ValueError in the tuple so
ValueError instances from execute_node (referenced at execute_node lines that
raise ValueError) are treated as expected and not sent to Sentry.

In `@autogpt_platform/backend/backend/util/metrics.py`:
- Around line 89-90: The log-noise filter only reads event["message"], missing
Sentry's rendered text at event["logentry"]["formatted"]; update the logic where
event and msg are handled (the block using event.get("logger") and
event.get("message") and the variable msg) to also check event.get("logentry",
{}).get("formatted") and prefer that value (lowercased) when present, falling
back to event["message"] so Sentry LoggingIntegration formatted messages are
filtered the same way as regular messages.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 42740d0d-3c87-401c-a6dc-af162188240e

📥 Commits

Reviewing files that changed from the base of the PR and between 4a6fa5b and 0b0fa35.

📒 Files selected for processing (3)
  • autogpt_platform/backend/backend/executor/manager.py
  • autogpt_platform/backend/backend/notifications/test_notifications.py
  • autogpt_platform/backend/backend/util/metrics.py
📜 Review details
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (5)
  • GitHub Check: types
  • GitHub Check: test (3.12)
  • GitHub Check: test (3.13)
  • GitHub Check: test (3.11)
  • GitHub Check: Check PR Status
🧰 Additional context used
📓 Path-based instructions (5)
autogpt_platform/backend/**/*.py

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

autogpt_platform/backend/**/*.py: Use Python 3.11 (required; managed by Poetry via pyproject.toml) for backend development
Always run 'poetry run format' (Black + isort) before linting in backend development
Always run 'poetry run lint' (ruff) after formatting in backend development

Files:

  • autogpt_platform/backend/backend/notifications/test_notifications.py
  • autogpt_platform/backend/backend/util/metrics.py
  • autogpt_platform/backend/backend/executor/manager.py
autogpt_platform/backend/**/*.{py,txt}

📄 CodeRabbit inference engine (autogpt_platform/backend/CLAUDE.md)

Use poetry run prefix for all Python commands, including testing, linting, formatting, and migrations

Files:

  • autogpt_platform/backend/backend/notifications/test_notifications.py
  • autogpt_platform/backend/backend/util/metrics.py
  • autogpt_platform/backend/backend/executor/manager.py
autogpt_platform/backend/backend/**/*.py

📄 CodeRabbit inference engine (autogpt_platform/backend/CLAUDE.md)

Use Prisma ORM for database operations in PostgreSQL with pgvector for embeddings

Files:

  • autogpt_platform/backend/backend/notifications/test_notifications.py
  • autogpt_platform/backend/backend/util/metrics.py
  • autogpt_platform/backend/backend/executor/manager.py
autogpt_platform/**/*.py

📄 CodeRabbit inference engine (AGENTS.md)

Format Python code with poetry run format

Files:

  • autogpt_platform/backend/backend/notifications/test_notifications.py
  • autogpt_platform/backend/backend/util/metrics.py
  • autogpt_platform/backend/backend/executor/manager.py
autogpt_platform/backend/**/*test*.py

📄 CodeRabbit inference engine (AGENTS.md)

Run poetry run test for backend testing (runs pytest with docker based postgres + prisma)

Files:

  • autogpt_platform/backend/backend/notifications/test_notifications.py
🧠 Learnings (16)
📓 Common learnings
Learnt from: majdyz
Repo: Significant-Gravitas/AutoGPT PR: 12356
File: autogpt_platform/backend/backend/copilot/constants.py:9-12
Timestamp: 2026-03-10T08:39:13.707Z
Learning: In Significant-Gravitas/AutoGPT PR `#12356`, the `COPILOT_SYNTHETIC_ID_PREFIX = "copilot-"` check in `create_auto_approval_record` (human_review.py) is intentional and safe. The `graph_exec_id` passed to this function comes from server-side `PendingHumanReview` DB records (not from user input); the API only accepts `node_exec_id` from users. Synthetic `copilot-*` IDs are only ever created server-side in `run_block.py`. The prefix skip avoids a DB lookup for a `AgentGraphExecution` record that legitimately does not exist for CoPilot sessions, while `user_id` scoping is enforced at the auth layer and on the resulting auto-approval record.
Learnt from: Pwuts
Repo: Significant-Gravitas/AutoGPT PR: 12284
File: autogpt_platform/frontend/src/app/api/openapi.json:11897-11900
Timestamp: 2026-03-04T23:58:18.476Z
Learning: Repo: Significant-Gravitas/AutoGPT — PR `#12284`
Backend/frontend OpenAPI codegen convention: In backend/api/features/store/model.py, the StoreSubmission and StoreSubmissionAdminView models define submitted_at: datetime | None, changes_summary: str | None, and instructions: str | None with no default. This is intentional to produce “required but nullable” fields in OpenAPI (properties appear in required[] and use anyOf [type, null]). This matches Prisma’s submittedAt DateTime? and changesSummary String?. Do not flag this as a required/nullable mismatch.
📚 Learning: 2026-02-04T16:49:42.490Z
Learnt from: CR
Repo: Significant-Gravitas/AutoGPT PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2026-02-04T16:49:42.490Z
Learning: Applies to autogpt_platform/backend/**/test/**/*.py : Use snapshot testing with '--snapshot-update' flag in backend tests when output changes; always review with 'git diff'

Applied to files:

  • autogpt_platform/backend/backend/notifications/test_notifications.py
📚 Learning: 2026-02-04T16:50:20.508Z
Learnt from: CR
Repo: Significant-Gravitas/AutoGPT PR: 0
File: autogpt_platform/backend/CLAUDE.md:0-0
Timestamp: 2026-02-04T16:50:20.508Z
Learning: Applies to autogpt_platform/backend/**/*_test.py : Always review snapshot changes with `git diff` before committing when updating snapshots with `poetry run pytest --snapshot-update`

Applied to files:

  • autogpt_platform/backend/backend/notifications/test_notifications.py
  • autogpt_platform/backend/backend/util/metrics.py
📚 Learning: 2026-02-26T17:02:22.448Z
Learnt from: Pwuts
Repo: Significant-Gravitas/AutoGPT PR: 12211
File: .pre-commit-config.yaml:160-179
Timestamp: 2026-02-26T17:02:22.448Z
Learning: Keep the pre-commit hook pattern broad for autogpt_platform/backend to ensure OpenAPI schema changes are captured. Do not narrow to backend/api/ alone, since the generated schema depends on Pydantic models across multiple directories (backend/data/, backend/blocks/, backend/copilot/, backend/integrations/, backend/util/). Narrowing could miss schema changes and cause frontend type desynchronization.

Applied to files:

  • autogpt_platform/backend/backend/notifications/test_notifications.py
  • autogpt_platform/backend/backend/util/metrics.py
  • autogpt_platform/backend/backend/executor/manager.py
📚 Learning: 2026-03-05T15:42:08.207Z
Learnt from: ntindle
Repo: Significant-Gravitas/AutoGPT PR: 12297
File: .claude/skills/backend-check/SKILL.md:14-16
Timestamp: 2026-03-05T15:42:08.207Z
Learning: In Python files under autogpt_platform/backend (recursively), rely on poetry run format to perform formatting (Black + isort) and linting (ruff). Do not run poetry run lint as a separate step after poetry run format, since format already includes linting checks.

Applied to files:

  • autogpt_platform/backend/backend/notifications/test_notifications.py
  • autogpt_platform/backend/backend/util/metrics.py
  • autogpt_platform/backend/backend/executor/manager.py
📚 Learning: 2026-03-10T08:39:13.707Z
Learnt from: majdyz
Repo: Significant-Gravitas/AutoGPT PR: 12356
File: autogpt_platform/backend/backend/copilot/constants.py:9-12
Timestamp: 2026-03-10T08:39:13.707Z
Learning: In Significant-Gravitas/AutoGPT PR `#12356`, the `COPILOT_SYNTHETIC_ID_PREFIX = "copilot-"` check in `create_auto_approval_record` (human_review.py) is intentional and safe. The `graph_exec_id` passed to this function comes from server-side `PendingHumanReview` DB records (not from user input); the API only accepts `node_exec_id` from users. Synthetic `copilot-*` IDs are only ever created server-side in `run_block.py`. The prefix skip avoids a DB lookup for a `AgentGraphExecution` record that legitimately does not exist for CoPilot sessions, while `user_id` scoping is enforced at the auth layer and on the resulting auto-approval record.

Applied to files:

  • autogpt_platform/backend/backend/util/metrics.py
📚 Learning: 2026-03-04T23:58:18.476Z
Learnt from: Pwuts
Repo: Significant-Gravitas/AutoGPT PR: 12284
File: autogpt_platform/frontend/src/app/api/openapi.json:11897-11900
Timestamp: 2026-03-04T23:58:18.476Z
Learning: Repo: Significant-Gravitas/AutoGPT — PR `#12284`
Backend/frontend OpenAPI codegen convention: In backend/api/features/store/model.py, the StoreSubmission and StoreSubmissionAdminView models define submitted_at: datetime | None, changes_summary: str | None, and instructions: str | None with no default. This is intentional to produce “required but nullable” fields in OpenAPI (properties appear in required[] and use anyOf [type, null]). This matches Prisma’s submittedAt DateTime? and changesSummary String?. Do not flag this as a required/nullable mismatch.

Applied to files:

  • autogpt_platform/backend/backend/util/metrics.py
📚 Learning: 2026-02-27T15:59:00.370Z
Learnt from: majdyz
Repo: Significant-Gravitas/AutoGPT PR: 12213
File: autogpt_platform/frontend/src/app/api/openapi.json:9983-9995
Timestamp: 2026-02-27T15:59:00.370Z
Learning: Repo: Significant-Gravitas/AutoGPT PR: 12213 — OpenAPI/codegen
Learning: Ensuring a field is required in generated TS types needs two sides: (1) no default value on the Pydantic field, and (2) the OpenAPI model's "required" array must list it. For MCPToolInfo, making input_schema required in OpenAPI and removing Field(default_factory=dict) in the backend prevents optional typing drift.

Applied to files:

  • autogpt_platform/backend/backend/util/metrics.py
📚 Learning: 2026-03-10T08:38:30.834Z
Learnt from: majdyz
Repo: Significant-Gravitas/AutoGPT PR: 12356
File: autogpt_platform/backend/backend/copilot/tools/run_block.py:349-370
Timestamp: 2026-03-10T08:38:30.834Z
Learning: In the AutoGPT CoPilot HITL (Human-In-The-Loop) flow (`autogpt_platform/backend/backend/copilot/tools/run_block.py`), the review card presented to users sets `editable: false`, meaning reviewers cannot modify the input payload. Therefore, credentials resolved before `is_block_exec_need_review()` remain valid and do not need to be recomputed after the review step — the original `input_data` is unchanged through the review lifecycle.

Applied to files:

  • autogpt_platform/backend/backend/util/metrics.py
📚 Learning: 2026-02-27T15:59:00.370Z
Learnt from: majdyz
Repo: Significant-Gravitas/AutoGPT PR: 12213
File: autogpt_platform/frontend/src/app/api/openapi.json:9983-9995
Timestamp: 2026-02-27T15:59:00.370Z
Learning: Repo: Significant-Gravitas/AutoGPT PR: 12213 — Backend/frontend OpenAPI codegen
Learning: For MCP schema models, required OpenAPI fields must have no defaults in Pydantic. Specifically, MCPToolInfo.input_schema must be required (no Field(default_factory=dict)) so openapi.json emits it in "required", ensuring generated TS types treat input_schema as non-optional.

Applied to files:

  • autogpt_platform/backend/backend/util/metrics.py
📚 Learning: 2026-03-11T16:50:37.459Z
Learnt from: majdyz
Repo: Significant-Gravitas/AutoGPT PR: 12367
File: autogpt_platform/backend/generate_views.py:146-150
Timestamp: 2026-03-11T16:50:37.459Z
Learning: In Significant-Gravitas/AutoGPT PR `#12367` (`autogpt_platform/backend/generate_views.py`), the `security_invoker = false` setting on analytics views is intentional. `analytics_readonly` is granted access only to the `analytics` schema. The views execute as their owner (postgres) to read `auth.*` and `platform.*` tables, but expose only curated, scrubbed columns via their SELECT lists. This is the correct PostgreSQL "view as security boundary" pattern — equivalent to a stored-procedure security definer. Do not flag this as a privilege escalation; switching to `security_invoker = true` would require granting `analytics_readonly` direct SELECT on `auth.sessions`, `auth.audit_log_entries`, `platform.AgentGraphExecution`, etc., which is a much wider blast radius than the current design.

Applied to files:

  • autogpt_platform/backend/backend/util/metrics.py
📚 Learning: 2026-03-15T23:15:58.145Z
Learnt from: majdyz
Repo: Significant-Gravitas/AutoGPT PR: 12398
File: autogpt_platform/backend/scripts/measure_copilot_tokens.py:0-0
Timestamp: 2026-03-15T23:15:58.145Z
Learning: In Significant-Gravitas/AutoGPT CoPilot, developer token-measurement scripts (e.g. `scripts/measure_copilot_tokens.py`) intentionally use a simplified, hardcoded base prompt rather than the production prompt-construction path. This isolates tool-schema token cost from the variable production system prompt, making before/after token diffs solely attributable to schema changes. Do not flag this as a drift risk in such utility scripts.

Applied to files:

  • autogpt_platform/backend/backend/util/metrics.py
📚 Learning: 2026-03-15T16:52:11.575Z
Learnt from: majdyz
Repo: Significant-Gravitas/AutoGPT PR: 12426
File: autogpt_platform/backend/backend/copilot/sdk/service.py:0-0
Timestamp: 2026-03-15T16:52:11.575Z
Learning: In Significant-Gravitas/AutoGPT (copilot backend), GitHub tokens (GH_TOKEN / GITHUB_TOKEN) for the `gh` CLI are injected lazily per-command in `autogpt_platform/backend/backend/copilot/tools/bash_exec._execute_on_e2b()` by calling `integration_creds.get_integration_env_vars(user_id)`, not on the global SDK subprocess environment in `sdk/service.py`. This scopes credentials to individual E2B sandbox command invocations and prevents token leakage into tool output streams or uploaded transcripts.

Applied to files:

  • autogpt_platform/backend/backend/util/metrics.py
📚 Learning: 2026-03-01T07:59:02.311Z
Learnt from: majdyz
Repo: Significant-Gravitas/AutoGPT PR: 12213
File: autogpt_platform/frontend/src/app/api/openapi.json:10030-10037
Timestamp: 2026-03-01T07:59:02.311Z
Learning: Repo: Significant-Gravitas/AutoGPT PR: 12213 — For MCP manual token storage, backend model autogpt_platform/backend/backend/api/features/mcp/routes.py defines MCPStoreTokenRequest.token as Pydantic SecretStr with a min length constraint, which generates OpenAPI schema metadata (format: "password", writeOnly: true, minLength: 1) in autogpt_platform/frontend/src/app/api/openapi.json. Prefer SecretStr (with length constraints) for sensitive request fields so generated TS clients and docs treat them as secrets.

Applied to files:

  • autogpt_platform/backend/backend/util/metrics.py
📚 Learning: 2026-03-15T15:30:02.282Z
Learnt from: majdyz
Repo: Significant-Gravitas/AutoGPT PR: 12385
File: autogpt_platform/backend/backend/copilot/tools/helpers.py:149-185
Timestamp: 2026-03-15T15:30:02.282Z
Learning: In autogpt_platform/backend/backend/copilot/tools/helpers.py, within execute_block, when InsufficientBalanceError occurs after post-execution credit charging (concurrent balance drain after pre-check passed), this is treated as a non-fatal billing leak: log at ERROR level with structured JSON fields `{"billing_leak": True, "user_id": ..., "cost": ...}` for monitoring/alerting, then return BlockOutputResponse normally. Discarding the output would worsen UX since the block already executed with potential side effects. Reuse the credit_model obtained during the pre-execution balance check (guarded by `if cost > 0 and credit_model:`) for the post-execution charge; do not perform a second get_user_credit_model call.

Applied to files:

  • autogpt_platform/backend/backend/executor/manager.py
📚 Learning: 2026-02-04T16:49:42.490Z
Learnt from: CR
Repo: Significant-Gravitas/AutoGPT PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2026-02-04T16:49:42.490Z
Learning: Applies to autogpt_platform/backend/backend/blocks/**/*.py : Implement 'run' method with proper error handling in backend blocks

Applied to files:

  • autogpt_platform/backend/backend/executor/manager.py
🔇 Additional comments (3)
autogpt_platform/backend/backend/executor/manager.py (1)

1503-1503: Log-level downgrades are consistent with non-fatal shutdown/alert flows.

This warning-level treatment looks appropriate for operationally expected cleanup/notification failures.

Also applies to: 1928-1935, 1951-1953, 1984-1986, 1995-1995

autogpt_platform/backend/backend/util/metrics.py (1)

77-82: Good call on environment-scoped metadata filtering and hook wiring.

The non-cloud guard for metadata.google.internal and before_send=_before_send integration are aligned and reduce false-positive suppression risk.

Also applies to: 122-122

autogpt_platform/backend/backend/notifications/test_notifications.py (1)

259-262: Test expectation updates are correct for warning-level logging.

These assertions now match the downgraded warning behavior and keep coverage on the same error-handling branches.

Also applies to: 374-378, 481-485

Comment thread autogpt_platform/backend/backend/executor/manager.py Outdated
Comment thread autogpt_platform/backend/backend/util/metrics.py Outdated
@majdyz majdyz requested review from Bentlybro, kcze and ntindle March 16, 2026 08:55
execute_node raises plain ValueError for disabled blocks and expired/missing
auth. Use isinstance(ex, ValueError) but exclude NotFoundError and
GraphNotFoundError which could indicate real platform issues.
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@autogpt_platform/backend/backend/executor/manager.py`:
- Around line 1918-1920: The current timeout handling around
thread.join(timeout=300) is incorrect because join() doesn't raise TimeoutError;
replace the try/except block with a join(timeout=300) followed by an explicit
check of thread.is_alive() to detect a timeout, and if still alive call the
existing disconnect/cleanup logic and log the warning (referencing the same
logger.warning call and prefix used), removing the unused TimeoutError except
branch; ensure any forced disconnect uses the same disconnect function/method
invoked elsewhere in this scope.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 686e040e-3045-4317-8476-2b9d1feca382

📥 Commits

Reviewing files that changed from the base of the PR and between 44aa4db and ce68d97.

📒 Files selected for processing (1)
  • autogpt_platform/backend/backend/executor/manager.py
📜 Review details
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (6)
  • GitHub Check: types
  • GitHub Check: test (3.11)
  • GitHub Check: test (3.12)
  • GitHub Check: test (3.13)
  • GitHub Check: Seer Code Review
  • GitHub Check: Check PR Status
🧰 Additional context used
📓 Path-based instructions (4)
autogpt_platform/backend/**/*.py

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

autogpt_platform/backend/**/*.py: Use Python 3.11 (required; managed by Poetry via pyproject.toml) for backend development
Always run 'poetry run format' (Black + isort) before linting in backend development
Always run 'poetry run lint' (ruff) after formatting in backend development

Files:

  • autogpt_platform/backend/backend/executor/manager.py
autogpt_platform/backend/**/*.{py,txt}

📄 CodeRabbit inference engine (autogpt_platform/backend/CLAUDE.md)

Use poetry run prefix for all Python commands, including testing, linting, formatting, and migrations

Files:

  • autogpt_platform/backend/backend/executor/manager.py
autogpt_platform/backend/backend/**/*.py

📄 CodeRabbit inference engine (autogpt_platform/backend/CLAUDE.md)

Use Prisma ORM for database operations in PostgreSQL with pgvector for embeddings

Files:

  • autogpt_platform/backend/backend/executor/manager.py
autogpt_platform/**/*.py

📄 CodeRabbit inference engine (AGENTS.md)

Format Python code with poetry run format

Files:

  • autogpt_platform/backend/backend/executor/manager.py
🧠 Learnings (7)
📚 Learning: 2026-03-15T15:30:02.282Z
Learnt from: majdyz
Repo: Significant-Gravitas/AutoGPT PR: 12385
File: autogpt_platform/backend/backend/copilot/tools/helpers.py:149-185
Timestamp: 2026-03-15T15:30:02.282Z
Learning: In autogpt_platform/backend/backend/copilot/tools/helpers.py, within execute_block, when InsufficientBalanceError occurs after post-execution credit charging (concurrent balance drain after pre-check passed), this is treated as a non-fatal billing leak: log at ERROR level with structured JSON fields `{"billing_leak": True, "user_id": ..., "cost": ...}` for monitoring/alerting, then return BlockOutputResponse normally. Discarding the output would worsen UX since the block already executed with potential side effects. Reuse the credit_model obtained during the pre-execution balance check (guarded by `if cost > 0 and credit_model:`) for the post-execution charge; do not perform a second get_user_credit_model call.

Applied to files:

  • autogpt_platform/backend/backend/executor/manager.py
📚 Learning: 2026-02-04T16:49:42.490Z
Learnt from: CR
Repo: Significant-Gravitas/AutoGPT PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2026-02-04T16:49:42.490Z
Learning: Applies to autogpt_platform/backend/backend/blocks/**/*.py : Implement 'run' method with proper error handling in backend blocks

Applied to files:

  • autogpt_platform/backend/backend/executor/manager.py
📚 Learning: 2026-03-10T08:39:13.707Z
Learnt from: majdyz
Repo: Significant-Gravitas/AutoGPT PR: 12356
File: autogpt_platform/backend/backend/copilot/constants.py:9-12
Timestamp: 2026-03-10T08:39:13.707Z
Learning: In Significant-Gravitas/AutoGPT PR `#12356`, the `COPILOT_SYNTHETIC_ID_PREFIX = "copilot-"` check in `create_auto_approval_record` (human_review.py) is intentional and safe. The `graph_exec_id` passed to this function comes from server-side `PendingHumanReview` DB records (not from user input); the API only accepts `node_exec_id` from users. Synthetic `copilot-*` IDs are only ever created server-side in `run_block.py`. The prefix skip avoids a DB lookup for a `AgentGraphExecution` record that legitimately does not exist for CoPilot sessions, while `user_id` scoping is enforced at the auth layer and on the resulting auto-approval record.

Applied to files:

  • autogpt_platform/backend/backend/executor/manager.py
📚 Learning: 2026-03-10T08:38:30.834Z
Learnt from: majdyz
Repo: Significant-Gravitas/AutoGPT PR: 12356
File: autogpt_platform/backend/backend/copilot/tools/run_block.py:349-370
Timestamp: 2026-03-10T08:38:30.834Z
Learning: In the AutoGPT CoPilot HITL (Human-In-The-Loop) flow (`autogpt_platform/backend/backend/copilot/tools/run_block.py`), the review card presented to users sets `editable: false`, meaning reviewers cannot modify the input payload. Therefore, credentials resolved before `is_block_exec_need_review()` remain valid and do not need to be recomputed after the review step — the original `input_data` is unchanged through the review lifecycle.

Applied to files:

  • autogpt_platform/backend/backend/executor/manager.py
📚 Learning: 2026-03-10T08:38:29.078Z
Learnt from: majdyz
Repo: Significant-Gravitas/AutoGPT PR: 12356
File: autogpt_platform/backend/backend/copilot/tools/run_block.py:297-300
Timestamp: 2026-03-10T08:38:29.078Z
Learning: In autogpt_platform/backend/backend/copilot/tools/run_block.py, the auto-approval key for sensitive block HITL review uses graph_exec_id (copilot-session-{session_id}) + node_id (copilot-node-{block_id}). This is intentional: approving a block type within a CoPilot session auto-approves all future invocations of that same block type within the same session, mirroring how auto-approve works in normal graph execution. The user explicitly opts into this session-scoped behavior via an auto-approve toggle. Without the toggle (default), each individual invocation requires its own approval.

Applied to files:

  • autogpt_platform/backend/backend/executor/manager.py
📚 Learning: 2026-02-26T17:02:22.448Z
Learnt from: Pwuts
Repo: Significant-Gravitas/AutoGPT PR: 12211
File: .pre-commit-config.yaml:160-179
Timestamp: 2026-02-26T17:02:22.448Z
Learning: Keep the pre-commit hook pattern broad for autogpt_platform/backend to ensure OpenAPI schema changes are captured. Do not narrow to backend/api/ alone, since the generated schema depends on Pydantic models across multiple directories (backend/data/, backend/blocks/, backend/copilot/, backend/integrations/, backend/util/). Narrowing could miss schema changes and cause frontend type desynchronization.

Applied to files:

  • autogpt_platform/backend/backend/executor/manager.py
📚 Learning: 2026-03-05T15:42:08.207Z
Learnt from: ntindle
Repo: Significant-Gravitas/AutoGPT PR: 12297
File: .claude/skills/backend-check/SKILL.md:14-16
Timestamp: 2026-03-05T15:42:08.207Z
Learning: In Python files under autogpt_platform/backend (recursively), rely on poetry run format to perform formatting (Black + isort) and linting (ruff). Do not run poetry run lint as a separate step after poetry run format, since format already includes linting checks.

Applied to files:

  • autogpt_platform/backend/backend/executor/manager.py
🔇 Additional comments (2)
autogpt_platform/backend/backend/executor/manager.py (2)

64-69: Good exception-noise boundary for Sentry capture.

The Line 387-Line 391 logic is a solid balance: expected ValueError paths are suppressed while NotFoundError/GraphNotFoundError still get captured.

Also applies to: 383-392


1493-1493: Log-level downgrades are appropriate for cleanup/notification paths.

These are non-user-actionable/transient paths, so warning level is a better fit than error.

Also applies to: 1925-1925, 1941-1943, 1974-1976, 1985-1985

Comment thread autogpt_platform/backend/backend/executor/manager.py
thread.join(timeout=N) never raises TimeoutError in Python — it always
returns None. Use thread.is_alive() after join to detect timeout.
@majdyz majdyz added this pull request to the merge queue Mar 16, 2026
@github-project-automation github-project-automation Bot moved this from 🆕 Needs initial review to 👍🏼 Mergeable in AutoGPT development kanban Mar 16, 2026
Merged via the queue into dev with commit c9c3d54 Mar 16, 2026
20 checks passed
@majdyz majdyz deleted the fix/sentry-error-cleanup branch March 16, 2026 10:46
@github-project-automation github-project-automation Bot moved this from 👍🏼 Mergeable to ✅ Done in AutoGPT development kanban Mar 16, 2026
@majdyz
Copy link
Copy Markdown
Contributor Author

majdyz commented Mar 17, 2026

Addressed all 3 nitpick comments from the initial review:

  1. retry.py L184-186 — Duplicate log statements: Fixed. The on_retry callback now does pass for final failures (when retry_state.next_action is None), deferring to sync_wrapper/async_wrapper for the single final-failure warning log.

  2. notifications.py L1015-1018 — Preserving traceback: Fixed. Changed to logger.warning(..., exc_info=True) so the traceback is preserved at warning level while the exception is still re-raised for @continuous_retry handling.

  3. metrics.py L54 — InsufficientBalanceError message gap + inactive email pattern: Fixed. Added "no credits left" as an alternate pattern for insufficient balance filtering. Also changed the inactive email check from requiring both "marked as inactive" AND "inactive addresses" to matching either with or.

Bentlybro pushed a commit that referenced this pull request Apr 4, 2026
…owngrading log levels (#12430)

## Summary

Reduces Sentry error noise by ~90% by filtering out expected/transient
errors and downgrading inappropriate error-level logs to warnings. Most
of the top Sentry issues are not actual bugs but expected conditions
(user errors, transient infra, business logic) that were incorrectly
logged at ERROR level, causing them to be captured as Sentry events.

## Changes

### 1. Sentry `before_send` filter (`metrics.py`)
Added a `before_send` hook to filter known expected errors before they
reach Sentry:
- **AMQP/RabbitMQ connection errors** — transient during
deploys/restarts
- **User credential errors** — invalid API keys, missing auth headers
(user error, not platform bug)
- **Insufficient balance** — expected business logic
- **Blocked IP access** — security check working as intended
- **Discord bot token errors** — misconfiguration, not runtime error
- **Google metadata DNS errors** — expected in non-GCP environments
- **Inactive email recipients** — expected for bounced addresses
- **Unclosed client sessions/connectors** — resource cleanup noise

### 2. Connection retry log levels (`retry.py`)
- `conn_retry` final failure: `error` → `warning` (these are infra
retries, not bugs)
- `conn_retry` wrapper final failure: `error` → `warning`
- Discord alert send failure: `error` → `warning`

### 3. Block execution Sentry capture (`manager.py`)
- Skip `sentry_sdk.capture_exception()` for `ValueError` subclasses
(BlockExecutionError, BlockInputError, InsufficientBalanceError, etc.) —
these are user-caused errors, not platform bugs
- Downgrade executor shutdown/disconnect errors to warning

### 4. Scheduler log levels (`scheduler.py`)
- Graph validation failure: `error` → `warning` (expected for
old/invalid graphs)
- Unable to unschedule graph: `error` → `warning`
- Job listener failure: `error` → `warning`
- Async operation failure: `error` → `warning`

### 5. Discord system alert (`notifications.py`)
- Wrapped `discord_system_alert` endpoint with try/catch to prevent
unhandled exceptions (fixes AUTOGPT-SERVER-743, AUTOGPT-SERVER-7MW)

### 6. Notification system log levels (`notifications.py`)
- All batch processing errors: `error` → `warning`
- User email not found: `error` → `warning`
- Notification parsing errors: `error` → `warning`
- Email sending failures: `error` → `warning`
- Summary data gathering failure: `error` → `warning`
- Cleaned up unprofessional error messages

### 7. Cloud storage cleanup (`cloud_storage.py`)
- Cleanup error: `error` → `warning`

## Sentry Issues Addressed

### AMQP/RabbitMQ (~3.4M events total)
-
[AUTOGPT-SERVER-3H2](https://significant-gravitas.sentry.io/issues/AUTOGPT-SERVER-3H2)
— AMQPConnector ConnectionRefusedError (1.2M events)
-
[AUTOGPT-SERVER-3H3](https://significant-gravitas.sentry.io/issues/AUTOGPT-SERVER-3H3)
— AMQPConnectionWorkflowFailed (770K events)
-
[AUTOGPT-SERVER-3H4](https://significant-gravitas.sentry.io/issues/AUTOGPT-SERVER-3H4)
— AMQP connection workflow failed (770K events)
-
[AUTOGPT-SERVER-3H5](https://significant-gravitas.sentry.io/issues/AUTOGPT-SERVER-3H5)
— AMQPConnectionWorkflow reporting failure (770K events)
-
[AUTOGPT-SERVER-3H7](https://significant-gravitas.sentry.io/issues/AUTOGPT-SERVER-3H7)
— Socket failed to connect (514K events)
-
[AUTOGPT-SERVER-3H8](https://significant-gravitas.sentry.io/issues/AUTOGPT-SERVER-3H8)
— TCP Connection attempt failed (514K events)
-
[AUTOGPT-SERVER-3H6](https://significant-gravitas.sentry.io/issues/AUTOGPT-SERVER-3H6)
— AMQPConnectionError (93K events)
-
[AUTOGPT-SERVER-7SX](https://significant-gravitas.sentry.io/issues/AUTOGPT-SERVER-7SX)
— Error creating transport (69K events)
-
[AUTOGPT-SERVER-1TN](https://significant-gravitas.sentry.io/issues/AUTOGPT-SERVER-1TN)
— ChannelInvalidStateError (39K events)
-
[AUTOGPT-SERVER-6JC](https://significant-gravitas.sentry.io/issues/AUTOGPT-SERVER-6JC)
— ConnectionClosedByBroker (2K events)
-
[AUTOGPT-SERVER-6RJ/6RK/6RN/6RQ/6RP/6RR](https://significant-gravitas.sentry.io/issues/AUTOGPT-SERVER-6RJ)
— Various connection failures (~15K events)
-
[AUTOGPT-SERVER-4A5/6RM/7XN](https://significant-gravitas.sentry.io/issues/AUTOGPT-SERVER-4A5)
— Connection close/transport errors (~540 events)

### User Credential Errors (~15K events)
-
[AUTOGPT-SERVER-6S5](https://significant-gravitas.sentry.io/issues/AUTOGPT-SERVER-6S5)
— Incorrect OpenAI API key (9.2K events)
-
[AUTOGPT-SERVER-7W4](https://significant-gravitas.sentry.io/issues/AUTOGPT-SERVER-7W4)
— Incorrect API key in AIConditionBlock (3.4K events)
-
[AUTOGPT-SERVER-83Y](https://significant-gravitas.sentry.io/issues/AUTOGPT-SERVER-83Y)
— AI condition invalid key (2.3K events)
-
[AUTOGPT-SERVER-7ZP](https://significant-gravitas.sentry.io/issues/AUTOGPT-SERVER-7ZP)
— Perplexity missing auth header (451 events)
-
[AUTOGPT-SERVER-7XK/7XM](https://significant-gravitas.sentry.io/issues/AUTOGPT-SERVER-7XK)
— Anthropic invalid key (125 events)
-
[AUTOGPT-SERVER-82C](https://significant-gravitas.sentry.io/issues/AUTOGPT-SERVER-82C)
— Missing auth header (27 events)
-
[AUTOGPT-SERVER-721](https://significant-gravitas.sentry.io/issues/AUTOGPT-SERVER-721)
— Ideogram invalid token (165 events)

### Business Logic / Validation (~120K events)
-
[AUTOGPT-SERVER-7YQ](https://significant-gravitas.sentry.io/issues/AUTOGPT-SERVER-7YQ)
— Disabled block used in graph (56K events)
-
[AUTOGPT-SERVER-6W3](https://significant-gravitas.sentry.io/issues/AUTOGPT-SERVER-6W3)
— Graph failed validation (46K events)
-
[AUTOGPT-SERVER-6W2](https://significant-gravitas.sentry.io/issues/AUTOGPT-SERVER-6W2)
— Unable to unschedule graph (46K events)
-
[AUTOGPT-SERVER-83X](https://significant-gravitas.sentry.io/issues/AUTOGPT-SERVER-83X)
— Blocked IP access (15K events)
-
[AUTOGPT-SERVER-6K9](https://significant-gravitas.sentry.io/issues/AUTOGPT-SERVER-6K9)
— Insufficient balance (4K events)

### Discord Alert Failures (~24K events)
-
[AUTOGPT-SERVER-743](https://significant-gravitas.sentry.io/issues/AUTOGPT-SERVER-743)
— Discord improper token (22K events)
-
[AUTOGPT-SERVER-7MW](https://significant-gravitas.sentry.io/issues/AUTOGPT-SERVER-7MW)
— Discord 403 Missing Access (1.5K events)

### Notification System (~16K events)
-
[AUTOGPT-SERVER-550](https://significant-gravitas.sentry.io/issues/AUTOGPT-SERVER-550)
— Notification batch create error (8.3K events)
-
[AUTOGPT-SERVER-58H](https://significant-gravitas.sentry.io/issues/AUTOGPT-SERVER-58H)
— ValidationError for NotificationEventModel (3K events)
-
[AUTOGPT-SERVER-5C6](https://significant-gravitas.sentry.io/issues/AUTOGPT-SERVER-5C6)
— Get notification batch error (2.1K events)
-
[AUTOGPT-SERVER-4BT](https://significant-gravitas.sentry.io/issues/AUTOGPT-SERVER-4BT)
— Notification batch create error (1.8K events)
-
[AUTOGPT-SERVER-5E4](https://significant-gravitas.sentry.io/issues/AUTOGPT-SERVER-5E4)
— NotificationPreference validation (1.4K events)
-
[AUTOGPT-SERVER-508](https://significant-gravitas.sentry.io/issues/AUTOGPT-SERVER-508)
— Inactive email recipients (702 events)

### Infrastructure / Transient (~20K events)
-
[AUTOGPT-SERVER-6WJ](https://significant-gravitas.sentry.io/issues/AUTOGPT-SERVER-6WJ)
— Unclosed client session (13K events)
-
[AUTOGPT-SERVER-745](https://significant-gravitas.sentry.io/issues/AUTOGPT-SERVER-745)
— Unclosed connector (5.8K events)
-
[AUTOGPT-SERVER-4V1](https://significant-gravitas.sentry.io/issues/AUTOGPT-SERVER-4V1)
— Google metadata DNS error (2.2K events)
-
[AUTOGPT-SERVER-80J](https://significant-gravitas.sentry.io/issues/AUTOGPT-SERVER-80J)
— CloudStorage DNS error (35 events)

### Executor Shutdown
-
[AUTOGPT-SERVER-55J](https://significant-gravitas.sentry.io/issues/AUTOGPT-SERVER-55J)
— Error disconnecting run client (118 events)

## Test plan
- [x] All pre-commit hooks pass (Ruff, isort, Black, Pyright typecheck)
- [x] All changed modules import successfully
- [ ] Deploy to staging and verify Sentry event volume drops
significantly
- [ ] Verify legitimate errors still appear in Sentry
Bentlybro pushed a commit to Bentlybro/AutoGPT that referenced this pull request Apr 4, 2026
…owngrading log levels (Significant-Gravitas#12430)

## Summary

Reduces Sentry error noise by ~90% by filtering out expected/transient
errors and downgrading inappropriate error-level logs to warnings. Most
of the top Sentry issues are not actual bugs but expected conditions
(user errors, transient infra, business logic) that were incorrectly
logged at ERROR level, causing them to be captured as Sentry events.

## Changes

### 1. Sentry `before_send` filter (`metrics.py`)
Added a `before_send` hook to filter known expected errors before they
reach Sentry:
- **AMQP/RabbitMQ connection errors** — transient during
deploys/restarts
- **User credential errors** — invalid API keys, missing auth headers
(user error, not platform bug)
- **Insufficient balance** — expected business logic
- **Blocked IP access** — security check working as intended
- **Discord bot token errors** — misconfiguration, not runtime error
- **Google metadata DNS errors** — expected in non-GCP environments
- **Inactive email recipients** — expected for bounced addresses
- **Unclosed client sessions/connectors** — resource cleanup noise

### 2. Connection retry log levels (`retry.py`)
- `conn_retry` final failure: `error` → `warning` (these are infra
retries, not bugs)
- `conn_retry` wrapper final failure: `error` → `warning`
- Discord alert send failure: `error` → `warning`

### 3. Block execution Sentry capture (`manager.py`)
- Skip `sentry_sdk.capture_exception()` for `ValueError` subclasses
(BlockExecutionError, BlockInputError, InsufficientBalanceError, etc.) —
these are user-caused errors, not platform bugs
- Downgrade executor shutdown/disconnect errors to warning

### 4. Scheduler log levels (`scheduler.py`)
- Graph validation failure: `error` → `warning` (expected for
old/invalid graphs)
- Unable to unschedule graph: `error` → `warning`
- Job listener failure: `error` → `warning`
- Async operation failure: `error` → `warning`

### 5. Discord system alert (`notifications.py`)
- Wrapped `discord_system_alert` endpoint with try/catch to prevent
unhandled exceptions (fixes AUTOGPT-SERVER-743, AUTOGPT-SERVER-7MW)

### 6. Notification system log levels (`notifications.py`)
- All batch processing errors: `error` → `warning`
- User email not found: `error` → `warning`
- Notification parsing errors: `error` → `warning`
- Email sending failures: `error` → `warning`
- Summary data gathering failure: `error` → `warning`
- Cleaned up unprofessional error messages

### 7. Cloud storage cleanup (`cloud_storage.py`)
- Cleanup error: `error` → `warning`

## Sentry Issues Addressed

### AMQP/RabbitMQ (~3.4M events total)
-
[AUTOGPT-SERVER-3H2](https://significant-gravitas.sentry.io/issues/AUTOGPT-SERVER-3H2)
— AMQPConnector ConnectionRefusedError (1.2M events)
-
[AUTOGPT-SERVER-3H3](https://significant-gravitas.sentry.io/issues/AUTOGPT-SERVER-3H3)
— AMQPConnectionWorkflowFailed (770K events)
-
[AUTOGPT-SERVER-3H4](https://significant-gravitas.sentry.io/issues/AUTOGPT-SERVER-3H4)
— AMQP connection workflow failed (770K events)
-
[AUTOGPT-SERVER-3H5](https://significant-gravitas.sentry.io/issues/AUTOGPT-SERVER-3H5)
— AMQPConnectionWorkflow reporting failure (770K events)
-
[AUTOGPT-SERVER-3H7](https://significant-gravitas.sentry.io/issues/AUTOGPT-SERVER-3H7)
— Socket failed to connect (514K events)
-
[AUTOGPT-SERVER-3H8](https://significant-gravitas.sentry.io/issues/AUTOGPT-SERVER-3H8)
— TCP Connection attempt failed (514K events)
-
[AUTOGPT-SERVER-3H6](https://significant-gravitas.sentry.io/issues/AUTOGPT-SERVER-3H6)
— AMQPConnectionError (93K events)
-
[AUTOGPT-SERVER-7SX](https://significant-gravitas.sentry.io/issues/AUTOGPT-SERVER-7SX)
— Error creating transport (69K events)
-
[AUTOGPT-SERVER-1TN](https://significant-gravitas.sentry.io/issues/AUTOGPT-SERVER-1TN)
— ChannelInvalidStateError (39K events)
-
[AUTOGPT-SERVER-6JC](https://significant-gravitas.sentry.io/issues/AUTOGPT-SERVER-6JC)
— ConnectionClosedByBroker (2K events)
-
[AUTOGPT-SERVER-6RJ/6RK/6RN/6RQ/6RP/6RR](https://significant-gravitas.sentry.io/issues/AUTOGPT-SERVER-6RJ)
— Various connection failures (~15K events)
-
[AUTOGPT-SERVER-4A5/6RM/7XN](https://significant-gravitas.sentry.io/issues/AUTOGPT-SERVER-4A5)
— Connection close/transport errors (~540 events)

### User Credential Errors (~15K events)
-
[AUTOGPT-SERVER-6S5](https://significant-gravitas.sentry.io/issues/AUTOGPT-SERVER-6S5)
— Incorrect OpenAI API key (9.2K events)
-
[AUTOGPT-SERVER-7W4](https://significant-gravitas.sentry.io/issues/AUTOGPT-SERVER-7W4)
— Incorrect API key in AIConditionBlock (3.4K events)
-
[AUTOGPT-SERVER-83Y](https://significant-gravitas.sentry.io/issues/AUTOGPT-SERVER-83Y)
— AI condition invalid key (2.3K events)
-
[AUTOGPT-SERVER-7ZP](https://significant-gravitas.sentry.io/issues/AUTOGPT-SERVER-7ZP)
— Perplexity missing auth header (451 events)
-
[AUTOGPT-SERVER-7XK/7XM](https://significant-gravitas.sentry.io/issues/AUTOGPT-SERVER-7XK)
— Anthropic invalid key (125 events)
-
[AUTOGPT-SERVER-82C](https://significant-gravitas.sentry.io/issues/AUTOGPT-SERVER-82C)
— Missing auth header (27 events)
-
[AUTOGPT-SERVER-721](https://significant-gravitas.sentry.io/issues/AUTOGPT-SERVER-721)
— Ideogram invalid token (165 events)

### Business Logic / Validation (~120K events)
-
[AUTOGPT-SERVER-7YQ](https://significant-gravitas.sentry.io/issues/AUTOGPT-SERVER-7YQ)
— Disabled block used in graph (56K events)
-
[AUTOGPT-SERVER-6W3](https://significant-gravitas.sentry.io/issues/AUTOGPT-SERVER-6W3)
— Graph failed validation (46K events)
-
[AUTOGPT-SERVER-6W2](https://significant-gravitas.sentry.io/issues/AUTOGPT-SERVER-6W2)
— Unable to unschedule graph (46K events)
-
[AUTOGPT-SERVER-83X](https://significant-gravitas.sentry.io/issues/AUTOGPT-SERVER-83X)
— Blocked IP access (15K events)
-
[AUTOGPT-SERVER-6K9](https://significant-gravitas.sentry.io/issues/AUTOGPT-SERVER-6K9)
— Insufficient balance (4K events)

### Discord Alert Failures (~24K events)
-
[AUTOGPT-SERVER-743](https://significant-gravitas.sentry.io/issues/AUTOGPT-SERVER-743)
— Discord improper token (22K events)
-
[AUTOGPT-SERVER-7MW](https://significant-gravitas.sentry.io/issues/AUTOGPT-SERVER-7MW)
— Discord 403 Missing Access (1.5K events)

### Notification System (~16K events)
-
[AUTOGPT-SERVER-550](https://significant-gravitas.sentry.io/issues/AUTOGPT-SERVER-550)
— Notification batch create error (8.3K events)
-
[AUTOGPT-SERVER-58H](https://significant-gravitas.sentry.io/issues/AUTOGPT-SERVER-58H)
— ValidationError for NotificationEventModel (3K events)
-
[AUTOGPT-SERVER-5C6](https://significant-gravitas.sentry.io/issues/AUTOGPT-SERVER-5C6)
— Get notification batch error (2.1K events)
-
[AUTOGPT-SERVER-4BT](https://significant-gravitas.sentry.io/issues/AUTOGPT-SERVER-4BT)
— Notification batch create error (1.8K events)
-
[AUTOGPT-SERVER-5E4](https://significant-gravitas.sentry.io/issues/AUTOGPT-SERVER-5E4)
— NotificationPreference validation (1.4K events)
-
[AUTOGPT-SERVER-508](https://significant-gravitas.sentry.io/issues/AUTOGPT-SERVER-508)
— Inactive email recipients (702 events)

### Infrastructure / Transient (~20K events)
-
[AUTOGPT-SERVER-6WJ](https://significant-gravitas.sentry.io/issues/AUTOGPT-SERVER-6WJ)
— Unclosed client session (13K events)
-
[AUTOGPT-SERVER-745](https://significant-gravitas.sentry.io/issues/AUTOGPT-SERVER-745)
— Unclosed connector (5.8K events)
-
[AUTOGPT-SERVER-4V1](https://significant-gravitas.sentry.io/issues/AUTOGPT-SERVER-4V1)
— Google metadata DNS error (2.2K events)
-
[AUTOGPT-SERVER-80J](https://significant-gravitas.sentry.io/issues/AUTOGPT-SERVER-80J)
— CloudStorage DNS error (35 events)

### Executor Shutdown
-
[AUTOGPT-SERVER-55J](https://significant-gravitas.sentry.io/issues/AUTOGPT-SERVER-55J)
— Error disconnecting run client (118 events)

## Test plan
- [x] All pre-commit hooks pass (Ruff, isort, Black, Pyright typecheck)
- [x] All changed modules import successfully
- [ ] Deploy to staging and verify Sentry event volume drops
significantly
- [ ] Verify legitimate errors still appear in Sentry
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

platform/backend AutoGPT Platform - Back end size/l

Projects

Status: ✅ Done

Development

Successfully merging this pull request may close these issues.

2 participants