20251229_0118_f06499634fff_add_monitoring_tables.py 4.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. """add_monitoring_tables
  2. Revision ID: f06499634fff
  3. Revises: c1148f55dcd9
  4. Create Date: 2025-12-29 01:18:05.570528+00:00
  5. """
  6. from typing import Sequence, Union
  7. from alembic import op
  8. import sqlalchemy as sa
  9. from sqlalchemy.dialects import postgresql
  10. # revision identifiers, used by Alembic.
  11. revision: str = 'f06499634fff'
  12. down_revision: Union[str, None] = 'c1148f55dcd9'
  13. branch_labels: Union[str, Sequence[str], None] = None
  14. depends_on: Union[str, Sequence[str], None] = None
  15. def upgrade() -> None:
  16. # Create host_metrics table
  17. op.create_table(
  18. 'host_metrics',
  19. sa.Column('id', sa.Integer(), nullable=False),
  20. sa.Column('timestamp', sa.DateTime(timezone=True), nullable=False),
  21. sa.Column('cpu_percent', sa.Float(), nullable=False),
  22. sa.Column('cpu_count', sa.Integer(), nullable=False),
  23. sa.Column('memory_total', sa.BigInteger(), nullable=False),
  24. sa.Column('memory_used', sa.BigInteger(), nullable=False),
  25. sa.Column('memory_percent', sa.Float(), nullable=False),
  26. sa.Column('load_1', sa.Float(), nullable=False),
  27. sa.Column('load_5', sa.Float(), nullable=False),
  28. sa.Column('load_15', sa.Float(), nullable=False),
  29. sa.Column('disk_read_bytes', sa.BigInteger(), nullable=False),
  30. sa.Column('disk_write_bytes', sa.BigInteger(), nullable=False),
  31. sa.Column('disk_usage_percent', sa.Float(), nullable=False),
  32. sa.Column('net_sent_bytes', sa.BigInteger(), nullable=False),
  33. sa.Column('net_recv_bytes', sa.BigInteger(), nullable=False),
  34. sa.PrimaryKeyConstraint('id')
  35. )
  36. op.create_index('ix_host_metrics_timestamp', 'host_metrics', ['timestamp'])
  37. # Create security_events table
  38. op.create_table(
  39. 'security_events',
  40. sa.Column('id', sa.Integer(), nullable=False),
  41. sa.Column('timestamp', sa.DateTime(timezone=True), nullable=False),
  42. sa.Column('event_type', sa.String(length=50), nullable=False),
  43. sa.Column('severity', sa.String(length=20), nullable=False),
  44. sa.Column('ip_address', sa.String(length=45), nullable=True),
  45. sa.Column('user_agent', sa.Text(), nullable=True),
  46. sa.Column('endpoint', sa.String(length=255), nullable=True),
  47. sa.Column('description', sa.Text(), nullable=False),
  48. sa.Column('event_metadata', postgresql.JSON(astext_type=sa.Text()), nullable=True),
  49. sa.Column('resolved', sa.Boolean(), nullable=False, server_default='false'),
  50. sa.Column('resolved_at', sa.DateTime(timezone=True), nullable=True),
  51. sa.Column('resolved_by', sa.Integer(), nullable=True),
  52. sa.PrimaryKeyConstraint('id')
  53. )
  54. op.create_index('ix_security_events_timestamp', 'security_events', ['timestamp'])
  55. op.create_index('ix_security_events_event_type', 'security_events', ['event_type'])
  56. op.create_index('ix_security_events_ip_address', 'security_events', ['ip_address'])
  57. op.create_index('ix_security_events_resolved', 'security_events', ['resolved'])
  58. # Create alerts table
  59. op.create_table(
  60. 'alerts',
  61. sa.Column('id', sa.Integer(), nullable=False),
  62. sa.Column('timestamp', sa.DateTime(timezone=True), nullable=False),
  63. sa.Column('alert_type', sa.String(length=50), nullable=False),
  64. sa.Column('severity', sa.String(length=20), nullable=False),
  65. sa.Column('title', sa.String(length=255), nullable=False),
  66. sa.Column('message', sa.Text(), nullable=False),
  67. sa.Column('alert_metadata', postgresql.JSON(astext_type=sa.Text()), nullable=True),
  68. sa.Column('acknowledged', sa.Boolean(), nullable=False, server_default='false'),
  69. sa.Column('acknowledged_at', sa.DateTime(timezone=True), nullable=True),
  70. sa.Column('acknowledged_by', sa.Integer(), nullable=True),
  71. sa.Column('dismissed', sa.Boolean(), nullable=False, server_default='false'),
  72. sa.Column('dismissed_at', sa.DateTime(timezone=True), nullable=True),
  73. sa.Column('sent_dashboard', sa.Boolean(), nullable=False, server_default='false'),
  74. sa.Column('sent_telegram', sa.Boolean(), nullable=False, server_default='false'),
  75. sa.Column('sent_email', sa.Boolean(), nullable=False, server_default='false'),
  76. sa.PrimaryKeyConstraint('id')
  77. )
  78. op.create_index('ix_alerts_timestamp', 'alerts', ['timestamp'])
  79. op.create_index('ix_alerts_alert_type', 'alerts', ['alert_type'])
  80. op.create_index('ix_alerts_severity', 'alerts', ['severity'])
  81. op.create_index('ix_alerts_acknowledged', 'alerts', ['acknowledged'])
  82. op.create_index('ix_alerts_dismissed', 'alerts', ['dismissed'])
  83. def downgrade() -> None:
  84. op.drop_table('alerts')
  85. op.drop_table('security_events')
  86. op.drop_table('host_metrics')