crosvm/tools/infra/binary_size
Zihan Chen edc1265c07 infra: Upload binary size to dashboard in postsubmit
Finally all pieces are together and we can start uploading the
metrics.
There's also a typo in catapult converter that's fixed.
Tested via led presubmit with few modifidcations to allow upload
happen in a presubmit runner.

TEST=https://chromeperf.appspot.com/report?sid=a7f57b2395b43aeaa65009589e17bc31548b78cb58daae21f12f70ee24ed9578

BUG=b:257303497

Change-Id: I351586f52ef18be95b14cc3310bb05db4f49a101
Reviewed-on: https://chromium-review.googlesource.com/c/crosvm/crosvm/+/4249502
Reviewed-by: Dennis Kempin <denniskempin@google.com>
Commit-Queue: Zihan Chen <zihanchen@google.com>
2023-02-15 22:41:49 +00:00

149 lines
4.3 KiB
Python
Executable file

#!/usr/bin/env python3
# Copyright 2023 The ChromiumOS Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import argparse
import json
import tempfile
import os
import sys
import time
import pathlib
sys.path.append(os.path.dirname(sys.path[0]))
from impl.common import cwd, CROSVM_ROOT, cmd
BOT_MASTERS = "crosvm.ci"
METRIC_NAME = "file_size"
TEST_SUITE_NAME = "crosvm.binary_output"
CHROMEPERF_URL = "https://chromeperf.appspot.com"
# TODO(zihanchen): upload binary size to db for backup
# TODO(zihanchen): Add usage
def main():
parser = argparse.ArgumentParser()
parser.add_argument(
"--base-dir",
help="Base dir of cargo target, used to convert target path to shorter relative path, must "
"be absolute",
)
parser.add_argument(
"--target-name",
help="Target name of binary",
)
parser.add_argument(
"--target-path",
help="Path to binary, must be absolute if base dir is provided",
required=True,
)
parser.add_argument("--upload", action="store_true")
parser.add_argument(
"--catapult-tool-path",
help="Path to catapult dashboard upload tool",
default="/tools/catapult",
)
parser.add_argument(
"--builder-name",
help="Name of builder generating binaries",
)
parser.add_argument("--log-url", help="Url to build execution")
parser.add_argument("--build-version", help="Version of crosvm corresponding to the results")
args = parser.parse_args()
if args.base_dir:
if not os.path.isabs(args.base_dir):
raise AssertionError("Base dir mush be and absolute path")
if not os.path.isabs(args.target_path):
raise AssertionError("When base dir is provided, target path must be an absolute path")
if not os.path.commonpath([args.base_dir, args.target_path]) == os.path.normpath(
args.base_dir
):
raise AssertionError("Base dir must be a parent directory of target path")
output_path = (
os.path.relpath(args.target_path, start=args.base_dir)
if args.base_dir
else os.path.normpath(args.target_path)
)
# output path can contain duplicated target names, dedup before printing
if len(output_path.split("/")) > 2 and output_path.split("/")[0] == output_path.split("/")[1]:
output_path = "/".join(output_path.split("/")[1:])
file_size = os.path.getsize(args.target_path)
size_dict_for_gerrit = {output_path: file_size}
print(json.dumps(size_dict_for_gerrit))
if not args.upload:
return
fuchiaperf_fd, fuchiaperf_file_path = tempfile.mkstemp(suffix=".fuchisaperf.json", text=True)
fuchiaperf_file = os.fdopen(fuchiaperf_fd, "w")
fuchsiaperf_data = [
{
"test_name": output_path,
"test_suite": TEST_SUITE_NAME,
"unit": "bytes",
"values": [file_size],
"metric": METRIC_NAME,
}
]
json.dump(fuchsiaperf_data, fuchiaperf_file)
fuchiaperf_file.close()
with open(fuchiaperf_file_path, "r") as f:
print(f.read(), file=sys.stderr)
_, catapult_file_path = tempfile.mkstemp(suffix=".json", text=True)
with cwd(CROSVM_ROOT / "tools" / "impl" / "catapult_converter"):
cmd(
"cargo",
"run",
"--",
"--input",
fuchiaperf_file_path,
"--execution-timestamp-ms",
str(int(time.time() * 1000)),
"--masters",
BOT_MASTERS,
"--bots",
args.builder_name,
"--log-url",
args.log_url,
*(
(
"--product-versions",
args.build_version,
)
if args.build_version
else ()
)
).write_to(pathlib.Path(catapult_file_path))
# print catapult file to stderr so we retain a copy
with open(catapult_file_path, "r") as f:
print(f.read(), file=sys.stderr)
print(
cmd(
args.catapult_tool_path,
"upload",
'--service-account-json=":gce"',
"--url",
CHROMEPERF_URL,
catapult_file_path,
).stdout(),
file=sys.stderr,
)
if __name__ == "__main__":
main()