From 36281387d6d950b453e1c923b2b00318e576bb80 Mon Sep 17 00:00:00 2001 From: Piotr Mitros Date: Sun, 15 Jan 2012 14:12:46 -0500 Subject: [PATCH] Profiling. Also, preliminary dummy code for tracking in capa_problem --- courseware/capa_module.py | 5 +++++ perfstats/__init__.py | 0 perfstats/middleware.py | 35 +++++++++++++++++++++++++++++++++++ perfstats/models.py | 3 +++ perfstats/tests.py | 16 ++++++++++++++++ perfstats/views.py | 7 +++++++ settings.py | 22 ++++++++++++++-------- urls.py | 4 ++++ 8 files changed, 84 insertions(+), 8 deletions(-) create mode 100644 perfstats/__init__.py create mode 100644 perfstats/middleware.py create mode 100644 perfstats/models.py create mode 100644 perfstats/tests.py create mode 100644 perfstats/views.py diff --git a/courseware/capa_module.py b/courseware/capa_module.py index b94ffac537..1286b63b8d 100644 --- a/courseware/capa_module.py +++ b/courseware/capa_module.py @@ -306,4 +306,9 @@ class LoncapaModule(XModule): filename=settings.DATA_DIR+"problems/"+self.filename+".xml" self.lcp=LoncapaProblem(filename, self.item_id, self.lcp.get_state()) + + event_info = self.lcp.get_state() + event_info.update({'filename':filename}) + #server_track(request, 'reset_problem', event_info) + return json.dumps(self.get_problem_html(encapsulate=False)) diff --git a/perfstats/__init__.py b/perfstats/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/perfstats/middleware.py b/perfstats/middleware.py new file mode 100644 index 0000000000..87f2a6e6c6 --- /dev/null +++ b/perfstats/middleware.py @@ -0,0 +1,35 @@ +import views, json, tempfile +import hotshot +import hotshot.stats +from django.conf import settings + +tmpfile = None +prof = None + +def restart_profile(): + global prof, tmpfile + try: + oldname = tmpfile.name + except: + oldname = "" + if prof != None: + prof.close() + tmpfile = tempfile.NamedTemporaryFile(prefix='prof',delete=False) + prof = hotshot.Profile(tmpfile.name) + print "Filename", tmpfile.name + return (tmpfile.name, oldname) + +restart_profile() + +class ProfileMiddleware: + def process_request (self, request): + prof.start() + print "Process request" + + def process_response (self, request, response): + try: + prof.stop() + except: + print "Profiler not active. If you didn't just restart, this is an error" + print "Process response" + return response diff --git a/perfstats/models.py b/perfstats/models.py new file mode 100644 index 0000000000..71a8362390 --- /dev/null +++ b/perfstats/models.py @@ -0,0 +1,3 @@ +from django.db import models + +# Create your models here. diff --git a/perfstats/tests.py b/perfstats/tests.py new file mode 100644 index 0000000000..501deb776c --- /dev/null +++ b/perfstats/tests.py @@ -0,0 +1,16 @@ +""" +This file demonstrates writing tests using the unittest module. These will pass +when you run "manage.py test". + +Replace this with more appropriate tests for your application. +""" + +from django.test import TestCase + + +class SimpleTest(TestCase): + def test_basic_addition(self): + """ + Tests that 1 + 1 always equals 2. + """ + self.assertEqual(1 + 1, 2) diff --git a/perfstats/views.py b/perfstats/views.py new file mode 100644 index 0000000000..fef5100a4b --- /dev/null +++ b/perfstats/views.py @@ -0,0 +1,7 @@ +# Create your views here. +import middleware +from django.http import HttpResponse + +def end_profile(request): + names = middleware.restart_profile() + return HttpResponse(str(names)) diff --git a/settings.py b/settings.py index be214e5987..fb9fb4ce6a 100644 --- a/settings.py +++ b/settings.py @@ -13,6 +13,8 @@ DEFAULT_FEEDBACK_EMAIL = 'feedback@mitx.mit.edu' WIKI_REQUIRE_LOGIN_EDIT = True WIKI_REQUIRE_LOGIN_VIEW = True +PROFILE = False + HTTPS = 'on' DEBUG = True @@ -68,14 +70,14 @@ TEMPLATE_LOADERS = ( ) MIDDLEWARE_CLASSES = ( - 'django.middleware.common.CommonMiddleware', - 'django.contrib.sessions.middleware.SessionMiddleware', - 'django.middleware.csrf.CsrfViewMiddleware', - 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'django.contrib.messages.middleware.MessageMiddleware', - 'track.middleware.TrackMiddleware', - 'djangomako.middleware.MakoMiddleware', - #'debug_toolbar.middleware.DebugToolbarMiddleware', + 'django.middleware.common.CommonMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + 'track.middleware.TrackMiddleware', + 'djangomako.middleware.MakoMiddleware', + #'debug_toolbar.middleware.DebugToolbarMiddleware', ) ROOT_URLCONF = 'mitx.urls' @@ -96,6 +98,7 @@ INSTALLED_APPS = ( 'simplewiki', 'track', 'circuit', + 'perfstats', # Uncomment the next line to enable the admin: # 'django.contrib.admin', # Uncomment the next line to enable admin documentation: @@ -134,6 +137,9 @@ MAXLOG = 500 execfile("../settings.py") +if PROFILE : + MIDDLEWARE_CLASSES = ( 'perfstats.middleware.ProfileMiddleware',) + MIDDLEWARE_CLASSES + if 'TRACK_DIR' not in locals(): TRACK_DIR = BASE_DIR+'/track_dir/' if 'ASKBOT_EXTRA_SKINS_DIR' not in locals(): diff --git a/urls.py b/urls.py index 8f2738edd3..e70a36f18b 100644 --- a/urls.py +++ b/urls.py @@ -2,6 +2,7 @@ from django.conf.urls.defaults import patterns, include, url import django.contrib.auth.views from django.conf import settings from django.contrib import admin +import perfstats # Uncomment the next two lines to enable the admin: # from django.contrib import admin @@ -30,6 +31,9 @@ urlpatterns = ('', url(r'^courseware/$', 'courseware.views.index'), ) +if settings.PROFILE: + urlpatterns=urlpatterns + (url(r'^reprofile$','perfstats.views.end_profile'),) + if settings.COURSEWARE_ENABLED: urlpatterns=urlpatterns + (url(r'^wiki/', include('simplewiki.urls')), url(r'^courseware/(?P[^/]*)/(?P[^/]*)/(?P
[^/]*)/$', 'courseware.views.index'),