From 0360e0d9414cf6d55fc236a5f7a6c0b8e298b40a Mon Sep 17 00:00:00 2001 From: Charlie Doern Date: Thu, 17 Jul 2025 21:30:36 -0400 Subject: [PATCH] fix: make telemetry more resilient to missing data it seems sometimes `row` is missing some data like `root_span_id`, omit these entries and log a warning Signed-off-by: Charlie Doern --- .../utils/telemetry/sqlite_trace_store.py | 27 ++++++++++++------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/llama_stack/providers/utils/telemetry/sqlite_trace_store.py b/llama_stack/providers/utils/telemetry/sqlite_trace_store.py index af1145fe7..7d8d99868 100644 --- a/llama_stack/providers/utils/telemetry/sqlite_trace_store.py +++ b/llama_stack/providers/utils/telemetry/sqlite_trace_store.py @@ -11,6 +11,9 @@ from typing import Protocol import aiosqlite from llama_stack.apis.telemetry import QueryCondition, Span, SpanWithStatus, Trace +from llama_stack.log import get_logger + +logger = get_logger(__name__, category="core") class TraceStore(Protocol): @@ -99,15 +102,21 @@ class SQLiteTraceStore(TraceStore): conn.row_factory = aiosqlite.Row async with conn.execute(query, params) as cursor: rows = await cursor.fetchall() - return [ - Trace( - trace_id=row["trace_id"], - root_span_id=row["root_span_id"], - start_time=datetime.fromisoformat(row["start_time"]), - end_time=datetime.fromisoformat(row["end_time"]), - ) - for row in rows - ] + results = [] + for row in rows: + try: + results.append( + Trace( + trace_id=row["trace_id"], + root_span_id=row["root_span_id"], + start_time=datetime.fromisoformat(row["start_time"]), + end_time=datetime.fromisoformat(row["end_time"]), + ) + ) + except (KeyError, TypeError, ValueError) as e: + logger.warning(f"Could not construct Trace due to missing information in row: {e}") + continue + return results async def get_span_tree( self,