annotate rhodecode/lib/profiler.py @ 4116:ffd45b185016 rhodecode-2.2.5-gpl

Imported some of the GPLv3'd changes from RhodeCode v2.2.5. This imports changes between changesets 21af6c4eab3d and 6177597791c2 in RhodeCode's original repository, including only changes to Python files and HTML. RhodeCode clearly licensed its changes to these files under GPLv3 in their /LICENSE file, which states the following: The Python code and integrated HTML are licensed under the GPLv3 license. (See: https://code.rhodecode.com/rhodecode/files/v2.2.5/LICENSE or http://web.archive.org/web/20140512193334/https://code.rhodecode.com/rhodecode/files/f3b123159901f15426d18e3dc395e8369f70ebe0/LICENSE for an online copy of that LICENSE file) Conservancy reviewed these changes and confirmed that they can be licensed as a whole to the Kallithea project under GPLv3-only. While some of the contents committed herein are clearly licensed GPLv3-or-later, on the whole we must assume the are GPLv3-only, since the statement above from RhodeCode indicates that they intend GPLv3-only as their license, per GPLv3ยง14 and other relevant sections of GPLv3.
author Bradley M. Kuhn <bkuhn@sfconservancy.org>
date Wed, 02 Jul 2014 19:03:13 -0400
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