profiler.py (2358B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\carbon\common\lib\werkzeug\contrib\profiler.py 2 import sys 3 try: 4 try: 5 from cProfile import Profile 6 except ImportError: 7 from profile import Profile 8 9 from pstats import Stats 10 available = True 11 except ImportError: 12 available = False 13 14 class MergeStream(object): 15 16 def __init__(self, *streams): 17 if not streams: 18 raise TypeError('at least one stream must be given') 19 self.streams = streams 20 21 def write(self, data): 22 for stream in self.streams: 23 stream.write(data) 24 25 26 class ProfilerMiddleware(object): 27 28 def __init__(self, app, stream = None, sort_by = ('time', 'calls'), restrictions = ()): 29 if not available: 30 raise RuntimeError('the profiler is not available because profile or pstat is not installed.') 31 self._app = app 32 self._stream = stream or sys.stdout 33 self._sort_by = sort_by 34 self._restrictions = restrictions 35 36 def __call__(self, environ, start_response): 37 response_body = [] 38 39 def catching_start_response(status, headers, exc_info = None): 40 start_response(status, headers, exc_info) 41 return response_body.append 42 43 def runapp(): 44 appiter = self._app(environ, catching_start_response) 45 response_body.extend(appiter) 46 if hasattr(appiter, 'close'): 47 appiter.close() 48 49 p = Profile() 50 p.runcall(runapp) 51 body = ''.join(response_body) 52 stats = Stats(p, stream=self._stream) 53 stats.sort_stats(*self._sort_by) 54 self._stream.write('-' * 80) 55 self._stream.write('\nPATH: %r\n' % environ.get('PATH_INFO')) 56 stats.print_stats(*self._restrictions) 57 self._stream.write('-' * 80 + '\n\n') 58 return [body] 59 60 61 def make_action(app_factory, hostname = 'localhost', port = 5000, threaded = False, processes = 1, stream = None, sort_by = ('time', 'calls'), restrictions = ()): 62 63 def action(hostname = ('h', hostname), port = ('p', port), threaded = threaded, processes = processes): 64 from werkzeug.serving import run_simple 65 app = ProfilerMiddleware(app_factory(), stream, sort_by, restrictions) 66 run_simple(hostname, port, app, False, None, threaded, processes) 67 68 return action