Skip to content

Commit 8d65e92

Browse files
committed
fix(sessions): emit logger.warning with full message before truncating error_message
Truncation is a lossy operation. Without surfacing the original content, users hitting this path on a legacy VARCHAR(255) schema had no way to recover the full error text without attaching a debugger. Extract the truncation logic into a pre-flight block before the StorageEvent constructor, emit a WARNING with the event id, the length limit, and the full original message, then pass the already-truncated value into the constructor. This makes the information available at WARNING level in any standard logging setup. Also adds import logging and module-level logger following the google_adk.<module> convention already used in the sessions package. Test updated to assert the warning is emitted and contains the original full message.
1 parent 9966d44 commit 8d65e92

File tree

2 files changed

+24
-11
lines changed

2 files changed

+24
-11
lines changed

src/google/adk/sessions/schemas/v0.py

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,13 @@
2929
from datetime import datetime
3030
from datetime import timezone
3131
import json
32+
import logging
3233
import pickle
3334
from typing import Any
3435
from typing import Optional
3536

37+
logger = logging.getLogger("google_adk." + __name__)
38+
3639
from google.adk.platform import uuid as platform_uuid
3740
from google.genai import types
3841
from sqlalchemy import Boolean
@@ -291,6 +294,19 @@ def long_running_tool_ids(self, value: set[str]):
291294

292295
@classmethod
293296
def from_event(cls, session: Session, event: Event) -> StorageEvent:
297+
error_message = event.error_message
298+
if error_message and len(error_message) > _LEGACY_ERROR_MSG_MAX_LEN:
299+
logger.warning(
300+
"error_message for event %s exceeds %d characters and will be"
301+
" truncated. Full message: %s",
302+
event.id,
303+
_LEGACY_ERROR_MSG_MAX_LEN,
304+
error_message,
305+
)
306+
error_message = (
307+
error_message[: _LEGACY_ERROR_MSG_MAX_LEN - len(_TRUNCATION_SUFFIX)]
308+
+ _TRUNCATION_SUFFIX
309+
)
294310
storage_event = StorageEvent(
295311
id=event.id,
296312
invocation_id=event.invocation_id,
@@ -305,15 +321,7 @@ def from_event(cls, session: Session, event: Event) -> StorageEvent:
305321
partial=event.partial,
306322
turn_complete=event.turn_complete,
307323
error_code=event.error_code,
308-
error_message=(
309-
event.error_message[
310-
: _LEGACY_ERROR_MSG_MAX_LEN - len(_TRUNCATION_SUFFIX)
311-
]
312-
+ _TRUNCATION_SUFFIX
313-
if event.error_message
314-
and len(event.error_message) > _LEGACY_ERROR_MSG_MAX_LEN
315-
else event.error_message
316-
),
324+
error_message=error_message,
317325
interrupted=event.interrupted,
318326
)
319327
if event.content:

tests/unittests/sessions/test_v0_storage_event.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,9 @@ def test_storage_event_v0_to_event_rehydrates_compaction_model():
5252
assert event.actions.compaction.end_timestamp == 2.0
5353

5454

55-
def test_from_event_truncates_error_message_exceeding_varchar255():
55+
def test_from_event_truncates_error_message_exceeding_varchar255(caplog):
56+
import logging
57+
5658
session = Session(app_name="app", user_id="user", id="session_id")
5759
event = Event(
5860
id="event_id",
@@ -63,9 +65,12 @@ def test_from_event_truncates_error_message_exceeding_varchar255():
6365
error_message="x" * 300,
6466
)
6567

66-
storage_event = StorageEvent.from_event(session, event)
68+
with caplog.at_level(logging.WARNING):
69+
storage_event = StorageEvent.from_event(session, event)
6770

6871
assert storage_event.error_message == "x" * 241 + "...[truncated]"
72+
assert any("truncated" in r.message for r in caplog.records)
73+
assert any("x" * 300 in r.message for r in caplog.records)
6974

7075

7176
def test_from_event_preserves_short_error_message():

0 commit comments

Comments
 (0)