Browse Source

ref(uptime): Make subscription unique on timeout as well (#78787)

The timeout will become configurable, so we need subscriptions to be
unique on this additional facet.
Evan Purkhiser 5 months ago
parent
commit
137448cbc8

+ 1 - 1
migrations_lockfile.txt

@@ -12,5 +12,5 @@ remote_subscriptions: 0003_drop_remote_subscription
 replays: 0004_index_together
 sentry: 0773_make_group_score_nullable
 social_auth: 0002_default_auto_field
-uptime: 0016_translate_uptime_object_headers_to_lists
+uptime: 0017_unique_on_timeout
 workflow_engine: 0009_detector_type

+ 48 - 0
src/sentry/uptime/migrations/0017_unique_on_timeout.py

@@ -0,0 +1,48 @@
+# Generated by Django 5.1.1 on 2024-10-08 19:37
+
+import django.db.models.functions.comparison
+import django.db.models.functions.text
+from django.db import migrations, models
+
+from sentry.new_migrations.migrations import CheckedMigration
+
+
+class Migration(CheckedMigration):
+    # This flag is used to mark that a migration shouldn't be automatically run in production.
+    # This should only be used for operations where it's safe to run the migration after your
+    # code has deployed. So this should not be used for most operations that alter the schema
+    # of a table.
+    # Here are some things that make sense to mark as post deployment:
+    # - Large data migrations. Typically we want these to be run manually so that they can be
+    #   monitored and not block the deploy for a long period of time while they run.
+    # - Adding indexes to large tables. Since this can take a long time, we'd generally prefer to
+    #   run this outside deployments so that we don't block them. Note that while adding an index
+    #   is a schema change, it's completely safe to run the operation after the code has deployed.
+    # Once deployed, run these manually via: https://develop.sentry.dev/database-migrations/#migration-deployment
+
+    is_post_deployment = False
+
+    dependencies = [
+        ("uptime", "0016_translate_uptime_object_headers_to_lists"),
+    ]
+
+    operations = [
+        migrations.RemoveConstraint(
+            model_name="uptimesubscription",
+            name="uptime_uptimesubscription_unique_subscription_check",
+        ),
+        migrations.AddConstraint(
+            model_name="uptimesubscription",
+            constraint=models.UniqueConstraint(
+                models.F("url"),
+                models.F("interval_seconds"),
+                models.F("timeout_ms"),
+                models.F("method"),
+                django.db.models.functions.text.MD5("headers"),
+                django.db.models.functions.comparison.Coalesce(
+                    django.db.models.functions.text.MD5("body"), models.Value("")
+                ),
+                name="uptime_uptimesubscription_unique_subscription_check",
+            ),
+        ),
+    ]

+ 1 - 0
src/sentry/uptime/models.py

@@ -71,6 +71,7 @@ class UptimeSubscription(BaseRemoteSubscription, DefaultFieldsModelExisting):
             models.UniqueConstraint(
                 "url",
                 "interval_seconds",
+                "timeout_ms",
                 "method",
                 MD5("headers"),
                 Coalesce(MD5("body"), Value("")),