Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

Ruby on Rails × AppSignalで実現するトレーシング完全ガイド――パフォーマンスと信頼性を高める方法

本ガイドでは、AppSignalを活用してRuby on Railsアプリケーションのパフォーマンスボトルネックを検出・診断・解消し、適切なトレーシングを実装する方法を解説します。トレーシングのセットアップから、エラーのキャプチャ、ロギングまで、必要な情報をすべて網羅しています。

この記事を読めば、どんなに高負荷な状況でもアプリケーションをスムーズに動作させられるようになります。

まずは、トレーシングとは何か、そしてそのメリットについて簡単に確認しましょう。

トレーシングとは?

トレーシングとは、リクエストや操作がアプリケーション内をどのように流れていくかを追跡するプロセスです。Rubyアプリケーションにおいて、トレーシングは実行フローを記録し、各コンポーネントのパフォーマンスに関する深い洞察を提供します。

トレーシングのメリット

トレーシングには、主に以下のようなメリットがあります。

  1. パフォーマンスの最適化: 改善が必要な遅い箇所を特定できます。
  2. デバッグの効率化: 詳細なトレースにより、コードの問題とその原因を素早く突き止められます。
  3. 信頼性の向上: アプリケーションの挙動を継続的に追跡することで、より安定したシステム運用が可能になります。

シナリオ:レスポンスが遅いRailsアプリ

一年で最も買い物が集中するブラックフライデーの日を想像してみてください。Rails製のECプラットフォームには何千人もの熱心な顧客が訪れ、カートには商品が詰まり、購入手続きを待つばかりです。すべてが順調に見えたその瞬間——システムが重くなり始めます。

取引は失敗し、放棄されたカートは急増し、パニックが広がります。これはすべての開発者にとって悪夢のような状況です。しかし、もし秘密兵器があったとしたらどうでしょう? 問題をリアルタイムで警告するだけでなく、アプリケーションの核心部に踏み込み、すべてのリクエスト、データベースクエリ、バックグラウンドジョブをトレースできるツール。それがAppSignalです。

AppSignalを使ったRuby on Railsアプリのトレーシング設定方法

AppSignalによるトレーシングの威力をお見せするため、AppSignalと統合できるサンプルのRails ECプロジェクトを用意しました。これにより、トレーシングがどのように問題を特定・解決するのかを実際に確認できます。

前提条件

  • Rubyバージョン: AppSignalはRuby 2.5以降に対応しています。
  • AppSignalアカウント: AppSignalでアカウントを作成してください(無料トライアルあり)。

これで、AppSignalを使ってRubyアプリケーションにトレーシングを設定する準備が整いました。

ステップ1:AppSignal Gemのインストール

Gemfileに以下を追加します:


次にbundle installを実行します:


ステップ2:AppSignalの初期化

AppSignalのインストールコマンドを実行して、必要な設定ファイルを生成します。


ターミナルの指示に従ってください。設定ファイルまたは環境変数のどちらかを選んで、アプリ内でAppSignalを構成できます。ここでは設定ファイル方式を採用します。

このコマンドにより、configディレクトリにappsignal.yml設定ファイルが生成されます。このファイルには、AppSignalのPush APIキーと基本的な設定項目があらかじめ入力されています。

ステップ3:AppSignalの設定

config/appsignal.ymlが各環境(開発、テスト、本番)向けに正しく設定されていることを確認してください。このファイルには環境ごとの設定が含まれています。監視しても価値の少ないアクションは除外するようにしましょう。

これでセットアップ完了です!

Ruby on Rails × AppSignalで実現するトレーシング完全ガイド――パフォーマンスと信頼性を高める方法

Ruby on Railsアプリケーションのインストルメンテーション

AppSignalは、データベースクエリやWebリクエストなど、Railsアプリケーションの主要コンポーネントを自動的に計測(instrument)できます。さらに、カスタムインストルメンテーションを追加して、アプリケーションの特定部分をトレースすることも可能です。

カスタムRailsインストルメンテーション

コードの特定部分を計測するには、Appsignal.instrumentメソッドで該当する数行のコードをラップします。このメソッドは、コントローラアクションの複雑な処理やバックグラウンドジョブなど、特定のコードブロックをトレースするのに役立ちます。


このエンドポイントにリクエストを送ると、N+1クエリ問題がレポートされます。

N+1問題とは、関連レコードを読み込む際に、コレクション内の各オブジェクトに対して個別にデータベースクエリを発行してしまう状態を指します。本来なら効率的な単一クエリで済むところに大量のクエリが発生するため、特に大規模なデータセットを扱う場合にパフォーマンスが大幅に低下します。

このケースでの修正方法は、全注文を取得するクエリをeager load(一括読み込み)することです。まず、次のコードを:


以下のコードに置き換えます:


AppSignalでRubyのエラーを収集・レポートする

AppSignalでは、Appsignal.set_errorメソッドを使ってアプリケーションエラーをキャプチャし、レポートできます。

以下は、注文コントローラのindexアクションでエラーをキャプチャしてレポートする例です:


この例では、特定のコントローラアクション内でのカスタムエラー処理を示しています。ただし、AppSignalはデフォルトでエラーをレポートするため、Appsignal.set_errorによる明示的なエラーレポートは通常不要である点に注意してください。

すべてのコントローラアクションで一貫したエラー処理を中央集権的に行うには、コントローラレベルでrescue_fromを使用することが推奨されます。このアプローチにより、コントローラアクション内で捕捉されなかった例外が確実にレポートされ、適切に管理されます。

