from sqlalchemy import Column, Integer, String, DateTime, Text, JSON, Float, Boolean, ForeignKey from sqlalchemy.orm import declarative_base from sqlalchemy.orm import relationship from datetime import datetime Base = declarative_base() class Metric(Base): __tablename__ = "metrics" id = Column(Integer, primary_key=True) metric_id = Column(String(64), unique=True, nullable=False) name = Column(String(128), nullable=False) # e.g., "api_request_count", "build_duration" value = Column(Float, nullable=False) labels = Column(JSON, default={}) # e.g., {"service": "api", "endpoint": "/v1/builds"} timestamp = Column(DateTime, default=datetime.utcnow) source = Column(String(64), nullable=True) # e.g., "build_farm", "api_gateway" class Trace(Base): __tablename__ = "traces" id = Column(Integer, primary_key=True) trace_id = Column(String(64), unique=True, nullable=False) span_id = Column(String(64), nullable=False) parent_span_id = Column(String(64), nullable=True) operation = Column(String(128), nullable=False) # e.g., "generate", "build", "deploy" start_time = Column(DateTime, nullable=False) end_time = Column(DateTime, nullable=True) duration_ms = Column(Float, nullable=True) tags = Column(JSON, default={}) # e.g., {"provider": "openai", "model": "gpt-4"} error = Column(Text, nullable=True) class AuditLog(Base): __tablename__ = "audit_logs" id = Column(Integer, primary_key=True) audit_id = Column(String(64), unique=True, nullable=False) user_id = Column(String(64), nullable=True) # who performed the action action = Column(String(64), nullable=False) # e.g., "create_workflow", "deploy_app" resource = Column(String(128), nullable=True) # e.g., "workflow_id", "deployment_id" details = Column(JSON, default={}) ip = Column(String(45), nullable=True) timestamp = Column(DateTime, default=datetime.utcnow) class AILog(Base): __tablename__ = "ai_logs" id = Column(Integer, primary_key=True) log_id = Column(String(64), unique=True, nullable=False) session_id = Column(String(64), nullable=True) # for grouping AI interactions provider = Column(String(64), nullable=False) # e.g., "openai", "anthropic" model = Column(String(64), nullable=False) prompt = Column(Text, nullable=False) response = Column(Text, nullable=True) tokens_used = Column(Integer, default=0) cost = Column(Float, default=0.0) duration_ms = Column(Float, default=0.0) success = Column(Boolean, default=True) error = Column(Text, nullable=True) timestamp = Column(DateTime, default=datetime.utcnow) class Alert(Base): __tablename__ = "alerts" id = Column(Integer, primary_key=True) alert_id = Column(String(64), unique=True, nullable=False) name = Column(String(128), nullable=False) condition = Column(String(256), nullable=False) # e.g., "value > 100" severity = Column(String(16), default="warning") # info, warning, critical triggered = Column(Boolean, default=False) last_triggered_at = Column(DateTime, nullable=True) resolved_at = Column(DateTime, nullable=True) created_at = Column(DateTime, default=datetime.utcnow)