From patchwork Mon Mar 22 03:07:59 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Mikanovich X-Patchwork-Id: 374 Return-Path: Delivered-To: ilbers.mnt@gmail.com Received: by 2002:a4a:378f:0:0:0:0:0 with SMTP id r137csp3574818oor; Mon, 22 Mar 2021 06:08:09 -0700 (PDT) X-Received: by 2002:ac2:5932:: with SMTP id v18mr9484462lfi.659.1616418488983; Mon, 22 Mar 2021 06:08:08 -0700 (PDT) ARC-Seal: i=3; a=rsa-sha256; t=1616418488; cv=pass; d=google.com; s=arc-20160816; b=ozL2hcpn8jSqv8pSFndhufUdaUkiVhticwG778NjDVAzxun7F+xGRR3j5SIjfuXKbv Rl1TscP7askKcDqRJ0ggpKpU1pjkWx9MKNep0oT2Lu7NIpl3Gule3QfdTIgb6gKfzvcm V/CNQyRYk1dpjIU98JTIGWnXscvZWy1MD651SL/1tpmii/9k/buIthP2XPc17H2KAn0C PdwsWPxeNwio/Qefs6I1ZZoVaE0nhmph1yxU3xC/0pWNV7844Hasftb8gC24HTkcC3kg DOj+0w2I3KbCiwZsiq7JmaQd4vyyq+kpyYLc4JMWwc+bj7QdJnlnanwMLwdlbOGUYmeI Szzw== ARC-Message-Signature: i=3; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-unsubscribe:list-subscribe:list-archive:list-help:list-post :list-id:mailing-list:precedence:mime-version:message-id:date :subject:cc:to:from:sender:dkim-signature; bh=+XagW2J7e5imCqH1SOEOM7kwlPrH7nZ2vkgrv7gMKV8=; b=jxZuhkbzCzWSQJIUySIqmRYtFv96AqpUbdEIcYp4eulpOS7nCTsWt6Mt2nRI3NeUVG a1AW6XfEjo7XDw2W2cmT5XaGnagfhc/goTG5QkYZAv2X9AGYgl0zjbCqe7QQLSxvS0Be zLk770jQJ4J8KVYoZDF5FqPoYK3YDfzuR4KSll3pHT2jgD9NqFxwiFPU0UuuNtWrKbDo LosT5KwM7D/iH3nEK92OB2iLOHMhUX6jFzVezi5C4o0QundYkaJiQN4kyYRL4+QGtbBy ygDav+JModVR+Xevo8q4g/gw9Ldj3tnvXItkWGfKJ8WKID+q51dOh9xs0lof8cnzU3+L 9nyA== ARC-Authentication-Results: i=3; mx.google.com; dkim=pass header.i=@googlegroups.com header.s=20161025 header.b=DNQI3p4t; arc=pass (i=2 spf=pass spfdomain=ilbers.de); spf=pass (google.com: domain of isar-users+bncbchiponzwecrbofn4kbamgqe3ycm5aa@googlegroups.com designates 209.85.220.55 as permitted sender) smtp.mailfrom=isar-users+bncBCHIPONZWECRBOFN4KBAMGQE3YCM5AA@googlegroups.com Received: from mail-sor-f55.google.com (mail-sor-f55.google.com. [209.85.220.55]) by mx.google.com with SMTPS id p9sor985446lfu.110.2021.03.22.06.08.08 (Google Transport Security); Mon, 22 Mar 2021 06:08:08 -0700 (PDT) Received-SPF: pass (google.com: domain of isar-users+bncbchiponzwecrbofn4kbamgqe3ycm5aa@googlegroups.com designates 209.85.220.55 as permitted sender) client-ip=209.85.220.55; Authentication-Results: mx.google.com; dkim=pass header.i=@googlegroups.com header.s=20161025 header.b=DNQI3p4t; arc=pass (i=2 spf=pass spfdomain=ilbers.de); spf=pass (google.com: domain of isar-users+bncbchiponzwecrbofn4kbamgqe3ycm5aa@googlegroups.com designates 209.85.220.55 as permitted sender) smtp.mailfrom=isar-users+bncBCHIPONZWECRBOFN4KBAMGQE3YCM5AA@googlegroups.com ARC-Seal: i=2; a=rsa-sha256; t=1616418488; cv=pass; d=google.com; s=arc-20160816; b=DdGPoXcuEImmbiL+3smZDDOW+KTKXOGCilyOEUSfPgPEcWWuKEIAv7mscxibxyYGo+ Y7Ne+n4EHKMcl+tjP1ktGBaYuJTAULOreO0bz41yJeF6IZBY73TtpOS3SjQVy2JD7xl/ QHWdD/dnnxB6S9vUBLro8a10yy9aoitNviiAnn0l20AVYeOSzD261t0QyB3aX6ylc8sM gxlB0sSmeRsJcYbDC/RlaryAN//JfhMwov+Yc/aDj1oHnjju2+nwVmzsresZptTucOW5 o/Jqd6wUQ/Kc3oTJ87gTxX3Qlbfh++OkGItqP/Hh4e3wpXiBmlJr7FRgOzEHG4T927mM qYAQ== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-unsubscribe:list-subscribe:list-archive:list-help:list-post :list-id:mailing-list:precedence:mime-version:message-id:date :subject:cc:to:from:sender:dkim-signature; bh=+XagW2J7e5imCqH1SOEOM7kwlPrH7nZ2vkgrv7gMKV8=; b=HRPLOeiikacsjJprNu258YCcFZ0uKc1M6RRuLvJSY9l/DSR8PgkvN7kYwRplG4MgdO gDqhpGYGBQG7uPvcNOuH+TCmAzbEcmbgnmJ9f/5DctPPcb5Oqd+iyGSfYVjkNoJs5IL6 FOq9WNd2M4/DAKIQBl9vHHB36swlARpRuhomjUsR81oSILW0TMCrt2//igxNui41o5O3 EbEqbfM/QPe0IMy1AogAE6icUaaml7MdwM3eYeWiW19m+/y8twaGqxPyiXHezLlJKH4m 3Djud2CxgkQ2LupIIB3H5Py2rXNVVKkRjGIi6paqBaNJ6IDuZf00x2PIV2C/FKeHwXIT sDdA== ARC-Authentication-Results: i=2; gmr-mx.google.com; spf=pass (google.com: domain of amikan@ilbers.de designates 85.214.156.166 as permitted sender) smtp.mailfrom=amikan@ilbers.de DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlegroups.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:mime-version :x-original-sender:x-original-authentication-results:precedence :mailing-list:list-id:list-post:list-help:list-archive :list-subscribe:list-unsubscribe; bh=+XagW2J7e5imCqH1SOEOM7kwlPrH7nZ2vkgrv7gMKV8=; b=DNQI3p4t61ukXbSm50QI4y3rWwZeIHpOmHpSgie0NsR8EDpsuqAhpnj8erSYXf4xbe AJiF1XZQejss7EyETtO9cQuoAn/SpWrw58/a0pNLHAm2+bXDT+YDmMaSqSert3gyx78o ixtr8X8HGoo6zzcvpyGDqChyyYrn1NGA1ND3GklkmzIpRC/LwcKHQMCaUMeuTZV+2igL s7eNaL5WsPozusWChdcW9MEmPKmcJ8LT93Ai4csr18RoARv328kBC/WqWh14zCUOgza5 gqZB1m1hygI2soRsHK+6TI/18yCS4gRambCuSzB/BNAxs8iQTuRTZVihKxVY2Rg6WDwB +edQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=sender:x-gm-message-state:from:to:cc:subject:date:message-id :mime-version:x-original-sender:x-original-authentication-results :precedence:mailing-list:list-id:x-spam-checked-in-group:list-post :list-help:list-archive:list-subscribe:list-unsubscribe; bh=+XagW2J7e5imCqH1SOEOM7kwlPrH7nZ2vkgrv7gMKV8=; b=QKBaLb6qtb59MP8FQ6wPhJ8XZPEKTmtXj436hbX0/IwWvGZXSDh5WL/c75/5uS6Asw VHf6P3GyXpKgGZQx074g2aibyAYbEn03OFVQcJxPQnnxO2H0fVmjtB4TaHpL08W4LiUZ 91iZIYDCy1CZGkrIjkwcm6uWH4SuhO8RIfFlaA6PwUN4R6PV2SXjNUR+RA/ZsQJskCui mT/aUJv71rtx6eJyIuzC6NxdhHQMFRBm1iJ/K5uamGL6Zs334PBJklddu6ihtcVMKEsJ ehxSYUtmF5+a5cZAQ+UxUvyKFQk4cHNYZ+g9Ob/E+ZWvfm5H2nx84JTEx9pOvdFJ75mR XG7g== Sender: isar-users@googlegroups.com X-Gm-Message-State: AOAM531EPCs743OBapkvQ+cXq4MW+PMAA6m0OPRAw6eNgEDlmDxX9rgx wZCVt0EN0jGNheXb50X1+4E= X-Google-Smtp-Source: ABdhPJyAn0dqzDw/J8EwuszPB1rT2udSojKJru8JqymcEs5kTSwQS2jaBzLlBjnWnLxCYyXKQbdhrA== X-Received: by 2002:a05:6512:47b:: with SMTP id x27mr9380796lfd.37.1616418488618; Mon, 22 Mar 2021 06:08:08 -0700 (PDT) X-BeenThere: isar-users@googlegroups.com Received: by 2002:ac2:58f8:: with SMTP id v24ls2599187lfo.2.gmail; Mon, 22 Mar 2021 06:08:07 -0700 (PDT) X-Received: by 2002:a19:7412:: with SMTP id v18mr8805515lfe.234.1616418487722; Mon, 22 Mar 2021 06:08:07 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1616418487; cv=none; d=google.com; s=arc-20160816; b=psNgiQ9EKUiO9eWfO4kL9fC/IMRo5rnVkfxrDwHcFnAD3CfvgscUeZV5fHoI0Fmr9e bXzQ2Dm5htw439NbkzhUjo2klkZzMahPrPr8Y+Nw1OYlIsj40qHKKXFueR3Jv3AXME0r 4XsVqhMZi8M3Uda+WxLJyC39f7KlfgI7luQ6gfnbF60hZDgLifOlimVU0k5ZN/r40a7T rEHyeP6NkyqRrKzCqkYAWoGqGcj8IzugOMloLhG7DzGgOAVPTEaPcH5P0bdWBOuhIOnL l1+ahvpft0l2FQul5qbVxqW2UdOnPOt9GRPGn3MEYEM4nVQGylvETzWbxGAe/NV0OgyA ITkA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from; bh=76bwx6/SBC4DsRlTvi/wqQfo7Xx7yZ0XBDh1sF2hlpg=; b=obHwKAEzYjNpB0n1Dqe0xSYUOgBOHtIWUoOBtvpCe7QL9PydATjT6s6XxT81bAvu3v MQU+cfi1ObDMecfhD+WK/B96EKmgDUBiTn4f70y5jQys+LuqbSXaicnHJqM7cdE6a6b0 v2GS1MssKRkOE6uA2IdusG6V58QyOFQ9cXq5DZobb98srDHaNjGkOyk/bFf94vxfwIGm +SAPoypp14iAO7t5Oz5xHvVOuJJ3w3HSg4lHKAHXlF/IDnh5ZeiCLM6VsRzcurAditYF LVRU+EK3UYVJswof7yDq74Vjs+VLG1VVAaKj8pJuUQL9A3jFBHCBkAkPXGXL605zZ7uF B7MQ== ARC-Authentication-Results: i=1; gmr-mx.google.com; spf=pass (google.com: domain of amikan@ilbers.de designates 85.214.156.166 as permitted sender) smtp.mailfrom=amikan@ilbers.de Received: from shymkent.ilbers.de (shymkent.ilbers.de. [85.214.156.166]) by gmr-mx.google.com with ESMTPS id h2si427799lja.3.2021.03.22.06.08.07 for (version=TLS1_2 cipher=ECDHE-ECDSA-CHACHA20-POLY1305 bits=256/256); Mon, 22 Mar 2021 06:08:07 -0700 (PDT) Received-SPF: pass (google.com: domain of amikan@ilbers.de designates 85.214.156.166 as permitted sender) client-ip=85.214.156.166; Received: from localhost.localdomain (mm-180-82-121-178.mgts.dynamic.pppoe.byfly.by [178.121.82.180] (may be forged)) (authenticated bits=0) by shymkent.ilbers.de (8.15.2/8.15.2/Debian-8) with ESMTPSA id 12MD85Fv020976 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 22 Mar 2021 14:08:06 +0100 From: Anton Mikanovich To: isar-users@googlegroups.com Cc: Anton Mikanovich Subject: [PATCH] charter: Introduce build chart generation tool Date: Mon, 22 Mar 2021 16:07:59 +0300 Message-Id: <20210322130759.152562-1-amikan@ilbers.de> X-Mailer: git-send-email 2.25.1 MIME-Version: 1.0 X-Spam-Status: No, score=-1.0 required=5.0 tests=ALL_TRUSTED autolearn=unavailable autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on shymkent.ilbers.de X-Original-Sender: amikan@ilbers.de X-Original-Authentication-Results: gmr-mx.google.com; spf=pass (google.com: domain of amikan@ilbers.de designates 85.214.156.166 as permitted sender) smtp.mailfrom=amikan@ilbers.de Precedence: list Mailing-list: list isar-users@googlegroups.com; contact isar-users+owners@googlegroups.com List-ID: X-Spam-Checked-In-Group: isar-users@googlegroups.com X-Google-Group-Id: 914930254986 List-Post: , List-Help: , List-Archive: , List-Unsubscribe: , X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: =?utf-8?q?1694937633858348229?= X-GMAIL-MSGID: =?utf-8?q?1694937633858348229?= This tool can generate Isar build charts from the logs prepend with timestamps in format: %Y-%m-%d %H:%M:%S. Signed-off-by: Anton Mikanovich --- testsuite/charter/charter.py | 145 +++++++++++++++++++++++++++++++++++ 1 file changed, 145 insertions(+) create mode 100755 testsuite/charter/charter.py diff --git a/testsuite/charter/charter.py b/testsuite/charter/charter.py new file mode 100755 index 0000000..36ced98 --- /dev/null +++ b/testsuite/charter/charter.py @@ -0,0 +1,145 @@ +#!/usr/bin/python3 + +import cairo +import re +import sys +from datetime import datetime + +timestamp_format = '%Y-%m-%d %H:%M:%S' + +try: + isar_log = sys.argv[1]; + output_filename = sys.argv[2]; +except: + print("Usage:", sys.argv[0], "isar.log output.svg") + print("Log time format:", timestamp_format) + print("Example: some_bitbake_command 2>&1 | gawk '{ print strftime(\"" + + timestamp_format + "\"), $0 }' > isar.log") + sys.exit(1) + +class Buildtask: + def __init__(self, package, task, start, stop): + self.package = package + self.task = task + self.start = start + self.stop = stop + +class Color: + def __init__(self, r, g, b): + self.r = r + self.g = g + self.b = b + +timestamp_first = 0 +timestamp_last = 0 +tasks = dict() + +log = open(isar_log) +for line in log: + line = line.rstrip() + if re.search('NOTE: recipe', line): + time = datetime.strptime(re.search('\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}', + line).group(0), timestamp_format).timestamp() + if timestamp_first == 0: + timestamp_first = time + timestamp_last = time + package = re.search('recipe\s(\S*):\stask\s\S*:\s\S*', line).group(1) + task = re.search('recipe\s\S*:\stask\s(\S*):\s\S*', line).group(1) + state = re.search('recipe\s\S*:\stask\s\S*:\s(\S*)', line).group(1) + key = package + ':' + task + if key in tasks and state == 'Succeeded': + tasks[key].stop = time - timestamp_first + elif state == 'Started': + tasks[key] = Buildtask(package, task, time - timestamp_first, -1) +log.close() + +header_height = 40 +footer_height = 5 +spacer_left = 5 +spacer_right = 250 +line_height = 18 +width_coef = 6 +image_width = spacer_left + width_coef * int(timestamp_last - + timestamp_first) + spacer_right +image_height = header_height + len(tasks) * line_height + footer_height + +def task_color(task): + return { + 'do_install_builddeps': Color(1.0, 0.9, 0.7), + 'do_dpkg_build': Color(0.9, 0.5, 0.4), + 'do_deploy_deb': Color(0.5, 0.9, 0.5), + 'do_rootfs_postprocess': Color(1.0, 0.4, 0.3) + }.get(task, Color(0.7, 0.8, 0.9)) + +def fill_background(r, g, b): + c.save() + c.set_source_rgb(r, g, b) + c.paint() + c.restore() + +def draw_text(x, y, text, size, color=None): + c.save() + c.move_to(x, y) + c.set_font_size(size) + if color: + c.set_source_rgb(color.r, color.g, color.b) + c.show_text(text) + c.restore() + +def draw_line(x, y, x2, y2, color, width=0.2): + c.save() + c.move_to(x, y) + c.set_source_rgb(color.r, color.g, color.b) + c.set_line_width(width) + c.line_to(x2, y2) + c.stroke() + c.restore() + +def draw_rect(x, y, width, height, color=None): + c.save() + c.rectangle(x, y, width, height) + if color: + c.set_source_rgb(color.r, color.g, color.b) + c.fill_preserve() + c.set_line_width(0.2) + c.set_source_rgb(0.8, 0.8, 0.8) + c.stroke() + c.restore() + +s = cairo.SVGSurface(output_filename, image_width, image_height) +c = cairo.Context(s) + +c.select_font_face("DejaVuSerif", cairo.FONT_SLANT_NORMAL, + cairo.FONT_WEIGHT_NORMAL) + +fill_background(1.0, 1.0, 1.0) +draw_text(1, 24, "Isar build chart from " + datetime.fromtimestamp( + timestamp_first).strftime(timestamp_format), 24, Color(0.1, 0.1, 0.1)) + +for n in range (int(timestamp_last - timestamp_first)): + if n % 5 == 0: + draw_text(spacer_left + n * width_coef, header_height - 1, + str(n) + "s", 10, Color(0.5, 0.5, 0.5)) + draw_line(spacer_left + n * width_coef, header_height, + spacer_left + n * width_coef, image_height - footer_height, + Color(0.8, 0.8, 0.8), 0.4) + else: + draw_line(spacer_left + n * width_coef, header_height, + spacer_left + n * width_coef, image_height - footer_height, + Color(0.9, 0.9, 0.9)) + +current_line = header_height +for key in tasks: + if tasks[key].stop < 0: + tasks[key].stop = int(timestamp_last - timestamp_first) + x1 = spacer_left + width_coef * tasks[key].start + width = width_coef * (tasks[key].stop - tasks[key].start) + if width <= 0: + width = 1 + draw_rect(x1, current_line, width, line_height, task_color(tasks[key].task)) + draw_text(x1 + 1, current_line + 12, '%s : %s (%ds)' % (tasks[key].package, + tasks[key].task, tasks[key].stop - tasks[key].start), 12, + Color(0.4, 0.4, 0.4)) + current_line += line_height + +s.finish()