ロギングは、問題をデバッグするための効果的な手段の 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
を実装しないように注意する必要があります。