Sentry を使用したウェブ アプリケーションとモバイル アプリケーションのエンドツーエンド モニタリング

Google Cloud Japan Team
※この投稿は米国時間 2023 年 7 月 7 日に、Google Cloud blog に投稿されたものの抄訳です。
Sentry パフォーマンス モニタリングと Google Cloud を使用してアプリケーションを「エンドツーエンド」でモニタリングすることで、パフォーマンスの問題を速やかに特定して解決できます。ここでは、Sentry でアプリケーションのエラーや障害を特定する仕組みと、Google Cloud で CPU 使用量やメモリ使用量などの指標を追跡してパフォーマンスの問題を特定する仕組みを説明します。ここに記載する情報は、発生する可能性のある問題を特定し、事前に防ぐための対策を考える際にも活用できます。
このブログ投稿では、次のことを説明します。
モニタリング チェーンの各要素
各要素の連携の仕組み
システム指標のみに注目するのではなく、すべての指標を導入するメリット
このブログ投稿を読めば、アプリケーションをエンドツーエンドでモニタリングし、その可用性とパフォーマンスを改善する理由と方法をより深く理解できるようになります。これにより、ユーザーとデベロッパーの満足度が高まります。いくつかの点を説明する目的で、またこのブログ投稿のリソースとして、Sentry を使用します。
現在のウェブ アプリケーションとモバイル アプリケーションのモニタリング チェーンの 3 つの主要部分(クライアントサイド、ネットワーク、サーバーサイド)について説明します。
クライアントサイド モニタリング
クライアントサイド モニタリングは、ユーザーによるアプリケーションの操作をモニタリングします。応答時間、エラー率、ユーザー満足度などを測定します。
クライアントサイドのパフォーマンスの低下の原因には、ラスト ワンマイルの ISP やユーザーのデバイスの状態に起因するレイテンシなど、アプリケーション オーナーが制御できる範囲の外のさまざまな要素が寄与することがあります。
クライアントサイド モニタリングでモニタリングできる特定の指標や詳細には次のものがあります。
JavaScript エラーの追跡
次のようなパフォーマンス指標:
ウェブに関する指標(First Paint、First Contentful Paint、Cumulative Layout Shift、Largest Contentful Paint、First Input Delay、Time To First Byte など)
モバイルに関する指標(モバイルの App Start、Slow and Frozen frames、TTID、TTFD など)
指標(すべてのタイプのプロジェクトの Apdex、Failure Rate、Throughput、Latency、User Misery など)
ブラウザの名前とバージョン
IP アドレス
デバイスの種類(デスクトップ、モバイルを含む)
リリース番号 / commit SHA
エラーのスタック トレース
パンくずリスト(ユーザー ナビゲーションとユーザー操作)
プロファイリング
プロファイリングは、クライアントサイド モニタリングの重要な機能の 1 つです。プロファイリングにより、アプリケーションのリソース使用状況のスナップショット(プロファイル)をキャプチャし、そのスナップショットをコードベースに接続できます。これにより、リソース使用状況をコード行に直接マッピングできます。また、パフォーマンスのボトルネックを洗い出し、問題そのものに集中して取り組むことができます。次の画像は、Android アプリのエンドツーエンド テストの実行中にキャプチャされたプロファイルを示す Sentry のダッシュボードです。

プロファイリングの実行時、n セッションごとにプロファイルをキャプチャするように設定するか、またはトレーシング サンプルレートを指定できます。トレーシング サンプルレートは、ツールで追跡するセッションの割合です。たとえば、トレーシング サンプルレートが 0.4 の場合、セッションの 40% がトレースされます。
スタック トレース
クライアントサイド モニタリングのもう 1 つの重要な機能は、スタック トレースの追跡です。スタック トレースは、エラーが発生するまでにアプリケーションが呼び出したすべての関数のリストです。この情報は、エラーの根本原因を特定するのに役立ちます。次の画像は、特定のエラーについてキャプチャされたスタック トレースを示す Sentry の [問題の詳細] ページのスクリーンショットです。


