クライアント、APIゲートウェイ・ログおよびバックエンドに表示されるopc-request-id値が期待どおりに一致しません

APIゲートウェイ・サービスでAPIゲートウェイおよびAPIデプロイメントが正常に作成され、APIをコールする際のopc-request-id相関および伝播の動作のトラブルシューティング方法をご紹介します。

opc-request-id値を使用して、クライアント・リクエストをAPIゲートウェイ・ログおよびバックエンド・ログに関連付けます。クライアントが送信する値は、クライアントがレスポンスで受信する値およびバックエンド・サービスがAPIゲートウェイから受信する値とは異なる場合があります。

APIゲートウェイは、受信値を解析し、値の選択された部分を保持して、リクエストの新しいスパンIDを生成します。このトピックの解析動作を使用して、ログ相関の正しい値を選択します。

問題の症状

次の症状が1つ以上表示される場合があります。

  • クライアントに返されたopc-request-idレスポンス・ヘッダーが、クライアントが送信した値と一致しません。

  • バックエンド・サービスは、クライアントに返された値とは異なるopc-request-id値をログに記録します。

  • クライアント提供のopc-request-idにスラッシュ(/)が含まれている場合、Application Performance Monitoring (APM)またはバックエンド・ログに予期しない衝突、欠落値または切捨てが表示されます。

  • 単一ヘッダー値を使用して、クライアント・レスポンス、APIゲートウェイ・アクセス・ログ、APIゲートウェイ実行ログおよびバックエンド・ログ全体で同じリクエストを見つけることはできません。

考えられる理由

値は、次の理由で異なる場合があります。

  • APIゲートウェイは、opc-request-idを不透明なパススルー値として扱いません。

  • APIゲートウェイは、受信値をスラッシュ(/)文字で分割し、顧客IDおよびトレースID部分のみを使用します。

  • APIゲートウェイは、リクエストごとに新しいスパンIDを生成します。

  • クライアントに返されたレスポンス・ヘッダーには、生成されたスパンIDが含まれますが、バックエンド・サービスに送信されたヘッダーにはスパンIDが含まれません。

  • スパンIDなどのクライアント提供の3番目のセグメントは、伝播では無視されます。

opc-request-id解析の理解

APIゲートウェイは、受信したopc-request-id値をスラッシュ(/)文字で最大3つの部分に分割します。解析された最初の2つのパーツを使用し、3番目のパーツを無視します。

APIゲートウェイは、解析されたパートを次のように解釈します。

  • 第1部:顧客ID。

  • 2番目の部分:トレースID。

  • 3番目の部分:無視された値。

その後、APIゲートウェイによってリクエストのスパンIDが生成され、次の値が構築されます:

  • クライアントに返されたレスポンス・ヘッダー: customerId/traceId/spanId

  • バックエンド・サービスに送信されるリクエスト・ヘッダー: customerId/traceId

APIゲートウェイ・ログを検索する場合は、完全なレスポンス・ヘッダー値を使用します。バックエンド・ログを検索する場合は、2つの部分からなるダウンストリーム値を使用します。

共通入力パターンのレビュー

これらの例を使用して、APIゲートウェイが共通のopc-request-id値をどのように変更するかを理解します。

opc-request-idヘッダーなし

クライアントがopc-request-idヘッダーを送信しない場合、APIゲートウェイはトレースIDとスパンIDを生成します。顧客IDが空です。

結果の値の形式は次のとおりです。

  • クライアント・レスポンス・ヘッダー: /<generated-trace-id>/<generated-span-id>

  • バックエンド・リクエスト・ヘッダー: /<generated-trace-id>

1つのセグメント: abcdef

クライアントが次のヘッダーを送信すると、API Gatewayは値を顧客IDとして扱います。

opc-request-id: abcdef

解釈される値は次のとおりです。

  • 顧客ID: abcdef

  • トレースID: APIゲートウェイによって生成されます。

  • スパンID: APIゲートウェイによって生成されます。

結果の値の形式は次のとおりです。

  • クライアント・レスポンス・ヘッダー: abcdef/<generated-trace-id>/<generated-span-id>

  • バックエンド・リクエスト・ヘッダー: abcdef/<generated-trace-id>

先頭のスラッシュ: /abcdef

クライアントが次のヘッダーを送信すると、API Gatewayはスラッシュの後に値をトレースIDとして扱います。

opc-request-id: /abcdef

解釈される値は次のとおりです。

  • 顧客ID:空。

  • トレースID: abcdef

  • スパンID: APIゲートウェイによって生成されます。

結果の値の形式は次のとおりです。

  • クライアント・レスポンス・ヘッダー: /abcdef/<generated-span-id>

  • バックエンド・リクエスト・ヘッダー: /abcdef

