You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

72 lines
2.5 KiB
Python

"""
Error log model for storing API errors
"""
from sqlalchemy import Column, Integer, String, Text, DateTime, JSON, Float, Boolean
from sqlalchemy.sql import func
from app.core.database import Base
class ErrorLog(Base):
"""Model for storing API error logs"""
__tablename__ = "error_logs"
id = Column(Integer, primary_key=True, index=True)
# Request information
request_id = Column(String(50), index=True)
endpoint = Column(String(200), index=True)
method = Column(String(10))
path = Column(String(500))
query_params = Column(JSON, nullable=True)
request_body = Column(JSON, nullable=True)
headers = Column(JSON, nullable=True)
# Error information
error_type = Column(String(100), index=True)
error_message = Column(Text)
error_detail = Column(JSON, nullable=True)
status_code = Column(Integer, index=True)
stack_trace = Column(Text, nullable=True)
# Context information
user_agent = Column(String(500), nullable=True)
client_ip = Column(String(50), nullable=True)
session_id = Column(String(100), nullable=True)
user_id = Column(String(100), nullable=True)
# Performance metrics
response_time_ms = Column(Float, nullable=True)
# Resolution
is_resolved = Column(Boolean, default=False, index=True)
resolved_at = Column(DateTime(timezone=True), nullable=True)
resolution_notes = Column(Text, nullable=True)
# Timestamps
created_at = Column(DateTime(timezone=True), server_default=func.now(), index=True)
def to_dict(self):
"""Convert to dictionary for API responses"""
return {
"id": self.id,
"request_id": self.request_id,
"endpoint": self.endpoint,
"method": self.method,
"path": self.path,
"query_params": self.query_params,
"request_body": self.request_body,
"error_type": self.error_type,
"error_message": self.error_message,
"error_detail": self.error_detail,
"status_code": self.status_code,
"stack_trace": self.stack_trace,
"user_agent": self.user_agent,
"client_ip": self.client_ip,
"response_time_ms": self.response_time_ms,
"is_resolved": self.is_resolved,
"resolved_at": self.resolved_at.isoformat() if self.resolved_at else None,
"resolution_notes": self.resolution_notes,
"created_at": self.created_at.isoformat() if self.created_at else None
}