"""Add operational SLO, alert and bounded capacity history records. Revision ID: 20260827_0020 Revises: 20260826_0019 """ from collections.abc import Sequence import sqlalchemy as sa from alembic import op revision: str = "20260827_0020" down_revision: str | None = "20260826_0019" branch_labels: str | Sequence[str] | None = None depends_on: str | Sequence[str] | None = None def _id() -> sa.Column[object]: return sa.Column("id", sa.Uuid(), primary_key=True, nullable=False) def _created() -> sa.Column[object]: return sa.Column("created_at", sa.DateTime(timezone=True), server_default=sa.func.now()) def upgrade() -> None: op.create_table( "service_level_indicators", _id(), sa.Column("key", sa.String(128), nullable=False, unique=True), sa.Column("name", sa.String(255), nullable=False), sa.Column("service", sa.String(128), nullable=False), sa.Column("capability", sa.String(128)), sa.Column("measurement", sa.String(32), nullable=False), sa.Column("valid_population", sa.JSON(), nullable=False), sa.Column("success_condition", sa.JSON(), nullable=False), sa.Column("default_window_seconds", sa.Integer(), nullable=False), sa.Column("enabled", sa.Boolean(), nullable=False, server_default=sa.true()), _created(), ) for column in ("key", "service", "capability", "enabled"): op.create_index(f"ix_service_level_indicators_{column}", "service_level_indicators", [column]) op.create_table( "slo_policy_revisions", _id(), sa.Column("key", sa.String(128), nullable=False), sa.Column("revision", sa.Integer(), nullable=False), sa.Column("sli_definition_id", sa.Uuid(), sa.ForeignKey("service_level_indicators.id", ondelete="RESTRICT"), nullable=False), sa.Column("objective", sa.Float(), nullable=False), sa.Column("threshold_ms", sa.Float()), sa.Column("rolling_window_seconds", sa.Integer(), nullable=False), sa.Column("minimum_sample_count", sa.Integer(), nullable=False), sa.Column("severity", sa.String(16), nullable=False), sa.Column("environment", sa.String(16), nullable=False), sa.Column("rationale", sa.Text(), nullable=False), sa.Column("effective_from", sa.DateTime(timezone=True), nullable=False), sa.Column("active", sa.Boolean(), nullable=False, server_default=sa.true()), sa.Column("fingerprint", sa.String(64), nullable=False, unique=True), sa.Column("created_by", sa.String(255), nullable=False), _created(), sa.Column("immutable_at", sa.DateTime(timezone=True), server_default=sa.func.now()), sa.UniqueConstraint("key", "revision", name="uq_slo_policy_key_revision"), ) for column in ("key", "sli_definition_id", "environment", "active"): op.create_index(f"ix_slo_policy_revisions_{column}", "slo_policy_revisions", [column]) op.create_table( "slo_evaluations", _id(), sa.Column("policy_id", sa.Uuid(), sa.ForeignKey("slo_policy_revisions.id", ondelete="RESTRICT"), nullable=False), sa.Column("window_start", sa.DateTime(timezone=True), nullable=False), sa.Column("window_end", sa.DateTime(timezone=True), nullable=False), sa.Column("observed_value", sa.Float()), sa.Column("sample_count", sa.Integer(), nullable=False), sa.Column("good_count", sa.Integer(), nullable=False), sa.Column("bad_count", sa.Integer(), nullable=False), sa.Column("state", sa.String(32), nullable=False), sa.Column("freshness_seconds", sa.Float()), sa.Column("allowed_bad", sa.Float()), sa.Column("consumed_bad", sa.Integer()), sa.Column("remaining_bad", sa.Float()), sa.Column("short_burn_rate", sa.Float()), sa.Column("long_burn_rate", sa.Float()), sa.Column("evidence", sa.JSON(), nullable=False), sa.Column("observed_at", sa.DateTime(timezone=True), server_default=sa.func.now()), sa.UniqueConstraint("policy_id", "window_end", name="uq_slo_evaluation_window"), ) for column in ("policy_id", "window_start", "window_end", "state"): op.create_index(f"ix_slo_evaluations_{column}", "slo_evaluations", [column]) op.create_table( "alert_rule_revisions", _id(), sa.Column("key", sa.String(128), nullable=False), sa.Column("revision", sa.Integer(), nullable=False), sa.Column("alert_type", sa.String(64), nullable=False), sa.Column("signal", sa.String(128), nullable=False), sa.Column("slo_policy_id", sa.Uuid(), sa.ForeignKey("slo_policy_revisions.id", ondelete="RESTRICT")), sa.Column("condition", sa.JSON(), nullable=False), sa.Column("pending_seconds", sa.Integer(), nullable=False), sa.Column("severity", sa.String(16), nullable=False), sa.Column("labels", sa.JSON(), nullable=False), sa.Column("cooldown_seconds", sa.Integer(), nullable=False), sa.Column("recovery_condition", sa.JSON(), nullable=False), sa.Column("active", sa.Boolean(), nullable=False, server_default=sa.true()), sa.Column("fingerprint", sa.String(64), nullable=False, unique=True), sa.Column("created_by", sa.String(255), nullable=False), _created(), sa.Column("immutable_at", sa.DateTime(timezone=True), server_default=sa.func.now()), sa.UniqueConstraint("key", "revision", name="uq_alert_rule_key_revision"), ) for column in ("key", "alert_type", "slo_policy_id", "severity", "active"): op.create_index(f"ix_alert_rule_revisions_{column}", "alert_rule_revisions", [column]) op.create_table( "maintenance_windows", _id(), sa.Column("name", sa.String(255), nullable=False), sa.Column("starts_at", sa.DateTime(timezone=True), nullable=False), sa.Column("ends_at", sa.DateTime(timezone=True), nullable=False), sa.Column("matcher", sa.JSON(), nullable=False), sa.Column("reason", sa.Text(), nullable=False), sa.Column("active", sa.Boolean(), nullable=False, server_default=sa.true()), sa.Column("created_by", sa.String(255), nullable=False), _created(), ) for column in ("starts_at", "ends_at", "active"): op.create_index(f"ix_maintenance_windows_{column}", "maintenance_windows", [column]) op.create_table( "operational_incidents", _id(), sa.Column("fingerprint", sa.String(64), nullable=False, unique=True), sa.Column("title", sa.String(255), nullable=False), sa.Column("state", sa.String(32), nullable=False), sa.Column("severity", sa.String(16), nullable=False), sa.Column("root_subject_type", sa.String(64), nullable=False), sa.Column("root_subject_ref", sa.String(255), nullable=False), sa.Column("correlation", sa.String(32), nullable=False), sa.Column("first_seen_at", sa.DateTime(timezone=True), nullable=False), sa.Column("last_seen_at", sa.DateTime(timezone=True), nullable=False), sa.Column("resolved_at", sa.DateTime(timezone=True)), ) op.create_index("ix_operational_incidents_state", "operational_incidents", ["state"]) op.create_table( "operational_alerts", _id(), sa.Column("rule_id", sa.Uuid(), sa.ForeignKey("alert_rule_revisions.id", ondelete="RESTRICT"), nullable=False), sa.Column("fingerprint", sa.String(64), nullable=False, unique=True), sa.Column("alert_type", sa.String(64), nullable=False), sa.Column("severity", sa.String(16), nullable=False), sa.Column("state", sa.String(32), nullable=False), sa.Column("source", sa.String(128), nullable=False), sa.Column("subject_type", sa.String(64), nullable=False), sa.Column("subject_ref", sa.String(255), nullable=False), sa.Column("summary", sa.Text(), nullable=False), sa.Column("details", sa.JSON(), nullable=False), sa.Column("first_seen_at", sa.DateTime(timezone=True), nullable=False), sa.Column("last_seen_at", sa.DateTime(timezone=True), nullable=False), sa.Column("firing_at", sa.DateTime(timezone=True)), sa.Column("acknowledged_at", sa.DateTime(timezone=True)), sa.Column("acknowledged_by", sa.String(255)), sa.Column("acknowledgement_reason", sa.Text()), sa.Column("resolved_at", sa.DateTime(timezone=True)), sa.Column("suppressed_until", sa.DateTime(timezone=True)), sa.Column("occurrence_count", sa.Integer(), nullable=False, server_default="1"), sa.Column("cooldown_until", sa.DateTime(timezone=True)), sa.Column("incident_id", sa.Uuid(), sa.ForeignKey("operational_incidents.id", ondelete="SET NULL")), ) for column in ("rule_id", "alert_type", "severity", "state", "subject_ref", "first_seen_at", "last_seen_at", "incident_id"): op.create_index(f"ix_operational_alerts_{column}", "operational_alerts", [column]) op.create_table( "alert_history_events", _id(), sa.Column("alert_id", sa.Uuid(), sa.ForeignKey("operational_alerts.id", ondelete="RESTRICT"), nullable=False), sa.Column("from_state", sa.String(32)), sa.Column("to_state", sa.String(32), nullable=False), sa.Column("actor", sa.String(255), nullable=False), sa.Column("reason", sa.Text(), nullable=False), sa.Column("evidence", sa.JSON(), nullable=False), sa.Column("occurred_at", sa.DateTime(timezone=True), server_default=sa.func.now()), ) for column in ("alert_id", "to_state", "occurred_at"): op.create_index(f"ix_alert_history_events_{column}", "alert_history_events", [column]) op.create_table( "incident_timeline_events", _id(), sa.Column("incident_id", sa.Uuid(), sa.ForeignKey("operational_incidents.id", ondelete="RESTRICT"), nullable=False), sa.Column("alert_id", sa.Uuid(), sa.ForeignKey("operational_alerts.id", ondelete="SET NULL")), sa.Column("event_type", sa.String(64), nullable=False), sa.Column("relation", sa.String(32), nullable=False), sa.Column("summary", sa.Text(), nullable=False), sa.Column("occurred_at", sa.DateTime(timezone=True), server_default=sa.func.now()), ) for column in ("incident_id", "alert_id", "occurred_at"): op.create_index(f"ix_incident_timeline_events_{column}", "incident_timeline_events", [column]) op.create_table( "capacity_snapshots", _id(), sa.Column("observed_at", sa.DateTime(timezone=True), nullable=False), sa.Column("received_at", sa.DateTime(timezone=True), nullable=False), sa.Column("node_id", sa.Uuid(), sa.ForeignKey("compute_nodes.id", ondelete="RESTRICT"), nullable=False), sa.Column("node_name", sa.String(255), nullable=False), sa.Column("accelerator_id", sa.Uuid(), sa.ForeignKey("accelerators.id", ondelete="RESTRICT")), sa.Column("gpu_total_bytes", sa.BigInteger()), sa.Column("gpu_observed_bytes", sa.BigInteger()), sa.Column("gpu_external_bytes", sa.BigInteger()), sa.Column("gpu_managed_resident_bytes", sa.BigInteger()), sa.Column("gpu_leased_bytes", sa.BigInteger()), sa.Column("gpu_reserve_bytes", sa.BigInteger()), sa.Column("gpu_schedulable_bytes", sa.BigInteger()), sa.Column("pressure_state", sa.String(16), nullable=False), sa.Column("system_ram_total_bytes", sa.BigInteger()), sa.Column("system_ram_available_bytes", sa.BigInteger()), sa.Column("storage_total_bytes", sa.BigInteger()), sa.Column("storage_free_bytes", sa.BigInteger()), sa.Column("availability", sa.String(32), nullable=False), sa.Column("freshness_seconds", sa.Float(), nullable=False), sa.UniqueConstraint("node_id", "accelerator_id", "observed_at", name="uq_capacity_observation"), ) for column in ("observed_at", "received_at", "node_id", "accelerator_id"): op.create_index(f"ix_capacity_snapshots_{column}", "capacity_snapshots", [column]) op.create_table( "capacity_aggregates", _id(), sa.Column("node_id", sa.Uuid(), sa.ForeignKey("compute_nodes.id", ondelete="RESTRICT"), nullable=False), sa.Column("accelerator_id", sa.Uuid(), sa.ForeignKey("accelerators.id", ondelete="RESTRICT")), sa.Column("bucket_start", sa.DateTime(timezone=True), nullable=False), sa.Column("bucket_seconds", sa.Integer(), nullable=False), sa.Column("sample_count", sa.Integer(), nullable=False), sa.Column("metrics", sa.JSON(), nullable=False), _created(), sa.UniqueConstraint("node_id", "accelerator_id", "bucket_start", name="uq_capacity_bucket"), ) for column in ("node_id", "accelerator_id", "bucket_start"): op.create_index(f"ix_capacity_aggregates_{column}", "capacity_aggregates", [column]) def downgrade() -> None: op.drop_table("capacity_aggregates") op.drop_table("capacity_snapshots") op.drop_table("incident_timeline_events") op.drop_table("alert_history_events") op.drop_table("operational_alerts") op.drop_table("operational_incidents") op.drop_table("maintenance_windows") op.drop_table("alert_rule_revisions") op.drop_table("slo_evaluations") op.drop_table("slo_policy_revisions") op.drop_table("service_level_indicators")