Session extension for checking mongo explain plan
Signed-off-by: Tim Van Steenburgh <tvansteenburgh@gmail.com>
diff --git a/Allura/allura/model/session.py b/Allura/allura/model/session.py
index ff06b00..0b9ce6d 100644
--- a/Allura/allura/model/session.py
+++ b/Allura/allura/model/session.py
@@ -83,15 +83,35 @@
if arefs:
index_tasks.add_artifacts.post([aref._id for aref in arefs])
+
+class MongoProfiling(SessionExtension):
+ def cursor_created(self, cursor, action, *args, **kw):
+ explain = cursor.ming_cursor.cursor.explain()
+ if explain.get('cursor') == 'BasicCursor':
+ log.warn('No index for mongo query: %s(%r, %r)', action, args, kw)
+ else:
+ nscanned, n = explain.get('nscanned'), explain.get('n', 0)
+ if nscanned and nscanned - n > 0:
+ log.warn('Query scan: nscanned(%i) > n(%i) for query: %s(%r, %r)',
+ nscanned, n, action, args, kw)
+
+
main_doc_session = Session.by_name('main')
project_doc_session = Session.by_name('project')
task_doc_session = Session.by_name('task')
-main_orm_session = ThreadLocalORMSession(main_doc_session)
-project_orm_session = ThreadLocalORMSession(project_doc_session)
-task_orm_session = ThreadLocalORMSession(task_doc_session)
+
+main_orm_session = ThreadLocalORMSession(
+ doc_session=main_doc_session,
+ extensions=[ ])
+project_orm_session = ThreadLocalORMSession(
+ doc_session=project_doc_session,
+ extensions=[ MongoProfiling])
+task_orm_session = ThreadLocalORMSession(
+ doc_session=task_doc_session,
+ extensions=[ MongoProfiling ])
artifact_orm_session = ThreadLocalORMSession(
- doc_session=project_doc_session,
- extensions = [ ArtifactSessionExtension ])
+ doc_session=project_doc_session,
+ extensions=[ ArtifactSessionExtension, MongoProfiling ])
repository_orm_session = ThreadLocalORMSession(
- doc_session=main_doc_session,
- extensions = [ ])
+ doc_session=main_doc_session,
+ extensions=[ MongoProfiling ])