From 9e28476a0eabf18f159798d46293c1910766a916 Mon Sep 17 00:00:00 2001 From: Matthew Betts Date: Mon, 18 Nov 2019 14:08:12 +1100 Subject: [PATCH] Add django middleware to write flamegraphs for requests to files --- flame_analyzer/middleware.py | 37 ++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 flame_analyzer/middleware.py diff --git a/flame_analyzer/middleware.py b/flame_analyzer/middleware.py new file mode 100644 index 0000000..889c7d1 --- /dev/null +++ b/flame_analyzer/middleware.py @@ -0,0 +1,37 @@ +from datetime import datetime + +from flame_analyzer import DjangoFileFlame + +try: + from django.utils.deprecation import MiddlewareMixin + + class FlameMiddleware(MiddlewareMixin): + """ + Django Middleware to log flamegraphs to files. + Requires python manager.py runserver --noreload --nothreading + """ + + def __call__(self, request): + self.process_request() + response = self.get_response(request) + return self.process_response(request, response) + + def process_request(self, request): + request.flame = DjangoFileFlame(self.file_path(request)) + request.flame.__enter__() + + def process_response(self, request, response): + if hasattr(request, 'flame'): + request.flame.__exit__(None, None, None) + return response + + def file_path(self, request): + now = datetime.now().strftime(f'%Y-%m-%d-%H:%M:%S') + path = request.get_full_path().strip('/') + file_path = f'{now}|{path}'.replace('/', '-') + file_path += '.svg' + return file_path + + +except ImportError: + FlameMiddleware = None