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, - Format payload yang dikirim oleh server backend/target sebagai bagian dari respons HTTP
tidak
cocok dengan format encoding yang ditetapkan pada header
Content-Encoding
TETAPI
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 Lihat Format GZIP RFC1952. |
Encoding Tunggal | mengempis | Format ini menggunakan struktur |
Beberapa Encoding | Beberapa Encoding Misalnya, jika encoding dilakukan dua kali, hal ini dapat berupa:
|
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:
- Login ke UI Apigee Edge sebagai pengguna dengan peran yang sesuai.
Beralihlah ke organisasi tempat Anda ingin menyelidiki masalah.
- Buka halaman Analyze > API Monitoring > Menyelidiki.
- Pilih jangka waktu spesifik saat Anda melihat error.
- Pastikan filter Proxy disetel ke Semua.
- Tempatkan Kode Kesalahan terhadap Waktu.
Pilih sel yang memiliki kode kesalahan
messaging.adaptors.http.flow.DecompressionFailureAtResponse
seperti yang ditunjukkan di bawah ini:Informasi tentang kode kesalahan
messaging.adaptors.http.flow.DecompressionFailureAtResponse
ditampilkan seperti yang ditunjukkan di bawah ini:Klik View logs dan luaskan baris yang gagal dengan error
502
.- Dari jendela Logs, perhatikan detail berikut:
- Kode Status:
502
- Sumber Kesalahan:
target
- Kode Kesalahan:
messaging.adaptors.http.flow.DecompressionFailureAtResponse
.
- Kode Status:
- 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 backendContent-Encoding
.
Alat pelacak
Untuk mendiagnosis error menggunakan alat Trace:
- Aktifkan sesi perekaman aktivitas
dan:
- Tunggu hingga error
502 Bad Gateway
terjadi, atau - Jika Anda dapat merekonstruksi masalah, lakukan panggilan API dan reproduksi
502 Bad Gateway
.
- Tunggu hingga error
Pastikan Show all FlowInfos diaktifkan:
- Pilih salah satu respons yang gagal dan periksa rekaman aktivitasnya.
- Jelajahi berbagai fase rekaman aktivitas dan temukan lokasi terjadinya kegagalan.
Biasanya Anda akan menemukan error dalam flow tepat setelah fase Response Received from target server seperti yang ditunjukkan di bawah ini:
-
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"}}}
- Encoding Konten:
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 errorDecompression failure at response
.
Perhatikan bahwa respons dari server target/backend adalah
200
dalam kasus ini; tetapi, aplikasi klien akan menerima respons502
karena error ditampilkan oleh Apigee Edge.- error:
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"}}}
- Kode status:
Buka fase AX (Data Analytics Dicatat) dalam rekaman aktivitas tersebut, lalu klik.
- 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:
- Anda akan melihat nilai X-Apigee-fault-code dan X-Apigee-fault-source sebagai
messaging.adaptors.http.flow.DecompressionFailureAtResponse
dantarget
, yang menunjukkan bahwa format payload respons tidak cocok dengan encoding yang ditentukan dalam headerContent-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:
- Jika Anda adalah pengguna Private Cloud, Anda dapat menggunakan log akses NGINX untuk menentukan informasi utama tentang error
502
HTTP. 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.
- Telusuri untuk melihat apakah ada error
502
selama durasi tertentu (jika masalah terjadi di masa lalu) atau apakah ada respons yang masih gagal dengan502
. Jika Anda menemukan error
502
dengan X-Apigee-fault-code yang cocok dengan nilaimessaging.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
- 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.
- Jika Fault Code adalah
messaging.adaptors.http.flow.DecompressionFailureAtResponse
dan Fault Source memiliki nilaitarget
, maka ini menunjukkan bahwa format payload respons yang dikirim oleh server backend/target tidak cocok dengan encoding yang didukung yang ditentukan dalam header responsContent-Encoding
. Anda dapat menentukan ketidakcocokan tersebut sebagai bagian dari respons HTTP menggunakan salah satu metode berikut:
Pesan error
Untuk memvalidasi menggunakan pesan error:
-
Jika Anda memiliki akses ke pesan error lengkap yang diterima dari Apigee Edge, lihat
faultstring
.Contoh pesan error:
"faultstring":"Decompression failure at response"
- Dalam pesan error di atas, kode akan menampilkan
"Decompression failure at response"
yang menyiratkan bahwa respons tidak dapat didekompresi menggunakan encoding yang ditentukan dalam headerContent-Encoding
.
Rekaman aktivitas
Untuk melakukan validasi menggunakan Trace:
- Tentukan Content-Type dan error.cause menggunakan Trace seperti yang dijelaskan dalam Langkah-langkah diagnosis umum.
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 errormessaging.adaptors.http.flow.DecompressionFailureAtResponse
.- Encoding Konten:
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:
- 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.
- Jika Anda adalah pengguna Private Cloud, Anda juga dapat membuat permintaan ke server backend dari salah satu Pemroses Pesan.
- Periksa respons yang dikirim oleh server backend dan tentukan nilai yang diteruskan di header respons
Content-Encoding.
- Tentukan format payload yang dikirim sebagai bagian dari permintaan.
- Jika nilai header
Content-Encoding
ada dalam daftar encoding yang didukung tetapi format payload respons tidak sesuai dengan encoding yang ditentukan dalam headerContent-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 headerContent-Encoding
yang merupakan encoding yang didukung di Apigee Edge. Namun,response_payload.zip
dikirim sebagai file ZIP. Oleh karena itu, respons ini gagal dengan error502 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.Periksa log Message Processor:
/opt/apigee/var/log/edge-message-processor/logs/system.log
Telusuri untuk melihat apakah ada error
502
selama durasi tertentu (jika masalah terjadi di masa lalu) atau apakah ada respons yang masih gagal dengan502
. Anda dapat menggunakan string penelusuran berikut:grep -ri "ZipException"
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() : Exceptionjava.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 formatBaris
java.util.zip.ZipException: Not in GZIP format
pada pesan error di atas menunjukkan bahwa payload respons tidak dikirim dalam format GZIP meskipunContent-Encoding
ditetapkan sebagai gzip. Oleh karena itu, Apigee Edge menampilkan pengecualian dan menampilkan kode status502
dengan kode kesalahanmessaging.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 checkBaris
java.util.zip.ZipException: incorrect header check
danCaused 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 deflateContent-Encoding
. Oleh karena itu, Apigee Edge akan menampilkan pengecualian dan menampilkan kode status502
dengan kode kesalahanmessaging.adaptors.http.flow.DecompressionFailureAtResponse
ke aplikasi klien.
-
Resolusi
- 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. - 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
- Salah satu
encoding yang didukung sebagai nilai untuk header
- 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 sebagaiContent-Encoding: gzip
dan payload respons dalam formatgzip
: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 error502
- 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