実装例は以下の通りです:


Error > Issue listタブでは、発生したすべてのエラーの一覧、各イシューのステータス、エラーが発生してからの経過時間を確認できます:

Ruby on Rails × AppSignalで実現するトレーシング完全ガイド――パフォーマンスと信頼性を高める方法

RuntimeErrorをクリックすると、エラーログと、このエラーを引き起こしているコード行を確認できます:

Ruby on Rails × AppSignalで実現するトレーシング完全ガイド――パフォーマンスと信頼性を高める方法

締めくくる前に、もう少し高度なトレーシング手法にも触れておきましょう。

高度なトレーシング手法

ここからは、ECアプリの注文エンドポイントに対して、いくつかの高度なトレーシング手法を実装していきます。

これらの手法は、高トラフィック環境を効率的に管理し、データプライバシーを守り、トレースデータへのアクセスを保護するのに役立ちます。

高トラフィック環境でのユースケース

高スループット環境では、すべてのリクエストに対してトレースデータを収集すると大きなオーバーヘッドが発生します。サンプリングを行うことで、リクエストの一部のみを対象にトレースデータを収集でき、この負荷を軽減できます。

トランザクションへのメタデータ追加

タグやサンプルデータを使うことで、エラーやパフォーマンス問題に追加のコンテキスト情報を付与できます。これは、リクエスト、セッション、環境パラメータには含まれない情報を追加したい場合に便利です。メタデータの渡し方と追加方法の詳細については、公式ドキュメントをご覧ください。

非同期処理

非同期処理は、メール送信、バックグラウンドジョブの処理、大規模なデータインポートなど、リクエスト/レスポンスサイクル内で実行するには時間がかかりすぎるタスクを扱うための一般的な手法です。Ruby on Railsアプリケーションでは通常、Sidekiq、Resque、Delayed Jobなどのバックグラウンドジョブライブラリを使ってこれらのタスクを管理します。

AppSignalはActive Job、DelayedJob、Shoryuken、Sidekiq、Queといったライブラリとシームレスに統合され、バックグラウンドジョブのパフォーマンスとエラーに関する洞察を提供します。

セキュリティへの配慮

セキュリティは、本番環境で動かすあらゆるアプリケーションにとって非常に重要な要素です。ユーザーのプライバシーを守るため、機密データがトレースデータに含まれないようにする必要があります。フィルタ対象パラメータの値は、AppSignalに送信される際に[FILTERED]へ置き換えられます。

マスキングが必要な機密性の高いリクエストパラメータを含めるよう、config/appsignal.ymlを修正してみましょう。


Railsのfilter_parameters設定オプションを使用している場合、AppSignalはその設定をRails側の設定と自動的にマージするため、二重に設定する必要はありません。

これらの高度なトレーシング手法を実装することで、高トラフィック環境を効率的に管理しながら、機密データのプライバシーを確保できます。フィルタパラメータの詳細については、公式ドキュメントをご参照ください。

まとめ

AppSignalを使ったRubyアプリのトレーシング設定には、トレーシングの基礎理解、アプリケーションの準備、ステップバイステップのセットアッププロセスが必要です。さらに、高度な手法やデバッグテクニックを活用することで、トレーシングを一段階強化できます。

開発および保守サイクルで継続的にトレーシングを取り入れることで、より高いパフォーマンスと信頼性が得られます。今すぐAppSignalを導入して、Rubyアプリケーションの詳細な監視と深いパフォーマンスインサイトを手に入れましょう。

それでは、Happy coding!

Ruby on Rails × AppSignalで実現するトレーシング完全ガイド――パフォーマンスと信頼性を高める方法

Daniel Amah(ダニエル・アマ)

ゲスト執筆者のDanielは、プリンシパルソフトウェアエンジニア兼テクニカルファウンダーとして、Ruby on Rails、React、AI駆動アーキテクチャを活用したスケーラブルなWeb・モバイルプラットフォームの構築において10年以上の経験を持っています。Taskclanの創設者であり、MediumやLinkedInでエンジニアリングリーダーシップ、開発者ワークフロー、スタートアップの実行について頻繁に発信しています。

Daniel Amahのすべての記事を見る


  1. Auth0でRuby on Railsの認証を効率化する:初心者向け実践ガイド

    Ruby開発者にとって、認証の選択肢は nowadays 非常に豊富になりました。自作のソリューションからプラグアンドプレイ型の認証まで、さまざまな方法があります。しかしご存知のとおり、独自の認証機構をゼロから構築するのはコストが高く、セキュリティ上のリスクも伴います。多くのチームにとって事実上の標準となっているのはDeviseですが、それに代わる選択肢が開発者の負担を大きく軽減してくれるかもしれません。 本記事では、Ruby on RailsアプリケーションにおけるAuth0のセットアップと活用方法を解説します。ロール(役割)の管理から、複数の認証プロバイダーによるユーザー認証まで、正しく始

  2. AppSignalが振り返る2024年のRubyハイライト:必読記事トップ5

    今年も残りわずかとなりました。そこでAppSignalでは、2024年に最も読まれたRuby記事トップ5を、逆順でご紹介します。 Ruby on Rails 7.2の新機能:Active Recordのデータベース関連機能 Ruby on Rails 7.2で導入される注目すべき変更点、特にActive Record周りの改善について詳しく解説した記事です。 StimulusとTurbo Framesで実現するRailsのHotwireモーダル このシリーズの第1回では、Railsアプリケーションにアクセシビリティに配慮したモーダルを実装するための、2つのHotwireアプローチを取り上げてい