# -*- coding: utf-8 -*- import time import cProfile from amplify.agent.common.context import context __author__ = "Mike Belov" __copyright__ = "Copyright (C) Nginx, Inc. All rights reserved." __license__ = "" __maintainer__ = "Mike Belov" __email__ = "dedm@nginx.com" def do_cprofile(func): """ Decorator that should be used to create and dump cprofiles of Python logic. To use, simply wrap the desired profile function via '@do_cprofile' and watch logs to see exactly which file it was dumped to in /tmp/. Once you have a .dump binary, you can load it and display it with something like: @ >>> import pstats @ >>> p = pstats.Stats('/tmp/func-111111.dump') @ >>> p.sort_stats('cumulative').print_stats(20) """ def profiled_func(*args, **kwargs): profile = cProfile.Profile() started = int(time.time()) try: profile.enable() result = func(*args, **kwargs) profile.disable() return result finally: dump_file = '/tmp/%s-%s.dump' % (func.__name__, started) context.log.debug('dumped run to %s' % dump_file) profile.dump_stats(dump_file) return profiled_func