Build and Push / build (release) Successful in 1m44s
- GET /tools/system/stats - Real-time host system statistics - CPU usage, memory, all mounted disks, network I/O - GPU/VRAM stats via nvidia-smi (if available) - Uses psutil for cross-platform host metrics - Auto-discovers and filters real filesystems 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
198 lines
3.8 KiB
Python
198 lines
3.8 KiB
Python
"""
|
|
Pydantic schemas for system stats module
|
|
"""
|
|
from pydantic import Field
|
|
from typing import Optional, List
|
|
from datetime import datetime
|
|
from src.shared.base import BaseSchema
|
|
|
|
|
|
class CpuStats(BaseSchema):
|
|
"""CPU usage statistics"""
|
|
|
|
usage_percent: float = Field(
|
|
...,
|
|
description="CPU usage percentage (0-100)",
|
|
ge=0,
|
|
le=100
|
|
)
|
|
|
|
cores: int = Field(
|
|
...,
|
|
description="Number of CPU cores"
|
|
)
|
|
|
|
load_1m: Optional[float] = Field(
|
|
default=None,
|
|
description="1-minute load average"
|
|
)
|
|
|
|
load_5m: Optional[float] = Field(
|
|
default=None,
|
|
description="5-minute load average"
|
|
)
|
|
|
|
load_15m: Optional[float] = Field(
|
|
default=None,
|
|
description="15-minute load average"
|
|
)
|
|
|
|
|
|
class MemoryStats(BaseSchema):
|
|
"""Memory usage statistics"""
|
|
|
|
usage_percent: float = Field(
|
|
...,
|
|
description="Memory usage percentage (0-100)",
|
|
ge=0,
|
|
le=100
|
|
)
|
|
|
|
total_bytes: int = Field(
|
|
...,
|
|
description="Total memory in bytes"
|
|
)
|
|
|
|
used_bytes: int = Field(
|
|
...,
|
|
description="Used memory in bytes"
|
|
)
|
|
|
|
available_bytes: int = Field(
|
|
...,
|
|
description="Available memory in bytes"
|
|
)
|
|
|
|
|
|
class DiskStats(BaseSchema):
|
|
"""Disk usage statistics for a single mount point"""
|
|
|
|
mount_point: str = Field(
|
|
...,
|
|
description="Mount point path"
|
|
)
|
|
|
|
device: str = Field(
|
|
...,
|
|
description="Device name (e.g., /dev/sda1)"
|
|
)
|
|
|
|
fstype: str = Field(
|
|
...,
|
|
description="Filesystem type (e.g., ext4, xfs)"
|
|
)
|
|
|
|
usage_percent: float = Field(
|
|
...,
|
|
description="Disk usage percentage (0-100)",
|
|
ge=0,
|
|
le=100
|
|
)
|
|
|
|
total_bytes: int = Field(
|
|
...,
|
|
description="Total disk space in bytes"
|
|
)
|
|
|
|
used_bytes: int = Field(
|
|
...,
|
|
description="Used disk space in bytes"
|
|
)
|
|
|
|
free_bytes: int = Field(
|
|
...,
|
|
description="Free disk space in bytes"
|
|
)
|
|
|
|
|
|
class NetworkStats(BaseSchema):
|
|
"""Network I/O statistics"""
|
|
|
|
bytes_sent: int = Field(
|
|
...,
|
|
description="Total bytes sent"
|
|
)
|
|
|
|
bytes_recv: int = Field(
|
|
...,
|
|
description="Total bytes received"
|
|
)
|
|
|
|
bytes_total: int = Field(
|
|
...,
|
|
description="Total bytes (sent + received)"
|
|
)
|
|
|
|
|
|
class GpuStats(BaseSchema):
|
|
"""GPU/VRAM statistics (if available)"""
|
|
|
|
available: bool = Field(
|
|
...,
|
|
description="Whether GPU stats are available"
|
|
)
|
|
|
|
name: Optional[str] = Field(
|
|
default=None,
|
|
description="GPU name"
|
|
)
|
|
|
|
usage_percent: Optional[float] = Field(
|
|
default=None,
|
|
description="VRAM usage percentage (0-100)"
|
|
)
|
|
|
|
total_bytes: Optional[int] = Field(
|
|
default=None,
|
|
description="Total VRAM in bytes"
|
|
)
|
|
|
|
used_bytes: Optional[int] = Field(
|
|
default=None,
|
|
description="Used VRAM in bytes"
|
|
)
|
|
|
|
free_bytes: Optional[int] = Field(
|
|
default=None,
|
|
description="Free VRAM in bytes"
|
|
)
|
|
|
|
|
|
class SystemStatsResponse(BaseSchema):
|
|
"""Response model for system stats"""
|
|
|
|
cpu: CpuStats = Field(
|
|
...,
|
|
description="CPU statistics"
|
|
)
|
|
|
|
memory: MemoryStats = Field(
|
|
...,
|
|
description="Memory statistics"
|
|
)
|
|
|
|
disks: List[DiskStats] = Field(
|
|
...,
|
|
description="Disk statistics for all mounted filesystems"
|
|
)
|
|
|
|
network: NetworkStats = Field(
|
|
...,
|
|
description="Network I/O statistics"
|
|
)
|
|
|
|
gpu: GpuStats = Field(
|
|
...,
|
|
description="GPU/VRAM statistics"
|
|
)
|
|
|
|
hostname: str = Field(
|
|
...,
|
|
description="System hostname"
|
|
)
|
|
|
|
queried_at: datetime = Field(
|
|
...,
|
|
description="UTC timestamp when stats were collected"
|
|
)
|