diff --git a/autoninja.py b/autoninja.py index f5e199b90..cdf263c7c 100755 --- a/autoninja.py +++ b/autoninja.py @@ -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 diff --git a/ninjalog_uploader.py b/ninjalog_uploader.py index b89e90976..ddcdc2d75 100755 --- a/ninjalog_uploader.py +++ b/ninjalog_uploader.py @@ -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