Add new alert architecture to forecasting

This commit is contained in:
Urtzi Alfaro
2025-08-23 15:48:32 +02:00
parent 4b4268d640
commit a214617815
6 changed files with 846 additions and 3 deletions

View File

@@ -18,6 +18,7 @@ from app.api import forecasts, predictions
from app.services.messaging import setup_messaging, cleanup_messaging
from app.services.forecasting_alert_service import ForecastingAlertService
from shared.monitoring.logging import setup_logging
from shared.monitoring.metrics import MetricsCollector
@@ -28,6 +29,9 @@ logger = structlog.get_logger()
# Initialize metrics collector
metrics_collector = MetricsCollector("forecasting-service")
# Initialize alert service
alert_service = None
@asynccontextmanager
async def lifespan(app: FastAPI):
"""Application lifespan manager for startup and shutdown events"""
@@ -45,6 +49,13 @@ async def lifespan(app: FastAPI):
await setup_messaging()
logger.info("Messaging initialized")
# Initialize forecasting alert service
logger.info("Setting up forecasting alert service")
global alert_service
alert_service = ForecastingAlertService(settings)
await alert_service.start()
logger.info("Forecasting alert service initialized")
# Register custom metrics
metrics_collector.register_counter("forecasts_generated_total", "Total forecasts generated")
metrics_collector.register_counter("predictions_served_total", "Total predictions served")
@@ -70,6 +81,11 @@ async def lifespan(app: FastAPI):
logger.info("Shutting down Forecasting Service")
try:
# Cleanup alert service
if alert_service:
await alert_service.stop()
logger.info("Alert service cleanup completed")
await cleanup_messaging()
logger.info("Messaging cleanup completed")
except Exception as e:
@@ -104,12 +120,16 @@ app.include_router(predictions.router, prefix="/api/v1", tags=["predictions"])
async def health_check():
"""Health check endpoint"""
db_health = await get_db_health()
alert_health = await alert_service.health_check() if alert_service else {"status": "not_initialized"}
overall_health = db_health and alert_health.get("status") == "healthy"
return {
"status": "healthy" if db_health else "unhealthy",
"status": "healthy" if overall_health else "unhealthy",
"service": "forecasting-service",
"version": "1.0.0",
"database": "connected" if db_health else "disconnected",
"alert_service": alert_health,
"timestamp": structlog.get_logger().info("Health check requested")
}
@@ -118,6 +138,13 @@ async def get_metrics():
"""Metrics endpoint for Prometheus"""
return metrics_collector.get_metrics()
@app.get("/alert-metrics")
async def get_alert_metrics():
"""Alert service metrics endpoint"""
if alert_service:
return alert_service.get_metrics()
return {"error": "Alert service not initialized"}
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8000)