0
0
mirror of https://github.com/PostHog/posthog.git synced 2024-11-21 21:49:51 +01:00

feat(experiments HogQL): add migration command (#26271)

This commit is contained in:
Juraj Majerik 2024-11-19 14:15:27 +01:00 committed by GitHub
parent 4e2dbe623e
commit 7b36e5f3d9
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -0,0 +1,74 @@
from django.core.management.base import BaseCommand
from posthog.hogql_queries.legacy_compatibility.filter_to_query import filter_to_query
from posthog.models import Experiment
from posthog.schema import ExperimentTrendsQuery, ExperimentFunnelsQuery
from sentry_sdk import capture_exception
import logging
from datetime import datetime
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
class Command(BaseCommand):
help = "Migrate experiment metrics to new schema"
def handle(self, *args, **options):
logger.info("Starting experiments migration")
experiments = Experiment.objects.iterator(chunk_size=100)
for experiment in experiments:
try:
# Check for valid insight type
if not experiment.filters.get("insight"):
logger.warning(f"Skipping experiment {experiment.id}: 'insight' type is missing or invalid")
continue
# Update main metric
main_experiment_query = self.create_experiment_query(
filters=experiment.filters,
custom_exposure_filter=experiment.parameters.get("custom_exposure_filter")
if experiment.parameters
else None,
)
experiment.metrics = [main_experiment_query.model_dump()]
# Update secondary metrics
experiment.metrics_secondary = []
for secondary_metric in experiment.secondary_metrics:
secondary_query = self.create_experiment_query(
filters=secondary_metric["filters"],
name=secondary_metric["name"],
)
experiment.metrics_secondary.append(secondary_query.model_dump())
experiment.filters["migrated_at"] = str(datetime.now())
experiment.save()
logger.info(f"ID: {experiment.id} updated")
except Exception as e:
capture_exception(e)
logger.exception(f"Error migrating experiment {experiment.id}")
logger.info("Experiment migration completed")
def create_experiment_query(self, filters, custom_exposure_filter=None, name=None):
filters["explicit_date"] = True
if filters.get("insight") == "TRENDS":
count_query = filter_to_query(filters)
exposure_query = None
if custom_exposure_filter:
exposure_query = filter_to_query(custom_exposure_filter)
return ExperimentTrendsQuery(
count_query=count_query,
exposure_query=exposure_query,
name=name,
)
elif filters.get("insight") == "FUNNELS":
funnels_query = filter_to_query(filters)
return ExperimentFunnelsQuery(
funnels_query=funnels_query,
name=name,
)
raise ValueError(f"Unsupported or missing insight type: {filters.get('insight')}")