もた日記

くだらないことを真面目にやる

Djangoメモ : django-silkで時間のかかるリクエスト、SQLを計測

django-silk

github.com

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.pyMIDDLEWAREINSTALLED_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/にアクセスすると計測結果が表示される。

f:id:wonder-wall:20180406204935p:plain

だが、インストール直後は何もデータがなく上図のようになるので、適当にアプリの色々なページにアクセスすること。

Summary

要約ページ。Summary, Most Time Overall, Most Time Spent in Database, Most Database Queriesの指標がある。

f:id:wonder-wall:20180406205447p:plain

Requests

各リクエストの結果。Recent, Path, Num. Queries, Time, Time on queriesの順でソートできる。
各リクエストをクリックするとDetailsとSQLが表示される。

f:id:wonder-wall:20180406205702p:plain

Details

リクエストの詳細。

f:id:wonder-wall:20180406210129p:plain

SQL

SQLの詳細。

f:id:wonder-wall:20180406210147p:plain

テーブルは各列でソートでき、各行をクリックすると実行されたSQLを確認できる。

f:id:wonder-wall:20180406210932p:plain

Profiling

"No Silk profiling was performed for this request. Use the silk_profile decorator/context manager to do so."というメッセージが表示されて何も表示されなかった。

f:id:wonder-wall:20180406210334p:plain

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_AUTHORISATIONTrueにするとis_staffTrueのユーザーのみに制限できる。

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