Anda sedang melihat dokumentasi Apigee Edge.
Buka
dokumentasi Apigee X. info
Gejala
Aplikasi klien mendapatkan kode status HTTP 502 Bad Gateway
dengan kode error protocol.http.TooBigBody
sebagai respons untuk panggilan API.
Pesan error
Aplikasi klien mendapatkan kode respons berikut:
HTTP/1.1 502 Bad Gateway
Selain itu, Anda mungkin melihat pesan error berikut:
{ "fault":{ "faultstring":"Body buffer overflow", "detail":{ "errorcode":"protocol.http.TooBigBody" } } }
Kemungkinan penyebab
Error ini terjadi jika ukuran payload yang dikirim oleh server target/backend ke Apigee Edge sebagai bagian dari respons HTTP lebih besar dari batas yang diizinkan di Apigee Edge.
Berikut kemungkinan penyebab error:
Penyebab | Deskripsi | Petunjuk pemecahan masalah yang berlaku untuk |
---|---|---|
Ukuran payload respons melebihi batas yang diizinkan | Ukuran payload yang dikirim oleh server target/backend sebagai bagian dari respons HTTP ke Apigee melebihi batas yang diizinkan di Apigee. | Pengguna Edge Publik dan Private Cloud |
Ukuran payload respons melebihi batas yang diizinkan setelah dekompresi | Ukuran payload yang dikirim dalam format terkompresi oleh server target/backend sebagai bagian dari respons HTTP terhadap Apigee melebihi batas yang diizinkan saat didekompresi oleh Apigee. | 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.
- Anda dapat memilih filter Proxy untuk mempersempit kode kesalahan.
- Tempatkan Kode Kesalahan terhadap Waktu.
Pilih sel yang memiliki kode kesalahan
protocol.http.TooBigBody
seperti yang ditunjukkan di bawah ini:Anda akan melihat informasi tentang kode kesalahan
protocol.http.TooBigBody
seperti yang ditunjukkan di bawah:Klik Lihat log dan luaskan baris untuk permintaan yang gagal.
- Dari jendela Log, perhatikan detail berikut:
- Kode Status:
502
- Sumber Kesalahan:
target
- Kode Kesalahan:
protocol.http.TooBigBody
.
- Kode Status:
- Jika Fault Source memiliki nilai
target
dan Fault Code memiliki nilaiprotocol.http.TooBigBody
, hal tersebut menunjukkan bahwa respons HTTP dari server target/ backend memiliki ukuran payload respons yang lebih besar daripada batas yang diizinkan di Apigee Edge.
Rekaman aktivitas
Untuk mendiagnosis error menggunakan alat Trace:
- Aktifkan sesi perekaman aktivitas dan:
- Tunggu hingga error
502 Bad Gateway
terjadi, atau - Jika Anda dapat merekonstruksi masalah, buat panggilan API dan rekonstruksi error
502 Bad Gateway
.
- Tunggu hingga error
- Pilih salah satu permintaan yang gagal dan periksa rekaman aktivitas.
- Jelajahi berbagai fase rekaman aktivitas dan temukan lokasi terjadinya kegagalan.
Buka fase Error tepat setelah fase Respons diterima dari server target, seperti yang ditunjukkan di bawah ini:
Catat nilai error dari rekaman aktivitas:
- error:
Body buffer overflow
- error.class:
com.apigee.errors.http.server.BadGateway
Hal ini menunjukkan bahwa Apigee Edge (komponen Message Processor) menampilkan error segera setelah menerima respons dari server backend karena ukuran payload melebihi batas yang diizinkan.
- error:
Anda akan melihat kegagalan dalam fase Response Sent to Client seperti yang ditunjukkan di bawah ini:
- Catat nilai error dari rekaman aktivitas. Contoh rekaman aktivitas di atas menunjukkan:
- error:
502 Bad Gateway
- Konten Error:
{"fault":{"faultstring":"Body buffer overflow","detail":{"errorcode":"protocol.http.TooBigBody"}}}
- error:
Buka fase Respons Diterima dari server target seperti yang ditunjukkan di bawah ini untuk berbagai skenario:
Tidak terkompresi
Skenario #1: Payload Respons yang dikirim dalam bentuk yang tidak dikompresi
Catat nilai error dari rekaman aktivitas:
- Respons yang diterima dari server target:
200 OK
- Content-Length (dari bagian Header Respons): ~11 MB
Terkompresi
Skenario #2: Minta Payload yang dikirim dalam bentuk terkompresi
Catat nilai error dari rekaman aktivitas:
- Respons yang diterima dari server target:
200 OK
- Content-Encoding: Jika Anda melihat header ini di bagian Header Respons, catat nilainya. Misalnya, dalam contoh ini nilainya adalah
gzip
.
- Respons yang diterima dari server target:
Perhatikan Body di bagian Response Content:
{"fault":{"faultstring":"Body buffer overflow","detail":{"errorcode":"protocol.http.TooBigBody"}}}
Buka Fase AX (Data Analytics Dicatat) dalam trace, lalu klik Fase tersebut untuk melihat detail terkait.
- Scroll ke bawah di Detail Fase ke bagian Pembacaan Variabel dan tentukan
nilai
target.received.content.length
yang menunjukkan:- Ukuran sebenarnya dari payload respons ketika dikirim dalam format yang tidak dikompresi dan
- Ukuran payload respons setelah dekompresi oleh Apigee, saat payload dikirim dalam format terkompresi. Nilai ini akan selalu sama dengan nilai batas yang diizinkan (10 MB) dalam skenario ini.
Tidak terkompresi
Skenario #1: Payload Respons yang dikirim dalam bentuk yang tidak dikompresi
Perhatikan nilai target.received.content.length:
Header permintaan Nilai target.received.content.length ~11 MB Terkompresi
Skenario #2: Minta Payload yang dikirim dalam bentuk terkompresi
Perhatikan nilai target.received.content.length:
Header Permintaan Nilai target.received.content.length ~10 MB Tabel berikut menjelaskan alasan error
502
ditampilkan oleh Apigee dalam dua skenario berdasarkan nilai target.received.content.length:Skenario Nilai target.acceptd.content.length Alasan kegagalan Payload Respons dalam format yang tidak dikompresi ~11 MB Ukuran > batas yang diizinkan sebesar 10 MB Payload Respons dalam format terkompresi ~10 MB Batas ukuran terlampaui saat dekompresi
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
Tempat: ORG, ENV, dan PORT# diganti dengan nilai sebenarnya.
- Telusuri untuk mengetahui apakah ada Error
502
selama durasi tertentu (jika masalah terjadi sebelumnya) atau apakah ada permintaan yang masih gagal dengan502
. - Jika Anda menemukan error
502
dengan X-Apigee-fault-code yang cocok dengan nilaiprotocol.http.TooBigBody
, tentukan nilai dari X-Apigee-fault-source.Contoh error 502 dari log akses NGINX:
Contoh entri dari log akses NGINX di atas memiliki nilai berikut untuk X-Apigee- fault-code dan X-Apigee-fault-source:
Header Respons Nilai X-Apigee-fault-code protocol.http.TooBigBody
X-Apigee-fault-source target
Penyebab: Ukuran Payload Respons lebih besar dari batas yang diizinkan
Diagnosis
- Tentukan Fault Code,Fault Source, dan Response Payload Size untuk error yang diamati menggunakan API Monitoring, alat Trace, atau log akses NGINX seperti yang dijelaskan dalam Langkah-langkah diagnosis umum dengan Skenario #1.
- Jika Sumber Kesalahan memiliki nilai
target
, ini menunjukkan bahwa ukuran payload respons yang dikirim oleh server target/backend ke Apigee lebih besar dari batas yang diizinkan di Apigee Edge. - Verifikasi Response Payload Size seperti yang ditentukan dari langkah 1.
- Jika ukuran payload > 10 MB batas yang diizinkan, itulah penyebab error.
- Jika batas ukuran payload ~ 10 MB, kemungkinan payload respons akan diteruskan dalam format terkompresi. Buka Penyebab: Ukuran payload respons melebihi batas yang diizinkan setelah dekompresi.
- Pastikan bahwa ukuran payload respons memang > 10 MB batas yang diizinkan dengan memeriksa respons sebenarnya menggunakan langkah-langkah berikut:
- Jika Anda tidak memiliki akses ke permintaan yang sebenarnya yang dibuat ke server target/backend, buka Resolution.
- Jika Anda memiliki akses ke permintaan aktual yang dibuat ke server target/backend, lakukan langkah-langkah berikut:
- Jika Anda adalah pengguna Cloud Publik/Cloud Pribadi, 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.
- Verifikasi ukuran payload yang diteruskan dalam respons dengan memeriksa header Content-Length.
- Jika Anda mendapati bahwa ukuran payload melebihi batas yang diizinkan di Apigee Edge, maka itulah yang menyebabkan masalah tersebut.
Contoh Respons dari server backend:
curl -v https://BACKENDSERVER-HOSTNAME/testfile
* About to connect() to 10.14.0.10 port 9000 (#0) * Trying 10.14.0.10... * Connected to 10.14.0.10 (10.148.0.10) port 9000 (#0) > GET /testfile HTTP/1.1 > User-Agent: curl/7.29.0 > Host: 10.14.0.10:9000 > Accept: */* > < HTTP/1.1 200 OK < Accept-Ranges: bytes < Content-Length: 11534336 < Content-Type: application/octet-stream < Last-Modified: Wed, 30 Jun 2021 08:18:02 GMT < Date: Wed, 30 Jun 2021 09:22:41 GMT < ----snipped---- <Response Body>
Dalam contoh di atas, Anda dapat melihat bahwa
Content-Length: 11534336 (which is ~11 MB)
yang merupakan penyebab error ini karena melampaui batas yang diizinkan di Apigee Edge.
Resolusi
Baca bagian Resolusi.
Penyebab: Ukuran Payload Respons melebihi batas yang diizinkan setelah dekompresi
Jika payload respons dikirim dalam format terkompresi dan header respons
Content-Encoding
disetel ke gzip,
Apigee, payload respons akan didekompresi. Selama proses dekompresi, jika Apigee mendapati ukuran payload lebih besar dari batas yang diizinkan di Apigee Edge, Apigee akan menghentikan dekompresi lebih lanjut dan segera merespons kembali dengan 502 Bad Gateway
dan kode error protocol.http.TooBigBody
.
Diagnosis
- Tentukan Fault Code, Fault Source dan Response Payload size untuk error yang diamati menggunakan API Monitoring, Trace Tool, atau log NGINX Access seperti yang dijelaskan dalam Langkah-langkah diagnosis umum dengan Skenario #2.
- Jika Fault Source memiliki nilai
target
, ini menunjukkan bahwa ukuran payload respons yang dikirim oleh aplikasi target/backend ke Apigee lebih besar daripada batas yang diizinkan di Apigee Edge. - Verifikasi Response Payload Size seperti yang ditentukan dari langkah 1.
- Jika ukuran payload > 10 MB batas yang diizinkan, berarti itulah penyebab error.
- Jika ukuran payload mencapai batas yang diizinkan ~ 10 MB, kemungkinan payload respons akan diteruskan dalam format terkompresi. Dalam hal ini, periksa ukuran payload respons terkompresi yang belum dikompresi.
- Anda dapat memvalidasi apakah respons dari target/backend dikirim dalam format terkompresi dan
ukuran yang tidak dikompresi lebih besar dari batas yang diizinkan menggunakan salah satu metode
berikut:
Rekaman aktivitas
Menggunakan alat Trace:
- Jika Anda telah merekam aktivitas untuk permintaan yang gagal, lihat langkah-langkah yang dijelaskan dalam
Pelacakan dan
- Tentukan nilai target.received.content.length
- Verifikasi apakah permintaan dari klien berisi header Content-Encoding:
gzip
- Jika nilai target.received.content.length sekitar batas 10 MB yang diizinkan, dan header respons Content-Encoding:
gzip
, itulah penyebab error ini.
Permintaan sebenarnya
Menggunakan permintaan aktual:
- Jika Anda tidak memiliki akses ke permintaan yang sebenarnya yang dibuat ke server target/backend, buka Resolution.
- Jika Anda memiliki akses ke permintaan aktual yang dibuat ke server target/backend, lakukan langkah-langkah berikut:
- Verifikasi ukuran payload yang diteruskan dalam respons bersama dengan header
Content-Encoding
yang dikirim dalam respons. - Jika Anda mendapati bahwa header respons
Content-Encoding
ditetapkan kegzip
dan ukuran payload yang tidak dikompresi melebihi batas yang diizinkan di Apigee Edge, maka itulah penyebab error.Contoh respons yang diterima dari server backend:
curl -v https://BACKENDSERVER-HOSTNAME/testzippedfile.gz
* About to connect() to 10.1.0.10 port 9000 (#0) * Trying 10.1.0.10... * Connected to 10.1.0.10 (10.1.0.10) port 9000 (#0) > GET /testzippedfile.gz HTTP/1.1 > User-Agent: curl/7.29.0 > Host: 10.1.0.10:9000 > Accept: */* > < HTTP/1.1 200 OK < Accept-Ranges: bytes < Content-Encoding: gzip < Content-Type: application/x-gzip < Last-Modified: Wed, 30 Jun 2021 08:18:02 GMT < Testheader: test < Date: Wed, 07 Jul 2021 10:14:16 GMT < Transfer-Encoding: chunked < ----snipped---- <Response Body>
Dalam kasus di atas, header
Content-Encoding: gzip
dikirim dan ukuran filetestzippedfile.gz
dalam respons kurang dari batasnya, tetapi ukuran filetestzippedfile
yang tidak dikompresi adalah ~15 MB.
- Verifikasi ukuran payload yang diteruskan dalam respons bersama dengan header
Log Pemroses Pesan
Menggunakan log Pemroses Pesan:
- Jika Anda adalah pengguna Private Cloud, Anda dapat menggunakan log Pemroses Pesan untuk menentukan informasi penting tentang error
502
HTTP. Memeriksa log Pemroses Pesan
/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 permintaan yang masih gagal dengan502
. Anda dapat menggunakan string pencarian berikut:grep -ri "chunkCount"
grep -ri "BadGateway: Body buffer overflow"
- Anda akan menemukan baris dari
system.log
yang mirip dengan yang ditunjukkan di bawah ini (TotalRead
danchunkCount
dapat bervariasi dalam kasus Anda):2021-07-07 09:40:47,012 NIOThread@7 ERROR HTTP.SERVICE - TrackingInputChannel.checkMessageBodyTooLarge() : Message is too large. TotalRead 10489856 chunkCount 2571 2021-07-07 09:40:47,012 NIOThread@7 ERROR HTTP.CLIENT - HTTPClient$Context.onInputException() : ClientInputChannel(ClientChannel[Connected: Remote:10.148.0.10:9000 Local:10.148.0.9:42240]@9155 useCount=1 bytesRead=0 bytesWritten=182 age=23ms lastIO=0ms isOpen=true).onExceptionRead exception: {} com.apigee.errors.http.server.BadGateway: Body buffer overflow 2021-07-07 09:40:47,012 NIOThread@7 ERROR ADAPTORS.HTTP.FLOW - AbstractResponseListener.onException() : AbstractResponseListener.onError(HTTPResponse@77cbd7c4, Body buffer overflow)
Selama proses dekompresi, segera setelah Pemroses Pesan menentukan total byte baca > 10 MB, Pemroses Pesan akan berhenti dan mencetak baris berikut:
Message is too large. TotalRead 10489856 chunkCount 2571
Ini menyiratkan bahwa Response Payload Size lebih dari 10 MB dan Apigee menampilkan error saat ukurannya mulai melebihi batas 10 MB dengan kode kesalahan sebagai
protocol.http.TooBigBody
- Jika Anda telah merekam aktivitas untuk permintaan yang gagal, lihat langkah-langkah yang dijelaskan dalam
Pelacakan dan
Resolusi
Ukuran tetap
Opsi #1 [Direkomendasikan]: Memperbaiki aplikasi server target agar ukuran payload tidak melebihi batas Apigee
- Analisis alasan server target tertentu mengirim ukuran respons / payload melebihi batas yang diizinkan, seperti yang dijelaskan dalam Batas.
- Jika tidak diinginkan, ubah aplikasi server target agar mengirimkan ukuran respons / payload kurang dari batas yang diizinkan.
- Jika diinginkan dan Anda ingin mengirim respons/payload lebih dari batas yang diizinkan, lanjutkan ke opsi berikutnya.
Pola URL bertanda tangan
Opsi #2 [Direkomendasikan]: Gunakan pola URL bertanda tangan dalam Apigee JavaCallout
Untuk payload yang lebih besar dari 10 MB, Apigee merekomendasikan penggunaan pola URL yang ditandatangani dalam Apigee JavaCallout, yang diilustrasikan dengan contoh Edge Callout: Signed URL Generator di GitHub.
Streaming
Opsi #3: Menggunakan Streaming
Jika proxy API perlu menangani permintaan dan/atau respons yang sangat besar, Anda dapat mengaktifkan streaming di Apigee.
CwC
Opsi #4: Gunakan properti CwC untuk meningkatkan batas buffering
Opsi ini hanya boleh digunakan jika Anda tidak dapat menggunakan opsi yang direkomendasikan karena mungkin ada masalah performa jika ukuran default ditingkatkan.
Apigee menyediakan properti CwC yang memungkinkannya meningkatkan batas ukuran payload permintaan dan respons. Untuk mengetahui detailnya, lihat Menetapkan batas ukuran pesan di Router atau Pemroses Pesan.
Batas
Apigee memperkirakan aplikasi klien dan server backend tidak akan mengirim ukuran payload yang lebih besar dari batas yang diizinkan seperti yang didokumentasikan untuk
Request/response size
dalam
Apigee Edge Limits.
- Jika Anda adalah pengguna Cloud Publik, batas maksimum untuk ukuran payload permintaan dan respons adalah seperti yang didokumentasikan untuk
Request/response size
di Apigee Edge Limits. - Jika Anda adalah pengguna Private Cloud, Anda mungkin telah mengubah batas maksimum default untuk ukuran payload permintaan dan respons (meskipun bukan praktik yang direkomendasikan). Anda dapat menentukan batas ukuran payload permintaan maksimum dengan mengikuti petunjuk di bagian Cara memeriksa batas saat ini.
Bagaimana cara memeriksa batas saat ini?
Bagian ini menjelaskan cara memverifikasi bahwa properti HTTPResponse.body.buffer.limit
telah diperbarui dengan nilai baru di Pemroses Pesan.
Pada mesin Message Processor, telusuri properti
HTTPResponse.body.buffer.limit
dalam direktori/opt/apigee/edge-message- processor/conf
dan periksa untuk melihat nilai yang telah ditetapkan seperti yang ditunjukkan di bawah ini:grep -ri "HTTPResponse.body.buffer.limit" /opt/apigee/edge-message-processor/conf
Contoh hasil dari perintah di atas adalah sebagai berikut:
/opt/apigee/edge-message-processor/conf/http.properties:HTTPResponse.body.buffer.limit=10m
Pada contoh output di atas, perhatikan bahwa properti
HTTPResponse.body.buffer.limit
telah ditetapkan dengan nilai10m
dalamhttp.properties
.Hal ini menunjukkan bahwa batas ukuran payload permintaan yang dikonfigurasi di Apigee untuk Private Cloud adalah 10 MB.
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
- Perintah curl lengkap yang digunakan untuk mereproduksi error
502
- File rekaman aktivitas untuk permintaan API
- Lengkapi output respons dari server target/backend beserta ukuran payload
Jika Anda adalah pengguna Private Cloud, berikan informasi berikut:
- Pesan error lengkap yang diamati untuk permintaan yang gagal
- Nama organisasi
- Nama lingkungan
- Paket Proxy API
- File rekaman aktivitas untuk permintaan API yang gagal
- Perintah curl lengkap yang digunakan untuk mereproduksi error
502
- Lengkapi output respons dari server target/backend beserta ukuran payload
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