Djangoメモ : django-silkで時間のかかるリクエスト、SQLを計測
django-silk
django-silkを使うと時間のかかるリクエスト、SQLを計測することができるので試してみる。 以下のバージョンでテスト済みということなので今回はDjango 2.0.2, Python 3.6.4を使用する。
- Django: 1.11, 2.0
- Python: 2.7, 3.4, 3.5, 3.6
インストール
まずpip
コマンドでdjango-silkをインストールする。
$ pip install django-silk
次にsettings.py
のMIDDLEWARE
とINSTALLED_APPS
に設定を追加する。
他のMIDDLEWARE
との兼ね合いで動作しないこともあるようなので、その場合は記述の順番を変えてみるとよいかも。
MIDDLEWARE = [ ... 'silk.middleware.SilkyMiddleware', ... ] INSTALLED_APPS = ( ... 'silk' )
urls.py
に下記行を追加する。
urlpatterns += [path('silk/', include('silk.urls', namespace='silk'))]
django-silkはデータベースに計測結果を記録していくので以下のテーブルが追加される。
$ python manage.py makemigrations $ python manage.py showmigrations silk silk [ ] 0001_initial [ ] 0002_auto_update_uuid4_id_field [ ] 0003_request_prof_file [ ] 0004_request_prof_file_storage [ ] 0005_increase_request_prof_file_length [ ] 0006_fix_request_prof_file_blank
migrate
コマンドを実行してテーブルを作成。
$ python manage.py migrate Operations to perform: Apply all migrations: admin, auth, boards, contenttypes, sessions, silk Running migrations: Applying silk.0001_initial... OK Applying silk.0002_auto_update_uuid4_id_field... OK Applying silk.0003_request_prof_file... OK Applying silk.0004_request_prof_file_storage... OK Applying silk.0005_increase_request_prof_file_length... OK Applying silk.0006_fix_request_prof_file_blank... OK
環境によってはcollectstatic
を実行する。
$ python manage.py collectstatic
これでインストールは完了。
計測結果ページ
URLConfに追加したsilk/
にアクセスすると計測結果が表示される。
だが、インストール直後は何もデータがなく上図のようになるので、適当にアプリの色々なページにアクセスすること。
Summary
要約ページ。Summary, Most Time Overall, Most Time Spent in Database, Most Database Queriesの指標がある。
Requests
各リクエストの結果。Recent, Path, Num. Queries, Time, Time on queriesの順でソートできる。
各リクエストをクリックするとDetailsとSQLが表示される。
Details
リクエストの詳細。
SQL
SQLの詳細。
テーブルは各列でソートでき、各行をクリックすると実行されたSQLを確認できる。
Profiling
"No Silk profiling was performed for this request. Use the silk_profile decorator/context manager to do so."というメッセージが表示されて何も表示されなかった。
settings.py
に以下の行を追加し、
SILKY_PYTHON_PROFILER = True SILKY_PYTHON_PROFILER_BINARY = True SILKY_PYTHON_PROFILER_RESULT_PATH = os.path.join(BASE_DIR, "profiles")
ビュー関数にデコレータなどを追加したところ.prof
ファイルは作成されるようになったがProfilingページには何も表示されないままだった。
from silk.profiling.profiler import silk_profile @silk_profile(name='View Blog Post')
認証、認可
デフォルトではsilk/
に誰でもアクセスできてしまうので、アクセスを制限したい場合は以下の行を追加する。
SILKY_AUTHORISATION
をTrue
にするとis_staff
がTrue
のユーザーのみに制限できる。
SILKY_AUTHENTICATION = True # User must login SILKY_AUTHORISATION = True # User must have permissions
条件カスタマイズしたい場合は以下のようにする。
def my_custom_perms(user): return user.is_allowed_to_use_silk SILKY_PERMISSIONS = my_custom_perms
または、
SILKY_PERMISSIONS = lambda user: user.is_superuser
リクエストログ削除
これまでのリクエストログを削除したい場合は下記コマンドを実行する。
$ python manage.py silk_clear_request_log