annotate rhodecode/lib/profiler.py @ 2060:572855f7a392 beta

reverted git fix as it broke pushing
author Marcin Kuzminski <marcin@python-works.com>
date Tue, 28 Feb 2012 07:08:42 +0200
parents c1516b35f91d
children 2c2bdaeca912
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
15
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
1 from __future__ import with_statement
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
2
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
3 import cProfile
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
4 import pstats
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
5 import cgi
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
6 import pprint
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
7 import threading
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
8
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
9 from StringIO import StringIO
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
10
1307
c1516b35f91d pep8ify
Marcin Kuzminski <marcin@python-works.com>
parents: 1203
diff changeset
11
15
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
12 class ProfilingMiddleware(object):
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
13 def __init__(self, app):
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
14 self.lock = threading.Lock()
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
15 self.app = app
1203
6832ef664673 source code cleanup: remove trailing white space, normalize file endings
Marcin Kuzminski <marcin@python-works.com>
parents: 547
diff changeset
16
15
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
17 def __call__(self, environ, start_response):
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
18 with self.lock:
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
19 profiler = cProfile.Profile()
1307
c1516b35f91d pep8ify
Marcin Kuzminski <marcin@python-works.com>
parents: 1203
diff changeset
20
15
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
21 def run_app(*a, **kw):
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
22 self.response = self.app(environ, start_response)
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
23
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
24 profiler.runcall(run_app, environ, start_response)
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
25
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
26 profiler.snapshot_stats()
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
27
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
28 stats = pstats.Stats(profiler)
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
29 stats.sort_stats('cumulative')
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
30
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
31 # Redirect output
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
32 out = StringIO()
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
33 stats.stream = out
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
34
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
35 stats.print_stats()
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
36
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
37 resp = ''.join(self.response)
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
38
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
39 # Lets at least only put this on html-like responses.
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
40 if resp.strip().startswith('<'):
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
41 ## The profiling info is just appended to the response.
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
42 ## Browsers don't mind this.
1307
c1516b35f91d pep8ify
Marcin Kuzminski <marcin@python-works.com>
parents: 1203
diff changeset
43 resp += ('<pre style="text-align:left; '
c1516b35f91d pep8ify
Marcin Kuzminski <marcin@python-works.com>
parents: 1203
diff changeset
44 'border-top: 4px dashed red; padding: 1em;">')
15
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
45 resp += cgi.escape(out.getvalue(), True)
1203
6832ef664673 source code cleanup: remove trailing white space, normalize file endings
Marcin Kuzminski <marcin@python-works.com>
parents: 547
diff changeset
46
15
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
47 output = StringIO()
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
48 pprint.pprint(environ, output, depth=3)
1203
6832ef664673 source code cleanup: remove trailing white space, normalize file endings
Marcin Kuzminski <marcin@python-works.com>
parents: 547
diff changeset
49
15
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
50 resp += cgi.escape(output.getvalue(), True)
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
51 resp += '</pre>'
1203
6832ef664673 source code cleanup: remove trailing white space, normalize file endings
Marcin Kuzminski <marcin@python-works.com>
parents: 547
diff changeset
52
15
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
53 return resp