##// END OF EJS Templates
html: move "Submit a bug" to make it more clear that it is for RhodeCode, not the repo...
html: move "Submit a bug" to make it more clear that it is for RhodeCode, not the repo RhodeCode _could_ contain a bug tracker and this link _could_ be for filing bugs for the hosted projects. Moving the link to the RhodeCode info makes it more clear that it is for RhodeCode bugs. The server instance is however something local, not directly related to the upstream.

File last commit:

r2215:2c2bdaec codereview
r3779:e61a656b beta
Show More
profiler.py
60 lines | 1.6 KiB | text/x-python | PythonLexer
from __future__ import with_statement
import gc
import objgraph
import cProfile
import pstats
import cgi
import pprint
import threading
from StringIO import StringIO
class ProfilingMiddleware(object):
def __init__(self, app):
self.lock = threading.Lock()
self.app = app
def __call__(self, environ, start_response):
with self.lock:
profiler = cProfile.Profile()
def run_app(*a, **kw):
self.response = self.app(environ, start_response)
profiler.runcall(run_app, environ, start_response)
profiler.snapshot_stats()
stats = pstats.Stats(profiler)
stats.sort_stats('calls') #cummulative
# Redirect output
out = StringIO()
stats.stream = out
stats.print_stats()
resp = ''.join(self.response)
# Lets at least only put this on html-like responses.
if resp.strip().startswith('<'):
## The profiling info is just appended to the response.
## Browsers don't mind this.
resp += ('<pre style="text-align:left; '
'border-top: 4px dashed red; padding: 1em;">')
resp += cgi.escape(out.getvalue(), True)
ct = objgraph.show_most_common_types()
print ct
resp += ct if ct else '---'
output = StringIO()
pprint.pprint(environ, output, depth=3)
resp += cgi.escape(output.getvalue(), True)
resp += '</pre>'
return resp