From 2a47ecc1293167cafad2490130663e5ac00c2bd4 Mon Sep 17 00:00:00 2001 From: Zamil Majdy Date: Wed, 8 Apr 2026 22:15:34 +0700 Subject: [PATCH] fix(backend): lower PlatformCostLog DataError to warning during schema mismatch MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The autogpt-database-manager pod can run a stale Prisma client immediately after a schema migration (e.g. rolling deploy of PR #12696 that added PlatformCostLog). This caused every copilot token-tracking write to raise prisma.errors.DataError ('userId'/'metadata' field not found), which was caught by logger.exception() — firing Sentry events at ERROR level. Catch DataError specifically in both log_platform_cost_safe (platform_cost.py) and the _safe_log closure in token_tracking.py, and demote to WARNING so Sentry is not spammed during deploy windows. All other exceptions still escalate to ERROR/Sentry as before. --- .../backend/backend/copilot/token_tracking.py | 14 ++++++++++++++ .../backend/backend/data/platform_cost.py | 13 +++++++++++++ 2 files changed, 27 insertions(+) diff --git a/autogpt_platform/backend/backend/copilot/token_tracking.py b/autogpt_platform/backend/backend/copilot/token_tracking.py index f48749e712..b71fc10fa0 100644 --- a/autogpt_platform/backend/backend/copilot/token_tracking.py +++ b/autogpt_platform/backend/backend/copilot/token_tracking.py @@ -15,6 +15,8 @@ import math import re import threading +from prisma.errors import DataError + from backend.data.db_accessors import platform_cost_db from backend.data.platform_cost import PlatformCostEntry, usd_to_microdollars @@ -50,6 +52,18 @@ def _schedule_cost_log(entry: PlatformCostEntry) -> None: async with _get_log_semaphore(): try: await platform_cost_db().log_platform_cost(entry) + except DataError as e: + # Prisma DataError typically means the DB manager pod is running a + # stale Prisma client (e.g. during a rolling deploy after a schema + # migration). Log at WARNING so Sentry is not spammed. + logger.warning( + "Skipping platform cost log (schema mismatch?) for " + "user=%s provider=%s block=%s: %s", + entry.user_id, + entry.provider, + entry.block_name, + e, + ) except Exception: logger.exception( "Failed to log platform cost for user=%s provider=%s block=%s", diff --git a/autogpt_platform/backend/backend/data/platform_cost.py b/autogpt_platform/backend/backend/data/platform_cost.py index aebbbe1d99..abbfb684e4 100644 --- a/autogpt_platform/backend/backend/data/platform_cost.py +++ b/autogpt_platform/backend/backend/data/platform_cost.py @@ -3,6 +3,7 @@ import logging from datetime import datetime, timedelta, timezone from typing import Any +from prisma.errors import DataError from prisma.models import PlatformCostLog as PrismaLog from pydantic import BaseModel @@ -87,6 +88,18 @@ async def log_platform_cost_safe(entry: PlatformCostEntry) -> None: try: async with _log_semaphore: await log_platform_cost(entry) + except DataError as e: + # Prisma DataError typically means the DB manager pod is running a stale + # Prisma client (e.g. during a rolling deploy after a schema migration). + # Log at WARNING so Sentry is not spammed. + logger.warning( + "Skipping platform cost log (schema mismatch?) for " + "user=%s provider=%s block=%s: %s", + entry.user_id, + entry.provider, + entry.block_name, + e, + ) except Exception: logger.exception( "Failed to log platform cost for user=%s provider=%s block=%s",