Files
moreminimore-marketing/backend/models/api_monitoring.py
Kunthawat Greethong c35fa52117 Base code
2026-01-08 22:39:53 +07:00

103 lines
3.7 KiB
Python

"""
API Monitoring Database Models
Persistent storage for API monitoring statistics.
"""
from sqlalchemy import Column, Integer, String, DateTime, Float, Boolean, JSON, Index, Text
from sqlalchemy.ext.declarative import declarative_base
from datetime import datetime
import json
Base = declarative_base()
class APIRequest(Base):
"""Store individual API requests for monitoring."""
__tablename__ = "api_requests"
id = Column(Integer, primary_key=True)
timestamp = Column(DateTime, default=datetime.utcnow, nullable=False)
path = Column(String(500), nullable=False)
method = Column(String(10), nullable=False)
status_code = Column(Integer, nullable=False)
duration = Column(Float, nullable=False) # Response time in seconds
user_id = Column(String(50), nullable=True)
cache_hit = Column(Boolean, nullable=True)
request_size = Column(Integer, nullable=True)
response_size = Column(Integer, nullable=True)
user_agent = Column(String(500), nullable=True)
ip_address = Column(String(45), nullable=True)
# Indexes for fast queries
__table_args__ = (
Index('idx_timestamp', 'timestamp'),
Index('idx_path_method', 'path', 'method'),
Index('idx_status_code', 'status_code'),
Index('idx_user_id', 'user_id'),
)
class APIEndpointStats(Base):
"""Aggregated statistics per endpoint."""
__tablename__ = "api_endpoint_stats"
id = Column(Integer, primary_key=True)
endpoint = Column(String(500), nullable=False, unique=True) # "GET /api/endpoint"
total_requests = Column(Integer, default=0)
total_errors = Column(Integer, default=0)
total_duration = Column(Float, default=0.0)
avg_duration = Column(Float, default=0.0)
min_duration = Column(Float, nullable=True)
max_duration = Column(Float, nullable=True)
last_called = Column(DateTime, nullable=True)
cache_hits = Column(Integer, default=0)
cache_misses = Column(Integer, default=0)
cache_hit_rate = Column(Float, default=0.0)
updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
__table_args__ = (
Index('idx_endpoint', 'endpoint'),
Index('idx_total_requests', 'total_requests'),
Index('idx_avg_duration', 'avg_duration'),
)
class SystemHealth(Base):
"""System health snapshots."""
__tablename__ = "system_health"
id = Column(Integer, primary_key=True)
timestamp = Column(DateTime, default=datetime.utcnow, nullable=False)
status = Column(String(20), nullable=False) # healthy, warning, critical
total_requests = Column(Integer, default=0)
total_errors = Column(Integer, default=0)
error_rate = Column(Float, default=0.0)
avg_response_time = Column(Float, default=0.0)
cache_hit_rate = Column(Float, default=0.0)
active_endpoints = Column(Integer, default=0)
metrics = Column(JSON, nullable=True) # Additional metrics
__table_args__ = (
Index('idx_timestamp', 'timestamp'),
Index('idx_status', 'status'),
)
class CachePerformance(Base):
"""Cache performance metrics."""
__tablename__ = "cache_performance"
id = Column(Integer, primary_key=True)
timestamp = Column(DateTime, default=datetime.utcnow, nullable=False)
cache_type = Column(String(50), nullable=False) # "comprehensive_user_data", "redis", etc.
hits = Column(Integer, default=0)
misses = Column(Integer, default=0)
hit_rate = Column(Float, default=0.0)
avg_response_time = Column(Float, default=0.0)
total_requests = Column(Integer, default=0)
__table_args__ = (
Index('idx_timestamp', 'timestamp'),
Index('idx_cache_type', 'cache_type'),
)