diff --git a/apps/api/src/services/operator_summary_cache.py b/apps/api/src/services/operator_summary_cache.py index b5b94a3c..b78ed352 100644 --- a/apps/api/src/services/operator_summary_cache.py +++ b/apps/api/src/services/operator_summary_cache.py @@ -14,9 +14,12 @@ from dataclasses import dataclass from datetime import UTC, datetime, timedelta from typing import Any +import structlog + _CACHE_SCHEMA_VERSION = "operator_summary_cache_v1" _CACHE_SOURCE = "api_pod_memory" +logger = structlog.get_logger(__name__) @dataclass(slots=True) @@ -90,6 +93,15 @@ def _decode_redis_value(raw: Any) -> dict[str, Any] | None: return payload if isinstance(payload, dict) else None +async def _get_redis_client() -> Any: + from src.core.redis_client import get_redis, init_redis_pool + + try: + return get_redis() + except RuntimeError: + return await init_redis_pool() + + def get_cached_operator_summary( namespace: str, key_parts: dict[str, Any], @@ -126,9 +138,7 @@ async def get_cached_operator_summary_async( """Return a shared Redis cache hit, falling back to process memory.""" redis_key = _redis_key(namespace, key_parts) try: - from src.core.redis_client import get_redis - - redis_client = get_redis() + redis_client = await _get_redis_client() payload = _decode_redis_value(await redis_client.get(redis_key)) if payload is not None and isinstance(payload.get("value"), dict): stored_epoch = float(payload.get("stored_epoch") or 0.0) @@ -157,8 +167,12 @@ async def get_cached_operator_summary_async( ), ) await redis_client.delete(redis_key) - except Exception: - pass + except Exception as exc: + logger.debug( + "operator_summary_redis_cache_read_failed", + namespace=namespace, + error=str(exc), + ) return get_cached_operator_summary( namespace, @@ -220,16 +234,18 @@ async def store_operator_summary_async( "ttl_seconds": ttl_value, } try: - from src.core.redis_client import get_redis - - redis_client = get_redis() + redis_client = await _get_redis_client() await redis_client.set( _redis_key(namespace, key_parts), json.dumps(payload, ensure_ascii=False, default=_json_default), ex=ttl_value, ) - except Exception: - pass + except Exception as exc: + logger.debug( + "operator_summary_redis_cache_write_failed", + namespace=namespace, + error=str(exc), + ) return response