@@ -74,198 +74,197 @@ def compare_preprod_artifact_size_analysis(
7474 return
7575
7676 try :
77- if not artifact .commit_comparison :
78- logger .info (
79- "preprod.size_analysis.compare.artifact_no_commit_comparison" ,
80- extra = {"artifact_id" : artifact_id },
81- )
82- return
83-
84- comparisons : list [dict [str , PreprodArtifactSizeMetrics ]] = []
85- preprod_artifact_status_check_updates : set [int ] = {artifact .id }
86-
87- # Create all comparisons with artifact as head
88- base_artifact = artifact .get_base_artifact_for_commit ().first ()
89- if base_artifact :
90- if artifact .build_configuration != base_artifact .build_configuration :
91- logger .info (
92- "preprod.size_analysis.compare.artifact_different_build_configurations" ,
93- extra = {"head_artifact_id" : artifact_id , "base_artifact_id" : base_artifact .id },
77+ if artifact .commit_comparison :
78+ comparisons : list [dict [str , PreprodArtifactSizeMetrics ]] = []
79+ preprod_artifact_status_check_updates : set [int ] = {artifact .id }
80+
81+ # Create all comparisons with artifact as head
82+ base_artifact = artifact .get_base_artifact_for_commit ().first ()
83+ if base_artifact :
84+ if artifact .build_configuration != base_artifact .build_configuration :
85+ logger .info (
86+ "preprod.size_analysis.compare.artifact_different_build_configurations" ,
87+ extra = {"head_artifact_id" : artifact_id , "base_artifact_id" : base_artifact .id },
88+ )
89+ # Update the status check even though we can't compare to avoid leaving it in a loading state
90+ create_preprod_status_check_task .apply_async (
91+ kwargs = {
92+ "preprod_artifact_id" : artifact_id ,
93+ "caller" : "compare_build_config_mismatch" ,
94+ }
95+ )
96+ return
97+
98+ base_size_metrics_qs = PreprodArtifactSizeMetrics .objects .filter (
99+ preprod_artifact_id = base_artifact .id ,
100+ preprod_artifact__project__organization_id = org_id ,
101+ preprod_artifact__project_id = project_id ,
102+ ).select_related ("preprod_artifact" , "preprod_artifact__mobile_app_info" )
103+ base_size_metrics = list (base_size_metrics_qs )
104+
105+ head_size_metrics_qs = PreprodArtifactSizeMetrics .objects .filter (
106+ preprod_artifact_id = artifact_id ,
107+ preprod_artifact__project__organization_id = org_id ,
108+ preprod_artifact__project_id = project_id ,
109+ ).select_related (
110+ "preprod_artifact" ,
111+ "preprod_artifact__mobile_app_info" ,
112+ "preprod_artifact__commit_comparison" ,
94113 )
95- # Update the status check even though we can't compare to avoid leaving it in a loading state
96- create_preprod_status_check_task .apply_async (
97- kwargs = {
98- "preprod_artifact_id" : artifact_id ,
99- "caller" : "compare_build_config_mismatch" ,
100- }
114+ head_size_metrics = list (head_size_metrics_qs )
115+
116+ validation_result = can_compare_size_metrics (head_size_metrics , base_size_metrics )
117+ if validation_result .can_compare :
118+ base_metrics_map = build_size_metrics_map (base_size_metrics )
119+ head_metrics_map = build_size_metrics_map (head_size_metrics )
120+
121+ for key , base_metric in base_metrics_map .items ():
122+ matching_head_size_metric = head_metrics_map .get (key )
123+ if matching_head_size_metric :
124+ logger .info (
125+ "preprod.size_analysis.compare.create_comparison" ,
126+ extra = {
127+ "head_artifact_id" : artifact_id ,
128+ "base_artifact_id" : base_artifact .id ,
129+ },
130+ )
131+ comparisons .append (
132+ {"head_metric" : matching_head_size_metric , "base_metric" : base_metric },
133+ )
134+ else :
135+ logger .info (
136+ "preprod.size_analysis.compare.no_matching_base_size_metric" ,
137+ extra = {
138+ "head_artifact_id" : artifact_id ,
139+ "size_metric_id" : base_metric .id ,
140+ },
141+ )
142+ else :
143+ logger .info (
144+ "preprod.size_analysis.compare.cannot_compare_size_metrics" ,
145+ extra = {
146+ "head_artifact_id" : artifact_id ,
147+ "base_artifact_id" : base_artifact .id ,
148+ "error_message" : validation_result .error_message ,
149+ },
150+ )
151+
152+ # Also create comparisons with artifact as base
153+ head_artifacts = artifact .get_head_artifacts_for_commit ()
154+ for head_artifact in head_artifacts :
155+ if head_artifact .build_configuration != artifact .build_configuration :
156+ logger .info (
157+ "preprod.size_analysis.compare.head_artifact_different_build_configurations" ,
158+ extra = {"head_artifact_id" : head_artifact .id , "base_artifact_id" : artifact_id },
159+ )
160+ continue
161+
162+ head_size_metrics_qs = PreprodArtifactSizeMetrics .objects .filter (
163+ preprod_artifact_id = head_artifact .id ,
164+ preprod_artifact__project__organization_id = org_id ,
165+ preprod_artifact__project_id = project_id ,
166+ ).select_related (
167+ "preprod_artifact" ,
168+ "preprod_artifact__mobile_app_info" ,
169+ "preprod_artifact__commit_comparison" ,
101170 )
102- return
103-
104- base_size_metrics_qs = PreprodArtifactSizeMetrics .objects .filter (
105- preprod_artifact_id = base_artifact .id ,
106- preprod_artifact__project__organization_id = org_id ,
107- preprod_artifact__project_id = project_id ,
108- ).select_related ("preprod_artifact" , "preprod_artifact__mobile_app_info" )
109- base_size_metrics = list (base_size_metrics_qs )
110-
111- head_size_metrics_qs = PreprodArtifactSizeMetrics .objects .filter (
112- preprod_artifact_id = artifact_id ,
113- preprod_artifact__project__organization_id = org_id ,
114- preprod_artifact__project_id = project_id ,
115- ).select_related (
116- "preprod_artifact" ,
117- "preprod_artifact__mobile_app_info" ,
118- "preprod_artifact__commit_comparison" ,
119- )
120- head_size_metrics = list (head_size_metrics_qs )
171+ head_size_metrics = list (head_size_metrics_qs )
172+
173+ base_size_metrics_qs = PreprodArtifactSizeMetrics .objects .filter (
174+ preprod_artifact_id = artifact_id ,
175+ preprod_artifact__project__organization_id = org_id ,
176+ preprod_artifact__project_id = project_id ,
177+ ).select_related ("preprod_artifact" , "preprod_artifact__mobile_app_info" )
178+ base_size_metrics = list (base_size_metrics_qs )
179+
180+ validation_result = can_compare_size_metrics (head_size_metrics , base_size_metrics )
181+ if not validation_result .can_compare :
182+ logger .info (
183+ "preprod.size_analysis.compare.cannot_compare_size_metrics" ,
184+ extra = {
185+ "head_artifact_id" : head_artifact .id ,
186+ "base_artifact_id" : artifact_id ,
187+ "error_message" : validation_result .error_message ,
188+ },
189+ )
190+ continue
121191
122- validation_result = can_compare_size_metrics (head_size_metrics , base_size_metrics )
123- if validation_result .can_compare :
124- base_metrics_map = build_size_metrics_map (base_size_metrics )
125192 head_metrics_map = build_size_metrics_map (head_size_metrics )
193+ base_metrics_map = build_size_metrics_map (base_size_metrics )
126194
127- for key , base_metric in base_metrics_map .items ():
128- matching_head_size_metric = head_metrics_map .get (key )
129- if matching_head_size_metric :
195+ for key , head_metric in head_metrics_map .items ():
196+ matching_base_size_metric = base_metrics_map .get (key )
197+ if matching_base_size_metric :
130198 logger .info (
131199 "preprod.size_analysis.compare.create_comparison" ,
132200 extra = {
133- "head_artifact_id" : artifact_id ,
134- "base_artifact_id" : base_artifact .id ,
201+ "head_artifact_id" : head_artifact . id ,
202+ "base_artifact_id" : artifact .id ,
135203 },
136204 )
137205 comparisons .append (
138- {"head_metric" : matching_head_size_metric , "base_metric" : base_metric },
206+ {"head_metric" : head_metric , "base_metric" : matching_base_size_metric },
139207 )
208+ preprod_artifact_status_check_updates .add (head_artifact .id )
140209 else :
141210 logger .info (
142211 "preprod.size_analysis.compare.no_matching_base_size_metric" ,
143212 extra = {
144- "head_artifact_id" : artifact_id ,
145- "size_metric_id" : base_metric .id ,
213+ "head_artifact_id" : head_artifact . id ,
214+ "size_metric_id" : head_metric .id ,
146215 },
147216 )
148- else :
149- logger .info (
150- "preprod.size_analysis.compare.cannot_compare_size_metrics" ,
151- extra = {
152- "head_artifact_id" : artifact_id ,
153- "base_artifact_id" : base_artifact .id ,
154- "error_message" : validation_result .error_message ,
155- },
156- )
157-
158- # Also create comparisons with artifact as base
159- head_artifacts = artifact .get_head_artifacts_for_commit ()
160- for head_artifact in head_artifacts :
161- if head_artifact .build_configuration != artifact .build_configuration :
162- logger .info (
163- "preprod.size_analysis.compare.head_artifact_different_build_configurations" ,
164- extra = {"head_artifact_id" : head_artifact .id , "base_artifact_id" : artifact_id },
165- )
166- continue
167-
168- head_size_metrics_qs = PreprodArtifactSizeMetrics .objects .filter (
169- preprod_artifact_id = head_artifact .id ,
170- preprod_artifact__project__organization_id = org_id ,
171- preprod_artifact__project_id = project_id ,
172- ).select_related (
173- "preprod_artifact" ,
174- "preprod_artifact__mobile_app_info" ,
175- "preprod_artifact__commit_comparison" ,
176- )
177- head_size_metrics = list (head_size_metrics_qs )
178-
179- base_size_metrics_qs = PreprodArtifactSizeMetrics .objects .filter (
180- preprod_artifact_id = artifact_id ,
181- preprod_artifact__project__organization_id = org_id ,
182- preprod_artifact__project_id = project_id ,
183- ).select_related ("preprod_artifact" , "preprod_artifact__mobile_app_info" )
184- base_size_metrics = list (base_size_metrics_qs )
185-
186- validation_result = can_compare_size_metrics (head_size_metrics , base_size_metrics )
187- if not validation_result .can_compare :
188- logger .info (
189- "preprod.size_analysis.compare.cannot_compare_size_metrics" ,
190- extra = {
191- "head_artifact_id" : head_artifact .id ,
192- "base_artifact_id" : artifact_id ,
193- "error_message" : validation_result .error_message ,
194- },
195- )
196- continue
197217
198- head_metrics_map = build_size_metrics_map (head_size_metrics )
199- base_metrics_map = build_size_metrics_map (base_size_metrics )
218+ # Create PENDING comparison records in DB and run comparisons
219+ with transaction .atomic (router .db_for_write (PreprodArtifactSizeComparison )):
220+ for comp in comparisons :
221+ head_metric = comp ["head_metric" ]
222+ base_metric = comp ["base_metric" ]
223+ comparison , created = PreprodArtifactSizeComparison .objects .get_or_create (
224+ head_size_analysis = head_metric ,
225+ base_size_analysis = base_metric ,
226+ organization_id = org_id ,
227+ defaults = {"state" : PreprodArtifactSizeComparison .State .PENDING },
228+ )
200229
201- for key , head_metric in head_metrics_map .items ():
202- matching_base_size_metric = base_metrics_map .get (key )
203- if matching_base_size_metric :
204230 logger .info (
205- "preprod.size_analysis.compare.create_comparison " ,
231+ "preprod.size_analysis.compare.running_comparison " ,
206232 extra = {
207- "head_artifact_id" : head_artifact .id ,
208- "base_artifact_id" : artifact .id ,
233+ "head_metric_id" : head_metric .id ,
234+ "base_metric_id" : base_metric .id ,
235+ "comparison_created" : created ,
209236 },
210237 )
211- comparisons .append (
212- {"head_metric" : head_metric , "base_metric" : matching_base_size_metric },
213- )
214- preprod_artifact_status_check_updates .add (head_artifact .id )
215- else :
216- logger .info (
217- "preprod.size_analysis.compare.no_matching_base_size_metric" ,
218- extra = {
219- "head_artifact_id" : head_artifact .id ,
220- "size_metric_id" : head_metric .id ,
221- },
238+ _run_size_analysis_comparison (org_id , head_metric , base_metric )
239+
240+ for artifact_id in preprod_artifact_status_check_updates :
241+ # Update all artifact's status check with the new comparison
242+ create_preprod_status_check_task .apply_async (
243+ kwargs = {
244+ "preprod_artifact_id" : artifact_id ,
245+ "caller" : "compare_completion" ,
246+ }
222247 )
223248
224- # Create PENDING comparison records in DB and run comparisons
225- with transaction .atomic (router .db_for_write (PreprodArtifactSizeComparison )):
226- for comp in comparisons :
227- head_metric = comp ["head_metric" ]
228- base_metric = comp ["base_metric" ]
229- comparison , created = PreprodArtifactSizeComparison .objects .get_or_create (
230- head_size_analysis = head_metric ,
231- base_size_analysis = base_metric ,
232- organization_id = org_id ,
233- defaults = {"state" : PreprodArtifactSizeComparison .State .PENDING },
234- )
235-
236- logger .info (
237- "preprod.size_analysis.compare.running_comparison" ,
238- extra = {
239- "head_metric_id" : head_metric .id ,
240- "base_metric_id" : base_metric .id ,
241- "comparison_created" : created ,
242- },
243- )
244- _run_size_analysis_comparison (org_id , head_metric , base_metric )
245-
246- for artifact_id in preprod_artifact_status_check_updates :
247- # Update all artifact's status check with the new comparison
248- create_preprod_status_check_task .apply_async (
249- kwargs = {
250- "preprod_artifact_id" : artifact_id ,
251- "caller" : "compare_completion" ,
252- }
253- )
254-
255- try :
256- artifact_type_name = PreprodArtifact .ArtifactType (artifact .artifact_type ).name .lower ()
257- except (ValueError , AttributeError , TypeError ):
258- artifact_type_name = "unknown"
259-
260- e2e_size_analysis_compare_duration = timezone .now () - artifact .date_added
261- metrics .distribution (
262- "preprod.size_analysis.compare.results_e2e" ,
263- e2e_size_analysis_compare_duration .total_seconds (),
264- sample_rate = 1.0 ,
265- tags = {
266- "artifact_type" : artifact_type_name ,
267- },
268- )
249+ try :
250+ artifact_type_name = PreprodArtifact .ArtifactType (artifact .artifact_type ).name .lower ()
251+ except (ValueError , AttributeError , TypeError ):
252+ artifact_type_name = "unknown"
253+
254+ e2e_size_analysis_compare_duration = timezone .now () - artifact .date_added
255+ metrics .distribution (
256+ "preprod.size_analysis.compare.results_e2e" ,
257+ e2e_size_analysis_compare_duration .total_seconds (),
258+ sample_rate = 1.0 ,
259+ tags = {
260+ "artifact_type" : artifact_type_name ,
261+ },
262+ )
263+ else :
264+ logger .info (
265+ "preprod.size_analysis.compare.artifact_no_commit_comparison" ,
266+ extra = {"artifact_id" : artifact_id },
267+ )
269268 finally :
270269 send_size_analysis_webhook (artifact = artifact , organization_id = org_id )
271270
0 commit comments