diff options
author | Daniel Moody <daniel.moody@mongodb.com> | 2022-09-02 23:21:52 +0000 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2022-09-03 00:02:05 +0000 |
commit | 026f76cae138e21e6ab51cf2f91cfff2ac3b5ec5 (patch) | |
tree | b23940b997c738552d83c8e355498143b7db9837 /site_scons | |
parent | 4defabfabdc8b639faa9be3ef44c87b3903fa8a9 (diff) | |
download | mongo-026f76cae138e21e6ab51cf2f91cfff2ac3b5ec5.tar.gz |
SERVER-67060 add build metrics evergreen tasks and cedar reporting
Diffstat (limited to 'site_scons')
-rw-r--r-- | site_scons/site_tools/build_metrics/artifacts.py | 2 | ||||
-rw-r--r-- | site_scons/site_tools/build_metrics/per_action_metrics.py | 13 | ||||
-rw-r--r-- | site_scons/site_tools/build_metrics/top_n_metrics.py | 79 |
3 files changed, 90 insertions, 4 deletions
diff --git a/site_scons/site_tools/build_metrics/artifacts.py b/site_scons/site_tools/build_metrics/artifacts.py index 7751575ecf1..5ea1a20d9ce 100644 --- a/site_scons/site_tools/build_metrics/artifacts.py +++ b/site_scons/site_tools/build_metrics/artifacts.py @@ -171,7 +171,7 @@ class CollectArtifacts(BuildMetricsCollector): self._artifacts += list(map(lambda x: os.path.join(root, x), files)) def finalize(self): - self.walk(self._env.Dir(self._env.subst(self._build_dir)).abspath) + self.walk(self._env.Dir(self._env.subst(self._build_dir)).path) for artifact in self._artifacts: artifact_dict = self._identify_artifact(artifact) diff --git a/site_scons/site_tools/build_metrics/per_action_metrics.py b/site_scons/site_tools/build_metrics/per_action_metrics.py index c0d9d8fb806..95028a661bf 100644 --- a/site_scons/site_tools/build_metrics/per_action_metrics.py +++ b/site_scons/site_tools/build_metrics/per_action_metrics.py @@ -1,7 +1,8 @@ import functools -import subprocess import time import psutil +import platform + import memory_profiler import SCons import sys @@ -179,8 +180,14 @@ class PerActionMetrics(BuildMetricsCollector): task_metrics['end_time'] = time.time_ns() task_metrics['cpu_time'] = int(cpu_usage * (10.0**9.0)) - task_metrics['mem_usage'] = int(mem_usage) - + # apparently macos big sur (11) changed some of the api for getting memory, + # so the memory comes up a bit larger than expected: + # https://github.com/giampaolo/psutil/issues/1908 + if sys.platform == "darwin" and platform.mac_ver()[0] and int( + platform.mac_ver()[0].split('.')[0]) > 10: + task_metrics['mem_usage'] = int(mem_usage / 1024.0) + else: + task_metrics['mem_usage'] = int(mem_usage) self.build_tasks_metrics.append(task_metrics) task_metrics['array_index'] = self.build_tasks_metrics.index(task_metrics) diff --git a/site_scons/site_tools/build_metrics/top_n_metrics.py b/site_scons/site_tools/build_metrics/top_n_metrics.py new file mode 100644 index 00000000000..fe13295991c --- /dev/null +++ b/site_scons/site_tools/build_metrics/top_n_metrics.py @@ -0,0 +1,79 @@ +import json +import sys +import datetime +import argparse +import logging +from tabulate import tabulate + +parser = argparse.ArgumentParser(description='Print top n metrics from build metrics json files.') +parser.add_argument('--input', metavar='FILE', type=str, default='build-metrics.json', + help='Path to build metrics input json.') +parser.add_argument('--output', metavar='FILE', type=str, default="top_n_metrics.txt", + help='Path to output text file.') +parser.add_argument('--num', metavar='N', type=int, default=10, + help='Positive integer which represent the top N metrics to report on.') +args = parser.parse_args() + +logger = logging.getLogger() +logger.setLevel(logging.INFO) +logger.addHandler(logging.FileHandler(args.output)) +log_format = logging.Formatter("%(message)s") +for handler in logger.handlers: + handler.setFormatter(log_format) + +with open(args.input) as f: + metrics = json.load(f) + + logger.info(f"Time of report: {datetime.datetime.now()}") + logger.info(f"Task ID: {metrics['evg_id']}") + logger.info(f"Distro: {metrics['variant']}") + logger.info( + f"Peak Memory Used:\n{round(metrics['system_memory']['max'] / 1024.0 / 1024.0, 2)} MBs") + logger.info(f"SCons Command:\n{metrics['scons_command']}") + + build_tasks_sort = metrics['build_tasks'].copy() + build_tasks_sort.sort(reverse=True, key=lambda x: x['mem_usage']) + logger.info(f"\nTop {args.num} Memory tasks:") + table_data = [] + for i, val in enumerate(build_tasks_sort[:args.num], start=1): + table_data.append([i, val['mem_usage'] / 1024.0 / 1024.0, val['outputs'][0]]) + logger.info(tabulate(table_data, headers=['Num', 'MBs', 'Output'], floatfmt=".2f")) + + build_tasks_sort = metrics['build_tasks'].copy() + build_tasks_sort.sort(reverse=True, key=lambda x: x['end_time'] - x['start_time']) + logger.info(f"\nTop {args.num} duration tasks:") + table_data = [] + for i, val in enumerate(build_tasks_sort[:args.num], start=1): + table_data.append([i, (val['end_time'] - val['start_time']) / 10.0**9, val['outputs'][0]]) + logger.info(tabulate(table_data, headers=['Num', 'Secs', 'Output'], floatfmt=".2f")) + + build_tasks_sort = metrics['artifact_metrics']['artifacts'].copy() + build_tasks_sort.sort(reverse=True, key=lambda x: x['size']) + logger.info(f"\nTop {args.num} sized artifacts:") + table_data = [] + for i, val in enumerate(build_tasks_sort[:args.num], start=1): + table_data.append([i, val['size'] / 1024.0 / 1024.0, val['name']]) + logger.info(tabulate(table_data, headers=['Num', 'MBs', 'Output'], floatfmt=".2f")) + + build_tasks_sort = [ + metric for metric in metrics['artifact_metrics']['artifacts'] + if metric.get('bin_metrics') and metric['bin_metrics'].get('text') + ] + build_tasks_sort.sort(reverse=True, key=lambda x: x['bin_metrics']['text']['vmsize']) + logger.info(f"\nTop {args.num} Text sections:") + table_data = [] + for i, val in enumerate(build_tasks_sort[:args.num], start=1): + table_data.append([i, val['bin_metrics']['text']['vmsize'] / 1024.0 / 1024.0, val['name']]) + logger.info(tabulate(table_data, headers=['Num', 'MBs', 'Output'], floatfmt=".2f")) + + build_tasks_sort = [ + metric for metric in metrics['artifact_metrics']['artifacts'] + if metric.get('bin_metrics') and metric['bin_metrics'].get('debug') + ] + build_tasks_sort.sort(reverse=True, key=lambda x: x['bin_metrics']['debug']['filesize']) + logger.info(f"\nTop {args.num} Debug sections:") + table_data = [] + for i, val in enumerate(build_tasks_sort[:args.num], start=1): + table_data.append( + [i, val['bin_metrics']['debug']['filesize'] / 1024.0 / 1024.0, val['name']]) + logger.info(tabulate(table_data, headers=['Num', 'MBs', 'Output'], floatfmt=".2f")) |