Antipattern: API proxy'sinde MessageLogging politikasını birden çok kez çağırma

Apigee Edge belgelerini görüntülüyorsunuz.
Apigee X belgelerine gidin.
bilgi

Apigee Edge'in MessageLogging politikası, API Proxy geliştiricilerinin özel mesajları sistem günlüğüne veya diske kaydetmesini sağlar (Edge for Private Cloud yalnızca). Giriş parametreleri, istek yükü, yanıt kodu, hata mesajları (varsa) vb. API isteğiyle ilgili tüm önemli bilgiler daha sonra başvurmak veya hata ayıklama amacıyla günlüğe kaydedilebilir. Politika, günlük kaydını gerçekleştirmek için bir arka plan işlemi kullansa da politikanın kullanılmasıyla ilgili uyarılar vardır.

Antipattern

MessageLogging politikası, bir API isteği hakkında daha fazla bilgi almak ve API isteğiyle ilgili karşılaşılan sorunları gidermek için etkili bir yol sağlar. Ancak aynı MessageLogging politikasını birden fazla kez kullanmak veya birden fazla MessageLogging politikasının, PostClientFlow dışındaki akışlarda aynı API proxy'sindeki parçalara veri kaydetmesini sağlamak olumsuz sonuçlara yol açabilir. Bunun nedeni, Apigee Edge'in MessageLogging politikası için harici bir sistem günlüğü sunucusuna bağlantı açmasıdır. Politika, TCP üzerinden TLS kullanıyorsa TLS bağlantısı kurmanın ek yükü olur.

Bunu örnek bir API Proxy'sinin yardımıyla açıklayalım.

API proxy'si

Aşağıdaki örnekte, İstek akışına "LogRequestInfo" adlı bir MessageLogging politikası yerleştirilmiş ve Yanıt akışına "LogResponseInfo" adlı başka bir MessageLogging politikası eklenmiştir. Her ikisi de ProxyEndpoint PreFlow'dadır. LogRequestInfo politikası, API proxy'si isteği alır almaz arka planda yürütülür ve LogResponseInfo politikası, proxy hedef sunucudan yanıt aldıktan sonra ancak proxy, API istemcisine yanıt döndürmeden önce yürütülür. Oluşturulma olasılığı olan iki TLS bağlantısı olduğundan, bu işlem ek sistem kaynakları tüketir.

Ayrıca, yalnızca API proxy'sinin yürütülmesi sırasında hata oluştuğunda yürütülen "LogErrorInfo" adlı bir MessageLogging politikası vardır.

<?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>

Message Logging politikası

Aşağıdaki örnek politika yapılandırmalarında veriler, TCP üzerinden TLS kullanılarak üçüncü taraf günlük sunucularına kaydedilmektedir. Aynı API proxy'sinde bu politikalardan birden fazlası kullanılırsa TLS bağlantıları oluşturma ve yönetmenin ek yükü, ek sistem belleğini ve CPU döngülerini işgal ederek geniş ölçekte performans sorunlarına yol açabilir.

LogRequestInfo politikası

<?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 politikası

<?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 politikası

<?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>

Etki

  • API Proxy akışı sırasında günlük sunucularıyla birden çok kez bağlantı kurulmasından dolayı artan ağ ek yükü.
  • Sistem günlüğü sunucusu yavaşsa veya birden fazla sistem günlüğü çağrısının neden olduğu yüksek hacimleri kaldıramıyorsa mesaj işlemcisi üzerinde tekrar baskı yaratarak isteğin işlenmesinin yavaş olmasına ve yüksek gecikme ya da 504 Ağ Geçidi Zaman Aşımı hatalarına neden olabilir.
  • Dosya günlük kaydının kullanıldığı Private Cloud kurulumlarında mesaj işleyici tarafından açılan eşzamanlı dosya tanımlayıcısı sayısında artış.
  • MessageLogging politikası PostClient akışı dışındaki akışlara yerleştirilirse bu politika yürütülmeden önce hata oluşursa MessageLogging politikası yürütülmeyeceği için bilgiler günlüğe kaydedilemeyebilir.

    Önceki ProxyEndpoint örneğinde, bilgiler aşağıdaki durumlarda günlüğe kaydedilmez:

    • İstek akışında LogRequestInfo politikasının önüne eklenen politikalardan herhangi biri başarısız olursa.
      veya
    • Hedef sunucu herhangi bir hatayla (HTTP 4XX, 5XX) başarısız olursa. Bu durumda, başarılı bir yanıt döndürülmediğinde LogResponseInfo politikası yürütülmez.

    Her iki durumda da LogErrorInfo politikası çalıştırılır ve yalnızca hatayla ilgili bilgiler günlüğe kaydedilir.

En iyi uygulama

  • Günlüğe kaydedilecek tüm akış değişkenlerini ayarlamak için bir ExtractVariables politikası veya JavaScript politikası kullanın. Böylece, bunları MessageLogging politikasında kullanabilirsiniz.
  • Koşulsuz olarak yürütülen gerekli tüm verileri PostClientFlow'a kaydetmek için tek bir MessageLogging politikası kullanın.
  • Mesajların sistem günlüğü sunucusuna garantili olarak teslim edilmesinin gerekli olmadığı ve TLS/SSL'nin zorunlu olmadığı UDP protokolünü kullanın.

MessageLogging politikası, hata işleme dahil olmak üzere gerçek API işlevinden ayrılacak şekilde tasarlanmıştır. Bu nedenle, istek/yanıt işlemenin dışında olan PostClientFlow'da çağrılması, API'nin başarısız olup olmamasına bakılmaksızın verileri daima günlüğe kaydedeceği anlamına gelir.

PostClientFlow'da MessageLogging Politikası'nın çağrılmasına dair bir örnek:

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

Tüm verileri günlüğe kaydeden bir MessageLogging politikası (LogInfo) örneğini burada bulabilirsiniz:

<?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>

Hata Akışı sonrasında PostClientFlow'da yanıt değişkenleri kullanılamadığından, ExtractVariables veya JavaScript politikalarını kullanarak woeid ve weather.response* değişkenlerinin açıkça ayarlanması önemlidir.

Daha fazla bilgi