From: "Sakib Sajal" <sakib.sajal@windriver.com>
To: openembedded-core@lists.openembedded.org
Subject: [PATCH 1/1] buildstats.bbclass: add functionality to collect build system stats
Date: Fri, 23 Oct 2020 12:56:48 -0400 [thread overview]
Message-ID: <20201023165648.5515-2-sakib.sajal@windriver.com> (raw)
In-Reply-To: <20201023165648.5515-1-sakib.sajal@windriver.com>
There are a number of timeout and hang defects where
it would be useful to collect statistics about what
is running on a build host when that condition occurs.
This adds functionality to collect build system stats
on a regular interval and/or on task failure. Both
features are disabled by default.
To enable logging on a regular interval, set:
BB_HEARTBEAT_EVENT = "<interval>"
Logs are stored in ${BUILDSTATS_BASE}/<build_name>/host_stats
To enable logging on a task failure, set:
BB_LOG_HOST_STAT_ON_FAILURE = "1"
Logs are stored in ${BUILDSTATS_BASE}/<build_name>/build_stats
The list of commands, along with the desired options, need
to be specified in the BB_LOG_HOST_STAT_CMDS variable
delimited by ; as such:
BB_LOG_HOST_STAT_CMDS = "/<absolute>/<path>/<executable> <options> ; ... ;"
Signed-off-by: Sakib Sajal <sakib.sajal@windriver.com>
---
meta/classes/buildstats.bbclass | 32 +++++++++++++++++++++++++++++---
1 file changed, 29 insertions(+), 3 deletions(-)
diff --git a/meta/classes/buildstats.bbclass b/meta/classes/buildstats.bbclass
index 6f87187233..c68d7bb8a2 100644
--- a/meta/classes/buildstats.bbclass
+++ b/meta/classes/buildstats.bbclass
@@ -104,14 +104,38 @@ def write_task_data(status, logfile, e, d):
f.write("Status: FAILED \n")
f.write("Ended: %0.2f \n" % e.time)
+def write_host_data(logfile, e, d):
+ import subprocess, os, datetime
+ cmds = d.getVar('BB_LOG_HOST_STAT_CMDS').split(";")
+ with open(logfile, "a") as f:
+ f.write("Event Time: %f\nDate: %s\n" % (e.time, datetime.datetime.now()))
+ for cmd in cmds:
+ if len(cmd) == 0:
+ continue
+ c = cmd.split()
+ if os.path.isfile(c[0]) and os.access(c[0], os.X_OK):
+ try:
+ output = subprocess.check_output(c, stderr=subprocess.STDOUT).decode('utf-8')
+ except subprocess.CalledProcessError as err:
+ output = "Error running command: %s\n%s" % (cmd, err)
+ f.write("%s\n%s\n" % (cmd, output))
+ else:
+ f.write("Error running command: '%s': %s is not an executable.\n" % (cmd, c[0]))
+
python run_buildstats () {
import bb.build
import bb.event
import time, subprocess, platform
bn = d.getVar('BUILDNAME')
- bsdir = os.path.join(d.getVar('BUILDSTATS_BASE'), bn)
- taskdir = os.path.join(bsdir, d.getVar('PF'))
+ # bitbake fires HeartbeatEvent even before a build has been
+ # triggered, causing BUILDNAME to be None
+ if bn is not None:
+ bsdir = os.path.join(d.getVar('BUILDSTATS_BASE'), bn)
+ taskdir = os.path.join(bsdir, d.getVar('PF'))
+ if isinstance(e, bb.event.HeartbeatEvent):
+ bb.utils.mkdirhier(bsdir)
+ write_host_data(os.path.join(bsdir, "host_stats"), e, d)
if isinstance(e, bb.event.BuildStarted):
########################################################################
@@ -186,10 +210,12 @@ python run_buildstats () {
build_status = os.path.join(bsdir, "build_stats")
with open(build_status, "a") as f:
f.write(d.expand("Failed at: ${PF} at task: %s \n" % e.task))
+ if bb.utils.to_boolean(d.getVar("BB_LOG_HOST_STAT_ON_FAILURE")):
+ write_host_data(build_status, e, d)
}
addhandler run_buildstats
-run_buildstats[eventmask] = "bb.event.BuildStarted bb.event.BuildCompleted bb.build.TaskStarted bb.build.TaskSucceeded bb.build.TaskFailed"
+run_buildstats[eventmask] = "bb.event.BuildStarted bb.event.BuildCompleted bb.event.HeartbeatEvent bb.build.TaskStarted bb.build.TaskSucceeded bb.build.TaskFailed"
python runqueue_stats () {
import buildstats
--
2.27.0
next prev parent reply other threads:[~2020-10-23 16:57 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-10-23 16:56 [PATCH 0/1] buildstats.bbclass: add functionality to collect Sakib Sajal
2020-10-23 16:56 ` Sakib Sajal [this message]
2020-10-23 17:25 ` [OE-core] [PATCH 1/1] buildstats.bbclass: add functionality to collect build system stats Christopher Larson
2020-10-23 18:58 ` Sakib Sajal
2020-10-28 14:27 ` Richard Purdie
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20201023165648.5515-2-sakib.sajal@windriver.com \
--to=sakib.sajal@windriver.com \
--cc=openembedded-core@lists.openembedded.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox