homelab_automation/alembic/versions/0005_add_host_metrics_table.py

87 lines
3.6 KiB
Python

"""Add host_metrics table for builtin playbooks data collection
Revision ID: 0005
Revises: 0004_add_users_table
Create Date: 2024-12-11
"""
from typing import Sequence, Union
from alembic import op
import sqlalchemy as sa
revision: str = '0005_add_host_metrics'
down_revision: Union[str, None] = '0004_add_users'
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None
def upgrade() -> None:
op.create_table(
'host_metrics',
sa.Column('id', sa.Integer(), autoincrement=True, nullable=False),
sa.Column('host_id', sa.String(), nullable=False),
sa.Column('metric_type', sa.String(50), nullable=False),
# CPU metrics
sa.Column('cpu_count', sa.Integer(), nullable=True),
sa.Column('cpu_model', sa.String(200), nullable=True),
sa.Column('cpu_load_1m', sa.Float(), nullable=True),
sa.Column('cpu_load_5m', sa.Float(), nullable=True),
sa.Column('cpu_load_15m', sa.Float(), nullable=True),
sa.Column('cpu_usage_percent', sa.Float(), nullable=True),
sa.Column('cpu_temperature', sa.Float(), nullable=True),
# Memory metrics
sa.Column('memory_total_mb', sa.Integer(), nullable=True),
sa.Column('memory_used_mb', sa.Integer(), nullable=True),
sa.Column('memory_free_mb', sa.Integer(), nullable=True),
sa.Column('memory_usage_percent', sa.Float(), nullable=True),
sa.Column('swap_total_mb', sa.Integer(), nullable=True),
sa.Column('swap_used_mb', sa.Integer(), nullable=True),
sa.Column('swap_usage_percent', sa.Float(), nullable=True),
# Disk metrics
sa.Column('disk_info', sa.JSON(), nullable=True),
sa.Column('disk_root_total_gb', sa.Float(), nullable=True),
sa.Column('disk_root_used_gb', sa.Float(), nullable=True),
sa.Column('disk_root_usage_percent', sa.Float(), nullable=True),
# System info
sa.Column('os_name', sa.String(100), nullable=True),
sa.Column('os_version', sa.String(100), nullable=True),
sa.Column('kernel_version', sa.String(100), nullable=True),
sa.Column('hostname', sa.String(200), nullable=True),
sa.Column('uptime_seconds', sa.Integer(), nullable=True),
sa.Column('uptime_human', sa.String(100), nullable=True),
# Network info
sa.Column('network_info', sa.JSON(), nullable=True),
# Raw data and metadata
sa.Column('raw_data', sa.JSON(), nullable=True),
sa.Column('collection_source', sa.String(100), nullable=True),
sa.Column('collection_duration_ms', sa.Integer(), nullable=True),
sa.Column('error_message', sa.Text(), nullable=True),
# Timestamps
sa.Column('collected_at', sa.DateTime(timezone=True), server_default=sa.func.now(), nullable=False),
sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.func.now(), nullable=False),
sa.ForeignKeyConstraint(['host_id'], ['hosts.id'], ondelete='CASCADE'),
sa.PrimaryKeyConstraint('id')
)
# Create indexes
op.create_index('idx_host_metrics_host_id', 'host_metrics', ['host_id'])
op.create_index('idx_host_metrics_collected_at', 'host_metrics', ['collected_at'])
op.create_index('idx_host_metrics_metric_type', 'host_metrics', ['metric_type'])
def downgrade() -> None:
op.drop_index('idx_host_metrics_metric_type', 'host_metrics')
op.drop_index('idx_host_metrics_collected_at', 'host_metrics')
op.drop_index('idx_host_metrics_host_id', 'host_metrics')
op.drop_table('host_metrics')