From 542b5800cead7f4c5d9bd44d3b572d32ce2ab163 Mon Sep 17 00:00:00 2001 From: Abdullah Khan Date: Tue, 18 Jul 2023 16:25:01 -0400 Subject: [PATCH 1/2] feat(perf-detector-threshold-configuration) Added datamigration for converting worldmap widgets to table widgets. --- migrations_lockfile.txt | 2 +- .../0515_migrate_worldmap_widgets.py | 62 +++++++++++++++++++ 2 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 src/sentry/migrations/0515_migrate_worldmap_widgets.py diff --git a/migrations_lockfile.txt b/migrations_lockfile.txt index 86f67243fe509..7f50c2ddf1201 100644 --- a/migrations_lockfile.txt +++ b/migrations_lockfile.txt @@ -6,5 +6,5 @@ To resolve this, rebase against latest master and regenerate your migration. Thi will then be regenerated, and you should be able to merge without conflicts. nodestore: 0002_nodestore_no_dictfield -sentry: 0514_migrate_priority_saved_searches +sentry: 0515_migrate_worldmap_widgets social_auth: 0001_initial diff --git a/src/sentry/migrations/0515_migrate_worldmap_widgets.py b/src/sentry/migrations/0515_migrate_worldmap_widgets.py new file mode 100644 index 0000000000000..188055a597c93 --- /dev/null +++ b/src/sentry/migrations/0515_migrate_worldmap_widgets.py @@ -0,0 +1,62 @@ +# Generated by Django 3.2.20 on 2023-07-18 19:50 + +from django.db import migrations + +from sentry.models import DashboardWidgetQuery +from sentry.new_migrations.migrations import CheckedMigration + + +def migrate_worldmap_widgets_to_table_widgets(apps, schema_editor): + # World map visulization has display_type 5 + widgetQueries = DashboardWidgetQuery.objects.select_related("widget").filter( + widget__display_type=5 + ) + + for widgetQuery in widgetQueries: + # Change widget display type from world_map:5 to table:4 + widgetQuery.widget.display_type = 4 + + # Ensure condition has countr_code check + if "has:geo.country_code" not in widgetQuery.conditions: + widgetQuery.conditions = widgetQuery.conditions + " has:geo.country_code" + + # Add region and country_code columns + if "geo.region" not in widgetQuery.columns: + widgetQuery.columns.insert(0, "geo.region") + if "geo.country_code" not in widgetQuery.columns: + widgetQuery.columns.insert(0, "geo.country_code") + + # Add region and country_code as fields + if "geo.region" not in widgetQuery.fields: + widgetQuery.fields.insert(0, "geo.region") + if "geo.country_code" not in widgetQuery.fields: + widgetQuery.fields.insert(0, "geo.country_code") + + widgetQuery.widget.save() + widgetQuery.save() + + +class Migration(CheckedMigration): + # This flag is used to mark that a migration shouldn't be automatically run in production. For + # the most part, 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 dangerous: + # - Large data migrations. Typically we want these to be run manually by ops 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 + # have ops run this and not block the deploy. Note that while adding an index is a schema + # change, it's completely safe to run the operation after the code has deployed. + is_dangerous = False + + dependencies = [ + ("sentry", "0514_migrate_priority_saved_searches"), + ] + + operations = [ + migrations.RunPython( + migrate_worldmap_widgets_to_table_widgets, + migrations.RunPython.noop, + hints={"tables": ["sentry_dashboardwidgetquery", "sentry_dashboardwidget"]}, + ), + ] From a9858a4cc828915556de78bc5b5fdac918a7ec30 Mon Sep 17 00:00:00 2001 From: Abdullah Khan Date: Tue, 18 Jul 2023 17:13:30 -0400 Subject: [PATCH 2/2] feat(perf-detector-threshold-configuration) Regenerated migrations_lockfile.txt --- migrations_lockfile.txt | 10 ++++++++++ ...ap_widgets.py => 0516_migrate_world_map_widgets.py} | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 migrations_lockfile.txt rename src/sentry/migrations/{0516_migrate_worldmap_widgets.py => 0516_migrate_world_map_widgets.py} (98%) diff --git a/migrations_lockfile.txt b/migrations_lockfile.txt new file mode 100644 index 0000000000000..a1cad6f57e875 --- /dev/null +++ b/migrations_lockfile.txt @@ -0,0 +1,10 @@ +Django migrations lock file. This helps us avoid migration conflicts on master. +If you have a conflict in this file, it means that someone has committed a migration +ahead of you. + +To resolve this, rebase against latest master and regenerate your migration. This file +will then be regenerated, and you should be able to merge without conflicts. + +nodestore: 0002_nodestore_no_dictfield +sentry: 0516_migrate_world_map_widgets +social_auth: 0001_initial diff --git a/src/sentry/migrations/0516_migrate_worldmap_widgets.py b/src/sentry/migrations/0516_migrate_world_map_widgets.py similarity index 98% rename from src/sentry/migrations/0516_migrate_worldmap_widgets.py rename to src/sentry/migrations/0516_migrate_world_map_widgets.py index 9115d43844587..199cd1f33030b 100644 --- a/src/sentry/migrations/0516_migrate_worldmap_widgets.py +++ b/src/sentry/migrations/0516_migrate_world_map_widgets.py @@ -1,4 +1,4 @@ -# Generated by Django 3.2.20 on 2023-07-18 19:50 +# Generated by Django 3.2.20 on 2023-07-18 21:10 from django.db import migrations