ScoutAPMでDjangoアプリのパフォーマンス改善

BY Hiro Takahashi

January 23, 2020

この投稿では、SQLクエリのパフォーマンス、外部HTTPコール、テンプレートのレンダリング、Django CMSのアプリであるWagtailの詳細をモニタリングするためのScoutの設定方法を紹介していきます。

WagtailはDjangoを使った、現代的なオープンソースコンテンツ管理システムです。NASA、Google、MITなどで用いられており、自身のコンテンツ管理システムを運営するにはもってこいのものです。scout-apmのパッケージをアプリに追加すると、すぐにアプリのパフォーマンスに関する洞察を得ることができます。

まずは基本的なパフォーマンスモニタリングの設定から始め、それからScoutを最大限活用するための詳細な設定に移っていきたいと思います。

Setup

Scoutはscout-apmというパッケージを通じて分配されており、設定には数行のコードが必要なだけです。設定が完了すると、Scoutが自動的にDjangoアプリケーションのWebリクエスト、例えばSQLクエリ、レンダリングなどを追跡します。

Scoutのアカウントを持っていない場合、14日間無料でお試し登録することができます。登録後、私たちのDjangoインストールインストラクションに従ってください。

Wagtailでは特定の環境ごとの設定ファイルが使われます。Scoutの設定には以下の方法に従うことをお勧めします。

bakerydemo/settings/base.py

# Scout settings
SCOUT_MONITOR = True
SCOUT_NAME    = WAGTAIL_SITE_NAME
SCOUT_KEY     = "SCOUT_KEY" # Grab your key from the Scout UI

dev and prod environments

Scoutはアプリケーション名毎にメトリクスを集計します。開発環境は本番環境と大きく異なる場合が多いため、環境に応じてアプリを分離させることをオススメします。(Scoutではいくつアプリを作成しても、料金は変わりません。)

Loading the SCOUT_KEY from environment variables

もしあなたが自身のAPIキーをバージョン管理の外に置いておきたい場合、SCOUT_KEYの環境変数を代わりに設定することができます。Scoutのエージェントはこの環境変数を使いますので、混乱を防ぐためにbase.pyからSCOUT_KEY取り除いてください。

Restart your app.

以上になります!python manage.py runserverで、アプリを起動し、アプリにいくつかリクエストを送ってください。それから、アプリケーションのデータがScoutに現れたかどうか確認してください。

Overview

アプリを再起動した後、最初にScoutで確認するページがOverviewページになると思います。

overview

Scoutでは自動的にSQL、View、レンダリングのパフォーマンスを計測します。

Scoutの「Web Endpoints」からエンドポイントのリストからパフォーマンス問題を探すこともできます。

endpoints

そして、特定のエンドポイントのパフォーマンスについて詳しく見ていきます。

search_view

GitHub Integration

ScoutはGitHubとの連携することで、遅いメソッドのソースコードへとすぐに導くことができます。GitHubとの連携は、”Settings”から「Integration」の下にある「GitHub」から行うことができます。

search_view

GitHubのOAuth画面を通じてScoutを認証してください。いったん認証されると、下記画像のように、遅いメソッドのソースコードをTrace上で見ることができます。

trace

Deploy Tracking

アプリケーションに変更を追加することで、パフォーマンス問題を引き起こす可能性があります。Deploy Trackingを活用することで、パフォーマンスの変化をコードの変化と紐付けやすくなります。

今回ははWagtailアプリをデプロイするのにHerokuを使っているので、Dyno metaを有効にするだけで、設定は完了です。

heroku labs:enable runtime-dyno-metadata

以下の画像のように、デプロイのマークを確認することができます。

deploy_marker

GitHubと連携することで、deploy trackingを更に有効なものにすることができます。デプロイマーク上に、マウスオーバーすると、前のdeployとのdiffの要約を表示し、リンクをリックすることでGithub上で、実際にソースコードのdiffを確認することができます。

Error Monitoring

Scout自体ではエラーモニタリングを提供しておりませんが、Rollbar・Sentryのようなエラーモニタリングと簡単に連携することが。”Settings”でRollbar integrationを有効にすることができます。

rollbar_scout

Integrationを追加後、Overviewページの下エラーが表示されるようになります。この機能により、パフォーマンスとエラー両方をScoutから確認することができるようになります。

"rollbar<em

Alerting

アプリケーションのパフォーマンスが低下したとき、Email・WebhookでScoutから通知を送ることができます。今回は”95th percentile response time”のEmailでアラートを送る設定をしたいと思います。

alert

Context & Trace Explorer

多くのパフォーマンスに関する問題は、ユーザー全員に起こるとは限りません。つまり、それらはある特定の状況で起こるということです。例えば、大量のデータにアクセスしているパワーユーザーはレスポンスタイムが遅くなることに巻き込まれがちです。時々、このようなパフォーマンス問題はオーバービューページから見つけられないことがあります。

Scoutにはcontext APIがあります。これを使うことで、Scoutのユーザーは、リクエストに関するメタデータを送ることができます。リクエストとして送られたクエリパラメータの検索キーワードとWagtailで見つかった検索結果の数をCustom Contextとして追加して見ます。

そして、ScoutのTrace Explorerで、リアルタイムにフィルターをかけて、特定の検索キーワードがContextとして追加されているのTraceを探すことができます。

trace_explorer

Custom Instrumentation

Scoutは有名・人気なLibraryについては、自動的に計測しますが、あなたが書いたカスタムコードはViewなどの大きな括りで表示されます。特定のメソッド・ブロックなどを計測したいという場合は、Custom Instrumentation.を使います。

検索結果のページネーションのあたりにCustom Instrumentationを追加してみます。

下の画像のように、Traceから今追加した、ブロック(‘Custom.pagination’)が確認できます!

custom_instru

What's Next

もしご興味ありましたら、こちらからプロダクトデモの予約、またはsupport@scoutapm.comまでご連絡ください。

ここまで、閲読頂きありがとうございます!犬のイラストをクリックしていただきますと無料でScout関連商品をお届けします

doggo-chill.png

2