sqrtspace-python/examples/fastapi-app/app/main.py
2025-07-20 04:11:04 -04:00

137 lines
3.9 KiB
Python

"""
FastAPI application demonstrating SqrtSpace SpaceTime integration
"""
from fastapi import FastAPI, Request
from fastapi.middleware.cors import CORSMiddleware
from contextlib import asynccontextmanager
import logging
from sqrtspace_spacetime import SpaceTimeConfig
from sqrtspace_spacetime.memory import MemoryPressureMonitor
from .config import settings
from .routers import products, analytics, ml, reports
from .services.cache_service import SpaceTimeCache
from .utils.memory import memory_monitor_middleware
# Configure logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
# Global instances
cache = SpaceTimeCache()
memory_monitor = MemoryPressureMonitor(settings.SPACETIME_MEMORY_LIMIT)
@asynccontextmanager
async def lifespan(app: FastAPI):
"""Application lifespan manager"""
# Startup
logger.info("Starting FastAPI with SqrtSpace SpaceTime")
# Configure SpaceTime
SpaceTimeConfig.set_defaults(
memory_limit=settings.SPACETIME_MEMORY_LIMIT,
external_storage=settings.SPACETIME_EXTERNAL_STORAGE,
chunk_strategy=settings.SPACETIME_CHUNK_STRATEGY,
compression=settings.SPACETIME_COMPRESSION
)
# Initialize services
app.state.cache = cache
app.state.memory_monitor = memory_monitor
yield
# Shutdown
logger.info("Shutting down...")
cache.cleanup()
# Create FastAPI app
app = FastAPI(
title="SqrtSpace SpaceTime FastAPI Demo",
description="Memory-efficient API with √n space-time tradeoffs",
version="1.0.0",
lifespan=lifespan
)
# Add CORS middleware
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
# Add custom middleware
app.middleware("http")(memory_monitor_middleware)
# Include routers
app.include_router(products.router, prefix="/products", tags=["products"])
app.include_router(analytics.router, prefix="/analytics", tags=["analytics"])
app.include_router(ml.router, prefix="/ml", tags=["machine-learning"])
app.include_router(reports.router, prefix="/reports", tags=["reports"])
@app.get("/")
async def root():
"""Root endpoint"""
return {
"message": "SqrtSpace SpaceTime FastAPI Demo",
"docs": "/docs",
"memory_usage": memory_monitor.get_memory_info()
}
@app.get("/health")
async def health_check():
"""Health check endpoint"""
memory_info = memory_monitor.get_memory_info()
return {
"status": "healthy",
"memory": {
"usage_mb": memory_info["used_mb"],
"available_mb": memory_info["available_mb"],
"percentage": memory_info["percentage"],
"pressure": memory_monitor.check().value
},
"cache": cache.get_stats()
}
@app.get("/system/memory")
async def system_memory():
"""Detailed memory statistics"""
import psutil
import os
process = psutil.Process(os.getpid())
return {
"process": {
"rss_mb": process.memory_info().rss / 1024 / 1024,
"vms_mb": process.memory_info().vms / 1024 / 1024,
"cpu_percent": process.cpu_percent(interval=0.1),
"num_threads": process.num_threads()
},
"spacetime": {
"memory_limit": settings.SPACETIME_MEMORY_LIMIT,
"external_storage": settings.SPACETIME_EXTERNAL_STORAGE,
"pressure_level": memory_monitor.check().value,
"cache_stats": cache.get_stats()
},
"system": {
"total_memory_mb": psutil.virtual_memory().total / 1024 / 1024,
"available_memory_mb": psutil.virtual_memory().available / 1024 / 1024,
"memory_percent": psutil.virtual_memory().percent,
"swap_percent": psutil.swap_memory().percent
}
}
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8000)