ご利用のアプリケーションで、トラフィックの不均衡、インスタンス障害、低速なエンドポイント、ビジネストラフィック分析、カナリアリリースのモニタリングなどの問題が発生した場合、アプリケーション監視の Trace Explorer を使用して、問題のあるコードを迅速に特定できます。このトピックでは、5 つの典型的な本番環境での問題を用いて、Trace Explorer の使用方法とその価値を説明します。
背景情報
単一リクエストの異常を調査するためのトレースの使用や、サービスモニタリングとアラート機能のための事前集約メトリックの使用に加えて、分散トレーシングは詳細なトレースデータに対する事後集約分析もサポートしています。この機能は Trace Explorer として知られています。個々のトレースの分析と比較して、Trace Explorer は問題の特定をより迅速に行うのに役立ちます。事前集約されたモニタリングチャートと比較して、Trace Explorer はカスタム診断のためのより高い柔軟性を提供します。
Trace Explorer は、保存されているすべての詳細なトレースデータに対してリアルタイム分析を実行します。さまざまなシナリオでカスタム診断を行うために、フィルター条件と集約ディメンションを自由に組み合わせることができます。例えば、3 秒以上かかる呼び出しの時系列分布を表示したり、エラーリクエストが異なるマシン間でどのように分散しているかを確認したり、VIP 顧客のトラフィック変更をモニタリングしたりできます。
問題 1:トラフィックの不均衡な分散
負荷分散の構成ミスにより大量のリクエストが少数のマシンにルーティングされ、サービスの可用性に影響を与える「ホットスポット」が作成された場合、どのように対処しますか?
トラフィックの不均衡な分散によって引き起こされる「ホットスポット」は、容易にサービスの可用性低下につながる可能性があります。このようなケースの多くは、負荷分散の構成ミス、再起動したノードがオンラインになるのを妨げるサービスレジストリの異常、または異常な DHT ハッシュ係数などの要因により、本番環境で発生します。
トラフィックの不均衡における最大のリスクは、「ホットスポット」を時間内に検出できないことです。その症状は、多くの場合、応答の遅延やエラーとして現れ、従来のモニタリングではトラフィックの不均衡を直接示さない場合があります。その結果、運用担当者はそれを主要な原因とは考えず、貴重なインシデント対応時間を無駄にし、問題を悪化させてしまいます。
Trace Explorer を使用すると、IP アドレスでトレースデータをグループ化して、リクエストがマシン間でどのように分散しているか、特にインシデント発生前後のトラフィック分散の変化を可視化できます。もし多数のリクエストが突然 1 台または少数のマシンに集中した場合、それはトラフィックの不均衡によるホットスポットである可能性が高いです。その後、これをインシデント発生時の変更イベントと関連付けることで、問題のある変更を迅速に特定し、ロールバックを実行できます。
[トレースエクスプローラー] ページで IP アドレスで集約すると、ほとんどのトラフィックが opentelemetry-demo-frontend-XX マシンに集中していることがわかる場合があります。 [トレースエクスプローラー] ページで、集約ディメンションを [IP アドレス] に設定し、[リクエスト数] でソートすると、各ホストのリクエスト数、エラー数、および平均持続時間を表示できます。 たとえば、opentelemetry-demo-frontend ホストはリクエスト数が 17,000 にも達し、他のホストをはるかに超えているため、トラフィックが明確に集中していることがわかります。
問題 2:インスタンス障害
ネットワークカードの損傷、CPU の過剰コミットメント、ディスクのフル状態などのインスタンス障害により、一部のリクエストが失敗またはタイムアウトした場合、どのように調査しますか?
インスタンス障害は頻繁に発生し、特に大規模なコアクラスターでは統計的にほぼ避けられません。インスタンス障害は大規模なサービス停止を引き起こすとは限りませんが、少数のユーザーリクエストが失敗したりタイムアウトしたりする原因となることがあります。これは継続的にユーザーエクスペリエンスを低下させ、サポートコストを増加させるため、迅速に対処する必要があります。
インスタンス障害は、ホスト障害とコンテナ障害 (Kubernetes 環境ではノード障害と Pod 障害) に分類できます。例えば、CPU の過剰コミットメントやハードウェア障害はホストレベルの問題であり、ホスト上のすべてのコンテナに影響します。対照的に、ディスクのフル状態やメモリ不足エラーなどの問題は、通常、単一のコンテナにのみ影響します。したがって、インスタンス障害のトラブルシューティングを行う際には、ホスト IP とコンテナ IP の両方のディメンションからデータを分析できます。
この問題に対処するには、Trace Explorer を使用して、まず異常またはタイムアウトしたリクエストをフィルターします。次に、結果をホスト IP またはコンテナ IP アドレスで集約して、インスタンス障害が原因であるかどうかを迅速に判断します。異常なリクエストが単一のマシンに集中している場合は、マシンを交換して迅速な回復を試みるか、ディスクがフル状態であるか、CPU スティールタイムが高すぎないかなどのシステムメトリックを検査できます。エラーが複数のマシンに分散している場合は、インスタンス障害を除外できる可能性が高く、ダウンストリームの依存関係やアプリケーションロジックの問題分析に集中すべきです。
[トレースエクスプローラー] ページで、エラー呼び出しまたは低速呼び出しをフィルターし、結果を IP アドレスでグループ化します。異常な呼び出しが特定のマシンに集中している場合、インスタンス障害の可能性が非常に高くなります。Trace Explorer ページで、フィルター条件を statusCode IN (2, 3) に設定し、集約ディメンションとして IP アドレス を選択し、左側のクイックフィルターセクションで Error ステータスにチェックを入れます。クエリ結果には合計 2,857 件のエラー呼び出しが表示され、2 つのホスト (*.42 および *.47) がそれぞれ 1,430 回と 1,425 回の呼び出しを生成し、どちらもエラーレートは 100% です。エラーは 19:21 から 19:26 の間に集中しており、これは典型的なインスタンス障害の特徴です。
問題 3:低速なエンドポイントの管理
新しいアプリケーションのローンチや大規模な販売促進の前に、どのようにして低速なエンドポイントを迅速に特定し、パフォーマンスボトルネックを解決しますか?
新しいアプリケーションをローンチしたり、大規模なプロモーションに備えたりする際には、体系的なパフォーマンスチューニングが必要になることがよくあります。最初のステップは、低速なエンドポイントのリストとそれらの発生頻度を特定することによって、現在のシステムのパフォーマンスボトルネックを分析することです。
Trace Explorer を使用して、持続時間が特定のしきい値を超える呼び出しをフィルターし、それらをエンドポイント名でグループ化できます。これにより、低速なエンドポイントのリストとそのパターンを迅速に特定できます。その後、最も頻繁に発生する低速なエンドポイントに 1 つずつ対処できます。
低速なエンドポイントを見つけた後、対応するトレース、メソッドスタック、スレッドプールのデータを使用して、低速な呼び出しの根本原因を特定できます。一般的な原因は次のとおりです。
-
データベースまたはマイクロサービスの接続プールが小さすぎるため、多くのリクエストが接続を待機します。これは、接続プールの最大スレッド数を増やすことで解決できます。
-
N+1 クエリ問題。例えば、単一の外部リクエストが数百の内部データベース呼び出しをトリガーします。これらの断片化されたリクエストをマージして、ネットワーク転送時間を短縮できます。
-
単一リクエストのデータサイズが大きすぎると、ネットワーク転送とデシリアライゼーションに時間がかかり、Full GC を引き起こしやすくなります。完全なクエリからページ分割クエリに切り替えることで、一度に多すぎるデータをリクエストするのを避けることができます。
-
ロギングフレームワーク内の「ホットロック」。同期から非同期のログ出力に切り替えることができます。
[トレースエクスプローラー] ページで、5 秒を超える低速な呼び出しをフィルター処理し、エンドポイント名でグループ化して、低速なエンドポイントのパターンを特定します。
問題 4:ビジネストラフィック分析
主要な顧客やチャネルのトラフィック変更とサービス品質をどのように分析しますか?
本番環境では、サービスはしばしば標準化されていますが、ビジネスセグメントは階層化され、分類されています。同じ注文サービスでも、カテゴリ、チャネル、ユーザーなどのディメンションで統計を分類・集約し、詳細な運用を行う必要があります。例えば、オフラインの小売チャネルでは、すべての注文とすべての POS 端末の安定性が広報問題になる可能性があります。オフラインチャネルの SLA 要件は、オンラインチャネルよりもはるかに高くなります。では、一般的な e コマースサービスシステム内で、オフライン小売トレースのトラフィック状況とサービス品質をどのように正確にモニタリングできるでしょうか?
Trace Explorer のカスタム属性に対するフィルタリングと統計機能を使用すると、低コストでビジネス指向のトレース分析を実行できます。例えば、エントリポイントサービスでオフライン注文のトレースに {"attributes.channel": "offline"} のようなタグを追加し、その後、異なる店舗、顧客グループ、製品カテゴリに個別のタグを追加できます。最後に、attributes.channel = offline でフィルターし、group by を使用して異なるビジネスタグでリクエスト数、持続時間、エラー率などのメトリックを集約することで、各ビジネスシナリオのトラフィックトレンドとサービス品質を迅速に分析できます。
問題 5:カナリアリリースのモニタリング
10 バッチで 500 台のマシンにデプロイしています。最初のカナリアリリースバッチが稼働した後、問題があるかどうかをどのように迅速に判断しますか?
変更管理の 3 つの柱である「カナリア、モニター、ロールバック」は、オンラインの安定性にとって不可欠です。段階的なカナリアリリースは、オンラインリスクを低減し、影響範囲を制御するための重要な手法です。カナリアバッチで異常が検出された場合は、デプロイを続行するのではなく、直ちにロールバックする必要があります。しかし、多くの本番障害は、効果的なカナリアリリースのモニタリングが欠如しているために発生します。
例えば、マイクロサービスのサービスレジストリが利用できない場合、再起動されたマシンは登録できず、オンラインになりません。カナリアリリースのモニタリングがなければ、再起動された最初の数バッチのマシンはすべて登録に失敗する可能性があります。すべてのトラフィックは残りのアクティブなマシンにルーティングされます。最後のバッチのマシンも登録に失敗するまで、アプリケーション全体のトラフィックと持続時間は大幅に変わらないかもしれません。その時点でアプリケーション全体が利用できなくなり、大規模な本番インシデントにつながります。
上記のシナリオで、異なるマシンバージョンのトラフィックに {"attributes.version": "v1.0.x"} のようなタグを付けると、Trace Explorer を使用して attributes.version で統計をグループ化できます。これにより、異なるバージョン間、またはリリース前後でのトラフィックの変更とサービス品質を明確に区別でき、カナリアバッチの異常がグローバルな監視メトリックによってマスクされるのを防ぐことができます。
Trace Explorer の制限事項
Trace Explorer は柔軟で、さまざまなカスタム診断のニーズを満たすことができますが、いくつかの制限事項があります。
-
詳細なトレースデータの分析にはコストがかかります。
Trace Explorer では、詳細なトレースデータをできるだけ完全にレポートし、保存する必要があります。サンプリングレートが低く、詳細データが不完全な場合、Trace Explorer の効果は大幅に低下します。完全なストレージのコストを削減するために、クラスター内にエッジデータノードをデプロイして一時的なデータキャッシングと処理を行い、ネットワークを越えたレポートのオーバーヘッドを削減できます。あるいは、サーバー側でコールド・ホットデータ分離を実装することもできます。ホットストレージで完全なトレース分析を実行し、コールドストレージでは低速またはエラーのあるトレースのみを診断します。
-
事後集約は、クエリのオーバーヘッドが高く、同時実行数が低いため、アラート機能には適していません。
Trace Explorer は、完全なデータセットに対してリアルタイムのスキャンと統計を実行します。クエリのパフォーマンスオーバーヘッドは、事前集約メトリックよりもはるかに高いため、高同時実行数のアラートクエリには適していません。代わりに、カスタムメトリック機能を使用して事後集約文をクライアントにプッシュダウンし、カスタムメトリック収集を行うことで、アラート機能やカスタムダッシュボードに使用できます。
-
Trace Explorer の価値を最大化するには、カスタム属性のタグ付けが必要です。
アプリケーション監視の標準的な事前集約メトリックとは異なり、Trace Explorer の多くのシナリオでは、カスタムタグを使用してコードを手動でインストルメントする必要があります。これは、さまざまなビジネスシナリオを区別し、正確な分析を可能にする最も効果的な方法です。
関連ドキュメント
問題をプロアクティブに診断するために、Application Real-Time Monitoring Service (ARMS) のアラート機能を使用して、特定のエンドポイントまたはすべてのエンドポイントに対してアラートを作成できます。問題が発生すると、サービスは運用チームに通知を送信します。アラートの作成方法については、「アプリケーションモニタリングのアラートルール」をご参照ください。