Spaces:
Runtime error
Runtime error
| import datetime | |
| from sqlalchemy import Column, Integer, String, Float, DateTime, Text, JSON, Enum as SAEnum | |
| from database import Base | |
| import enum | |
| class JobStatus(str, enum.Enum): | |
| PENDING = "pending" | |
| PROCESSING = "processing" | |
| COMPLETED = "completed" | |
| FAILED = "failed" | |
| class Job(Base): | |
| """Tracks every file processing request for health monitoring.""" | |
| __tablename__ = "jobs" | |
| id = Column(Integer, primary_key=True, index=True) | |
| job_id = Column(String(64), unique=True, index=True, nullable=False) | |
| original_filename = Column(String(512), nullable=False) | |
| file_type = Column(String(10)) # "pdf" or "image" | |
| total_pages = Column(Integer, default=1) | |
| current_page = Column(Integer, default=0) | |
| status = Column(String(20), default=JobStatus.PENDING.value) | |
| # --- Results --- | |
| tables_found = Column(Integer, default=0) | |
| cells_extracted = Column(Integer, default=0) | |
| result_payload = Column(JSON, nullable=True) # full extraction data | |
| # --- Health metrics --- | |
| latency_seconds = Column(Float, nullable=True) | |
| error_message = Column(Text, nullable=True) | |
| # --- Timestamps --- | |
| created_at = Column(DateTime, default=datetime.datetime.utcnow) | |
| started_at = Column(DateTime, nullable=True) | |
| completed_at = Column(DateTime, nullable=True) | |
| def to_dict(self): | |
| return { | |
| "id": self.id, | |
| "job_id": self.job_id, | |
| "original_filename": self.original_filename, | |
| "file_type": self.file_type, | |
| "total_pages": self.total_pages, | |
| "current_page": self.current_page, | |
| "status": self.status, | |
| "tables_found": self.tables_found, | |
| "cells_extracted": self.cells_extracted, | |
| "latency_seconds": self.latency_seconds, | |
| "error_message": self.error_message, | |
| "created_at": self.created_at.isoformat() if self.created_at else None, | |
| "started_at": self.started_at.isoformat() if self.started_at else None, | |
| "completed_at": self.completed_at.isoformat() if self.completed_at else None, | |
| } | |
| class HealthLog(Base): | |
| """Aggregated health snapshots for the monitoring dashboard.""" | |
| __tablename__ = "health_logs" | |
| id = Column(Integer, primary_key=True, index=True) | |
| timestamp = Column(DateTime, default=datetime.datetime.utcnow, index=True) | |
| total_jobs = Column(Integer, default=0) | |
| successful_jobs = Column(Integer, default=0) | |
| failed_jobs = Column(Integer, default=0) | |
| avg_latency = Column(Float, default=0.0) | |
| p95_latency = Column(Float, default=0.0) | |