103 lines
3.7 KiB
Python
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'),
|
|
)
|