Files
@ cdf10b3df899
Branch filter:
Location: kallithea/rhodecode/lib/profiler.py - annotation
cdf10b3df899
1.6 KiB
text/x-python
Allow RhodeCode maintainers to specify a custom bug tracker.
This allows people who maintain large RhodeCode installations to setup their
own bug tracker and respond to requests against their specific installation.
The maintainer is then free to forward problems with RhodeCode to the
canonical issue tracker on bitbucket.
If the config option "bugtracker" is present, its value will be used with the
"Report a bug" button. If left blank, this disables the button. If no value is
present, then the default is used. This is so that the new config option
doesn't break installations of RhodeCode upgrading to a newer version and to
allow easier installation for the common use case.
This allows people who maintain large RhodeCode installations to setup their
own bug tracker and respond to requests against their specific installation.
The maintainer is then free to forward problems with RhodeCode to the
canonical issue tracker on bitbucket.
If the config option "bugtracker" is present, its value will be used with the
"Report a bug" button. If left blank, this disables the button. If no value is
present, then the default is used. This is so that the new config option
doesn't break installations of RhodeCode upgrading to a newer version and to
allow easier installation for the common use case.
1e757ac98988 1e757ac98988 2c2bdaeca912 2c2bdaeca912 1e757ac98988 1e757ac98988 1e757ac98988 1e757ac98988 1e757ac98988 1e757ac98988 1e757ac98988 1e757ac98988 c1516b35f91d 1e757ac98988 1e757ac98988 1e757ac98988 1e757ac98988 6832ef664673 1e757ac98988 1e757ac98988 1e757ac98988 c1516b35f91d 1e757ac98988 1e757ac98988 1e757ac98988 1e757ac98988 1e757ac98988 1e757ac98988 1e757ac98988 1e757ac98988 2c2bdaeca912 1e757ac98988 1e757ac98988 1e757ac98988 1e757ac98988 1e757ac98988 1e757ac98988 1e757ac98988 1e757ac98988 1e757ac98988 1e757ac98988 1e757ac98988 1e757ac98988 1e757ac98988 c1516b35f91d c1516b35f91d 1e757ac98988 6832ef664673 2c2bdaeca912 2c2bdaeca912 2c2bdaeca912 2c2bdaeca912 2c2bdaeca912 1e757ac98988 1e757ac98988 6832ef664673 1e757ac98988 1e757ac98988 6832ef664673 1e757ac98988 | 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
|