API 可观测性提升系列(第3部分):Tracing

March 19, 2024

Technology

はじめに

分散トレーシングとは何か?

今日のマイクロサービスアーキテクチャと分散システムの環境では、単一のリクエストが複数のサービスを通過し、それぞれがさまざまな内部処理ステップを含むことがよくあります。システムの効率的かつ安定した運用を確保するためには、これらのリクエストの完全なパスと処理を理解することが不可欠です。この必要性から、分散トレーシング技術が生まれました。これにより、リクエストが開始から完了までの全行程を明確に理解することが可能になります。これには、通過するすべてのサービス、各サービスの処理時間、および発生した異常が含まれます。

APIでのトレーシング利用プロセス

最初に、各サービスのエントリーポイントでトレーシングエージェントまたはSDKをデプロイして、すべてのリクエストをキャプチャすることが重要です。トレーシングデータを通じて、各サービスでのリクエストの処理時間を明確に観察し、潜在的なパフォーマンスのボトルネックを特定することができます。分散トレーシングは、正常なリクエスト処理だけでなく、プロセス中に発生する例外やエラーも記録します。分散トレーシングデータを可視化することで、異なるサービスやコンポーネント間のリクエストの流れを直感的に理解することができます。

API7 Enterpriseのトレーシング

可観測性の向上 - 分散トレーシング

分散トレーシングに関して、APIの可観測性を向上させるためのいくつかの方法と具体的な例を以下に示します:

1. 適切な分散トレーシングツールと技術の選択

分散トレーシングツールを選択する際には、技術スタック、ビジネス要件、および監視の複雑さを考慮する必要があります。ZipkinSkyWalking、およびOpenTelemetryは人気のある分散トレーシングソリューションで、それぞれ独自の特徴を持っています。

2. API開発への分散トレーシングの統合

ZipkinとSkyWalkingの場合、それぞれの依存関係と設定を追加することでAPI開発に統合することができます。しかし、OpenTelemetryの場合、そのAPIを使用してトレーシングコンテキストを手動で作成および管理する必要があります。

3. 分散トレーシングシステムの設定と最適化

Zipkin、SkyWalking、およびOpenTelemetryはすべて設定ファイルを通じてカスタマイズ可能です。サンプリング率、バックエンドストレージの設定、データ伝送の最適化などのパラメータを設定できます。また、異常イベントに迅速に対応するためにアラートルールを定義することが重要です。

4. データ分析と可視化

Zipkin、SkyWalking、およびOpenTelemetryは、分散トレーシングデータとパフォーマンスメトリクスを表示するための可視化インターフェースを提供します。例えば、ZipkinのUIでは、特定のトレースデータを検索して表示し、異なるサービス間のリクエストの流れを理解することができます。SkyWalkingのダッシュボードは、グローバルなパフォーマンスの概要とサービス呼び出し関係図を提供します。OpenTelemetryのデータは、Grafanaなどのさまざまな可視化ツールにインポートして、カスタムダッシュボードとチャートを作成することができます。

5. API7 Enterpriseの分散トレーシングプラグインとの統合

API7 Enterpriseは、Zipkin、OpenTracing、SkyWalkingなどの複数のトレーシングプラグインをサポートしています。これらのトレーシングプラグインは、ルーティングルールまたはグローバルルールにバインドする必要があります。サンプリング率の要件がない場合は、グローバルルールにバインドして見落としを防ぐことをお勧めします。

API7 Enterpriseの可観測性プラグイン

実践的なケース分析:EコマースAPIの可観測性の向上

Eコマースプラットフォームで商品を閲覧し購入するプロセスでは、複数のAPI呼び出しが関与します。例えば、ユーザーは最初に商品サービスのAPIを呼び出して商品リストを取得し、次に特定の商品を選択して注文サービスのAPIを呼び出して注文を作成し、最後に支払いサービスのAPIを呼び出して支払いを完了します。

このシナリオでは、注文サービスのAPIがピーク時に遅延やタイムアウトを頻繁に発生させ、チェックアウトプロセスで顕著な遅延と失敗が生じることが観察されました。この問題に対処するため、チームは分散トレーシング技術を導入してパフォーマンスのボトルネックを診断し、システムを最適化することにしました。

  1. 分散トレーシングツールの選択: チームは、複数の言語をサポートし、統合が容易で、豊富な可視化機能を備えているSkyWalkingを分散トレーシングツールとして選択しました。

  2. SkyWalkingの統合: 注文サービスはJavaで開発されており、チームはSkyWalkingのJava Agentを注文サービスのコードに統合しました。これにより、注文サービスのAPIが呼び出されたときにSkyWalkingが自動的にトレーシングデータを収集できるようになります。

  3. SkyWalkingの設定: チームはSkyWalkingのバックエンドストレージをElasticsearchに設定し、適切なサンプリング率を設定して、トレーシングデータの詳細レベルとストレージコストのバランスを取ります。

  4. トレーシングデータの収集と分析: ピーク時に、チームはSkyWalkingのUIを通じて注文サービスのAPIの呼び出しチェーンとパフォーマンスメトリクスを観察しました。その結果、注文作成プロセス中に商品在庫サービスのAPIの特定の呼び出しが大幅に時間がかかることがパフォーマンスのボトルネックとなっていることがわかりました。

  5. 詳細な調査: チームは、商品在庫サービスのAPIの詳細なトレーシングデータをさらに調査し、呼び出しパラメータ、返却結果、および例外情報を含めました。その結果、特定の商品を処理する際にAPIが複雑なデータベースクエリ操作を実行し、処理時間が増加していることがわかりました。

  6. 最適化策: この問題に対処するため、チームは2つの最適化策を実施しました。まず、データベースクエリ文を最適化してクエリ効率を向上させました。次に、商品在庫サービスのAPIにキャッシュを実装し、頻繁にクエリされ、変更が少ない商品についてはキャッシュから結果を取得することで、不要なデータベースクエリを回避しました。

結論

分散トレーシング技術は、マイクロサービスアーキテクチャと分散システムにおいて重要な役割を果たします。複数のサービス間のリクエストの流れを記録し可視化することで、パフォーマンスのボトルネックを迅速に特定し、システムの安定性と可観測性を向上させることができます。適切な分散トレーシングツールを選択し、API開発に統合することで、システムの動作をより深く理解し、ユーザーエクスペリエンスとシステム効率を向上させることができます。

関連ブログ

Tags: