502 Gateway Buruk - DekompresiFailureAtResponse

Anda sedang melihat dokumentasi Apigee Edge.
Buka Dokumentasi Apigee X.
info

Gejala

Aplikasi klien mendapatkan kode status HTTP 502 Bad Gateway dengan kode error messaging.adaptors.http.flow.DecompressionFailureAtResponse sebagai respons terhadap API panggilan telepon.

Pesan error

Aplikasi klien mendapatkan kode respons berikut:

HTTP/1.1 502 Bad Gateway

Selain itu, Anda mungkin melihat pesan error yang mirip dengan yang ditampilkan di bawah ini:

{
   "fault":{
      "faultstring":"Decompression failure at response",
      "detail":{
         "errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtResponse"
      }
   }
}

Kemungkinan penyebab

Error ini hanya terjadi jika:

  • Encoding yang ditentukan dalam header respons HTTP (dari server backend/target) Content-Encoding valid dan didukung oleh Apigee Edge,
  • TETAPI

  • Format payload yang dikirim oleh server backend/target sebagai bagian dari respons HTTP tidak cocok dengan format encoding yang ditentukan di header Content-Encoding

Hal ini karena Apigee Edge gagal mendekode payload menggunakan encoding yang ditentukan karena format payload tidak dalam format yang sama dengan encoding yang ditentukan dalam Header Content-Encoding.

Berikut adalah beberapa contoh nilai Content-Encoding yang didukung dan cara Apigee Edge mengharapkan representasi payload dalam kasus tersebut:

Skenario Content-Encoding Representasi payload
Encoding Tunggal gzip

Format gzip Unix.

Lihat Format GZIP RFC1952.

Encoding Tunggal mengempiskan

Format ini menggunakan struktur zlib dengan algoritma kompresi deflate.

Lihat RFC1950 dan RFC1951.

Beberapa Encoding

Beberapa Encoding

Misalnya, jika encoding dilakukan dua kali, hal ini bisa berupa:

  • gzip, deflate
  • gzip, gzip
  • deflate, gzip
  • mengempis, mengempis
Beberapa encoding diterapkan ke payload dalam urutan tertentu seperti yang muncul di header.

Kemungkinan penyebab error ini adalah sebagai berikut:

Penyebab Deskripsi Petunjuk pemecahan masalah berlaku untuk
Format payload respons tidak cocok dengan Content-Encoding Format payload respons yang dikirim server backend/target adalah tidak dienkode atau tidak cocok dengan encoding yang ditentukan dalam header Content-Encoding. Pengguna Edge Public dan Private Cloud

Langkah-langkah diagnosis umum

Gunakan salah satu alat/teknik berikut untuk mendiagnosis error ini:

Pemantauan API

Untuk mendiagnosis error menggunakan Pemantauan API:

  1. Login ke UI Apigee Edge sebagai pengguna dengan peran yang sesuai.
  2. Beralihlah ke organisasi tempat Anda ingin menyelidiki masalah tersebut.

  3. Buka Analyze > Pemantauan API > Investigasi.
  4. Pilih jangka waktu tertentu saat Anda melihat error.
  5. Pastikan filter Proxy disetel ke Semua.
  6. Gambarkan Kode Kesalahan terhadap Waktu.
  7. Pilih sel yang memiliki kode kesalahan messaging.adaptors.http.flow.DecompressionFailureAtResponse sebagai yang ditampilkan di bawah ini:

    ( lihat gambar yang lebih besar)

  8. Informasi tentang kode kesalahan messaging.adaptors.http.flow.DecompressionFailureAtResponse ditampilkan seperti yang ditunjukkan di bawah ini:

    ( lihat gambar yang lebih besar)

  9. Klik View logs dan luaskan baris yang gagal dengan error 502.

    ( lihat gambar yang lebih besar)

  10. Dari jendela Logs, perhatikan detail berikut:
    • Kode Status: 502
    • Sumber Kesalahan: target
    • Kode Kesalahan: messaging.adaptors.http.flow.DecompressionFailureAtResponse.
  11. Jika Fault Source memiliki nilai target, hal ini menunjukkan bahwa format {i>payload <i}respons tidak sesuai dengan encoding yang didukung yang ditentukan di header respons server backend Content-Encoding.

