annotate rhodecode/lib/profiler.py @ 3181:efe23d6c178c rhodecode-0.0.1.5.2

merged with beta
author Marcin Kuzminski <marcin@python-works.com>
date Mon, 21 Jan 2013 00:49:59 +0100
parents 2c2bdaeca912
children
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
2215
2c2bdaeca912 code-review initial
Marcin Kuzminski <marcin@python-works.com>
parents: 1307
diff changeset
3 import gc
2c2bdaeca912 code-review initial
Marcin Kuzminski <marcin@python-works.com>
parents: 1307
diff changeset
4 import objgraph
15
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
5 import cProfile
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
6 import pstats
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
7 import cgi
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
8 import pprint
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
9 import threading
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
10
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
11 from StringIO import StringIO
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
12
1307
c1516b35f91d pep8ify
Marcin Kuzminski <marcin@python-works.com>
parents: 1203
diff changeset
13
15
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
14 class ProfilingMiddleware(object):
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
15 def __init__(self, app):
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
16 self.lock = threading.Lock()
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
17 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
18
15
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
19 def __call__(self, environ, start_response):
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
20 with self.lock:
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
21 profiler = cProfile.Profile()
1307
c1516b35f91d pep8ify
Marcin Kuzminski <marcin@python-works.com>
parents: 1203
diff changeset
22
15
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
23 def run_app(*a, **kw):
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
24 self.response = self.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.runcall(run_app, environ, start_response)
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
27
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
28 profiler.snapshot_stats()
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
29
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
30 stats = pstats.Stats(profiler)
2215
2c2bdaeca912 code-review initial
Marcin Kuzminski <marcin@python-works.com>
parents: 1307
diff changeset
31 stats.sort_stats('calls') #cummulative
15
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
32
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
33 # Redirect output
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
34 out = StringIO()
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
35 stats.stream = out
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
36
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
37 stats.print_stats()
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
38
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
39 resp = ''.join(self.response)
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
40
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
41 # Lets at least only put this on html-like responses.
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
42 if resp.strip().startswith('<'):
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
43 ## The profiling info is just appended to the response.
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
44 ## Browsers don't mind this.
1307
c1516b35f91d pep8ify
Marcin Kuzminski <marcin@python-works.com>
parents: 1203
diff changeset
45 resp += ('<pre style="text-align:left; '
c1516b35f91d pep8ify
Marcin Kuzminski <marcin@python-works.com>
parents: 1203
diff changeset
46 'border-top: 4px dashed red; padding: 1em;">')
15
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
47 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
48
2215
2c2bdaeca912 code-review initial
Marcin Kuzminski <marcin@python-works.com>
parents: 1307
diff changeset
49 ct = objgraph.show_most_common_types()
2c2bdaeca912 code-review initial
Marcin Kuzminski <marcin@python-works.com>
parents: 1307
diff changeset
50 print ct
2c2bdaeca912 code-review initial
Marcin Kuzminski <marcin@python-works.com>
parents: 1307
diff changeset
51
2c2bdaeca912 code-review initial
Marcin Kuzminski <marcin@python-works.com>
parents: 1307
diff changeset
52 resp += ct if ct else '---'
2c2bdaeca912 code-review initial
Marcin Kuzminski <marcin@python-works.com>
parents: 1307
diff changeset
53
15
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
54 output = StringIO()
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
55 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
56
15
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
57 resp += cgi.escape(output.getvalue(), True)
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
58 resp += '</pre>'
1203
6832ef664673 source code cleanup: remove trailing white space, normalize file endings
Marcin Kuzminski <marcin@python-works.com>
parents: 547
diff changeset
59
15
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
60 return resp