Live profiling tool for Django framework to measure views performance
Project description
django-speedinfo
django-speedinfo is a live profiling tool for Django projects to find
the most high loaded views for the next optimization. django-speedinfo counts
number of calls, cache hits, SQL queries, measures average and total call time
and more for each of your views. Detailed report and profiler controls are
available in Django admin.
Prerequisites
- Python 2.7, 3.6+
- Django 1.8+
Installation
pip install django-speedinfo
Upgrading from 1.x
Old profiling data will be unavailable after upgrading. Don't forget to export the data in advance.
- Setup one of the storage backends as shown in the section 4 of Setup below.
SPEEDINFO_PROFILING_CONDITIONSis empty by default. If you useSPEEDINFO_EXCLUDE_URLSin your project you need to initialize the list of conditions explicitly:SPEEDINFO_PROFILING_CONDITIONS = ["speedinfo.conditions.exclude_urls.ExcludeURLCondition"]SPEEDINFO_REPORT_COLUMNSandSPEEDINFO_REPORT_COLUMNS_FORMATwere removed, useSPEEDINFO_ADMIN_COLUMNSinstead. Every entry inSPEEDINFO_ADMIN_COLUMNSlist is a tuple (column name, value format, attribute name). See Customize admin columns for details. To add extra columns follow the instruction in the section Extra admin columns below.speedinfo.settingsmodule renamed tospeedinfo.conf- Base condition class was renamed from
ConditiontoAbstractCondition
Setup
- Add
speedinfotoINSTALLED_APPS. - Add
speedinfo.middleware.ProfilerMiddlewareto the end ofMIDDLEWARE(orMIDDLEWARE_CLASSESfor Django < 1.10) list, but beforedjango.middleware.cache.FetchFromCacheMiddleware(if used):MIDDLEWARE = [ ..., "speedinfo.middleware.ProfilerMiddleware", "django.middleware.cache.FetchFromCacheMiddleware", ] - Setup any cache backend (except local-memory and dummy caching) using our proxy cache backend.
django-speedinfoneeds the cache to store profiler state between requests and to intercept calls to cache:CACHES = { "default": { "BACKEND": "speedinfo.backends.proxy_cache", "CACHE_BACKEND": "django.core.cache.backends.filebased.FileBasedCache", "LOCATION": "/var/tmp/django_cache", } } - Setup storage for profiling data.
django-speedinfocomes with two storages to choose from:- Database storage
- Add
speedinfo.storage.databasetoINSTALLED_APPS. - Add
SPEEDINFO_STORAGE = "speedinfo.storage.database.storage.DatabaseStorage"to project settings. - Run
python manage.py migrate.
- Add
- Cache storage
- Add
SPEEDINFO_STORAGE = "speedinfo.storage.cache.storage.CacheStorage"to project settings. - Optionally you may define a separate cache in
CACHESto store profiling data. To use it inCacheStorageassignSPEEDINFO_CACHE_STORAGE_CACHE_ALIASto the appropriate cache alias. Example:CACHES = { "default": { "BACKEND": "speedinfo.backends.proxy_cache", "CACHE_BACKEND": "django.core.cache.backends.db.DatabaseCache", "LOCATION": "cache_table", }, "speedinfo-storage": { "BACKEND": "django.core.cache.backends.memcached.MemcachedCache", "LOCATION": "127.0.0.1:11211", }, }) SPEEDINFO_CACHE_STORAGE_CACHE_ALIAS = "speedinfo-storage"
- Add
- Database storage
- Run
python manage.py collectstatic.
Usage
Open Views profiler in Django admin. Click the Turn on / Turn off button
to control profiler state. Press Reset button to delete all profiling data.
Advanced features
Custom page caching
django-speedinfo automatically detects when Django use per-site caching via
UpdateCacheMiddleware and FetchFromCacheMiddleware middlewares
or per-view caching via cache_page decorator and counts cache hit
when retrieving pages from the cache.
If you implement your own caching logic and want to mark the view response
as obtained from the cache, add specified attribute to the HttpResponse object
as shown below:
from django.views import View
from from speedinfo.conf import speedinfo_settings
class CachedView(View):
def get(self, request, *args, **kwargs):
# ...
# Assume that `response` was taken from the cache
setattr(response, speedinfo_settings.SPEEDINFO_CACHED_RESPONSE_ATTR_NAME, True)
return response
The default value of SPEEDINFO_CACHED_RESPONSE_ATTR_NAME is _is_cached.
But you can override it if the attribute name is conflicts with your application logic.
Customize admin columns
SPEEDINFO_ADMIN_COLUMNS allows to control visibility and appearance of Django admin
profiler columns. Every entry in the SPEEDINFO_ADMIN_COLUMNS list is a tuple of
(column name, value format, ViewProfiler attribute name). Default value:
SPEEDINFO_ADMIN_COLUMNS = (
("View name", "{}", "view_name"),
("HTTP method", "{}", "method"),
("Anonymous calls", "{:.1f}%", "anon_calls_ratio"),
("Cache hits", "{:.1f}%", "cache_hits_ratio"),
("SQL queries per call", "{}", "sql_count_per_call"),
("SQL time", "{:.1f}%", "sql_time_ratio"),
("Total calls", "{}", "total_calls"),
("Time per call", "{:.8f}", "time_per_call"),
("Total time", "{:.4f}", "total_time"),
)
Extra admin columns
To add additional data to a storage and columns to admin follow the instruction:
- Create custom storage backend which will hold or calculate additional fields.
- Implement storage
fetch_all()method that will return the list of theViewProfilerinstances initialized with the extra fields. Example:def fetch_all(self, ordering=None): ... return [ ViewProfiler(view_name="...", method="...", ..., extra_field="...") ... ] - Implement sorting by extra fields in
fetch_all()method. - Add extra fields to
SPEEDINFO_ADMIN_COLUMNSas described in the section Customize admin columns.
Profiling conditions
SPEEDINFO_PROFILING_CONDITIONS allows to declare a list of condition classes
to filter profiling views by some rules. By default SPEEDINFO_PROFILING_CONDITIONS is empty.
django-speedinfo comes with one build-in condition - ExcludeURLCondition. It allows to
exclude some urls from profiling by adding them to the SPEEDINFO_EXCLUDE_URLS list.
Each entry in SPEEDINFO_EXCLUDE_URLS is a regex compatible expression to test requested url.
Usage example:
SPEEDINFO_PROFILING_CONDITIONS = [
"speedinfo.conditions.exclude_urls.ExcludeURLCondition",
]
SPEEDINFO_EXCLUDE_URLS = [
r"/admin/",
r"/news/$",
r"/movie/\d+/$",
]
To define your own condition class, you must inherit from the base class speedinfo.conditions.base.AbstractCondition
and implement all abstract methods. See ExcludeURLCondition source code for implementation example. Then add
full path to your class to SPEEDINFO_PROFILING_CONDITIONS list as shown above. Conditions in mentioned list
are executed in a top-down order. The first condition returning False interrupts the further check.
Custom storage backend
django-speedinfo comes with DatabaseStorage and CacheStorage. But you may want to write your
own storage (e.g. for MongoDB, Redis or even file-based). First create the storage class based on
speedinfo.storage.base.AbstractStorage and implement all abstract methods. See speedinfo.storage.cache.storage
and speedinfo.storage.database.storage as an examples. Then add path to your custom storage class
to the project settings SPEEDINFO_STORAGE = "path.to.module.CustomStorage". Use our tests
to make sure that everything works as intended (you need to clone repository to get access to the tests package):
from django.test import TestCase, override_settings
from tests.test_storage import StorageTestCase
@override_settings(
SPEEDINFO_STORAGE="path.to.module.CustomStorage",
SPEEDINFO_TESTS=True,
)
class CustomStorageTestCase(StorageTestCase, TestCase):
pass
Notice
The number of SQL queries measured by django-speedinfo may differ from the values
of django-debug-toolbar for the same view. It happens because django-speedinfo
shows the average number of SQL queries for each view. Also profiler doesn't take
into account SQL queries made in the preceding middlewares.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file django-speedinfo-2.0.2.tar.gz.
File metadata
- Download URL: django-speedinfo-2.0.2.tar.gz
- Upload date:
- Size: 19.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.1.1 CPython/2.7.18 Linux/5.8.13-200.fc32.x86_64
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5b7c9976ac1060f2a5a086c2cd299ace491313f2d8aaeef04a434074c2ca089c
|
|
| MD5 |
44d4c8e79df9dd3496017b575eaa91b1
|
|
| BLAKE2b-256 |
1c87a5bedf4b344a704f3fb71ad808aac1c2e091eb6f1ebce345a9cc0a36cbf5
|
File details
Details for the file django_speedinfo-2.0.2-py2.py3-none-any.whl.
File metadata
- Download URL: django_speedinfo-2.0.2-py2.py3-none-any.whl
- Upload date:
- Size: 23.2 kB
- Tags: Python 2, Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.1.1 CPython/2.7.18 Linux/5.8.13-200.fc32.x86_64
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ab0049c1182143a47b9c0cc9e19ce00180bd30aca48052b55647a221b97f89af
|
|
| MD5 |
7354ec5a9ac44c9cab7765e7d8a9bf95
|
|
| BLAKE2b-256 |
500b5fadb52e96615d9ce9f7eedc8a8979e2a176c2b93d52bdd1a580f761bcf4
|