Alat rekaman aktivitas

Untuk mendiagnosis error menggunakan alat Trace:

  1. Mengaktifkan sesi rekaman aktivitas dan:
    1. Tunggu hingga error 502 Bad Gateway terjadi, atau
    2. Jika Anda dapat mereproduksi masalah, lakukan panggilan API dan rekonstruksi 502 Bad Gateway.
  2. Pastikan Tampilkan semua FlowInfos diaktifkan:

  3. Pilih salah satu respons yang gagal dan periksa rekaman aktivitasnya.
  4. Menavigasi melalui berbagai fase pelacakan dan menemukan letak kegagalan terjadi.
  5. Anda biasanya akan menemukan kesalahan dalam alur tepat setelah Respons Diterima dari server target sebagaimana ditunjukkan di bawah ini:

    ( lihat gambar yang lebih besar)

  6. Perhatikan nilai properti dari rekaman aktivitas:

    • Encoding Konten: gzip
    • Isi Konten Respons: {"fault":{"faultstring":"Decompression failure at response","detail":{"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtResponse"}}}
  7. Buka fase error tepat setelah pesan Respons Diterima dari server target fase:

    ( lihat gambar yang lebih besar)

    Perhatikan properti:

    • error: Decompression failure at response
    • error.class: com.apigee.errors.http.server.BadGateway
    • error.cause: Not in GZIP format

      error.cause menyatakan bahwa payload respons tidak dalam format GZIP. Ini berarti bahwa Apigee Edge mengharapkan payload respons dalam format GZIP sebagai ditentukan dalam header Content-Encoding (ditentukan di bagian sebelumnya langkah).Oleh karena itu, Apigee Edge tidak dapat mendekompresi payload menggunakan gzip dan menampilkan kesalahan Decompression failure at response.

    Perhatikan bahwa respons dari server target/backend adalah 200 dalam case; Namun, aplikasi klien akan menerima 502 karena error ditampilkan oleh Apigee Edge.

  8. Buka fase Response Sent to Client dalam trace, lalu klik.

    ( lihat gambar yang lebih besar)

    Perhatikan detail berikut dari rekaman aktivitas:

    • Kode status: 502 Bad Gateway.
    • Konten Error: {"fault":{"faultstring":"Decompression failure at response","detail":{"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtResponse"}}}
  9. Buka fase AX (Data Analytics Direkam) di rekaman aktivitas lalu klik tombol tersebut.

  10. Scroll ke bawah ke bagian Detail Fase, Header Error, dan tentukan nilai X-Apigee-fault-code dan X-Apigee-fault-source sebagaimana ditunjukkan di bawah ini:

    ( lihat gambar yang lebih besar)

  11. Anda akan melihat nilai X-Apigee-fault-code dan X-Apigee-fault-source sebagai messaging.adaptors.http.flow.DecompressionFailureAtResponse dan target, yang menunjukkan bahwa format payload respons tidak cocok dengan encoding yang ditentukan dalam header Content-Encoding.
    Header respons Nilai
    X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtResponse
    X-Apigee-fault-source target

NGINX

Untuk mendiagnosis error menggunakan log akses NGINX:

  1. Jika Anda adalah pengguna Private Cloud, Anda dapat menggunakan log akses NGINX untuk menentukan informasi penting tentang error 502 HTTP.
  2. Periksa log akses NGINX:

    /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

    Di mana: ORG, ENV, dan PORT# diganti dengan nilai sebenarnya.

  3. Telusuri untuk mengetahui apakah terdapat error 502 selama durasi tertentu atau tidak (jika masalah terjadi di masa lalu) atau jika ada tanggapan yang masih gagal 502.
  4. Jika Anda menemukan error 502 dengan X-Apigee-fault-code cocok dengan nilai messaging.adaptors.http.flow.DecompressionFailureAtResponse, lalu tentukan nilai X-Apigee-fault-source.

    Contoh error 502 dari log akses NGINX:

    Contoh entri di atas dari log akses NGINX memiliki nilai berikut untuk X-Apigee-fault-code dan X-Apigee-fault-source:

    Header respons Nilai
    X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtResponse
    X-Apigee-fault-source target

Penyebab: Format payload respons tidak cocok dengan Content-Encoding

Secara default, Apigee Edge selalu mendekompresi payload jika header respons Content-Encoding berisi valid dan encoding yang didukung. Oleh karena itu, format payload respons diharapkan harus cocok dengan encoding yang ditentukan dalam header respons Content-Encoding. Jika ada ketidakcocokan, Anda akan mendapatkan error ini.

Diagnosis

  1. Tentukan Kode Kesalahan dan Sumber Kesalahan untuk error yang diamati menggunakan API Log akses Monitoring, Trace, atau NGINX seperti yang dijelaskan dalam Langkah-langkah diagnosis umum.
  2. Jika Kode Kesalahan tersebut adalah messaging.adaptors.http.flow.DecompressionFailureAtResponse dan Sumber Kesalahan memiliki nilai target, maka menunjukkan bahwa format payload respons yang dikirim oleh server backend/target tidak sesuai dengan encoding yang didukung yang ditentukan dalam header respons Content-Encoding.
  3. Anda dapat menentukan ketidakcocokan ini sebagai bagian dari respons HTTP menggunakan salah satu metode:

    Pesan error

    Untuk memvalidasi menggunakan pesan error:

    1. Jika Anda memiliki akses ke pesan error lengkap yang diterima dari Apigee Edge, lihat faultstring.

      Contoh pesan error:

      "faultstring":"Decompression failure at response"
      
    2. Dalam pesan {i>error<i} di atas, "Decompression failure at response" yang menyiratkan bahwa respons tidak dapat didekompresi menggunakan encoding yang ditentukan dalam Header Content-Encoding.

    Trace

    Untuk memvalidasi menggunakan Trace:

    1. Tentukan Content-Type dan error.Cause menggunakan Trace seperti yang dijelaskan dalam Langkah-langkah diagnosis umum.
    2. Nilai dari trace contoh adalah sebagai berikut:

      • Encoding Konten: gzip
      • error.cause: Not in GZIP format

      Nilai di header respons Content-Encoding adalah gzip; tetapi, payload respons tidak dalam format GZIP (seperti yang ditunjukkan oleh error.cause). Oleh karena itu, Apigee Edge merespons dengan 502 Bad Gateway dan kode error messaging.adaptors.http.flow.DecompressionFailureAtResponse.

    Permintaan sebenarnya

    Untuk memvalidasi menggunakan permintaan yang sebenarnya:

    Jika Anda memiliki akses ke permintaan sebenarnya yang dibuat ke server target/backend aplikasi, lalu lakukan langkah-langkah berikut:

    1. Jika Anda adalah pengguna Public Cloud/Private Cloud, buat permintaan langsung ke server backend dari server backend itu sendiri atau komputer tempat Anda diizinkan membuat permintaan ke server backend.
    2. Jika Anda adalah pengguna Private Cloud, Anda juga dapat membuat permintaan ke server backend dari salah satu Pemroses Pesan.
    3. Periksa respons yang dikirim oleh server backend dan tentukan nilainya diteruskan di header respons Content-Encoding.
    4. Tentukan format payload yang dikirim sebagai bagian dari permintaan.
    5. Jika nilai header Content-Encoding ada dalam daftar encoding yang didukung, tetapi format payload respons tidak cocok dengan encoding yang ditentukan dalam header Content-Encoding, maka itulah yang menjadi penyebab masalah.

      Contoh:

      curl -v https://HOSTALIAS/test
      

      ***trimmed***
      >
      < HTTP/1.1 200 OK
      < Accept-Ranges: bytes
      < Content-Encoding: gzip
      < Date: Mon, 02 Aug 2021 08:17:35 GMT
      < Transfer-Encoding: chunked
      <
      < response_payload.zip Response Body(not in GZIP format)>
      

      Contoh respons di atas mengirimkan nilai gzip ke Header Content-Encoding yang merupakan encoding yang didukung di Apigee Edge. Namun, response_payload.zip dikirim sebagai file ZIP. Oleh karena itu, respons gagal dengan error 502 Bad Gateway beserta kode error: messaging.adaptors.http.flow.DecompressionFailureAtResponse.

    Log Pemroses Pesan

    Untuk memvalidasi menggunakan log Pemroses Pesan:

    Jika Anda adalah pengguna Private Cloud, Anda dapat menggunakan log Pemroses Pesan untuk menentukan informasi penting tentang error 502 HTTP.

    1. Periksa log Pemroses Pesan:

      /opt/apigee/var/log/edge-message-processor/logs/system.log

    2. Telusuri untuk mengetahui apakah terdapat 502 error selama periode tertentu durasi (jika masalah terjadi di masa lalu) atau jika ada tanggapan masih gagal dengan 502. Anda dapat menggunakan string penelusuran berikut:

      grep -ri "ZipException"
      
    3. Anda akan menemukan baris dari system.log seperti berikut ini:

      Skenario #1

      Skenario #1: Jika respons API memiliki header Content-Encoding: gzip

      2021-08-02 06:50:25,433  NIOThread@2 ERROR HTTP.CLIENT -
      HTTPClient$Context.onInputException() :  ClientInputChannel(ClientChannel[Connected:
      Remote:3.8.1.1:9000 Local:10.0.115.32:41298]@38140 useCount=1 bytesRead=0
      bytesWritten=203 age=469ms  lastIO=0ms  isOpen=true).onExceptionRead exception: {}
      java.util.zip.ZipException: Not in GZIP format
      ---trimmed--
      2021-08-02 06:50:25,433  NIOThread@2 INFO  HTTP.CLIENT -
      HTTPClient$Context.logContextDetails() : Request details : host=null
      path=/folder/testFile method=GET. Channel details : Bytes read=0
      2021-08-02 06:50:25,434  NIOThread@2 ERROR ADAPTORS.HTTP.FLOW -
      AbstractResponseListener.onException() : AbstractResponseListener.onError(HTTPResponse@4806fdab, Not in GZIP format)
      2021-08-02 06:50:25,434  NIOThread@2 INFO  HTTP.SERVICE -
      ExceptionHandler.handleException() : Exception
      java.util.zip.ZipException: Not in GZIP format
      occurred while writing to channel null
      2021-08-02 06:50:25,434  NIOThread@2 INFO  HTTP.SERVICE -
      ExceptionHandler.handleException() : Exception trace:
      java.util.zip.ZipException: Not in GZIP format
      

      Baris java.util.zip.ZipException: Not in GZIP format di pesan error di atas menunjukkan bahwa respons payload tidak dikirim dalam format GZIP meskipun Content-Encoding ditetapkan sebagai gzip. Oleh karena itu, Apigee Edge menampilkan pengecualian dan menampilkan kode status 502 dengan kode fault messaging.adaptors.http.flow.DecompressionFailureAtResponse pada aplikasi klien.

      Skenario #2

      Skenario #2: Jika respons API memiliki header Content-Encoding: deflate

      2021-08-02 06:35:21,215  NIOThread@0 ERROR HTTP.CLIENT -
      HTTPClient$Context.onInputException() :  ClientInputChannel(ClientChannel[Connected:
      Remote:3.8.1.1:9000 Local:192.168.194.140:35224]@36014 useCount=1 bytesRead=0
      bytesWritten=202 age=439ms  lastIO=2ms  isOpen=true).onExceptionRead exception: {}
      java.util.zip.ZipException: incorrect header check
      ---trimmed----
      Caused by:
      java.util.zip.DataFormatException: incorrect header check
      ---trimmed---
      2021-08-02 06:35:21,215  NIOThread@0 INFO  HTTP.CLIENT -
      HTTPClient$Context.logContextDetails() : Request details :
      host=null path=/folder/testFile method=GET. Channel details : Bytes read=0
      2021-08-02 06:35:21,216  NIOThread@0 ERROR ADAPTORS.HTTP.FLOW -
      AbstractResponseListener.onException() : AbstractResponseListener.onError(HTTPResponse@3966e277,
      incorrect header check)
      2021-08-02 06:35:21,216  NIOThread@0 INFO  HTTP.SERVICE -
      ExceptionHandler.handleException() : Exception
      java.util.zip.ZipException: incorrect header check occurred while writing to channel null
      2021-08-02 06:35:21,217  NIOThread@0 INFO  HTTP.SERVICE -
      ExceptionHandler.handleException() : Exception trace:
      java.util.zip.ZipException: incorrect header check
      
      

      Garis java.util.zip.ZipException: incorrect header check dan Caused by: java.util.zip.DataFormatException: incorrect header check dalam pesan {i>error<i} di atas menunjukkan bahwa muatan respons tidak dikirim dalam dan tidak cocok dengan encoding yang ditentukan dalam Header Content-Encoding dari deflate. Oleh karena itu, Apigee Edge menampilkan pengecualian dan menampilkan kode status 502 dengan kode kesalahan messaging.adaptors.http.flow.DecompressionFailureAtResponse pada aplikasi klien.

Resolusi

  1. Jika payload respons terkompresi tidak diperlukan dalam alur proxy API di Apigee Edge dan di server backend, jangan teruskan header Content-Encoding. Jika payload respons perlu dikompresi, lanjutkan ke langkah 2.
  2. Jika terdapat kebutuhan untuk mengompresi payload respons, pastikan server backend selalu mengirimkan hal berikut:
    • Salah satu encoding yang didukung sebagai nilai untuk header Content-Encoding di respons
    • Payload respons dalam format yang didukung pada Apigee Edge cocok dengan encoding format yang ditentukan dalam header Content-Encoding
  3. Pada contoh yang dibahas di atas, payload respons memiliki format ZIP tetapi header respons menentukan Content-Encoding: gzip. Anda dapat memperbaiki masalah dengan mengirimkan respons header sebagai Content-Encoding: gzip dan payload respons di gzip format:
    curl -v https://HOSTALIAS/v1/test
    
    >
    < HTTP/1.1 200 OK
    < Accept-Ranges: bytes
    < Content-Encoding: gzip
    < Date: Mon, 02 Aug 2021 08:17:35 GMT
    < Transfer-Encoding: chunked
    <
    < response_payload.gz Response Body(in GZIP format)>
    

Spesifikasi

Apigee Edge merespons dengan kode status 502 Bad Gateway dengan kode error messaging.adaptors.http.flow.DecompressionFailureAtResponse sesuai dengan RFC berikut spesifikasi:

Spesifikasi
RFC 7231, bagian 6.5.1
RFC 7231, bagian 3.1.2.2

Jika Anda masih memerlukan bantuan dari Dukungan Apigee, buka Harus mengumpulkan informasi diagnostik.

Harus mengumpulkan informasi diagnostik

Kumpulkan informasi diagnostik berikut, lalu hubungi Dukungan Apigee Edge:

Jika Anda adalah pengguna Cloud Publik, berikan informasi berikut:

  • Nama organisasi
  • Nama lingkungan
  • Nama Proxy API
  • Menyelesaikan perintah curl yang digunakan untuk mereproduksi error 502
  • File pelacakan untuk respons API

Jika Anda adalah pengguna Private Cloud, berikan informasi berikut:

  • Pesan error lengkap yang diamati untuk respons yang gagal
  • Nama lingkungan
  • Paket Proxy API
  • File pelacakan untuk respons API
  • Log akses NGINX /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

    Di mana: ORG, ENV, dan PORT# diganti dengan nilai aktual.

  • Log sistem Pemroses Pesan /opt/apigee/var/log/edge-message-processor/logs/system.log