先頭のスラッシュは、顧客ID部分が空であるため、値の意味を変更します。

2つのセグメント: customer/trace

クライアントが次のヘッダーを送信する場合、APIゲートウェイは指定された両方の部分を使用します:

opc-request-id: customer/trace

解釈される値は次のとおりです。

  • 顧客ID: customer

  • トレースID: trace

  • スパンID: APIゲートウェイによって生成されます

結果の値の形式は次のとおりです。

  • クライアント・レスポンス・ヘッダー: customer/trace/<generated-span-id>

  • バックエンド・リクエスト・ヘッダー: customer/trace

3つのセグメント: customer/trace/span

クライアントが次のヘッダーを送信すると、APIゲートウェイは3番目のセグメントを無視し、新しいスパンIDを生成します。

opc-request-id: customer/trace/span

解釈される値は次のとおりです。

  • 顧客ID: customer

  • トレースID: trace

  • 3番目のセグメント:無視されます。

  • スパンID: APIゲートウェイによって生成されます。

結果の値の形式は次のとおりです。

  • クライアント・レスポンス・ヘッダー: customer/trace/<generated-span-id>

  • バックエンド・リクエスト・ヘッダー: customer/trace

クライアント指定のスパン値は保持されません。

3つ以上のセグメント: customer/trace/span/extra

クライアントが次のヘッダーを送信した場合でも、APIゲートウェイは最初の2つのセグメントのみを使用します。

opc-request-id: customer/trace/span/extra

解釈される値は次のとおりです。

  • 顧客ID: customer

  • トレースID: trace

2番目のスラッシュの後にあるすべてのコンテンツは、伝播のために無視されます。

結果の値の形式は次のとおりです。

  • クライアント・レスポンス・ヘッダー: customer/trace/<generated-span-id>

  • バックエンド・リクエスト・ヘッダー: customer/trace

要求ID値の比較

テスト・リクエストを送信し、次の場所にあるopc-request-id値を比較します。

  • クライアントが送信するヘッダー値。

  • APIゲートウェイがクライアントに返すレスポンス・ヘッダー値。

  • バックエンド・サービスがAPIゲートウェイから受信するリクエスト・ヘッダー値。

たとえば、既知のopc-request-id値を含むリクエストを送信します。

curl -i https://<gateway-hostname>/<deployment-path-prefix>/<api-route-path> \
-H "opc-request-id: <your-request-id>"

少なくとも次の値をテストします。

  • opc-request-idヘッダーがありません。

  • opc-request-id: abcdef.

  • opc-request-id: /abcdef.

  • opc-request-id: customer/trace.

  • opc-request-id: customer/trace/span.

ログ・エントリのレビュー

APIゲートウェイのアクセス・ログおよび実行ログを検索する場合は、クライアント・レスポンス・ヘッダーに返される完全なopc-request-id値を使用します。

次のログ・エントリを確認します。

  • リクエストのAPIゲートウェイ・アクセス・ログ・エントリ。

  • リクエストのAPIゲートウェイ実行ログ・エントリ。

  • 転送されたリクエストのバックエンド・ログ・エントリ。

APIゲートウェイがクライアントに返すのと同じフル値をバックエンド・サービスがログに記録するとはかぎりません。バックエンド・サービスは、クライアントに表示可能な形式customerId/traceId/spanIdではなく、ダウンストリーム形式customerId/traceIdを受け取ります。

相関問題の修正

相関の問題を回避するには、次の演習を使用します。

  • クライアント提供のopc-request-id値をスラッシュ(/)で開始しないでください。ただし、空の顧客IDと明示的なトレースIDが必要な場合を除きます。

  • 保持されるクライアント提供の3番目のセグメントに依存しないでください。

  • バックエンド・サービスまたはAPMツールで単一の不透明な相関文字列が想定される場合は、その相関値に別のアプリケーション・ヘッダーを使用します。

  • APIゲートウェイのログ相関には、クライアントが表示可能な完全なレスポンス・ヘッダー値を使用します。

  • バックエンド・ログをチェックする場合は、2つの部分からなるダウンストリーム値を使用します。

リクエストID相関の検証

リクエスト・フォーマットまたは相関戦略を更新した後、結果を確認します:

  • 同じ要求を再度送信します。

  • opc-request-idレスポンス・ヘッダーに必要な構造があることを確認します。

  • アクセス・ログおよび実行ログに同じリクエストがあることを確認します。

  • バックエンド・サービスが、予想される2つの部分からなるopc-request-id値を受け取ることを確認します。

  • APMツールまたはバックエンド・ログ・パーサーで、レスポンス・ヘッダー値とダウンストリーム・リクエスト値が同一である必要がないことを確認します。

詳細情報

詳細は、次を参照してください: