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, - Format payload yang dikirim oleh server backend/target sebagai bagian dari respons HTTP
tidak
cocok dengan format encoding yang ditentukan di 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 cara Apigee Edge
mengharapkan representasi payload dalam kasus tersebut:
Skenario | Content-Encoding | Representasi payload |
---|---|---|
Encoding Tunggal | gzip | Format Lihat Format GZIP RFC1952. |
Encoding Tunggal | mengempiskan | Format ini menggunakan struktur |
Beberapa Encoding | Beberapa Encoding Misalnya, jika encoding dilakukan dua kali, hal ini bisa 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 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:
- Login ke UI Apigee Edge sebagai pengguna dengan peran yang sesuai.
Beralihlah ke organisasi tempat Anda ingin menyelidiki masalah tersebut.
- Buka Analyze > Pemantauan API > Investigasi.
- Pilih jangka waktu tertentu saat Anda melihat error.
- Pastikan filter Proxy disetel ke Semua.
- Gambarkan Kode Kesalahan terhadap Waktu.
Pilih sel yang memiliki kode kesalahan
messaging.adaptors.http.flow.DecompressionFailureAtResponse
sebagai yang ditampilkan 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 ini menunjukkan bahwa format {i>payload <i}respons tidak sesuai dengan encoding yang didukung yang ditentukan di header respons server backendContent-Encoding
.
Alat rekaman aktivitas
Untuk mendiagnosis error menggunakan alat Trace:
- Mengaktifkan sesi rekaman aktivitas
dan:
- Tunggu hingga error
502 Bad Gateway
terjadi, atau - Jika Anda dapat mereproduksi masalah, lakukan panggilan API dan rekonstruksi
502 Bad Gateway
.
- Tunggu hingga error
Pastikan Tampilkan semua FlowInfos diaktifkan:
- Pilih salah satu respons yang gagal dan periksa rekaman aktivitasnya.
- Menavigasi melalui berbagai fase pelacakan dan menemukan letak kegagalan terjadi.
Anda biasanya akan menemukan kesalahan dalam alur tepat setelah Respons Diterima dari server target sebagaimana ditunjukkan di bawah ini:
-
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"}}}
- Encoding Konten:
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 kesalahanDecompression failure at response
.
Perhatikan bahwa respons dari server target/backend adalah
200
dalam case; Namun, aplikasi klien akan menerima502
karena error ditampilkan oleh Apigee Edge.- error:
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"}}}
- Kode status:
Buka fase AX (Data Analytics Direkam) di rekaman aktivitas lalu klik tombol tersebut.
- 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:
- 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 penting tentang error
502
HTTP. 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.
- Telusuri untuk mengetahui apakah terdapat error
502
selama durasi tertentu atau tidak (jika masalah terjadi di masa lalu) atau jika ada tanggapan yang masih gagal502
. Jika Anda menemukan error
502
dengan X-Apigee-fault-code cocok dengan nilaimessaging.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
- 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.
- Jika Kode Kesalahan tersebut adalah
messaging.adaptors.http.flow.DecompressionFailureAtResponse
dan Sumber Kesalahan memiliki nilaitarget
, maka menunjukkan bahwa format payload respons yang dikirim oleh server backend/target tidak sesuai dengan encoding yang didukung yang ditentukan dalam header responsContent-Encoding
. Anda dapat menentukan ketidakcocokan ini sebagai bagian dari respons HTTP menggunakan salah satu metode:
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 {i>error<i} di atas,
"Decompression failure at response"
yang menyiratkan bahwa respons tidak dapat didekompresi menggunakan encoding yang ditentukan dalam HeaderContent-Encoding
.
Trace
Untuk memvalidasi menggunakan Trace:
- Tentukan Content-Type dan error.Cause menggunakan Trace seperti yang dijelaskan dalam Langkah-langkah diagnosis umum.
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 errormessaging.adaptors.http.flow.DecompressionFailureAtResponse
.- Encoding Konten:
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:
- 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.
- 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 nilainya
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 cocok dengan encoding yang ditentukan dalam headerContent-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 HeaderContent-Encoding
yang merupakan encoding yang didukung di Apigee Edge. Namun,response_payload.zip
dikirim sebagai file ZIP. Oleh karena itu, respons gagal dengan error502 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.Periksa log Pemroses Pesan:
/opt/apigee/var/log/edge-message-processor/logs/system.log
Telusuri untuk mengetahui apakah terdapat
502
error selama periode tertentu durasi (jika masalah terjadi di masa lalu) atau jika ada tanggapan 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: 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() : 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
di pesan error di atas menunjukkan bahwa respons payload tidak dikirim dalam format GZIP meskipunContent-Encoding
ditetapkan sebagai gzip. Oleh karena itu, Apigee Edge menampilkan pengecualian dan menampilkan kode status502
dengan kode faultmessaging.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 checkGaris
java.util.zip.ZipException: incorrect header check
danCaused 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 HeaderContent-Encoding
dari deflate. Oleh karena itu, Apigee Edge menampilkan pengecualian dan menampilkan kode status502
dengan kode kesalahanmessaging.adaptors.http.flow.DecompressionFailureAtResponse
pada 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 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
- Salah satu
encoding yang didukung sebagai nilai untuk header
- 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 sebagaiContent-Encoding: gzip
dan payload respons digzip
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 error502
- 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