Source code for flexget.plugins.cli.performance

import time
from argparse import SUPPRESS

from loguru import logger
from sqlalchemy.engine import Connection

from flexget import options
from flexget.event import add_event_handler, event, remove_event_handler

logger = logger.bind(name='performance')

performance = {}

_start = {}

query_count = 0
orig_execute = None


[docs] def log_query_count(name_point): """Debugging purposes, allows logging number of executed queries at :name_point:.""" logger.info('At point named `{}` total of {} queries were ran', name_point, query_count)
[docs] def before_plugin(task, keyword): fd = _start.setdefault(task.name, {}) fd.setdefault('time', {})[keyword] = time.time() fd.setdefault('queries', {})[keyword] = query_count
[docs] def after_plugin(task, keyword): took = time.time() - _start[task.name]['time'][keyword] queries = query_count - _start[task.name]['queries'][keyword] # Store results, increases previous values pd = performance.setdefault(task.name, {}) data = pd.setdefault(keyword, {}) data['took'] = data.get('took', 0) + took data['queries'] = data.get('queries', 0) + queries
[docs] @event('manager.execute.started') def startup(manager, options): if not options.debug_perf: return logger.info('Enabling plugin and SQLAlchemy performance debugging') global query_count, orig_execute query_count = 0 # Monkeypatch query counter for SQLAlchemy if hasattr(Connection, 'execute'): orig_execute = Connection.execute def monkeypatched(*args, **kwargs): global query_count query_count += 1 return orig_execute(*args, **kwargs) Connection.execute = monkeypatched else: logger.critical('Unable to monkeypatch sqlalchemy') add_event_handler('task.execute.before_plugin', before_plugin) add_event_handler('task.execute.after_plugin', after_plugin)
[docs] @event('manager.execute.completed') def cleanup(manager, options): if not options.debug_perf: return # Print summary for name, data in performance.items(): logger.info('Performance results for task {}:', name) for keyword, results in data.items(): took = results['took'] queries = results['queries'] if took > 0.1 or queries > 10: logger.info('{:<15} took {:0.2f} sec ({} queries)', keyword, took, queries) # Deregister our hooks if hasattr(Connection, 'execute') and orig_execute: Connection.execute = orig_execute remove_event_handler('task.execute.before_plugin', before_plugin) remove_event_handler('task.execute.after_plugin', after_plugin)
[docs] @event('options.register') def register_parser_arguments(): options.get_parser('execute').add_argument( '--debug-perf', action='store_true', dest='debug_perf', default=False, help=SUPPRESS )