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

BY Hiro Takahashi

December 19, 2019

この記事では、ScoutをRuby on Railsアプリに導入し、ActiveRecordなどが生成したSQLクエリ、外部サーバーへのHTTPリクエスト、テンプレートレンダリングなどのアクションのパフォーマンスをモニタリングするまでをみていきます。Scout独自のインサイトである、N+1, Slow Query, Memory bloatの検知なども活用することで、パフォーマンスのボトルネックの発見・改善を最適化します。

導入方法

undefined

1. scout-apm gemをアプリに追加

2. こちらから、scout_apm.ymlをダウンロードまたは環境変数を設定 (こちらから14日間無料トライアルを始めて、keyを取得)

3. アプリを起動

データが見れないという場合は、こちらのドキュメントを参考にするか、support@scoutapm.comまでお気軽にご連絡ください

どこから見ていけばいいのか?

Scoutのアカウント作成、agentインストール完了しましたが、どこからRailsアプリのパフォーマンスを見ていけばいいでしょうか?パフォーマンス問題を素早く解決するために役立つScoutの主な機能を見ていきたいと思います。

The main overview page

Scoutにログインして、最初に見えるページが、下の画像のようなOverviewページになります。このページでは、素早くアプリケーションのパフォーマンスヘルスチャックを行うことできます。

undefined

時間の指定、メトリックの変更(Mean response time, 95th response time, Throughput, Error, Memory, Apdex )を簡単に行うことができます。また、チャート上で、下の画像のようにドラッグドロップすると、選択された時間内に呼ばれたエンデポイントのリストとMetricデータがTooltip上に表示されます。チャートに大きな変化がある際などには、このような機能がとても有効になります。

undefined

Insights Tabs

初めてScoutを使う場合や、どこにパフォーマンスの問題が話からない場合などにスタート地点として、最適なのがInsightsになります。ここでは、Scoutが自動的に検知した、N+1W Query、Slow Query、Memory Bloatを確認することができます。これらを解決することにより、アプリケーションのパフォーマンスを素早く改善することができます。(Scoutを活用して、Memoryの問題を解決したい場合には、こちらを参考にしてください)

undefined

Endpoints and Traces

Scoutでは、大きく分けて2種類のMetricとTraceというデータを提供しています。Metricデータは、毎分agentで集計されたデータなのに対し、Traceデータは個別リクエストの詳細データになります。

Metricデータを使用してわかる情報としては、エンドポイントを選択して最初見えるページでの、平均リスポンス時間はどのくらいか、その内訳はどのようになっているかなどといったものになります。OverviewページもまたMetricデータを使用しています。

undefined

そして、Traceデータを見ることで、更に詳細情報を確認することができます。下の例は、HomeControllerのshowアクションになります。Time Breakdownからこのリクエストの92%はAutoInstrumentで時間が使われたことが分かります。AutoInstrumentはController内のコード一行づつを自動的に計測するというもので、Scoutでのみ利用可能な機能担っております。(2019年12月現在)、AutoInstrumentについての詳細は、こちらのブログ記事を参考にしてください。

更に、Githubと連携することにより、Backtraceをクリックすると実際のソースコードをScout上で表示することができます。この機能により、いつ加えれらたコードなのか、誰がこの変更に詳しいのかを素早く確認することができます。

undefined

これらEndpoint、Traceページが、Scoutで一番時間を使うページになるかと思いますが、これらのページにたどり着くためには、OverViewページで、ドラッグ&ドロップした後にエンドポイントを選択、InsightsからTraceページに直接アクセスすることができる他に、ページ上部のWeb Endpointsボタンをクリックすることもできます。

undefined

独自のカスタマイズしたい?

ここまでで、Scoutに来る度にいつも使うであろう基本となる主要なページを紹介してきましたが、その他の機能についても見ていきたいと思います。

Custom Contexts and Trace Explorer

例えば、毎週火曜の深夜2時にどうしてパフォーマンス問題が起きているんだろう…?このような問題は容易に起こりやすい一方で、原因を特定するのは難しいことがあります。そこで有効な機能が、Trace ExploreとCustom Contextになります。

Custom Contextは、ユーザー自身が定義する必要のあるものですが、これを使うことにより、リクエストに紐付く詳細データを確認することができます。この機能は、少しの変更を加えるだけで、利用することできます。

undefined

Deploy Tracking

このパフォーマンス問題は、直近のDeploy後に突然起こったものなのか?また、Deploy中のユーザーエクスペリエンスに問題はないのか?といった疑問を解決するために有効になる機能が、Deploy Trackingになります。この機能を使うことによって、Overviewチャート常に、ロケットのアイコンが表示され、deployされた時間をScout上から確認することが可能になります。

deploy_tracking.png

Deploy trackingは、いくつのcommitが関係しているか、どのbranchかなどを表示します。Scoutでは、gitのrevision shaを使うことで、データを収集しています。

Alerting

他のモニタリングツールのように、Scoutも洗練されたアラート機能を持っています。例えば、あるエンドポイントの平均リスポンス時間がthreshholdを超えた場合、throughputが急上昇した場合などと、柔軟に設定することができます。また、アラートが発生した場合には、Overviewチャート上にも、Warningアイコンが表示されます。

Alert.png

デフォルトでは、アラートは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があるが、使いにくい・コストが高いと感じている方など、お問い合わせお待ちしております

doggo-hunter.png

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