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 panggilan API.

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 ditetapkan pada 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 bagaimana 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 mengempis

Format ini menggunakan struktur zlib dengan algoritme kompresi deflate.

Lihat RFC1950 dan RFC1951.

Beberapa Encoding

Beberapa Encoding

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

  • gzip, mengecil
  • gzip, gzip
  • mengempis, 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 yang berlaku untuk
Format payload respons tidak cocok dengan Content-Encoding Format payload respons yang dikirim oleh server backend/target tidak dienkode atau tidak sesuai dengan encoding yang ditentukan pada header Content-Encoding. Pengguna Edge Publik dan Private Cloud

Langkah-langkah diagnosis umum

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

Pemantauan API

Untuk mendiagnosis error menggunakan API Monitoring:

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

  3. Buka halaman Analyze > API Monitoring > Menyelidiki.
  4. Pilih jangka waktu spesifik saat Anda melihat error.
  5. Pastikan filter Proxy disetel ke Semua.
  6. Tempatkan Kode Kesalahan terhadap Waktu.
  7. Pilih sel yang memiliki kode kesalahan messaging.adaptors.http.flow.DecompressionFailureAtResponse seperti yang ditunjukkan 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 itu menunjukkan bahwa format payload respons tidak sesuai dengan encoding yang didukung yang ditentukan dalam header respons server backend Content-Encoding.

Alat pelacak

Untuk mendiagnosis error menggunakan alat Trace:

  1. Aktifkan sesi perekaman aktivitas dan:
    1. Tunggu hingga error 502 Bad Gateway terjadi, atau
    2. Jika Anda dapat merekonstruksi masalah, lakukan panggilan API dan reproduksi 502 Bad Gateway.
  2. Pastikan Show all FlowInfos diaktifkan:

  3. Pilih salah satu respons yang gagal dan periksa rekaman aktivitasnya.
  4. Jelajahi berbagai fase rekaman aktivitas dan temukan lokasi terjadinya kegagalan.
  5. Biasanya Anda akan menemukan error dalam flow tepat setelah fase Response Received from target server seperti yang ditunjukkan di bawah ini:

    ( lihat gambar yang lebih besar)

  6. Catat 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 fase Response Received from target server:

    ( 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. Artinya, Apigee Edge mengharapkan payload respons dalam format GZIP seperti yang ditentukan dalam header Content-Encoding (ditentukan pada langkah sebelumnya).Oleh karena itu, Apigee Edge tidak dapat mendekompresi payload menggunakan gzip dan menampilkan error Decompression failure at response.

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

  8. Buka fase Response Sent to Client dalam rekaman aktivitas tersebut, 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 Dicatat) dalam rekaman aktivitas tersebut, lalu klik.

  10. Scroll ke bawah ke bagian Phase Details, Error Headers, lalu tentukan nilai X-Apigee-fault-code dan X-Apigee-fault-source seperti yang 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 utama tentang error 502 HTTP.
  2. Periksa log akses NGINX:

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

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

  3. Telusuri untuk melihat apakah ada error 502 selama durasi tertentu (jika masalah terjadi di masa lalu) atau apakah ada respons yang masih gagal dengan 502.
  4. Jika Anda menemukan error 502 dengan X-Apigee-fault-code yang cocok dengan nilai messaging.adaptors.http.flow.DecompressionFailureAtResponse, maka 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 encoding yang valid dan didukung. Oleh karena itu, format payload respons diharapkan harus cocok dengan encoding yang ditentukan di 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 Pemantauan API, Alat Pelacakan, atau log akses NGINX seperti yang dijelaskan di Langkah-langkah diagnosis umum.
  2. Jika Fault Code adalah messaging.adaptors.http.flow.DecompressionFailureAtResponse dan Fault Source memiliki nilai target, maka ini menunjukkan bahwa format payload respons yang dikirim oleh server backend/target tidak cocok dengan encoding yang didukung yang ditentukan dalam header respons Content-Encoding.
  3. Anda dapat menentukan ketidakcocokan tersebut sebagai bagian dari respons HTTP menggunakan salah satu metode berikut:

    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 error di atas, kode akan menampilkan "Decompression failure at response" yang menyiratkan bahwa respons tidak dapat didekompresi menggunakan encoding yang ditentukan dalam header Content-Encoding.

    Rekaman aktivitas

    Untuk melakukan validasi menggunakan Trace:

    1. Tentukan Content-Type dan error.cause menggunakan Trace seperti yang dijelaskan dalam Langkah-langkah diagnosis umum.
    2. Nilai dari rekaman aktivitas sampel adalah sebagai berikut:

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

      Nilai di header respons Content-Encoding adalah gzip; namun, 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 aktual yang dibuat ke aplikasi server target/backend, lakukan langkah-langkah berikut:

    1. Jika Anda adalah pengguna Cloud Publik/Private Cloud, buat permintaan langsung ke server backend dari server backend itu sendiri atau perangkat lain tempat Anda diizinkan untuk 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 nilai yang 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 sesuai dengan encoding yang ditentukan dalam header Content-Encoding, maka hal tersebut yang menyebabkan 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 ini gagal dengan error 502 Bad Gateway dengan 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 Message Processor:

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

    2. Telusuri untuk melihat apakah ada error 502 selama durasi tertentu (jika masalah terjadi di masa lalu) atau apakah ada respons yang 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: Saat 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 pada pesan error di atas menunjukkan bahwa payload respons 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 kesalahan messaging.adaptors.http.flow.DecompressionFailureAtResponse ke aplikasi klien.

      Skenario #2

      Skenario #2: Saat 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
      
      

      Baris java.util.zip.ZipException: incorrect header check dan Caused by: java.util.zip.DataFormatException: incorrect header check pada pesan error di atas menunjukkan bahwa payload respons tidak dikirim dalam format deflate dan tidak cocok dengan encoding yang ditentukan dalam header deflate Content-Encoding. Oleh karena itu, Apigee Edge akan menampilkan pengecualian dan menampilkan kode status 502 dengan kode kesalahan messaging.adaptors.http.flow.DecompressionFailureAtResponse ke 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 payload respons perlu dikompresi, pastikan server backend selalu mengirimkan hal berikut:
    • Salah satu encoding yang didukung sebagai nilai untuk header Content-Encoding dalam respons
    • Payload respons dalam format yang didukung ke Apigee Edge cocok dengan format encoding yang ditentukan dalam header Content-Encoding
  3. Pada contoh yang dibahas di atas, payload respons dalam format ZIP, tetapi header respons menentukan Content-Encoding: gzip. Anda dapat memperbaiki masalah ini dengan mengirimkan header respons sebagai Content-Encoding: gzip dan payload respons dalam format gzip:
    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 kode status 502 Bad Gateway dengan kode error messaging.adaptors.http.flow.DecompressionFailureAtResponse sesuai dengan spesifikasi RFC berikut:

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
  • Selesaikan perintah curl yang digunakan untuk mereproduksi error 502
  • File rekaman aktivitas 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 rekaman aktivitas untuk respons API
  • Log akses NGINX /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

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

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