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