flexget.plugins.cli.performance
Covered: 16 lines
Missed: 34 lines
Skipped 19 lines
Percent: 32 %
 1
import logging
 2
from optparse import SUPPRESS_HELP
 3
from flexget.plugin import register_parser_option
 4
from flexget.event import event
 6
log = logging.getLogger('performance')
 8
performance = {}
10
_start = {}
12
query_count = 0
15
def log_query_count(name_point):
16
    """Debugging purposes, allows logging number of executed queries at :name_point:"""
17
    log.info('At point named `%s` total of %s queries were ran' % (name_point, query_count))
20
@event('manager.startup')
21
def startup(manager):
22
    if manager.options.debug_perf:
23
        log.info('Enabling plugin and SQLAlchemy performance debugging')
24
        import time
27
        from sqlalchemy.engine import Connection
28
        if hasattr(Connection, 'execute'):
29
            orig_f = Connection.execute
31
            def monkeypatched(*args, **kwargs):
32
                global query_count
33
                query_count += 1
34
                return orig_f(*args, **kwargs)
36
            Connection.execute = monkeypatched
37
        else:
38
            log.critical('Unable to monkeypatch sqlalchemy')
40
        @event('feed.execute.before_plugin')
41
        def before(feed, keyword):
42
            fd = _start.setdefault(feed.name, {})
43
            fd.setdefault('time', {})[keyword] = time.time()
44
            fd.setdefault('queries', {})[keyword] = query_count
46
        @event('feed.execute.after_plugin')
47
        def after(feed, keyword):
48
            took = time.time() - _start[feed.name]['time'][keyword]
49
            queries = query_count - _start[feed.name]['queries'][keyword]
51
            pd = performance.setdefault(feed.name, {})
52
            data = pd.setdefault(keyword, {})
53
            data['took'] = data.get('took', 0) + took
54
            data['queries'] = data.get('queries', 0) + queries
56
        @event('manager.execute.completed')
57
        def results(manager):
58
            for name, data in performance.iteritems():
59
                log.info('Performance results for feed %s:' % name)
60
                for keyword, results in data.iteritems():
61
                    took = results['took']
62
                    queries = results['queries']
63
                    if took > 0.1 or queries > 10:
64
                        log.info('%-15s took %0.2f sec (%s queries)' % (keyword, took, queries))
67
register_parser_option('--debug-perf', action='store_true', dest='debug_perf', default=False,
68
                       help=SUPPRESS_HELP)