アンチパターン: 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 を実装しないように注意する必要があります。

関連情報