Added profiler.
This commit is contained in:
		
							parent
							
								
									ebb520dd4a
								
							
						
					
					
						commit
						c6620ad70a
					
				| @ -2,6 +2,7 @@ import pathlib | ||||
| import asyncio | ||||
| 
 | ||||
| import logging  | ||||
| 
 | ||||
| logging.basicConfig(level=logging.DEBUG) | ||||
| 
 | ||||
| from aiohttp import web | ||||
| @ -32,7 +33,7 @@ from snek.view.status import StatusView | ||||
| from snek.view.web import WebView | ||||
| from snek.view.upload import UploadView | ||||
| from snek.view.search_user import SearchUserView  | ||||
| 
 | ||||
| from snek.system.profiler import profiler_handler | ||||
| 
 | ||||
| SESSION_KEY = b"c79a0c5fda4b424189c427d28c9f7c34" | ||||
| 
 | ||||
| @ -43,7 +44,6 @@ async def session_middleware(request, handler): | ||||
|     response = await handler(request) | ||||
|     return response | ||||
| 
 | ||||
| 
 | ||||
| class Application(BaseApplication): | ||||
| 
 | ||||
|     def __init__(self, *args, **kwargs): | ||||
| @ -77,6 +77,7 @@ class Application(BaseApplication): | ||||
|             name="static", | ||||
|             show_index=True, | ||||
|         ) | ||||
|         self.router.add_view("/profiler.html", profiler_handler) | ||||
|         self.router.add_view("/about.html", AboutHTMLView) | ||||
|         self.router.add_view("/about.md", AboutMDView) | ||||
|         self.router.add_view("/logout.json", LogoutView) | ||||
| @ -128,8 +129,6 @@ class Application(BaseApplication): | ||||
| 
 | ||||
| async def main(): | ||||
|     app = Application(db_path="sqlite:///snek.db") | ||||
|     loop = asyncio.get_event_loop() | ||||
|     loop.set_debug(True) | ||||
|     await web._run_app(app, port=8081, host="0.0.0.0") | ||||
| 
 | ||||
| if __name__ == "__main__": | ||||
|  | ||||
							
								
								
									
										42
									
								
								src/snek/system/profiler.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								src/snek/system/profiler.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,42 @@ | ||||
| import cProfile | ||||
| import pstats | ||||
| import sys  | ||||
| from aiohttp import web | ||||
| profiler = None | ||||
| import io  | ||||
| 
 | ||||
| 
 | ||||
| @web.middleware | ||||
| async def profile_middleware(request, handler): | ||||
|     global profiler  | ||||
|     if not profiler: | ||||
|         profiler = cProfile.Profile() | ||||
|     profiler.enable() | ||||
|     response = await handler(request) | ||||
|     profiler.disable() | ||||
|     stats = pstats.Stats(profiler, stream=sys.stdout) | ||||
|     stats.sort_stats('cumulative') | ||||
|     stats.print_stats()  | ||||
|     return response | ||||
| 
 | ||||
| async def profiler_handler(request): | ||||
|     output = io.StringIO() | ||||
|     stats = pstats.Stats(profiler, stream=output) | ||||
|     stats.sort_stats('cumulative') | ||||
|     stats.print_stats() | ||||
|     return web.Response(text=output.getvalue()) | ||||
| 
 | ||||
| class Profiler: | ||||
| 
 | ||||
|     def __init__(self): | ||||
|         global profiler  | ||||
|         if profiler is None: | ||||
|             profiler = cProfile.Profile() | ||||
|         self.profiler = profiler | ||||
| 
 | ||||
|     async def __aenter__(self): | ||||
|         self.profiler.enable()     | ||||
|      | ||||
|     async def __aexit__(self, *args, **kwargs): | ||||
|         self.profiler.disable() | ||||
| 
 | ||||
| @ -12,6 +12,7 @@ from snek.system.view import BaseView | ||||
| import traceback | ||||
| import json | ||||
| from snek.system.model import now  | ||||
| from snek.system.profiler import Profiler | ||||
| 
 | ||||
| class RPCView(BaseView): | ||||
| 
 | ||||
| @ -169,8 +170,10 @@ class RPCView(BaseView): | ||||
|         async for msg in ws: | ||||
|             if msg.type == web.WSMsgType.TEXT: | ||||
|                 try: | ||||
|                     async with Profiler(): | ||||
|                         await rpc(msg.json()) | ||||
|                 except Exception as ex: | ||||
|                     print(ex, flush=True) | ||||
|                     await self.services.socket.delete(ws) | ||||
|                     break | ||||
|             elif msg.type == web.WSMsgType.ERROR: | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user