Merge branch 'tracemallocmiddleware' into 'develop'
Initial tracemalloc middleware, See merge request funkwhale/funkwhale!1293
This commit is contained in:
commit
94662e5814
1
.env.dev
1
.env.dev
|
@ -13,6 +13,7 @@ BROWSABLE_API_ENABLED=True
|
||||||
FORWARDED_PROTO=http
|
FORWARDED_PROTO=http
|
||||||
LDAP_ENABLED=False
|
LDAP_ENABLED=False
|
||||||
FUNKWHALE_SPA_HTML_ROOT=http://nginx/front/
|
FUNKWHALE_SPA_HTML_ROOT=http://nginx/front/
|
||||||
|
PYTHONTRACEMALLOC=1
|
||||||
|
|
||||||
# Uncomment this if you're using traefik/https
|
# Uncomment this if you're using traefik/https
|
||||||
# FORCE_HTTPS_URLS=True
|
# FORCE_HTTPS_URLS=True
|
||||||
|
|
|
@ -104,4 +104,5 @@ if env.bool("WEAK_PASSWORDS", default=False):
|
||||||
MIDDLEWARE = (
|
MIDDLEWARE = (
|
||||||
"funkwhale_api.common.middleware.DevHttpsMiddleware",
|
"funkwhale_api.common.middleware.DevHttpsMiddleware",
|
||||||
"funkwhale_api.common.middleware.ProfilerMiddleware",
|
"funkwhale_api.common.middleware.ProfilerMiddleware",
|
||||||
|
"funkwhale_api.common.middleware.PymallocMiddleware",
|
||||||
) + MIDDLEWARE
|
) + MIDDLEWARE
|
||||||
|
|
|
@ -14,6 +14,7 @@ from django.middleware import csrf
|
||||||
from django.contrib import auth
|
from django.contrib import auth
|
||||||
from django import urls
|
from django import urls
|
||||||
from rest_framework import views
|
from rest_framework import views
|
||||||
|
import tracemalloc
|
||||||
|
|
||||||
from funkwhale_api.federation import utils as federation_utils
|
from funkwhale_api.federation import utils as federation_utils
|
||||||
|
|
||||||
|
@ -405,3 +406,20 @@ class ProfilerMiddleware:
|
||||||
response = http.HttpResponse("<pre>%s</pre>" % stream.getvalue())
|
response = http.HttpResponse("<pre>%s</pre>" % stream.getvalue())
|
||||||
|
|
||||||
return response
|
return response
|
||||||
|
|
||||||
|
|
||||||
|
class PymallocMiddleware:
|
||||||
|
def __init__(self, get_response):
|
||||||
|
self.get_response = get_response
|
||||||
|
|
||||||
|
def __call__(self, request):
|
||||||
|
|
||||||
|
if tracemalloc.is_tracing():
|
||||||
|
snapshot = tracemalloc.take_snapshot()
|
||||||
|
stats = snapshot.statistics("lineno")
|
||||||
|
|
||||||
|
print("Memory trace")
|
||||||
|
for stat in stats[:25]:
|
||||||
|
print(stat)
|
||||||
|
|
||||||
|
return self.get_response(request)
|
||||||
|
|
|
@ -0,0 +1,50 @@
|
||||||
|
Debugging Funkwhale
|
||||||
|
===================
|
||||||
|
|
||||||
|
In order to track down errors its useful to provide as many information as possible. Usually pasting
|
||||||
|
the logs should be sufficient, but there are some tools for some deeper debugging.
|
||||||
|
|
||||||
|
Frontend Logs
|
||||||
|
-------------
|
||||||
|
|
||||||
|
Logs and errors written by the Frontend can be accessed with Firefox. When opening the website of
|
||||||
|
your Funkwhale instance, simply hit ``Ctlr + Shift + J``. Alternatively open the Firefox Menu and open
|
||||||
|
the Browser Console in the developers menu.
|
||||||
|
|
||||||
|
In the opening window you can see all the output. You can copy what you want to share or repeat the
|
||||||
|
failing operation to see what error occurs.
|
||||||
|
|
||||||
|
Backend Logs
|
||||||
|
------------
|
||||||
|
|
||||||
|
Depending on your setup you can see the logs from our API server in different ways.
|
||||||
|
|
||||||
|
Docker
|
||||||
|
^^^^^^
|
||||||
|
|
||||||
|
Simply run ``docker-compose logs --tail=100 api`` If you want continuous logs, add the ``f`` flag.
|
||||||
|
|
||||||
|
Quick install
|
||||||
|
^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
To get the logs, run ``journalctl -xn -u funkwhale-server``
|
||||||
|
|
||||||
|
Profiling
|
||||||
|
---------
|
||||||
|
|
||||||
|
In order to find performance issues, its possible to run API requests with activated profiling. In
|
||||||
|
order to do this, add ``funkwhale_api.common.middleware.ProfilerMiddleware`` to the environment
|
||||||
|
variable ``ADDITIONAL_MIDDLEWARES_BEFORE``
|
||||||
|
|
||||||
|
If enabled, simply add ``?prof`` to the request URL you want to profile. You should get an HTML-Report
|
||||||
|
of the running request.
|
||||||
|
|
||||||
|
Memory Tracing
|
||||||
|
--------------
|
||||||
|
|
||||||
|
Its possible to print memory traces for each API request to the API logs. In order to do this, add
|
||||||
|
``funkwhale_api.common.middleware.PymallocMiddleware`` to the environment variable
|
||||||
|
``ADDITIONAL_MODDLEWARES_BEFORE`` This adds a middleware which should not do anything by default.
|
||||||
|
Tracing can be activated by setting ``PYTHONTRACEMALLOC=1`` This might has some inpact on the
|
||||||
|
performance, please report how it goes. The Middleware now prints the top 25 memory allocations to
|
||||||
|
the API logs.
|
Loading…
Reference in New Issue