host_metrics.py 3.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. """
  2. Host metrics model for storing system monitoring data.
  3. """
  4. from datetime import datetime
  5. from sqlalchemy import BigInteger, DateTime, Float, Integer, JSON
  6. from sqlalchemy.orm import Mapped, mapped_column
  7. from app.core.database import Base
  8. class HostMetrics(Base):
  9. """Host system metrics - comprehensive monitoring."""
  10. __tablename__ = "host_metrics"
  11. id: Mapped[int] = mapped_column(primary_key=True)
  12. timestamp: Mapped[datetime] = mapped_column(DateTime(timezone=True), index=True)
  13. # CPU
  14. cpu_percent: Mapped[float] = mapped_column(Float, nullable=False)
  15. cpu_count: Mapped[int] = mapped_column(Integer, nullable=False)
  16. cpu_per_core: Mapped[list | None] = mapped_column(JSON) # Per-core percentages
  17. cpu_steal: Mapped[float] = mapped_column(Float, nullable=False, default=0) # VM steal time
  18. context_switches_per_sec: Mapped[int] = mapped_column(Integer, nullable=False, default=0)
  19. interrupts_per_sec: Mapped[int] = mapped_column(Integer, nullable=False, default=0)
  20. # Memory
  21. memory_total: Mapped[int] = mapped_column(BigInteger, nullable=False)
  22. memory_used: Mapped[int] = mapped_column(BigInteger, nullable=False)
  23. memory_percent: Mapped[float] = mapped_column(Float, nullable=False)
  24. memory_available: Mapped[int] = mapped_column(BigInteger, nullable=False)
  25. memory_buffers: Mapped[int] = mapped_column(BigInteger, nullable=False, default=0)
  26. memory_cached: Mapped[int] = mapped_column(BigInteger, nullable=False, default=0)
  27. swap_total: Mapped[int] = mapped_column(BigInteger, nullable=False, default=0)
  28. swap_used: Mapped[int] = mapped_column(BigInteger, nullable=False, default=0)
  29. swap_percent: Mapped[float] = mapped_column(Float, nullable=False, default=0)
  30. # Load Average
  31. load_1: Mapped[float] = mapped_column(Float, nullable=False)
  32. load_5: Mapped[float] = mapped_column(Float, nullable=False)
  33. load_15: Mapped[float] = mapped_column(Float, nullable=False)
  34. # Disk I/O - cumulative + rates
  35. disk_read_bytes: Mapped[int] = mapped_column(BigInteger, nullable=False)
  36. disk_write_bytes: Mapped[int] = mapped_column(BigInteger, nullable=False)
  37. disk_read_iops: Mapped[int] = mapped_column(Integer, nullable=False, default=0) # Ops/sec
  38. disk_write_iops: Mapped[int] = mapped_column(Integer, nullable=False, default=0)
  39. disk_read_mbps: Mapped[float] = mapped_column(Float, nullable=False, default=0) # MB/s
  40. disk_write_mbps: Mapped[float] = mapped_column(Float, nullable=False, default=0)
  41. disk_io_time_ms: Mapped[int] = mapped_column(BigInteger, nullable=False, default=0) # Latency
  42. disk_usage_percent: Mapped[float] = mapped_column(Float, nullable=False)
  43. # Network - cumulative + rates
  44. net_sent_bytes: Mapped[int] = mapped_column(BigInteger, nullable=False)
  45. net_recv_bytes: Mapped[int] = mapped_column(BigInteger, nullable=False)
  46. net_in_mbps: Mapped[float] = mapped_column(Float, nullable=False, default=0) # MB/s
  47. net_out_mbps: Mapped[float] = mapped_column(Float, nullable=False, default=0)
  48. net_packets_in_per_sec: Mapped[int] = mapped_column(Integer, nullable=False, default=0)
  49. net_packets_out_per_sec: Mapped[int] = mapped_column(Integer, nullable=False, default=0)
  50. net_errors_in: Mapped[int] = mapped_column(BigInteger, nullable=False, default=0)
  51. net_errors_out: Mapped[int] = mapped_column(BigInteger, nullable=False, default=0)
  52. net_drops_in: Mapped[int] = mapped_column(BigInteger, nullable=False, default=0)
  53. net_drops_out: Mapped[int] = mapped_column(BigInteger, nullable=False, default=0)
  54. # Processes
  55. process_count: Mapped[int] = mapped_column(Integer, nullable=False, default=0)
  56. thread_count: Mapped[int] = mapped_column(Integer, nullable=False, default=0)
  57. top_cpu_processes: Mapped[list | None] = mapped_column(JSON) # Top 5 by CPU
  58. top_mem_processes: Mapped[list | None] = mapped_column(JSON) # Top 5 by memory