アンチパターン: JavaScript ポリシーを使用してデータをサードパーティ製サーバーに記録する

ロギングは、問題をデバッグするための効果的な手段の 1 つです。ヘッダー、フォーム パラメータ、クエリ パラメータ、動的変数など、API リクエストに関連する情報はすべてログに記録し、後から見返すことができます。情報は Message Processor にローカルに記録することも(Apigee Edge for Private Cloud のみ)、Sumo Logic、Splunk、Loggly といったサードパーティ製サーバーに記録することもできます。

アンチパターン

次のコードでは、JavaScript ポリシーhttpClient オブジェクトを使用して、データを Sumo Logic サーバーに記録します。つまり、リクエスト / レスポンスの処理中に、プロセスのロギングが実際に行われます。結果的に、処理時間が長くなり、全体的なレイテンシが大きくなるため、このような方法は非生産的です。

LogData_JS:

<!-- /antipatterns/examples/1-4.xml -->
    <Javascript async="false" continueOnError="false" enabled="true" timelimit="2000" name="LogData_JS">
      <DisplayName>LogData_JS</DisplayName>
      <ResourceURL>jsc://LogData.js</ResourceURL>
    </Javascript>
    

LogData.js:

<!-- /antipatterns/examples/1-5.xml -->
    var sumoLogicURL = "...";
    httpClient.send(sumoLogicURL);
    waitForComplete();
    

ここでの問題の原因は、waitForComplete() の呼び出しです。これにより、ロギング プロセスが完了するまで、呼び出し元の操作が停止されます。これを有効なパターンにするには、この呼び出しを削除して、ロギング プロセスを非同期に行います。

影響

  • JavaScript ポリシー経由でロギングコードを実行すると、API リクエストのレイテンシが増大します。
  • 同時リクエストによって Message Processor のリソースに負担がかかり、他のリクエストの処理に悪影響が及ぶ可能性があります。

ベスト プラクティス

  • MessageLogging ポリシーを使用して、ログサーバー、またはサードパーティ製ログ管理サービス(Sumo Logic、Splunk、Loggly など)にデータを移行または記録します。
  • Message Logging ポリシーの最大の利点は、このポリシーを Post Client フロー内で定義できることです。この結果、リクエスト元のクライアント アプリにレスポンスが返された後でポリシーが実行されます。
  • このポリシーを Post Client フロー内で定義することで、ロギング アクティビティとリクエスト / レスポンス処理とを分離でき、レイテンシの発生を回避できます。
  • なんらかの要件や理由があり、上述した Post Client フローを使用せず、JavaScript 経由でロギングを行う場合は、ロギングを非同期に実行する必要があります。つまり、httpClient オブジェクトを使用する場合は、JavaScript に waitForComplete実装しないように注意する必要があります。

関連情報