@@ -77,6 +77,7 @@ def compare_command_logic(args, project_name, project_version):
7777 use_branch = False
7878 baseline_branch = args .baseline_branch
7979 comparison_branch = args .comparison_branch
80+ simplify_table = args .simple_table
8081 by_str = ""
8182 baseline_str = ""
8283 comparison_str = ""
@@ -161,7 +162,7 @@ def compare_command_logic(args, project_name, project_version):
161162 used_key , len (test_names )
162163 )
163164 )
164- profilers_artifacts_matrix = []
165+ table = []
165166 detected_regressions = []
166167 total_improvements = 0
167168 total_stable = 0
@@ -192,18 +193,53 @@ def compare_command_logic(args, project_name, project_version):
192193 baseline_timeseries = [x for x in baseline_timeseries if "target" not in x ]
193194 progress .update ()
194195 if args .verbose :
195- logging .info ("Baseline timeseries {}" .format (len (baseline_timeseries )))
196- logging .info ("Comparison timeseries {}" .format (len (comparison_timeseries )))
196+ logging .info (
197+ "Baseline timeseries for {}: {}. test={}" .format (
198+ baseline_str , len (baseline_timeseries ), test_name
199+ )
200+ )
201+ logging .info (
202+ "Comparison timeseries for {}: {}. test={}" .format (
203+ comparison_str , len (comparison_timeseries ), test_name
204+ )
205+ )
206+ if len (baseline_timeseries ) > 1 :
207+ logging .warning (
208+ "\t \t Time-series: {}" .format (", " .join (baseline_timeseries ))
209+ )
210+ logging .info ("Checking if Totals will reduce timeseries." )
211+ new_base = []
212+ for ts_name in baseline_timeseries :
213+ if "Totals" in ts_name :
214+ new_base .append (ts_name )
215+ baseline_timeseries = new_base
216+
197217 if len (baseline_timeseries ) != 1 :
198218 if args .verbose :
199219 logging .warning (
200220 "Skipping this test given the value of timeseries !=1. Baseline timeseries {}" .format (
201221 len (baseline_timeseries )
202222 )
203223 )
224+ if len (baseline_timeseries ) > 1 :
225+ logging .warning (
226+ "\t \t Time-series: {}" .format (", " .join (baseline_timeseries ))
227+ )
228+
204229 continue
205230 else :
206231 ts_name_baseline = baseline_timeseries [0 ]
232+
233+ if len (comparison_timeseries ) > 1 :
234+ logging .warning (
235+ "\t \t Time-series: {}" .format (", " .join (comparison_timeseries ))
236+ )
237+ logging .info ("Checking if Totals will reduce timeseries." )
238+ new_base = []
239+ for ts_name in comparison_timeseries :
240+ if "Totals" in ts_name :
241+ new_base .append (ts_name )
242+ comparison_timeseries = new_base
207243 if len (comparison_timeseries ) != 1 :
208244 if args .verbose :
209245 logging .warning (
@@ -236,39 +272,34 @@ def compare_command_logic(args, project_name, project_version):
236272 baseline_datapoints = rts .ts ().revrange (
237273 ts_name_baseline , from_ts_ms , to_ts_ms
238274 )
239- baseline_nsamples = len (baseline_datapoints )
240- if baseline_nsamples > 0 :
241- _ , baseline_v = baseline_datapoints [0 ]
242- for tuple in baseline_datapoints :
243- if args .last_n < 0 or (
244- args .last_n > 0 and len (baseline_values ) < args .last_n
245- ):
246- baseline_values .append (tuple [1 ])
247- baseline_df = pd .DataFrame (baseline_values )
248- baseline_median = float (baseline_df .median ())
249- baseline_v = baseline_median
250- baseline_std = float (baseline_df .std ())
251- baseline_pct_change = (baseline_std / baseline_median ) * 100.0
252- largest_variance = baseline_pct_change
275+ (
276+ baseline_pct_change ,
277+ baseline_v ,
278+ largest_variance ,
279+ ) = get_v_pct_change_and_largest_var (
280+ args ,
281+ baseline_datapoints ,
282+ baseline_pct_change ,
283+ baseline_v ,
284+ baseline_values ,
285+ largest_variance ,
286+ )
253287
254288 comparison_datapoints = rts .ts ().revrange (
255289 ts_name_comparison , from_ts_ms , to_ts_ms
256290 )
257- comparison_nsamples = len (comparison_datapoints )
258- if comparison_nsamples > 0 :
259- _ , comparison_v = comparison_datapoints [0 ]
260- for tuple in comparison_datapoints :
261- if args .last_n < 0 or (
262- args .last_n > 0 and len (comparison_values ) < args .last_n
263- ):
264- comparison_values .append (tuple [1 ])
265- comparison_df = pd .DataFrame (comparison_values )
266- comparison_median = float (comparison_df .median ())
267- comparison_v = comparison_median
268- comparison_std = float (comparison_df .std ())
269- comparison_pct_change = (comparison_std / comparison_median ) * 100.0
270- if comparison_pct_change > largest_variance :
271- largest_variance = comparison_pct_change
291+ (
292+ comparison_pct_change ,
293+ comparison_v ,
294+ largest_variance ,
295+ ) = get_v_pct_change_and_largest_var (
296+ args ,
297+ comparison_datapoints ,
298+ comparison_pct_change ,
299+ comparison_v ,
300+ comparison_values ,
301+ largest_variance ,
302+ )
272303
273304 waterline = args .regressions_percent_lower_limit
274305 if args .regressions_percent_lower_limit < largest_variance :
@@ -277,6 +308,9 @@ def compare_command_logic(args, project_name, project_version):
277308
278309 except redis .exceptions .ResponseError :
279310 pass
311+ except ZeroDivisionError as e :
312+ logging .error ("Detected a ZeroDivisionError. {}" .format (e .__str__ ()))
313+ pass
280314 unstable = False
281315 if baseline_v != "N/A" and comparison_v != "N/A" :
282316 stamp_b = ""
@@ -286,15 +320,21 @@ def compare_command_logic(args, project_name, project_version):
286320 unstable = True
287321 if baseline_pct_change > 10.0 :
288322 stamp_b = "UNSTABLE"
289- baseline_v_str = " {:.0f} +- {:.1f}% {} ({} datapoints)" .format (
290- baseline_v , baseline_pct_change , stamp_b , len (baseline_values )
291- )
323+ if simplify_table :
324+ baseline_v_str = " {:.0f}" .format (baseline_v )
325+ else :
326+ baseline_v_str = " {:.0f} +- {:.1f}% {} ({} datapoints)" .format (
327+ baseline_v , baseline_pct_change , stamp_b , len (baseline_values )
328+ )
292329 stamp_c = ""
293330 if comparison_pct_change > 10.0 :
294331 stamp_c = "UNSTABLE"
295- comparison_v_str = " {:.0f} +- {:.1f}% {} ({} datapoints)" .format (
296- comparison_v , comparison_pct_change , stamp_c , len (comparison_values )
297- )
332+ if simplify_table :
333+ comparison_v_str = " {:.0f}" .format (comparison_v )
334+ else :
335+ comparison_v_str = " {:.0f} +- {:.1f}% {} ({} datapoints)" .format (
336+ comparison_v , comparison_pct_change , stamp_c , len (comparison_values )
337+ )
298338 if metric_mode == "higher-better" :
299339 percentage_change = (
300340 float (comparison_v ) / float (baseline_v ) - 1
@@ -340,15 +380,25 @@ def compare_command_logic(args, project_name, project_version):
340380
341381 if args .print_regressions_only is False or detected_regression :
342382 percentage_change_str = "{:.1f}% " .format (percentage_change )
343- profilers_artifacts_matrix .append (
344- [
345- test_name ,
346- baseline_v_str ,
347- comparison_v_str ,
348- percentage_change_str ,
349- note .strip (),
350- ]
351- )
383+ if simplify_table :
384+ table .append (
385+ [
386+ test_name ,
387+ baseline_v_str ,
388+ comparison_v_str ,
389+ percentage_change_str ,
390+ ]
391+ )
392+ else :
393+ table .append (
394+ [
395+ test_name ,
396+ baseline_v_str ,
397+ comparison_v_str ,
398+ percentage_change_str ,
399+ note .strip (),
400+ ]
401+ )
352402
353403 logging .info ("Printing differential analysis between branches" )
354404
@@ -370,7 +420,7 @@ def compare_command_logic(args, project_name, project_version):
370420 "% change ({})" .format (metric_mode ),
371421 "Note" ,
372422 ],
373- value_matrix = profilers_artifacts_matrix ,
423+ value_matrix = table ,
374424 )
375425 writer .write_table ()
376426 if total_stable > 0 :
@@ -401,3 +451,38 @@ def compare_command_logic(args, project_name, project_version):
401451 "," .join (["{}.yml" .format (x ) for x in detected_regressions ])
402452 )
403453 )
454+
455+
456+ def get_v_pct_change_and_largest_var (
457+ args ,
458+ comparison_datapoints ,
459+ comparison_pct_change ,
460+ comparison_v ,
461+ comparison_values ,
462+ largest_variance ,
463+ ):
464+ comparison_nsamples = len (comparison_datapoints )
465+ if comparison_nsamples > 0 :
466+ _ , comparison_v = comparison_datapoints [0 ]
467+ for tuple in comparison_datapoints :
468+ if args .last_n < 0 or (
469+ args .last_n > 0 and len (comparison_values ) < args .last_n
470+ ):
471+ comparison_values .append (tuple [1 ])
472+ comparison_df = pd .DataFrame (comparison_values )
473+ comparison_median = float (comparison_df .median ())
474+ comparison_v = comparison_median
475+ comparison_std = float (comparison_df .std ())
476+ if args .verbose :
477+ logging .info (
478+ "comparison_datapoints: {} value: {}; std-dev: {}; median: {}" .format (
479+ comparison_datapoints ,
480+ comparison_v ,
481+ comparison_std ,
482+ comparison_median ,
483+ )
484+ )
485+ comparison_pct_change = (comparison_std / comparison_median ) * 100.0
486+ if comparison_pct_change > largest_variance :
487+ largest_variance = comparison_pct_change
488+ return comparison_pct_change , comparison_v , largest_variance
0 commit comments