homelab_automation/app/models/host_metrics.py
Bruno Charest c3cd7c2621
Some checks failed
Tests / Backend Tests (Python) (3.10) (push) Has been cancelled
Tests / Backend Tests (Python) (3.11) (push) Has been cancelled
Tests / Backend Tests (Python) (3.12) (push) Has been cancelled
Tests / Frontend Tests (JS) (push) Has been cancelled
Tests / Integration Tests (push) Has been cancelled
Tests / All Tests Passed (push) Has been cancelled
feat: Implement initial Homelab Automation API v2 with new models, routes, and core architecture, including a SQLAlchemy model refactoring script.
2026-03-03 20:18:22 -05:00

89 lines
4.7 KiB
Python

from __future__ import annotations
from datetime import datetime
from typing import Optional
from sqlalchemy import DateTime, Float, ForeignKey, Integer, JSON, String, Text, Index
from sqlalchemy.orm import Mapped, mapped_column, relationship
from sqlalchemy.sql import func
from .database import Base
class HostMetrics(Base):
"""Stocke les métriques collectées par les builtin playbooks pour chaque hôte."""
__tablename__ = "host_metrics"
__table_args__ = (
Index("idx_host_metrics_host_id", "host_id"),
Index("idx_host_metrics_collected_at", "collected_at"),
Index("idx_host_metrics_metric_type", "metric_type"),
)
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
host_id: Mapped[str] = mapped_column(String, ForeignKey("hosts.id", ondelete="CASCADE"), nullable=False)
metric_type: Mapped[str] = mapped_column(String(50), nullable=False) # 'system_info', 'disk_usage', 'memory', etc.
# Métriques CPU
cpu_count: Mapped[int] = mapped_column(Integer, nullable=True)
cpu_model: Mapped[str] = mapped_column(String(200), nullable=True)
cpu_cores: Mapped[int] = mapped_column(Integer, nullable=True)
cpu_threads: Mapped[int] = mapped_column(Integer, nullable=True)
cpu_threads_per_core: Mapped[int] = mapped_column(Integer, nullable=True)
cpu_sockets: Mapped[int] = mapped_column(Integer, nullable=True)
cpu_mhz: Mapped[float] = mapped_column(Float, nullable=True)
cpu_max_mhz: Mapped[float] = mapped_column(Float, nullable=True)
cpu_min_mhz: Mapped[float] = mapped_column(Float, nullable=True)
cpu_load_1m: Mapped[float] = mapped_column(Float, nullable=True)
cpu_load_5m: Mapped[float] = mapped_column(Float, nullable=True)
cpu_load_15m: Mapped[float] = mapped_column(Float, nullable=True)
cpu_usage_percent: Mapped[float] = mapped_column(Float, nullable=True)
cpu_temperature: Mapped[float] = mapped_column(Float, nullable=True)
# Métriques mémoire
memory_total_mb: Mapped[int] = mapped_column(Integer, nullable=True)
memory_used_mb: Mapped[int] = mapped_column(Integer, nullable=True)
memory_free_mb: Mapped[int] = mapped_column(Integer, nullable=True)
memory_usage_percent: Mapped[float] = mapped_column(Float, nullable=True)
swap_total_mb: Mapped[int] = mapped_column(Integer, nullable=True)
swap_used_mb: Mapped[int] = mapped_column(Integer, nullable=True)
swap_usage_percent: Mapped[float] = mapped_column(Float, nullable=True)
# Métriques disque (stockées en JSON pour flexibilité - plusieurs disques)
disk_info: Mapped[object] = mapped_column(JSON, nullable=True) # Liste des points de montage avec usage
disk_devices: Mapped[object] = mapped_column(JSON) # Liste des disques + partitions (layout, nullable=True)
disk_root_total_gb: Mapped[float] = mapped_column(Float, nullable=True)
disk_root_used_gb: Mapped[float] = mapped_column(Float, nullable=True)
disk_root_usage_percent: Mapped[float] = mapped_column(Float, nullable=True)
# Storage stacks (JSON)
lvm_info: Mapped[object] = mapped_column(JSON, nullable=True)
zfs_info: Mapped[object] = mapped_column(JSON, nullable=True)
# Stockage détaillé (JSON) - données normalisées avec métadonnées de collecte
storage_details: Mapped[dict] = mapped_column(JSON, nullable=True)
# Informations système
os_name: Mapped[str] = mapped_column(String(100), nullable=True)
os_version: Mapped[str] = mapped_column(String(100), nullable=True)
kernel_version: Mapped[str] = mapped_column(String(100), nullable=True)
hostname: Mapped[str] = mapped_column(String(200), nullable=True)
uptime_seconds: Mapped[int] = mapped_column(Integer, nullable=True)
uptime_human: Mapped[str] = mapped_column(String(100), nullable=True)
# Réseau (stocké en JSON pour flexibilité)
network_info: Mapped[dict] = mapped_column(JSON, nullable=True)
# Données brutes et métadonnées
raw_data: Mapped[dict] = mapped_column(JSON, nullable=True) # Données brutes du playbook
collection_source: Mapped[str] = mapped_column(String(100), nullable=True) # Nom du builtin playbook
collection_duration_ms: Mapped[int] = mapped_column(Integer, nullable=True)
error_message: Mapped[str] = mapped_column(Text, nullable=True)
collected_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), nullable=False, server_default=func.now())
created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), nullable=False, server_default=func.now())
host: Mapped["Host"] = relationship("Host", back_populates="metrics")
def __repr__(self) -> str:
return f"<HostMetrics id={self.id} host_id={self.host_id} type={self.metric_type}>"