annotate pylons_app/lib/profiler.py @ 172:83c7ee1b5f5c

improved timerproxy with sqllogging, and new way of sqlformat queries
author Marcin Kuzminski <marcin@python-works.com>
date Fri, 21 May 2010 03:01:31 +0200
parents c8265b4f0c2a
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
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
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
11 class ProfilingMiddleware(object):
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
12 def __init__(self, app):
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
13 self.lock = threading.Lock()
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
14 self.app = app
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
15
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
16
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()
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
20 def run_app(*a, **kw):
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
21 self.response = self.app(environ, start_response)
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
22
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
23 profiler.runcall(run_app, environ, start_response)
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
24
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
25 profiler.snapshot_stats()
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
26
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
27 stats = pstats.Stats(profiler)
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
28 stats.sort_stats('cumulative')
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
29
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
30 # Redirect output
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
31 out = StringIO()
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
32 stats.stream = out
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
33
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
34 stats.print_stats()
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
35
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
36 resp = ''.join(self.response)
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
37
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
38 # Lets at least only put this on html-like responses.
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
39 if resp.strip().startswith('<'):
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
40 ## The profiling info is just appended to the response.
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
41 ## Browsers don't mind this.
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
42 resp += '<pre style="text-align:left; border-top: 4px dashed red; padding: 1em;">'
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
43 resp += cgi.escape(out.getvalue(), True)
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
44
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
45 output = StringIO()
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
46 pprint.pprint(environ, output, depth=3)
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
47
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
48 resp += cgi.escape(output.getvalue(), True)
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
49 resp += '</pre>'
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
50
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
51 return resp
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
52
c8265b4f0c2a added log4j to development,
Marcin Kuzminski
parents:
diff changeset
53