autoninja: Add exit code and build duration to ninjalog metadata

- exit code will be useful to distinguish between successful builds and
others.
- build duration will cover the overhead outside of ninja invocation
e.g. Reclient and Siso's startup/shutdown.

Bug: 348527311
Change-Id: Ibebdf3d64597fb0e57914a84d33e46bca66671da
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/tools/depot_tools/+/5804201
Auto-Submit: Junji Watanabe <jwata@google.com>
Reviewed-by: Fumitoshi Ukai <ukai@google.com>
Reviewed-by: Takuto Ikuta <tikuta@chromium.org>
Commit-Queue: Junji Watanabe <jwata@google.com>
changes/01/5804201/6
Junji Watanabe 9 months ago committed by LUCI CQ
parent e416566a1e
commit 8f617b4617

@ -405,14 +405,23 @@ def _main_inner(input_args, build_id, should_collect_logs=False):
return ninja.main(ninja_args)
def _upload_ninjalog(args):
def _upload_ninjalog(args, exit_code, build_duration):
warnings.simplefilter("ignore", ResourceWarning)
# Run upload script without wait.
creationflags = 0
if platform.system() == "Windows":
creationflags = subprocess.CREATE_NEW_PROCESS_GROUP
cmd = [
sys.executable,
_NINJALOG_UPLOADER,
"--exit_code",
str(exit_code),
"--build_duration",
str(int(build_duration)),
"--cmdline",
] + args[1:]
subprocess.Popen(
[sys.executable, _NINJALOG_UPLOADER, "--cmdline"] + args[1:],
cmd,
stdout=subprocess.DEVNULL,
stderr=subprocess.DEVNULL,
creationflags=creationflags,
@ -420,6 +429,7 @@ def _upload_ninjalog(args):
def main(args):
start = time.time()
# Generate Build ID randomly.
# This ID is expected to be used consistently in all build tools.
build_id = os.environ.get("AUTONINJA_BUILD_ID")
@ -445,7 +455,8 @@ def main(args):
exit_code = 1
finally:
if should_collect_logs:
_upload_ninjalog(input_args)
elapsed = time.time() - start
_upload_ninjalog(input_args, exit_code, elapsed)
return exit_code

@ -123,7 +123,7 @@ def GetJflag(cmdline):
return int(cmdline[i][len("-j"):])
def GetMetadata(cmdline, ninjalog):
def GetMetadata(cmdline, ninjalog, exit_code, build_duration):
"""Get metadata for uploaded ninjalog.
Returned metadata has schema defined in
@ -151,6 +151,8 @@ def GetMetadata(cmdline, ninjalog):
build_configs[k] = str(build_configs[k])
metadata = {
"exit_code": exit_code,
"build_duration_sec": build_duration,
"platform": platform.system(),
"cpu_core": multiprocessing.cpu_count(),
"build_configs": build_configs,
@ -160,7 +162,6 @@ def GetMetadata(cmdline, ninjalog):
invocation_id = os.environ.get("AUTONINJA_BUILD_ID")
if invocation_id:
metadata['invocation_id'] = invocation_id
jflag = GetJflag(cmdline)
if jflag is not None:
metadata["jobs"] = jflag
@ -188,15 +189,13 @@ def GetNinjalog(cmdline):
return os.path.join(ninjalog_dir, ".ninja_log")
def UploadNinjaLog(ninjalog, server, cmdline):
def UploadNinjaLog(server, ninjalog, metadata):
output = io.BytesIO()
with open(ninjalog) as f:
with gzip.GzipFile(fileobj=output, mode="wb") as g:
g.write(f.read().encode())
g.write(b"# end of ninja log\n")
metadata = GetMetadata(cmdline, ninjalog)
logging.info("send metadata: %s", json.dumps(metadata))
g.write(json.dumps(metadata).encode())
@ -236,6 +235,12 @@ def main():
parser.add_argument("--verbose",
action="store_true",
help="Enable verbose logging.")
parser.add_argument("--exit_code",
type=int,
help="exit code of the ninja command.")
parser.add_argument("--build_duration",
type=int,
help="total duration spent on autoninja (secounds)")
parser.add_argument(
"--cmdline",
required=True,
@ -272,7 +277,9 @@ def main():
logging.info("ninjalog is already uploaded.")
return 0
exit_code = UploadNinjaLog(ninjalog, args.server, args.cmdline)
metadata = GetMetadata(args.cmdline, ninjalog, args.exit_code,
args.build_duration)
exit_code = UploadNinjaLog(args.server, ninjalog, metadata)
if exit_code == 0:
last_upload_file.touch()
return exit_code

Loading…
Cancel
Save