Bug fixes of training
This commit is contained in:
@@ -5,10 +5,11 @@ Fetches POI features for use in demand forecasting predictions.
|
||||
Ensures feature consistency between training and prediction.
|
||||
"""
|
||||
|
||||
import httpx
|
||||
from typing import Dict, Any, Optional
|
||||
import structlog
|
||||
|
||||
from shared.clients.external_client import ExternalServiceClient
|
||||
|
||||
logger = structlog.get_logger()
|
||||
|
||||
|
||||
@@ -20,15 +21,18 @@ class POIFeatureService:
|
||||
prediction uses the same features as training.
|
||||
"""
|
||||
|
||||
def __init__(self, external_service_url: str = "http://external-service:8000"):
|
||||
def __init__(self, external_client: ExternalServiceClient = None):
|
||||
"""
|
||||
Initialize POI feature service.
|
||||
|
||||
Args:
|
||||
external_service_url: Base URL for external service
|
||||
external_client: External service client instance (optional)
|
||||
"""
|
||||
self.external_service_url = external_service_url.rstrip("/")
|
||||
self.poi_context_endpoint = f"{self.external_service_url}/poi-context"
|
||||
if external_client is None:
|
||||
from app.core.config import settings
|
||||
self.external_client = ExternalServiceClient(settings, "forecasting-service")
|
||||
else:
|
||||
self.external_client = external_client
|
||||
|
||||
async def get_poi_features(
|
||||
self,
|
||||
@@ -44,21 +48,10 @@ class POIFeatureService:
|
||||
Dictionary with POI features or empty dict if not available
|
||||
"""
|
||||
try:
|
||||
async with httpx.AsyncClient(timeout=10.0) as client:
|
||||
response = await client.get(
|
||||
f"{self.poi_context_endpoint}/{tenant_id}"
|
||||
)
|
||||
result = await self.external_client.get_poi_context(tenant_id)
|
||||
|
||||
if response.status_code == 404:
|
||||
logger.warning(
|
||||
"No POI context found for tenant",
|
||||
tenant_id=tenant_id
|
||||
)
|
||||
return {}
|
||||
|
||||
response.raise_for_status()
|
||||
data = response.json()
|
||||
poi_context = data.get("poi_context", {})
|
||||
if result:
|
||||
poi_context = result.get("poi_context", {})
|
||||
ml_features = poi_context.get("ml_features", {})
|
||||
|
||||
logger.info(
|
||||
@@ -68,17 +61,16 @@ class POIFeatureService:
|
||||
)
|
||||
|
||||
return ml_features
|
||||
else:
|
||||
logger.warning(
|
||||
"No POI context found for tenant",
|
||||
tenant_id=tenant_id
|
||||
)
|
||||
return {}
|
||||
|
||||
except httpx.HTTPError as e:
|
||||
logger.error(
|
||||
"Failed to fetch POI features for forecasting",
|
||||
tenant_id=tenant_id,
|
||||
error=str(e)
|
||||
)
|
||||
return {}
|
||||
except Exception as e:
|
||||
logger.error(
|
||||
"Unexpected error fetching POI features",
|
||||
"Failed to fetch POI features for forecasting",
|
||||
tenant_id=tenant_id,
|
||||
error=str(e),
|
||||
exc_info=True
|
||||
@@ -87,17 +79,18 @@ class POIFeatureService:
|
||||
|
||||
async def check_poi_service_health(self) -> bool:
|
||||
"""
|
||||
Check if POI service is accessible.
|
||||
Check if POI service is accessible through the external client.
|
||||
|
||||
Returns:
|
||||
True if service is healthy, False otherwise
|
||||
"""
|
||||
try:
|
||||
async with httpx.AsyncClient(timeout=5.0) as client:
|
||||
response = await client.get(
|
||||
f"{self.poi_context_endpoint}/health"
|
||||
)
|
||||
return response.status_code == 200
|
||||
# Test the external service health by attempting to get POI context for a dummy tenant
|
||||
# This will go through the proper authentication and routing
|
||||
dummy_context = await self.external_client.get_poi_context("test-tenant")
|
||||
# If we can successfully make a request (even if it returns None for missing tenant),
|
||||
# it means the service is accessible
|
||||
return True
|
||||
except Exception as e:
|
||||
logger.error(
|
||||
"POI service health check failed",
|
||||
|
||||
Reference in New Issue
Block a user