summaryrefslogtreecommitdiff
path: root/site_scons
diff options
context:
space:
mode:
authorDaniel Moody <daniel.moody@mongodb.com>2022-09-02 23:21:52 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2022-09-03 00:02:05 +0000
commit026f76cae138e21e6ab51cf2f91cfff2ac3b5ec5 (patch)
treeb23940b997c738552d83c8e355498143b7db9837 /site_scons
parent4defabfabdc8b639faa9be3ef44c87b3903fa8a9 (diff)
downloadmongo-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.py2
-rw-r--r--site_scons/site_tools/build_metrics/per_action_metrics.py13
-rw-r--r--site_scons/site_tools/build_metrics/top_n_metrics.py79
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"))