Fix: missing "fs" to template variable
[lttng-ci.git] / scripts / babeltrace-benchmark / benchmark.py
index cf58ad10e39ce16e60d9a1484cb92a6485a23d1e..c31f87b0a219587404711a536678167d4f0bbc8f 100644 (file)
@@ -39,6 +39,17 @@ BENCHMARK_TYPES = ["dummy", "text"]
 DEFAULT_BUCKET = "lava"
 
 
+def json_type(string):
+    """
+    Argpase type for json args.
+    We expect a base dictionary.
+    """
+    passed_json = json.loads(string)
+    if not isinstance(passed_json, dict):
+        msg = "%r is not a dict" % string
+        raise argparse.ArgumentTypeError(msg)
+    return passed_json
+
 def graph_get_color(branch):
     """
     Get the color matching the branch.
@@ -164,7 +175,6 @@ def plot_raw_value(branch, benchmark_type, x_data, y_data, labels, latest_values
     )
     plt.plot(outlier_x_data, outlier_y_data, "+", label="outlier", color="black")
 
-    ymin = 0
     ymax = 1
     if y_data:
         ymin = 0.8 * min([item for sublist in y_data for item in sublist])
@@ -178,17 +188,62 @@ def plot_raw_value(branch, benchmark_type, x_data, y_data, labels, latest_values
             label="Latest {}".format(l_branch),
             color=graph_get_color(l_branch),
         )
-        if l_result <= ymin:
-            ymin = 0.8 * l_result
         if l_result >= ymax:
             ymax = 1.2 * l_result
-
-    plt.ylim(ymin=ymin, ymax=ymax)
+    ax = plt.gca()
+    plt.ylim(ymin=0, ymax=ymax)
     plt.xticks(x_data, labels, rotation=90, family="monospace")
     plt.title(graph_get_title(branch, benchmark_type), fontweight="bold")
     plt.ylabel("User + system time (s)")
     plt.xlabel("Latest commits")
     plt.legend()
+    plt.grid(True)
+
+    # Put tick on the right side
+    ax.tick_params(labeltop=False, labelright=True)
+
+    plt.tight_layout()
+    return
+
+
+def plot_delta_between_point(
+    branch, benchmark_type, x_data, y_data, labels, latest_values
+):
+    """
+    Plot the graph of delta between each sequential commit.
+    """
+    local_abs_max = 100
+
+    # Transform y_data to a list of  for which the reference is the first
+    # element.
+    local_y_data = []
+    for pos, y in enumerate(y_data):
+        if pos == 0:
+            local_y_data.append(0.0)
+            continue
+        local_y_data.append(y - y_data[pos - 1])
+
+    plt.plot(x_data, local_y_data, "o", label=branch, color=graph_get_color(branch))
+
+    # Get max absolute value to align the y axis with zero in the middle.
+    if local_y_data:
+        local_abs_max = abs(max(local_y_data, key=abs)) * 1.3
+
+    plt.ylim(ymin=local_abs_max * -1, ymax=local_abs_max)
+
+    ax = plt.gca()
+    plt.xticks(x_data, labels, rotation=90, family="monospace")
+    plt.title(
+        graph_get_title(branch, benchmark_type) + " Delta to previous commit",
+        fontweight="bold",
+    )
+    plt.ylabel("Seconds")
+    plt.xlabel("Latest commits")
+    plt.legend()
+    plt.grid(True)
+
+    # Put tick on the right side
+    ax.tick_params(labeltop=False, labelright=True)
 
     plt.tight_layout()
     return
@@ -246,6 +301,10 @@ def plot_ratio(branch, benchmark_type, x_data, y_data, labels, latest_values):
     plt.ylabel("Ratio")
     plt.xlabel("Latest commits")
     plt.legend()
+    plt.grid(True)
+
+    # Put tick on the right side
+    ax.tick_params(labeltop=False, labelright=True)
 
     plt.tight_layout()
     return
@@ -303,17 +362,23 @@ def generate_graph(branches, report_name, git_path):
             plot_raw_value(branch, b_type, x_data, y_data, labels, latest_values)
             pdf_pages.savefig(fig)
 
-            fig = plt.figure(figsize=(width, 8.27), dpi=100)
             # Use the mean of each sanitize dataset here, we do not care for
             # variance for ratio. At least not yet.
             y_data = [mean(sanitize_dataset(c[1][b_type])[0]) for c in results]
+            fig = plt.figure(figsize=(width, 8.27), dpi=100)
             plot_ratio(branch, b_type, x_data, y_data, labels, latest_values)
             pdf_pages.savefig(fig)
 
+            fig = plt.figure(figsize=(width, 8.27), dpi=100)
+            plot_delta_between_point(
+                branch, b_type, x_data, y_data, labels, latest_values
+            )
+            pdf_pages.savefig(fig)
+
     pdf_pages.close()
 
 
-def launch_jobs(branches, git_path, wait_for_completion, debug):
+def launch_jobs(branches, git_path, wait_for_completion, debug, force):
     """
     Lauch jobs for all missing results.
     """
@@ -324,7 +389,7 @@ def launch_jobs(branches, git_path, wait_for_completion, debug):
         with tempfile.TemporaryDirectory() as workdir:
             for commit in commits:
                 b_results = get_benchmark_results(client, commit, workdir)[0]
-                if b_results:
+                if b_results and not force:
                     continue
                 lava_submit.submit(
                     commit, wait_for_completion=wait_for_completion, debug=debug
@@ -345,6 +410,9 @@ def main():
     parser.add_argument(
         "--generate-jobs", action="store_true", help="Generate and send jobs"
     )
+    parser.add_argument(
+        "--force-jobs", action="store_true", help="Force the queueing of jobs to lava"
+    )
     parser.add_argument(
         "--do-not-wait-on-completion",
         action="store_true",
@@ -366,19 +434,35 @@ def main():
     parser.add_argument(
         "--repo-path", help="The location of the git repo to use.", required=True
     )
+    parser.add_argument(
+        "--overwrite-branches-cutoff",
+        help="A dictionary of the form {"
+        "'branch_name': 'commit_hash_cutoff',...}. Allow custom graphing and"
+        "jobs generation.",
+        required=False, type=json_type
+    )
 
     args = parser.parse_args()
 
+    if args.overwrite_branches_cutoff:
+        bt_branches = args.overwrite_branches_cutoff
+
     if not os.path.exists(args.repo_path):
         print("Repository location does not exists.")
         return 1
 
     if args.generate_jobs:
         print("Launching jobs for:")
+
         for branch, cutoff in bt_branches.items():
             print("\t Branch {} with cutoff {}".format(branch, cutoff))
+
         launch_jobs(
-            bt_branches, args.repo_path, not args.do_not_wait_on_completion, args.debug
+            bt_branches,
+            args.repo_path,
+            not args.do_not_wait_on_completion,
+            args.debug,
+            args.force_jobs,
         )
 
     if args.generate_report:
This page took 0.024631 seconds and 4 git commands to generate.