def test_firefox_ios_klar_app_id_propagation(): exp = Experiment("slug", "2019-01-01", 8, app_id="my_cool_app") tl = TimeLimits.for_ts( first_enrollment_date="2019-01-01", last_date_full_data="2019-03-01", time_series_period="weekly", num_dates_enrollment=8, ) sds = SegmentDataSource( name="cool_data_source", from_expr="`moz-fx-data-shared-prod`.{dataset}.cool_table", default_dataset="org_mozilla_ios_klar", ) segment = Segment( name="cool_segment", select_expr="COUNT(*)", data_source=sds, ) enrollments_sql = exp.build_enrollments_query( time_limits=tl, segment_list=[segment], enrollments_query_type="glean-event", ) sql_lint(enrollments_sql) metrics_sql = exp.build_metrics_query( metric_list=[ m for m in mozanalysis.metrics.klar_ios.__dict__.values() if isinstance(m, Metric) ], time_limits=tl, enrollments_table="enrollments", ) sql_lint(metrics_sql) assert "org_mozilla_ios_klar" not in enrollments_sql assert "my_cool_app" in enrollments_sql sql_lint(metrics_sql)
def test_with_segments(self, client, project_id, static_dataset, temporary_dataset): experiment = Experiment( experimenter_slug="test-experiment", type="rollout", status="Live", start_date=dt.datetime(2020, 3, 30, tzinfo=pytz.utc), end_date=dt.datetime(2020, 6, 1, tzinfo=pytz.utc), proposed_enrollment=7, branches=[ Branch(slug="branch1", ratio=0.5), Branch(slug="branch2", ratio=0.5) ], reference_branch="branch2", features=[], normandy_slug="test-experiment", ) config = AnalysisSpec().resolve(experiment) test_clients_daily = DataSource( name="clients_daily", from_expr=f"`{project_id}.test_data.clients_daily`", ) test_active_hours = Metric( name="active_hours", data_source=test_clients_daily, select_expr=agg_sum("active_hours_sum"), ) test_clients_last_seen = SegmentDataSource( "clients_last_seen", f"`{project_id}.test_data.clients_last_seen`") regular_user_v3 = Segment( "regular_user_v3", test_clients_last_seen, "COALESCE(LOGICAL_OR(is_regular_user_v3), FALSE)", ) config.experiment.segments = [regular_user_v3] config.metrics = { AnalysisPeriod.WEEK: [Summary(test_active_hours, BootstrapMean())] } self.analysis_mock_run(config, static_dataset, temporary_dataset, project_id) query_job = client.client.query(f""" SELECT * FROM `{project_id}.{temporary_dataset}.test_experiment_week_1` ORDER BY enrollment_date DESC """) expected_metrics_results = [ { "client_id": "bbbb", "branch": "branch2", "enrollment_date": datetime.date(2020, 4, 3), "num_enrollment_events": 1, "analysis_window_start": 0, "analysis_window_end": 6, "regular_user_v3": True, }, { "client_id": "aaaa", "branch": "branch1", "enrollment_date": datetime.date(2020, 4, 2), "num_enrollment_events": 1, "analysis_window_start": 0, "analysis_window_end": 6, "regular_user_v3": False, }, ] for i, row in enumerate(query_job.result()): for k, v in expected_metrics_results[i].items(): assert row[k] == v assert (client.client.get_table( f"{project_id}.{temporary_dataset}.test_experiment_weekly") is not None) assert (client.client.get_table( f"{project_id}.{temporary_dataset}.statistics_test_experiment_week_1" ) is not None) stats = client.client.list_rows( f"{project_id}.{temporary_dataset}.statistics_test_experiment_week_1" ).to_dataframe() count_by_branch = stats.query( "segment == 'all' and statistic == 'count'").set_index("branch") assert count_by_branch.loc["branch1", "point"] == 1.0 assert count_by_branch.loc["branch2", "point"] == 1.0 assert len(stats.query("segment == 'regular_user_v3'")) > 0 assert (client.client.get_table( f"{project_id}.{temporary_dataset}.statistics_test_experiment_weekly" ) is not None)
# This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. from mozanalysis.segments import Segment, SegmentDataSource clients_last_seen = SegmentDataSource( name='clients_last_seen', from_expr="`moz-fx-data-shared-prod.telemetry.clients_last_seen`", window_start=0, window_end=0, ) regular_users_v3 = Segment( name='regular_users_v3', data_source=clients_last_seen, select_expr="""MAX( BIT_COUNT(COALESCE(days_seen_bits, 0) & 0x0FFFFFFE) >= 14 )""", ) new_or_resurrected_v3 = Segment( name='new_or_resurrected_v3', data_source=clients_last_seen, select_expr="""MAX( BIT_COUNT(COALESCE(days_seen_bits, 0) & 0x0FFFFFFE) = 0 )""", )
from mozanalysis.metrics import agg_any from mozanalysis.segments import Segment, SegmentDataSource clients_last_seen = SegmentDataSource( name="clients_last_seen", from_expr="`moz-fx-data-shared-prod.telemetry.clients_last_seen`", window_start=0, window_end=0, ) regular_users_v3 = Segment( name="regular_users_v3", data_source=clients_last_seen, select_expr=agg_any("is_regular_user_v3"), friendly_name="Regular users (v3)", description=dedent("""\ Clients who used Firefox on at least 14 of the 27 days prior to enrolling. This segment is characterized by high retention. """), ) new_or_resurrected_v3 = Segment( name="new_or_resurrected_v3", data_source=clients_last_seen, select_expr="LOGICAL_OR(COALESCE(is_new_or_resurrected_v3, TRUE))", friendly_name="New or resurrected users (v3)", description=dedent("""\ Clients who used Firefox on none of the 27 days prior to enrolling. """), )
# License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. from mozanalysis.metrics import agg_any from mozanalysis.segments import Segment, SegmentDataSource clients_last_seen = SegmentDataSource( name='clients_last_seen', from_expr="`moz-fx-data-shared-prod.telemetry.clients_last_seen`", window_start=0, window_end=0, ) regular_users_v3 = Segment( name='regular_users_v3', data_source=clients_last_seen, select_expr=agg_any('is_regular_user_v3'), ) new_or_resurrected_v3 = Segment( name='new_or_resurrected_v3', data_source=clients_last_seen, select_expr="LOGICAL_OR(COALESCE(is_new_or_resurrected_v3, TRUE))", ) weekday_regular_v1 = Segment( name='weekday_regular_v1', data_source=clients_last_seen, select_expr=agg_any('is_weekday_regular_v1'), )