セッション リプレイとユーザー操作の追跡
クライアントサイド モニタリングではユーザー操作も追跡できます。この情報は、ユーザー固有の問題(特定のデバイスまたはブラウザでのみ発生するエラーなど)を特定する際に役立ちます。
モバイル アプリケーションの場合、クライアントサイド モニタリングはエラー発生時にスクリーンショットを即時にキャプチャできます。この機能は、エラー発生時のユーザーの動作を確認するのに役立ちます。
ウェブ アプリケーションの場合、クライアントサイド モニタリングではセッション リプレイも記録できます。これは、セッション中のすべてのユーザー操作をキャプチャする DOM レコーダーです。この情報は、エラーの原因となったステップを特定するのに役立ちます。
総じて、クライアントサイド モニタリングはユーザーがアプリケーションをどのように操作しているかを確認するうえで非常に重要です。パフォーマンス ボトルネック、エラー、ユーザー特有の問題を特定するのに役立ちます。
クライアントサイドの問題について説明したところで、次はクライアントとアプリケーションの間の状況を確認する必要があります。
ネットワーク モニタリング
ネットワーク モニタリングは、システム ネットワークのパフォーマンスに関するデータを収集して分析します。このデータは、問題の特定およびトラブルシューティングと、今後の容量のニーズに応えるための計画の策定に利用できます。
ネットワークのモニタリングに役立つさまざまな指標があります。その一部を次に示します。
パケットロス: 転送中に失われたパケットの割合。
レイテンシ: ネットワーク上の 2 点間でパケットの移動にかかる時間。
スループット: ネットワークを介して転送されるデータの時間単位あたりの量。
使用率: ネットワーク リソース使用量合計の割合。
これらのシグナルのモニタリングに役立つ Google Cloud プロダクトには次のものがあります。
Cloud Monitoring: アプリケーションとインフラストラクチャのパフォーマンス、稼働時間、全体的な健全性を可視化します。
Cloud Logging: アプリケーションとインフラストラクチャからログを収集して保存します。これにより、問題をトラブルシューティングして傾向を把握できます。
これらのプロダクトを使用して、特定のネットワークの種類とアプリケーションに関連する指標を収集して分析できます。たとえば、Cloud Monitoring を使用してウェブ アプリケーションのレイテンシとスループットの指標を収集することや、Cloud Profiler を使用してファイル共有アプリケーションでのパフォーマンス ボトルネックを特定することができます。
モニタリングすべき障害点には、次のものが考えられます。
ロードバランサ: ロードバランサは、トラフィックを複数のサーバーに分散します。ロードバランサが適切に機能していないと、すべてのトラフィックが単一サーバーに振り向けられ、パフォーマンスの問題につながる可能性があります。
コンテンツ配信ネットワーク(CDN): CDN は、地理的位置に基づいてユーザーにコンテンツを配信するサーバーのネットワークです。CDN で障害が発生すると、特定エリアにいるユーザーに対してパフォーマンスの低下が発生することや、ユーザーがコンテンツにアクセスできないことがあります。
DNS サーバー: DNS サーバーはドメイン名を IP アドレスに変換します。DNS サービスで障害が発生すると、ユーザーはウェブサイトに名前でアクセスできなくなります。
ルーター: ルーターは、異なるネットワーク間でトラフィックをルーティングします。ルーターで障害が発生すると、トラフィックがネットワーク間を流れることができなくなります。
Virtual Private Cloud(VPC): VPC は、単一組織が使用するパブリック クラウド上のネットワークです。Virtual Private Cloud で障害が発生するか、ネットワーク アクセスが制限されると、組織のすべてのアプリケーションとデータが利用できなくなることがあります。
ネットワーク モニタリングは、このようなネットワーク コンポーネントやその他のコンポーネントで発生している問題を特定してトラブルシューティングするのに役立ちます。組織はネットワーク パフォーマンスをモニタリングすることで、停止を防ぎ、ネットワークの全体的な信頼性を改善できます。
上で説明した用途の他に、ネットワーク モニタリングは次の用途にも使用できます。
容量アップグレードの計画
ネットワーク パフォーマンスのベンチマークの実施
時間の経過に伴う傾向の追跡
ネットワーク パフォーマンスの最適化
ネットワーク モニタリングは、信頼性と効率性が高いネットワークを維持するうえで重要な機能です。組織は、ネットワーク パフォーマンスをモニタリングし、容量アップグレードの計画を策定し、時間の経過に伴う傾向を追跡することで、問題を特定してトラブルシューティングを行うことができます。この情報は、ネットワーク パフォーマンスの最適化と、ネットワークの信頼性改善に活用できます。
無料のシンプルなツールから複雑なエンタープライズ レベルのソリューションまで、さまざまなネットワーク モニタリング ツールとソリューションが提供されています。特定の組織にとって最良のツールは、ネットワークの規模と複雑さ、モニタリングする必要がある特定の指標、利用できる予算に応じて異なります。
サーバーサイド モニタリング
サーバーサイド モニタリングは、サーバーとそのアプリケーションのパフォーマンスを追跡するプロセスです。問題を特定してトラブルシューティングを行い、サーバーが期待されるパフォーマンスを維持できるようにします。
サーバーサイドの主な指標は、システムとアプリケーションの 2 種類です。
システム モニタリングはハードウェア コンポーネント(CPU、メモリ、ディスク、スループットなど)のパフォーマンスを追跡します。このモニタリングは、サーバーのハードウェアやソフトウェアの問題(ハードドライブの故障やソフトウェア バグなど)を特定するのに役立ちます。
アプリケーション モニタリングでは、ソフトウェア コンポーネント(ウェブアプリ、データベース、メールサーバーなど)のパフォーマンスを追跡します。このモニタリングは、アプリケーションのコードの問題(メモリリークや競合状態など)を特定するのに役立ちます。
「サーバーサイド」モニタリングの対象となるその他の要素を次に示します。
アプリケーション パフォーマンス: ページの読み込み時間、エラー率、ユーザー満足度などです。
アプリケーション内レイテンシ: リクエストがアプリケーション内で処理されるのにかかる時間です。
稼働時間チェック: 疑似ユーザー リクエストを使用してアプリケーションが到達可能であるかどうかをチェックします。
Cron: 定期的に実行される、スケジュール設定されたタスクです。
Google Cloud Monitoring は、次のようなさまざまなコンピューティング コンポーネントからデータを収集することで、サーバーサイド モニタリングの機能(特にシステム指標)を提供します。
Google Cloud Monitoring にはさまざまなアラート オプションも用意されており、潜在的な問題が発生するとすぐに通知を受け取ることができます。
エンドツーエンド モニタリングが効果的である理由
クライアントサイド モニタリング、ネットワーク モニタリング、サーバーサイド モニタリングの組み合わせにより、アプリケーションのパフォーマンスをより明確に把握でき、問題を効率的かつ速やかに特定して解決できます。
ラウンドトリップ時間(RTT)の原因の判断などのような特定の状況では、リクエスト フロー全体の各側面に対する深いオブザーバビリティを得るうえで役立ちます。
このコンセプトを導入した例として、分散トレースがあります。分散トレースは、システムを通過するリクエストのフローとタイミングを追跡します。フローとタイミングがわかることで、システムのパフォーマンスを把握し、接続チェーン全体でのボトルネックを特定できます。
リクエスト フローの各部分は他の部分にコンテキストを提供できるため、トラブルシューティングの際にギャップや不明な点が少なくなります。モニタリング対象を把握することで、問題が発生する前に標準的な手順を策定しておくことができます。なんらかの問題が発生した場合には信頼性の高いガイドとして利用できます。
エンドツーエンド モニタリングの例
応答時間が長い場合のトラブルシューティングでは、分散トレースを使用して、リクエスト フローで最も時間がかかっている部分を確認できます。これは、問題の原因になっているコンポーネントを特定するのに役立ちます。
同様に、接続の切断のトラブルシューティングでは、分散トレースを使用して、リクエスト フローの中断されている部分を確認できます。これは、プロセスで失敗したステップを特定するのに役立ちます。
リクエスト フロー全体を把握しておくと、発生するあらゆる問題のトラブルシューティングを迅速かつ容易に実行できます。
次のシナリオを考えてみます。ユーザーがよくアクセスするサイトに移動する際に問題が発生し始めました。Cloud CDN を通過するリクエストをクライアントが送信するとき、エラーの急増を知らせるアラートがデベロッパーに通知されたとします。この場合のデバッグ手順は次のとおりです。
デベロッパーは最初にクライアントサイド モニタリング データを調べ、特定のブラウザ、デバイスの種類、IP 範囲に影響が出ているかどうかを確認します。すべてのプラットフォームとロケーションで一貫して問題が発生していますが、始まりは特定の時点であることが判明しました。
デベロッパーは次にネットワーク モニタリング データを調べ、ユーザーのブラウザとサーバーの間で何が起きているのかを確認します。この場合、ネットワーク モニタリングにより、リクエストの失敗は Cloud CDN とクライアントの間で、リクエスト / レスポンス サイクルの比較的早期の時点に発生していることがわかりました。
次にデベロッパーはサーバーサイド モニタリング データを調べ、サーバーで実行されている処理を確認します。このとき、エラーが発生し始めた時期と最新のデプロイメントが一致していることに気づきました。サーバーサイドでの処理には一切問題がないため、この問題はデプロイメントと Cloud CDN に関連していると推測しました。
デベロッパーは、クライアントの Cookie の作成に使用されるコードの一部が変更されていること、クライアントが Cookie を送信していないことを突き止めました。このため、変更を元に戻し、変更をデプロイするより安定した方法を見つけることで、この問題を解決します。
デベロッパーはクライアントサイド モニタリング、ネットワーク モニタリング、サーバーサイド モニタリングを連携して使用することで、問題の根本原因を迅速に特定できました。この例では、最新のデプロイメントで Cookie の生成機能が削除されていたことが原因でした。
ここから、デプロイメントをロールバックし、実装とテストを行い、再デプロイできます。
将来似たような問題が発生した場合に、モニタリングを使用してロールバックを自動化できることが理想的です。たとえば、新しいデプロイメントの後でエラーが急増し始めた場合、デバッグを行うとともに以前のデプロイメントにロールバックします。
さらに良いことに、テスト用に本番前環境を本番環境にできる限り近づけることができ、モニタリングを(本番前環境であっても)実装して、可能な限り最高の忠実度でテストを実施できます。
お試しになりたい場合は、実際の Next.js サンプル アプリケーションを使用した 分散トレースに関する 7 部構成の YouTube シリーズをご覧ください。
エンドツーエンド モニタリングの 5 つの主なメリット
エンドツーエンド モニタリングには、トラブルシューティングで役立つ他に、実装にかかる時間と労力に見合ったさまざまなメリットがあります。
ボトルネックの特定によるパフォーマンスの改善: 分散トレースでは、アプリケーションのさまざまな要素の間とその中でのリクエストとオペレーションをトレースすることで、ほとんどのパフォーマンスの問題の発生場所と原因を特定できるようになります。
問題への対処にかかる時間の短縮: システムの各部分の動作を明確に特定することで、常に簡単に問題から原因を見つけることができるようになります。結果として、ランブックや段階的なトラブルシューティングが可能になります。
ユーザー満足度の向上: エンドツーエンド モニタリングでは、ユーザー エクスペリエンスを追跡することで、問題の発生場所や、問題の管理を担当するチームに関係なく、ユーザーにとってアプリケーションの利便性が損なわれる原因となった問題を特定して解決できます。
競合アプリケーションとの比較とパフォーマンスの追跡: エンドツーエンド モニタリングでは、競合アプリケーションと比較してアプリケーションのパフォーマンスを追跡することで、そのアプリケーションで改善できる領域を特定できます。
情報に基づく意思決定: エンドツーエンド モニタリングでは、アプリケーション パフォーマンスを包括的に可視化することで、アプリケーションに関する意思決定(新機能への投資、インフラストラクチャの変更、人員増など)を十分な情報に基づいて行うことができます。
アプリケーションのパフォーマンス、信頼性、ユーザー エクスペリエンスの改善をお考えの場合は、Sentry を使用したエンドツーエンド モニタリングの導入をご検討ください。Sentry は、十分な情報に基づいてアプリケーションに関する意思決定を行うために必要なデータとインサイトを提供する優れたツールです。
無料の YouTube シリーズをご覧ください。このシリーズでは、Sentry のデベロッパー アドボケイトの Larzar が、Next.js アプリの作成、Sentry での計測、分散トレースのデモを紹介しています。このコースをご覧になる前に、Sentry への登録をご検討ください。Sentry を簡単にお試しいただくために、この登録リンクを使用して Sentry に新規登録された組織には、$75 のクレジットを進呈します。
- Cloud Operations アドボケイト Aron Eidelman
- Sentry、デベロッパー アドボケイト Lazar Nikolov 氏