@@ -287,11 +287,29 @@ def get_experiment_data(experiment: NimbusExperiment):
287287 if data and window == AnalysisWindow .OVERALL :
288288 # Append some values onto the incoming Jetstream data
289289 data .append_population_percentages ()
290- data .append_retention_data (
290+ week_2_retention = data .get_retention_by_window (
291+ 2 ,
291292 raw_data .get (AnalysisWindow .WEEKLY , {})
292293 .get (AnalysisBasis .ENROLLMENTS , {})
293- .get (segment )
294+ .get (segment ),
295+ Metric .RETENTION ,
294296 )
297+ if not week_2_retention :
298+ runtime_errors .append (
299+ AnalysisError (
300+ experiment = experiment .slug ,
301+ filename = "experimenter/jetstream/client.py" ,
302+ func_name = "get_experiment_data" ,
303+ log_level = "WARNING" ,
304+ message = (
305+ "Week 2 retention is unavailable because this "
306+ "experiment did not run long enough."
307+ ),
308+ metric = Metric .RETENTION ,
309+ timestamp = timezone .now (),
310+ )
311+ )
312+ data .extend (week_2_retention )
295313 # Append 3-day retention from daily data
296314 data .append_retention_3_days (
297315 raw_data .get (AnalysisWindow .DAILY , {})
@@ -307,6 +325,12 @@ def get_experiment_data(experiment: NimbusExperiment):
307325 if segment == Segment .ALL :
308326 experiment_data ["other_metrics" ] = other_metrics
309327 elif data and window == AnalysisWindow .WEEKLY :
328+ data .replace_retention_weeks (
329+ raw_data .get (AnalysisWindow .WEEKLY , {})
330+ .get (AnalysisBasis .ENROLLMENTS , {})
331+ .get (segment )
332+ )
333+
310334 # Append 3-day retention from daily data
311335 data .append_retention_3_days (
312336 raw_data .get (AnalysisWindow .DAILY , {})
@@ -370,6 +394,12 @@ def get_experiment_data(experiment: NimbusExperiment):
370394 if segment == Segment .ALL :
371395 experiment_data ["other_metrics" ].update (other_metrics )
372396 elif data and window == AnalysisWindow .WEEKLY :
397+ data .replace_retention_weeks (
398+ raw_data .get (AnalysisWindow .WEEKLY , {})
399+ .get (AnalysisBasis .EXPOSURES , {})
400+ .get (segment )
401+ )
402+
373403 # Append 3-day retention from daily data
374404 data .append_retention_3_days (
375405 raw_data .get (AnalysisWindow .DAILY , {})
@@ -421,14 +451,17 @@ def get_experiment_data(experiment: NimbusExperiment):
421451 errors_experiment_overall .append (err )
422452
423453 for e in runtime_errors :
424- analysis_error = AnalysisError (
425- experiment = experiment .slug ,
426- filename = "experimenter/jetstream/client.py" ,
427- func_name = "load_data_from_gcs" ,
428- log_level = "WARNING" ,
429- message = e ,
430- timestamp = timezone .now (),
431- )
454+ if isinstance (e , AnalysisError ):
455+ analysis_error = e
456+ else :
457+ analysis_error = AnalysisError (
458+ experiment = experiment .slug ,
459+ filename = "experimenter/jetstream/client.py" ,
460+ func_name = "load_data_from_gcs" ,
461+ log_level = "WARNING" ,
462+ message = e ,
463+ timestamp = timezone .now (),
464+ )
432465 errors_experiment_overall .append (analysis_error .model_dump ())
433466
434467 errors_by_metric ["experiment" ] = errors_experiment_overall
0 commit comments