import functools import logging import time LOG = logging.getLogger(__name__) class Timed: """ A context manager which measures and optionally logs context run time. :param msg: A message that describes the thing that is being measured :param threshold: Threshold, in seconds. When the context exceeds this threshold, a log will be made. :param log_mode: Control whether to log. Defaults to "threshold". Possible values include: "always" - Always log 'msg', even when 'threshold' is not reached. "threshold" - Log when context time exceeds 'threshold'. "skip" - Do not log. Context time and message are stored in the 'output' and 'delta' attributes, respectively. Used to manually coalesce with other logs at the call site. usage: this call: ``` with Timed("Configuring the network"): run_configure() ``` might produce this log: ``` Configuring the network took 0.100 seconds ``` """ def __init__( self, msg: str, *, threshold: float = 0.01, log_mode: str = "threshold", ): self.msg = msg self.threshold = threshold self.log_mode = log_mode self.output = "" self.start = 0.0 self.delta = 0.0 def __enter__(self): self.start = time.monotonic() return self def __exit__(self, exc_type, exc_val, exc_tb): self.delta = time.monotonic() - self.start suffix = f"took {self.delta:.3f} seconds" if "always" == self.log_mode: LOG.debug("%s %s", self.msg, suffix) elif "skip" == self.log_mode: return elif "threshold" == self.log_mode: if self.delta > self.threshold: LOG.debug("%s %s", self.msg, suffix) self.output = f"{self.msg} {suffix}" else: raise ValueError( f"Invalid Timed log_mode value: '{self.log_mode}'." ) def timed(msg: str, *, threshold: float = 0.01, log_mode: str = "threshold"): """ A decorator which measures and optionally logs context run time. :param msg: A message that describes the thing that is being measured :param threshold: Threshold, in seconds. When the context exceeds this threshold, a log will be made. :param log_mode: Control whether to log. Defaults to "threshold". Possible values include: "always" - Always log 'msg', even when 'threshold' is not reached. "threshold" - Log when context time exceeds 'threshold'. usage: this call: ``` @timed("Configuring the network") def run_configure(): ... ``` might produce this log: ``` Configuring the network took 0.100 seconds ``` """ def wrapper(func): @functools.wraps(func) def decorator(*args, **kwargs): with Timed(msg, threshold=threshold, log_mode=log_mode): return func(*args, **kwargs) return decorator return wrapper
Name | Type | Size | Permission | Actions |
---|---|---|---|---|
__pycache__ | Folder | 0755 |
|
|
analyze | Folder | 0755 |
|
|
cmd | Folder | 0755 |
|
|
config | Folder | 0755 |
|
|
distros | Folder | 0755 |
|
|
filters | Folder | 0755 |
|
|
handlers | Folder | 0755 |
|
|
log | Folder | 0755 |
|
|
mergers | Folder | 0755 |
|
|
net | Folder | 0755 |
|
|
reporting | Folder | 0755 |
|
|
sources | Folder | 0755 |
|
|
__init__.py | File | 0 B | 0644 |
|
apport.py | File | 8.27 KB | 0644 |
|
atomic_helper.py | File | 2.79 KB | 0644 |
|
cloud.py | File | 3.22 KB | 0644 |
|
dmi.py | File | 7.86 KB | 0644 |
|
event.py | File | 2 KB | 0644 |
|
features.py | File | 4.87 KB | 0644 |
|
gpg.py | File | 7.99 KB | 0644 |
|
helpers.py | File | 16.16 KB | 0644 |
|
importer.py | File | 2.43 KB | 0644 |
|
lifecycle.py | File | 7.78 KB | 0644 |
|
netinfo.py | File | 24.02 KB | 0644 |
|
performance.py | File | 3.1 KB | 0644 |
|
persistence.py | File | 2.52 KB | 0644 |
|
registry.py | File | 1022 B | 0644 |
|
safeyaml.py | File | 10.11 KB | 0644 |
|
settings.py | File | 2.12 KB | 0644 |
|
signal_handler.py | File | 1.75 KB | 0644 |
|
simpletable.py | File | 1.93 KB | 0644 |
|
socket.py | File | 5.93 KB | 0644 |
|
ssh_util.py | File | 22.22 KB | 0644 |
|
stages.py | File | 41.53 KB | 0644 |
|
subp.py | File | 12.36 KB | 0644 |
|
temp_utils.py | File | 2.94 KB | 0644 |
|
templater.py | File | 7.8 KB | 0644 |
|
type_utils.py | File | 703 B | 0644 |
|
url_helper.py | File | 34.7 KB | 0644 |
|
user_data.py | File | 14.44 KB | 0644 |
|
util.py | File | 90.43 KB | 0644 |
|
version.py | File | 564 B | 0644 |
|
warnings.py | File | 3.76 KB | 0644 |
|