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
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
|
|
} |