Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to profile Google App Engine python27 runtime (not python)

How to profile python code under Google App Engine runtime python27?

In runtime python it was done by this code - python runtime:

from google.appengine.ext import webapp

class PageHandler(webapp.RequestHandler):
  def get(self):
    self.response.headers['Content-Type'] = 'text/plain'
    self.response.out.write('Hello, WebApp World!')

def real_main():
  application = webapp.WSGIApplication([('/', PageHandler)], debug=True)
  run_wsgi_app(application)

def profile_main():
  # This is the main function for profiling
  # We've renamed our original main() above to real_main()
  import cProfile, pstats, StringIO
  prof = cProfile.Profile()
  prof = prof.runctx('real_main()', globals(), locals())
  stream = StringIO.StringIO()
  stats = pstats.Stats(prof, stream=stream)
  stats.sort_stats('cumulative')
  logging.info("Profile data:\n%s", stream.getvalue())

if __name__ == "__main__":
    profile_main()

In runtime python27 is has to be done differently since there is no main calls - how to do the same thing - I want to switch to python27 but not without profiling. How to attach profiler in python27 - python27 runtime?

import webapp2

class PageHandler(webapp2.RequestHandler):
    def get(self):
        self.response.headers['Content-Type'] = 'text/plain'
        self.response.out.write('Hello, WebApp World!')

app = webapp2.WSGIApplication([('/', PageHandler)])
like image 456
Chameleon Avatar asked Apr 06 '12 08:04

Chameleon


2 Answers

You can profile a WSGI app using WSGI middleware by inserting in your appengine_config.py:

import cProfile
import cStringIO
import logging
import pstats

def webapp_add_wsgi_middleware(app):

  def profiling_wrapper(environ, start_response):
    profile = cProfile.Profile()
    response = profile.runcall(app, environ, start_response)
    stream = cStringIO.StringIO()
    stats = pstats.Stats(profile, stream=stream)
    stats.sort_stats('cumulative').print_stats()
    logging.info('Profile data:\n%s', stream.getvalue())
    return response

  return profiling_wrapper
like image 135
Sam McNally Avatar answered Sep 21 '22 11:09

Sam McNally


You can also just drop in App Engine Mini Profiler, which takes care of this incantation for you and presents the results nicely on each page being profiled.

It provides both API call perf information (via Appstats) and standard profiling data for all function calls (via cProfiler)

https://github.com/kamens/gae_mini_profiler

like image 31
kamens Avatar answered Sep 21 '22 11:09

kamens