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

Apigee Edge belgelerini görüntülüyorsunuz.
. Git: Apigee X belgeleri.
bilgi

Apigee Edge'in MessageLogging politikası, API Proxy geliştiricilerinin disk günlüğüne veya diske (yalnızca Private Cloud için Edge) ekleyin. API ile ilgili tüm önemli bilgiler Örneğin, giriş parametreleri, istek yükü, yanıt kodu, hata mesajları (varsa), gibi dosyalar daha sonra başvurmak veya hata ayıklamak için günlüğe kaydedilebilir. Politikada arka planda işlem yapması gerekiyorsa politikanın kullanımıyla ilgili uyarılar vardır.

Antipattern

MessageLogging politikası, bir API isteği gönderme ve API isteğinde karşılaşılan sorunları ayıklama. Ancak, aynı MessageLogging politikasını bir defadan fazla kullanmak veya birden fazla MessageLogging politikaları, verileri PostClientFlow olumsuz sonuçlar doğurabilir. Bunun nedeni, Apigee Edge'in MessageLogging politikası için harici bir sistem günlüğü sunucusuna gönderir. Politika, TCP üzerinden TLS kullanıyorsa TLS bağlantısı kurma için ek yük gerekir.

Örnek bir API Proxy'si ile bunu açıklayalım.

API proxy'si

Aşağıdaki örnekte, "LogRequestInfo" adlı bir MessageLogging politikası etiketi, İstek akışı ve "LogResponseInfo" adlı başka bir MessageLogging politikası parametresi Yanıt akışı. Her ikisi de ProxyEndpoint PreFlow'dadır. LogRequestInfo politikası, API proxy'si isteği alır almaz arka planda çalışır ve LogResponseInfo politika, proxy hedef sunucudan bir yanıt aldıktan sonra yürütülür ancak proxy, API istemcisine yanıtı döndürmeden önce. Bu öğe, tüketecek potansiyel olarak iki TLS bağlantısı kurulmakta olduğundan ek sistem kaynakları kullanır.

Ayrıca, "LogErrorInfo" adlı bir MessageLogging politikası da vardır. yalnızca uygulanan API proxy'si yürütülürken hata olursa.

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

Mesaj Kaydı politikası

Aşağıdaki örnek politika yapılandırmalarında, veriler üçüncü tarafa kaydedilmektedir günlük sunucularının etkinliklerini ifade eder. Aynı API proxy'sinde bu politikalardan birden fazlası kullanılıyorsa TLS bağlantıları kurmanın ve yönetmenin ek yükü, Bu da geniş ölçekte performans sorunlarına yol açıyor.

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

  • Birden çok günlük sunucusuyla bağlantı kurulması nedeniyle artan ağ ek yükü kez kontrol edin.
  • Sistem günlüğü sunucusu yavaşsa veya birden fazla sistem günlüğünün neden olduğu yüksek hacmi işleyemiyorsa çağrısı yapıldığında, mesaj işlemcisi üzerinde geri baskıya neden olarak isteklerin yavaşlamasına neden olur. işleme ve potansiyel olarak yüksek gecikme veya 504 Ağ Geçidi Zaman Aşımı hataları.
  • Şu modda mesaj işlemcisi tarafından açılan eşzamanlı dosya tanımlayıcılarında artış Dosya günlük kaydının kullanıldığı Private Cloud kurulumları.
  • MessageLogging politikası PostClient akışı dışındaki akışlara yerleştirilirse bir veya MessageLogging politikası devreye girmediğinden, bilgilerin günlüğe kaydedilmemesine bu politika yürütülmeden önce herhangi bir hata oluşursa yürütülmelidir.

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

    • [ istek akışı başarısız olur.
      . veya
    • Hedef sunucu herhangi bir hatayla başarısız olursa (HTTP 4XX, 5XX). Böyle bir durumda başarılı bir yanıt döndürülmezse LogResponseInfo politikası başlar.

    Her iki durumda da, LogErrorInfo politikası yürütülür ve yalnızca hatayla ilgili ekleyebilirsiniz.

En iyi uygulama

  • Tüm akışı ayarlamak için bir ExtractVariables politikası veya JavaScript politikası kullanın. değişkenlerini belirler. Böylece, bu değişkenler MessageLogging politikası için kullanılabilir.
  • Tek bir MessageLogging politikası kullanarak gerekli tüm verileri PostClientFlow'a kaydetmek koşulsuz olarak yürütülür.
  • Sistem günlüğü sunucusuna teslim garantisinin sağlanmadığı UDP protokolünü kullanın. gerekir ve TLS/SSL zorunlu değildir.

MessageLogging politikası, gerçek API işlevinden ayrılacak şekilde tasarlanmıştır. hata işleme dahil. Bu nedenle, dosyayı ilkesine göre, sonuçlardan bağımsız olarak her zaman kontrol edebilirsiniz.

PostClientFlow'da MessageLogging Politikası'nın çağrılmasına ilişkin bir örnek aşağıda verilmiştir:

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

Çünkü yanıt değişkenleri bir Hata Akışı sonrasında PostClientFlow'da kullanılamaz; kullanarak woeid ve weather.response* değişkenlerini açıkça ayarlamak için ExtractVariables veya JavaScript politikaları.

Daha fazla bilgi