ScoutAPMでRailsアプリのパフォーマンス改善
この記事では、ScoutをRuby on Railsアプリに導入し、ActiveRecordなどが生成したSQLクエリ、外部サーバーへのHTTPリクエスト、テンプレートレンダリングなどのアクションのパフォーマンスをモニタリングするまでをみていきます。Scout独自のインサイトである、N+1, Slow Query, Memory bloatの検知なども活用することで、パフォーマンスのボトルネックの発見・改善を最適化します。
導入方法
1. scout-apm gemをアプリに追加
2. こちらから、scout_apm.ymlをダウンロードまたは環境変数を設定 (こちらから14日間無料トライアルを始めて、keyを取得)
3. アプリを起動
データが見れないという場合は、こちらのドキュメントを参考にするか、support@scoutapm.comまでお気軽にご連絡ください
どこから見ていけばいいのか?
Scoutのアカウント作成、agentインストール完了しましたが、どこからRailsアプリのパフォーマンスを見ていけばいいでしょうか?パフォーマンス問題を素早く解決するために役立つScoutの主な機能を見ていきたいと思います。
The main overview page
Scoutにログインして、最初に見えるページが、下の画像のようなOverviewページになります。このページでは、素早くアプリケーションのパフォーマンスヘルスチャックを行うことできます。
時間の指定、メトリックの変更(Mean response time, 95th response time, Throughput, Error, Memory, Apdex )を簡単に行うことができます。また、チャート上で、下の画像のようにドラッグドロップすると、選択された時間内に呼ばれたエンデポイントのリストとMetricデータがTooltip上に表示されます。チャートに大きな変化がある際などには、このような機能がとても有効になります。
Insights Tabs
初めてScoutを使う場合や、どこにパフォーマンスの問題が話からない場合などにスタート地点として、最適なのがInsightsになります。ここでは、Scoutが自動的に検知した、N+1W Query、Slow Query、Memory Bloatを確認することができます。これらを解決することにより、アプリケーションのパフォーマンスを素早く改善することができます。(Scoutを活用して、Memoryの問題を解決したい場合には、こちらを参考にしてください)
Endpoints and Traces
Scoutでは、大きく分けて2種類のMetricとTraceというデータを提供しています。Metricデータは、毎分agentで集計されたデータなのに対し、Traceデータは個別リクエストの詳細データになります。
Metricデータを使用してわかる情報としては、エンドポイントを選択して最初見えるページでの、平均リスポンス時間はどのくらいか、その内訳はどのようになっているかなどといったものになります。OverviewページもまたMetricデータを使用しています。
そして、Traceデータを見ることで、更に詳細情報を確認することができます。下の例は、HomeControllerのshowアクションになります。Time Breakdownからこのリクエストの92%はAutoInstrumentで時間が使われたことが分かります。AutoInstrumentはController内のコード一行づつを自動的に計測するというもので、Scoutでのみ利用可能な機能担っております。(2019年12月現在)、AutoInstrumentについての詳細は、こちらのブログ記事を参考にしてください。
更に、Githubと連携することにより、Backtraceをクリックすると実際のソースコードをScout上で表示することができます。この機能により、いつ加えれらたコードなのか、誰がこの変更に詳しいのかを素早く確認することができます。
これらEndpoint、Traceページが、Scoutで一番時間を使うページになるかと思いますが、これらのページにたどり着くためには、OverViewページで、ドラッグ&ドロップした後にエンドポイントを選択、InsightsからTraceページに直接アクセスすることができる他に、ページ上部のWeb Endpointsボタンをクリックすることもできます。
独自のカスタマイズしたい?
ここまでで、Scoutに来る度にいつも使うであろう基本となる主要なページを紹介してきましたが、その他の機能についても見ていきたいと思います。
Custom Contexts and Trace Explorer
例えば、毎週火曜の深夜2時にどうしてパフォーマンス問題が起きているんだろう…?このような問題は容易に起こりやすい一方で、原因を特定するのは難しいことがあります。そこで有効な機能が、Trace ExploreとCustom Contextになります。
Custom Contextは、ユーザー自身が定義する必要のあるものですが、これを使うことにより、リクエストに紐付く詳細データを確認することができます。この機能は、少しの変更を加えるだけで、利用することできます。
Deploy Tracking
このパフォーマンス問題は、直近のDeploy後に突然起こったものなのか?また、Deploy中のユーザーエクスペリエンスに問題はないのか?といった疑問を解決するために有効になる機能が、Deploy Trackingになります。この機能を使うことによって、Overviewチャート常に、ロケットのアイコンが表示され、deployされた時間をScout上から確認することが可能になります。
Deploy trackingは、いくつのcommitが関係しているか、どのbranchかなどを表示します。Scoutでは、gitのrevision shaを使うことで、データを収集しています。
Alerting
他のモニタリングツールのように、Scoutも洗練されたアラート機能を持っています。例えば、あるエンドポイントの平均リスポンス時間がthreshholdを超えた場合、throughputが急上昇した場合などと、柔軟に設定することができます。また、アラートが発生した場合には、Overviewチャート上にも、Warningアイコンが表示されます。
デフォルトでは、アラートはEメールで指定された人に送られますが、webhookにも対応しているので、Zapierなどのサービスを活用することで、Slack, VictorOps, PagerDutyなどのツールにも送ることが可能です。
Custom Instrumentation
ScoutがInstrumentしてる以外のライブラリを使っている場合はどうしたらいいのか?上記でも少しだけ触れましたが、ScoutではAuto Instrumentationという機能を提供しています。これによって、Controller内のコードについては、Scoutが自動的に一行ごと計測しますので、かなり詳細まで計測できるはずです。更に、特定のメソッド、ブロックを計測したい場合は、Custom Instrumentationをアプリケーションの方に追加することができます。基本的には、1~2行のコードを追加するのみなので、とても簡単に追加することが可能です。
ScoutでのRailsパフォーマンスモニタリングに興味が湧いた方!
こちらからプロダクトデモの予約、またはsupport@scoutapm.comまでご連絡ください。
Railsのパフォーマンス改善に興味がある方、すでに使っているAPMがあるが、使いにくい・コストが高いと感じている方など、お問い合わせお待ちしております。
ここまで、閲読頂きありがとうございます!犬のイラストをクリックしていただきますと、無料でScout関連商品をお届けします!