1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
|
import atexit
import datetime
import logging
import sys
from typing import List
from buildscripts.metrics.metrics_datatypes import ToolingMetrics
from buildscripts.metrics.tooling_metrics_utils import save_tooling_metrics, should_collect_metrics
logger = logging.getLogger('scons_tooling_metrics')
class SConsExitHook(object):
"""Plumb all sys.exit through this object so that we can access the exit code in atexit."""
def __init__(self):
self.exit_code = None
self._orig_exit = sys.exit
def __del__(self):
sys.exit = self._orig_exit
def initialize(self):
sys.exit = self.exit
def exit(self, code=0):
self.exit_code = code
self._orig_exit(code)
# This method should only be used when registered on atexit
def _save_scons_tooling_metrics(
utc_starttime: datetime,
env_vars: "SCons.Variables.Variables",
env: "SCons.Script.SConscript.SConsEnvironment",
parser: "SCons.Script.SConsOptions.SConsOptionParser",
args: List[str],
exit_hook: SConsExitHook,
):
"""Save SCons tooling metrics to atlas cluster."""
try:
if not should_collect_metrics():
return
tooling_metrics = ToolingMetrics.get_scons_metrics(utc_starttime, env_vars, env, parser,
args, exit_hook.exit_code)
save_tooling_metrics(tooling_metrics)
except Exception as exc: # pylint: disable=broad-except
logger.warning(
"%sSCons Metrics Collection Failed -- this is a non-issue.\nIf this message persists, feel free to reach out to #server-development-platform",
exc)
def setup_scons_metrics_collection_atexit(
utc_starttime: datetime,
env_vars: "SCons.Variables.Variables",
env: "SCons.Script.SConscript.SConsEnvironment",
parser: "SCons.Script.SConsOptions.SConsOptionParser",
args: List[str],
) -> None:
"""Register an atexit method for scons metrics collection."""
scons_exit_hook = SConsExitHook()
scons_exit_hook.initialize()
atexit.register(
_save_scons_tooling_metrics,
utc_starttime,
env_vars,
env,
parser,
args,
scons_exit_hook,
)
|