2024_10_28_1400-add_app_alert_rules.py 4.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. """add_app_alert_rules
  2. Revision ID: add_app_alert_rules
  3. Revises: 923752d42eb6
  4. Create Date: 2024-10-28 14:00:00.000000
  5. """
  6. import models as models
  7. import sqlalchemy as sa
  8. from alembic import op
  9. from sqlalchemy.dialects import postgresql
  10. # revision identifiers, used by Alembic.
  11. revision = "add_app_alert_rules"
  12. down_revision = "923752d42eb6"
  13. branch_labels = None
  14. depends_on = None
  15. def upgrade():
  16. # ### commands auto generated by Alembic - please adjust! ###
  17. # Create app_alert_rules table
  18. op.create_table(
  19. "app_alert_rules",
  20. sa.Column("id", models.types.StringUUID(), server_default=sa.text("uuid_generate_v4()"), nullable=False),
  21. sa.Column("tenant_id", models.types.StringUUID(), nullable=False),
  22. sa.Column("app_id", models.types.StringUUID(), nullable=False),
  23. sa.Column("name", sa.String(255), nullable=False),
  24. sa.Column("description", sa.Text(), nullable=True),
  25. sa.Column("is_enabled", sa.Boolean(), server_default=sa.text("true"), nullable=False),
  26. sa.Column("metric_type", sa.String(50), nullable=False),
  27. sa.Column("operator", sa.String(10), nullable=False),
  28. sa.Column("threshold_value", sa.Float(), nullable=False),
  29. sa.Column("check_interval_minutes", sa.Integer(), server_default=sa.text("5"), nullable=False),
  30. sa.Column("consecutive_triggers", sa.Integer(), server_default=sa.text("2"), nullable=False),
  31. sa.Column("notification_channels", postgresql.JSONB(), nullable=False),
  32. sa.Column("last_triggered_at", sa.DateTime(), nullable=True),
  33. sa.Column("trigger_count", sa.Integer(), server_default=sa.text("0"), nullable=False),
  34. sa.Column("consecutive_trigger_count", sa.Integer(), server_default=sa.text("0"), nullable=False),
  35. sa.Column("created_by", models.types.StringUUID(), nullable=False),
  36. sa.Column("created_at", sa.DateTime(), server_default=sa.text("CURRENT_TIMESTAMP(0)"), nullable=False),
  37. sa.Column("updated_at", sa.DateTime(), server_default=sa.text("CURRENT_TIMESTAMP(0)"), nullable=False),
  38. sa.PrimaryKeyConstraint("id", name="app_alert_rule_pkey"),
  39. )
  40. # Create indexes for app_alert_rules
  41. with op.batch_alter_table("app_alert_rules", schema=None) as batch_op:
  42. batch_op.create_index("app_alert_rule_app_idx", ["app_id"], unique=False)
  43. batch_op.create_index("app_alert_rule_tenant_idx", ["tenant_id"], unique=False)
  44. batch_op.create_index("app_alert_rule_enabled_idx", ["is_enabled"], unique=False)
  45. # Create app_alert_logs table
  46. op.create_table(
  47. "app_alert_logs",
  48. sa.Column("id", models.types.StringUUID(), server_default=sa.text("uuid_generate_v4()"), nullable=False),
  49. sa.Column("alert_rule_id", models.types.StringUUID(), nullable=False),
  50. sa.Column("triggered_at", sa.DateTime(), server_default=sa.text("CURRENT_TIMESTAMP(0)"), nullable=False),
  51. sa.Column("metric_value", sa.Float(), nullable=False),
  52. sa.Column("threshold_value", sa.Float(), nullable=False),
  53. sa.Column("notification_status", postgresql.JSONB(), nullable=False),
  54. sa.Column("error_message", sa.Text(), nullable=True),
  55. sa.PrimaryKeyConstraint("id", name="app_alert_log_pkey"),
  56. )
  57. # Create indexes for app_alert_logs
  58. with op.batch_alter_table("app_alert_logs", schema=None) as batch_op:
  59. batch_op.create_index("app_alert_log_rule_idx", ["alert_rule_id"], unique=False)
  60. batch_op.create_index("app_alert_log_triggered_at_idx", ["triggered_at"], unique=False)
  61. # ### end Alembic commands ###
  62. def downgrade():
  63. # ### commands auto generated by Alembic - please adjust! ###
  64. # Drop app_alert_logs table
  65. with op.batch_alter_table("app_alert_logs", schema=None) as batch_op:
  66. batch_op.drop_index("app_alert_log_triggered_at_idx")
  67. batch_op.drop_index("app_alert_log_rule_idx")
  68. op.drop_table("app_alert_logs")
  69. # Drop app_alert_rules table
  70. with op.batch_alter_table("app_alert_rules", schema=None) as batch_op:
  71. batch_op.drop_index("app_alert_rule_enabled_idx")
  72. batch_op.drop_index("app_alert_rule_tenant_idx")
  73. batch_op.drop_index("app_alert_rule_app_idx")
  74. op.drop_table("app_alert_rules")
  75. # ### end Alembic commands ###