Antipattern:在 API Proxy 中多次叫用 MessageLogging 政策

查看 Apigee Edge 說明文件。
前往 Apigee X說明文件
資訊

Apigee Edge 的 MessageLogging 政策可讓 API Proxy 開發人員將自訂訊息記錄到 syslog 或磁碟至磁碟 (僅限 Private Cloud 的 Edge)。任何與 API 相關的重要資訊 要求,例如輸入參數、要求酬載、回應代碼、錯誤訊息 (如果有的話) 依此類推,您可以記錄以供日後參考或進行偵錯。雖然政策使用 背景程序執行記錄,使用政策時必須注意一些事項。

反模式

MessageLogging 政策能讓您有效地取得更多有關 API 要求,並對 API 要求遇到的任何問題進行偵錯。 不過,使用相同 MessageLogging 政策超過一次或多項政策 MessageLogging 政策會在與 PostClientFlow 可能會產生不良影響。這是因為 Apigee Edge 開啟了連線 傳送至外部系統記錄伺服器以安裝 MessageLogging 政策。 如果政策透過 TCP 使用傳輸層安全標準 (TLS),建立 TLS 連線會產生額外負荷。

讓我們使用範例 API Proxy 來說明這一點。

API Proxy

在以下範例中,名為「LogRequestInfo」的 MessageLogging 政策放置於 要求流程,以及另一項名為「LogResponseInfo」的 MessageLogging 政策會新增至 回應流程。兩者都在 ProxyEndpoint PreFlow 中。系統會執行 LogRequestInfo 政策 API Proxy 收到要求後立即在背景寫入,而 LogResponseInfo 政策會在 Proxy 收到目標伺服器的回應「之後」執行 但「之前」,Proxy 會將回應傳回 API 用戶端。這會消耗 可能還有兩個 TLS 連線,進而建立了額外的系統資源。

此外,還有一項名為「LogErrorInfo」的 MessageLogging 政策只會執行 在 API Proxy 執行期間發生錯誤。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ProxyEndpoint name="default">
  ...
<FaultRules>
    <FaultRule name="fault-logging">
        <Step>
            <Name>LogErrorInfo</Name>
        </Step>
    </FaultRule>
</FaultRules>
<PreFlow name="PreFlow">
    <Request>
      <Step>
        <Name>LogRequestInfo</Name>
      </Step>
    </Request>
  </PreFlow>
  <PreFlow name="PreFlow">
    <Response>
      <Step>
        <Name>LogResponseInfo</Name>
      </Step>
    </Response>
  </PreFlow>
  ...
</ProxyEndpoint>

訊息記錄政策

下列政策設定範例會將資料記錄到第三方 記錄伺服器如果在同一 API Proxy 中使用了多項政策, 建立及管理 TLS 連線的負擔 系統記憶體和 CPU 週期,造成大規模效能問題。

LogRequestInfo 政策

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<MessageLogging name="LogRequestInfo">
  <Syslog>
    <Message>[3f509b58 tag="{organization.name}.{apiproxy.name}.{environment.name}"] Weather request for WOEID {request.queryparam.w}.</Message>
    <Host>logs-01.loggly.com</Host>
    <Port>6514</Port>
    <Protocol>TCP</Protocol>
    <FormatMessage>true</FormatMessage>
    <SSLInfo>
        <Enabled>true</Enabled>
    </SSLInfo>
  </Syslog>
  <logLevel>INFO</logLevel>
</MessageLogging>

LogResponseInfo 政策

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<MessageLogging name="LogResponseInfo">
  <Syslog>
    <Message>[3f509b58 tag="{organization.name}.{apiproxy.name}.{environment.name}"] Status: {response.status.code}, Response {response.content}.</Message>
    <Host>logs-01.loggly.com</Host>
    <Port>6514</Port>
    <Protocol>TCP</Protocol>
    <FormatMessage>true</FormatMessage>
    <SSLInfo>
        <Enabled>true</Enabled>
    </SSLInfo>
  </Syslog>
  <logLevel>INFO</logLevel>
</MessageLogging>

LogErrorInfo 政策

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<MessageLogging name="LogErrorInfo">
  <Syslog>
    <Message>[3f509b58 tag="{organization.name}.{apiproxy.name}.{environment.name}"] Fault name: {fault.name}.</Message>
    <Host>logs-01.loggly.com</Host>
    <Port>6514</Port>
    <Protocol>TCP</Protocol>
    <FormatMessage>true</FormatMessage>
    <SSLInfo>
        <Enabled>true</Enabled>
    </SSLInfo>
  </Syslog>
  <logLevel>ERROR</logLevel>
</MessageLogging>

影響

  • 多次建立與記錄檔伺服器的連線,導致網路負擔增加 作業時間。
  • 如果系統記錄伺服器速度緩慢,或無法處理多個系統記錄造成的龐大流量 呼叫而導致訊息處理器的壓力,導致要求速度變慢 並可能出現高延遲或 504 閘道逾時錯誤
  • 增加訊息處理工具開啟的並行檔案描述元數量 使用檔案記錄功能的私有雲設定。
  • 如果 MessageLogging 政策是在 PostClient 流程以外的流程中, 由於 MessageLogging 政策不會記錄這些資訊, 如果政策執行前發生任何失敗,則會執行。

    上述的 ProxyEndpoint 範例,資訊會 下列情況不會記錄任何事件:

    • 如果 LogRequestInfo 政策前面放置任何政策 要求流程失敗
    • 如果目標伺服器發生任何錯誤 (HTTP 4XX、5XX)。在此情況下 系統不會傳回成功的回應,因此 LogResponseInfo 政策不會 執行。

    這兩種情況都會執行 LogErrorInfo 政策,只記錄錯誤相關 可能不準確或不適當

最佳做法

  • 使用 ExtractVariables 政策JavaScript 政策設定所有流程 要記錄的變數,以便用於 MessageLogging 政策。
  • 使用單一 MessageLogging 政策將所有必要資料記錄到 PostClientFlow, 容器能在無條件下執行
  • 使用 UDP 通訊協定,因為保證將訊息傳送至系統記錄伺服器 而且不一定要使用 TLS/SSL。

MessageLogging 政策旨在與實際的 API 功能分離, 包括錯誤處理機制因此,在 PostClientFlow (位於外部的 PostClientFlow) 中叫用 要求/回應處理的資料,意指無論 API 是否失敗

以下是在 PostClientFlow 叫用 MessageLogging 政策的範例:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 ...
<PostClientFlow>
        <Request/>
        <Response>
            <Step>
                <Name>LogInfo</Name>
            </Step>
        </Response>
</PostClientFlow>
 ...

以下是記錄所有資料的 MessageLogging 政策範例:LogInfo:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<MessageLogging name="LogInfo">
  <Syslog>
    <Message>[3f509b58 tag="{organization.name}.{apiproxy.name}.{environment.name}"] Weather request for WOEID {woeid} Status: {weather.response.code}, Response {weather.response}, Fault: {fault.name:None}.</Message>
    <Host>logs-01.loggly.com</Host>
    <Port>6514</Port>
    <Protocol>TCP</Protocol>
    <FormatMessage>true</FormatMessage>
    <SSLInfo>
        <Enabled>true</Enabled>
    </SSLInfo>
  </Syslog>
  <logLevel>INFO</logLevel>
</MessageLogging>

由於 回應 錯誤流程發生後,PostClientFlow 中不會有變數。請務必 以便明確設定 woeidweather.response* 變數 擷取變數或 JavaScript 政策。

延伸閱讀