אתם צופים במסמכי התיעוד של Apigee Edge.
כדאי לעיין במסמכי התיעוד של Apigee X. מידע
תיאור הבעיה
אפליקציית הלקוח מקבלת קוד סטטוס של HTTP 502 Bad Gateway עם קוד השגיאה messaging.adaptors.http.flow.DecompressionFailureAtResponse כתגובה לקריאות ל-API.
הודעת שגיאה
אפליקציית הלקוח מקבלת את קוד התגובה הבא:
HTTP/1.1 502 Bad Gateway
בנוסף, יכול להיות שתופיע הודעת שגיאה דומה לזו שמוצגת למטה:
{
"fault":{
"faultstring":"Decompression failure at response",
"detail":{
"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtResponse"
}
}
}גורמים אפשריים
השגיאה הזו מתרחשת רק אם:
- הקידוד שצוין בכותרת תגובת ה-HTTP (מהשרת העורפי או משרת היעד)
Content-Encodingהוא תקין ו נתמך על ידי Apigee Edge, - פורמט המטען הייעודי (payload) שנשלח על ידי השרת העורפי או שרת היעד כחלק מתגובת ה-HTTP
לא תואם
לפורמט הקידוד שצוין בכותרת
Content-Encoding
BUT
הסיבה לכך היא ש-Apigee Edge לא מצליח לפענח את המטען הייעודי (payload) באמצעות הקידוד שצוין, כי הפורמט של המטען הייעודי לא זהה לפורמט של הקידוד שצוין בכותרת Content-Encoding.
ריכזנו כאן כמה דוגמאות לערכים נתמכים Content-Encoding ולאופן שבו Apigee Edge
מצפה שמטען הייעודי (payload) ייוצג במקרים האלה:
| תרחיש | קידוד התוכן | ייצוג של מטען ייעודי (Payload) |
|---|---|---|
| קידוד יחיד | gzip | הפורמט של |
| קידוד יחיד | deflate | הפורמט הזה משתמש במבנה |
| קידודים מרובים | קידודים מרובים לדוגמה, במקרים שבהם הקידוד נעשה פעמיים, יכול להיות ש:
|
הוחלו כמה קידודים על מטען הייעודי (payload) בסדר שבו הם מופיעים בכותרת. |
אלה הסיבות האפשריות לשגיאה הזו:
| סיבה | תיאור | הוראות לפתרון בעיות שרלוונטיות ל |
|---|---|---|
| פורמט המטען הייעודי (payload) של התגובה לא תואם לקידוד התוכן | הפורמט של מטען הייעודי (payload) של התגובה שנשלח על ידי השרת העורפי או שרת היעד לא מקודד או לא תואם לקידוד שצוין בכותרת Content-Encoding. |
משתמשים ב-Edge Public Cloud וב-Edge Private Cloud |
שלבים נפוצים לאבחון
כדי לאבחן את השגיאה הזו, אפשר להשתמש באחד מהכלים או מהטכניקות הבאים:
API Monitoring
כדי לאבחן את השגיאה באמצעות הכלי 'מעקב אחר API':
- נכנסים לממשק המשתמש של Apigee Edge כמשתמש עם תפקיד מתאים.
עוברים לארגון שבו רוצים לבדוק את הבעיה.
- עוברים לדף Analyze > API Monitoring > Investigate.
- בוחרים את מסגרת הזמן הספציפית שבה נתקלת בשגיאות.
- מוודאים שהמסנן Proxy מוגדר לAll.
- משרטטים את קוד התקלה מול הזמן.
בוחרים תא עם קוד השגיאה
messaging.adaptors.http.flow.DecompressionFailureAtResponseכמו בדוגמה הבאה:( הגדלת התמונה)
מוצג מידע על קוד התקלה
messaging.adaptors.http.flow.DecompressionFailureAtResponse, כמו בדוגמה הבאה:( הגדלת התמונה)
לוחצים על הצגת יומנים ומרחיבים את השורה שנכשלה עם השגיאה
502.( הגדלת התמונה)
- בחלון יומנים, רושמים את הפרטים הבאים:
- קוד סטטוס:
502 - מקור התקלה:
target - קוד שגיאה:
messaging.adaptors.http.flow.DecompressionFailureAtResponse.
- קוד סטטוס:
- אם הערך של Fault Source הוא
target, המשמעות היא שפורמט מטען הייעוד של התגובה לא תאם ל קידוד הנתמך שצוין בכותרת התגובה של שרת הקצה העורפיContent-Encoding.
כלי המעקב
כדי לאבחן את השגיאה באמצעות הכלי Trace:
- מפעילים את trace session (מעקב אחר סשן) ואחת מהאפשרויות הבאות:
- ממתינים להתרחשות השגיאה
502 Bad Gateway, או - אם אפשר לשחזר את הבעיה, מבצעים את קריאת ה-API ומשחזרים את
502 Bad Gateway.
- ממתינים להתרחשות השגיאה
מוודאים שהאפשרות הצגת כל פרטי הזרימה מופעלת:
- בוחרים באחת מהתגובות שנכשלו ובודקים את המעקב.
- אפשר לנווט בין השלבים השונים של ה-trace ולמצוא את המקום שבו התרחשה השגיאה.
בדרך כלל השגיאה מופיעה בתהליך מיד אחרי השלב Response Received from target server (התקבלה תגובה משרת היעד), כמו שמוצג כאן:
( הגדלת התמונה)
-
שימו לב לערכים של המאפיינים מהמעקב:
- Content-Encoding:
gzip - תוכן התגובה:
{"fault":{"faultstring":"Decompression failure at response","detail":{"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtResponse"}}}
- Content-Encoding:
עוברים לשלב השגיאה מיד אחרי השלב Response Received from target server (התקבלה תגובה משרת היעד):
( הגדלת התמונה)
שימו לב למאפיינים:
- שגיאה:
Decompression failure at response - error.class:
com.apigee.errors.http.server.BadGateway error.cause:
Not in GZIP formatב-error.cause מצוין שמטען הייעודי (payload) של התגובה הוא לא בפורמט GZIP. המשמעות היא שמערכת Apigee Edge ציפתה שמטען התגובה יהיה בפורמט GZIP, כפי שצוין בכותרת
Content-Encoding(שנקבעה בשלב הקודם).לכן, מערכת Apigee Edge לא יכולה לבצע דקומפרסיה של המטען באמצעות gzip ומחזירה את השגיאהDecompression failure at response.
שימו לב שהתשובה משרת היעד או מהשרת העורפי היא
200במקרה הזה, אבל אפליקציית הלקוח תקבל תשובה מסוג502כי השגיאה מוחזרת על ידי Apigee Edge.- שגיאה:
עוברים לשלב Response Sent to Client (התשובה נשלחה ללקוח) בנתוני המעקב ולוחצים עליו.
( הגדלת התמונה)
שימו לב לפרטים הבאים מהמעקב:
- קוד הסטטוס:
502 Bad Gateway. - תוכן השגיאה:
{"fault":{"faultstring":"Decompression failure at response","detail":{"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtResponse"}}}
- קוד הסטטוס:
עוברים לשלב AX (נתוני Analytics שתועדו) במעקב ולוחצים עליו.
- גוללים למטה לקטע Phase Details (פרטי השלב) או Error Headers (כותרות שגיאה) וקובעים את הערכים של X-Apigee-fault-code ו-X-Apigee-fault-source, כמו שמוצג בהמשך:
( הגדלת התמונה)
- הערכים של X-Apigee-fault-code ו-X-Apigee-fault-source
יהיו
messaging.adaptors.http.flow.DecompressionFailureAtResponseו-target, מה שמציין שהפורמט של מטען התגובה לא תאם לקידוד שצוין בכותרתContent-Encoding.כותרות תגובה ערך X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtResponseX-Apigee-fault-source target
NGINX
כדי לאבחן את השגיאה באמצעות יומני הגישה של NGINX:
- אם אתם משתמשים ב-Private Cloud, אתם יכולים להשתמש ביומני הגישה של NGINX כדי לקבוע את פרטי המפתח לגבי שגיאות HTTP
502. בודקים את יומני הגישה של NGINX:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_logאיפה: הערכים ORG, ENV ו-PORT# מוחלפים בערכים בפועל.
- מחפשים אם יש שגיאות
502במהלך פרק זמן מסוים (אם הבעיה התרחשה בעבר) או אם יש תגובות שעדיין נכשלות עם502. אם אתם מוצאים שגיאות
502עם הערך של X-Apigee-fault-code שזהה לערך שלmessaging.adaptors.http.flow.DecompressionFailureAtResponse, אתם צריכים לקבוע את הערך של X-Apigee-fault-source.דוגמה לשגיאה 502 מיומן הגישה של NGINX:
בדוגמה של רשומה מיומן הגישה של NGINX שמופיעה למעלה, הערכים של X-Apigee-fault-code ושל X-Apigee-fault-source הם:
כותרות תגובה ערך X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtResponseX-Apigee-fault-source target
הסיבה: פורמט המטען הייעודי (payload) של התגובה לא תואם לקידוד התוכן
כברירת מחדל, Apigee Edge תמיד מבצע דקומפרסיה של מטען הייעודי (payload) אם כותרת התגובה
Content-Encoding מכילה קידוד תקין ו
נתמך. לכן, הפורמט של מטען הייעודי (payload) בתשובה צריך להיות זהה לקידוד שצוין בכותרת התשובה Content-Encoding.
אם יש אי התאמה, השגיאה הזו תופיע.
אבחון
- כדי לקבוע את קוד השגיאה ואת מקור השגיאה של השגיאה שנצפתה, אפשר להשתמש בכלי 'מעקב אחר קריאות ל-API', בכלי 'מעקב' או ביומני הגישה של NGINX, כמו שמוסבר בשלבים הנפוצים לאבחון.
- אם קוד השגיאה הוא
messaging.adaptors.http.flow.DecompressionFailureAtResponseומקור השגיאה הואtarget, המשמעות היא שפורמט מטען הייעודי (payload) של התגובה שנשלח על ידי השרת העורפי או שרת היעד לא תואם לContent-Encodingשצוין בכותרת התגובה. אפשר לקבוע את אי ההתאמה כחלק מתגובת ה-HTTP באחת מהשיטות הבאות:
הודעת שגיאה
כדי לאמת באמצעות הודעת השגיאה:
-
אם יש לכם גישה להודעת השגיאה המלאה שהתקבלה מ-Apigee Edge, תוכלו לעיין ב
faultstring.הודעת שגיאה לדוגמה:
"faultstring":"Decompression failure at response"
- בהודעת השגיאה שלמעלה מוצג
"Decompression failure at response", מה שאומר שלא הייתה אפשרות לבצע דקומפרסיה של התגובה באמצעות הקידוד שצוין בכותרתContent-Encoding.
מעקב
כדי לבצע אימות באמצעות הכלי Trace:
- קובעים את הערכים של Content-Type ו-error.cause באמצעות Trace כפי שמוסבר במאמר שלבים נפוצים לאבחון.
הערכים מהדוגמה של נתוני המעקב הם:
- Content-Encoding:
gzip - error.cause:
Not in GZIP format
הערך בכותרת התגובה Content-Encoding הוא gzip; אבל מטען הייעודי (payload) של התגובה לא בפורמט GZIP (כפי שמצוין ב-error.cause). לכן, Apigee Edge מגיב עם קוד השגיאה
502 Bad Gatewayוקוד השגיאהmessaging.adaptors.http.flow.DecompressionFailureAtResponse.- Content-Encoding:
הבקשה בפועל
כדי לאמת באמצעות הבקשה בפועל:
אם יש לכם גישה לבקשה בפועל שנשלחה לאפליקציית השרת של היעד או העורף, אתם יכולים לבצע את השלבים הבאים:
- אם אתם משתמשים ב-Public Cloud או ב-Private Cloud, אתם יכולים לשלוח בקשה ישירות לשרת הקצה העורפי משרת הקצה העורפי עצמו או מכל מכונה אחרת שממנה מותר לכם לשלוח בקשה לשרת הקצה העורפי.
- אם אתם משתמשים ב-Private Cloud, אתם יכולים לשלוח את הבקשה לשרת הקצה העורפי מאחד ממעבדי ההודעות.
- בודקים את התגובה שנשלחה על ידי שרת הקצה העורפי ומזהים את הערך
שמועבר בכותרת התגובה
Content-Encoding. - קובעים את הפורמט של המטען הייעודי (Payload) שנשלח כחלק מהבקשה.
- אם הערך של הכותרת
Content-Encodingמופיע ברשימה של קידוד נתמך, אבל הפורמט של מטען התגובה לא תואם לקידוד שצוין בכותרתContent-Encoding, זו הסיבה לבעיה.דוגמה:
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)>בתגובה לדוגמה שלמעלה, הערך
gzipנשלח לכותרתContent-Encoding, שהיא קידוד נתמך ב-Apigee Edge. עם זאת, הקובץresponse_payload.zipנשלח כקובץ ZIP. לכן, התגובה הזו נכשלת עם שגיאת502 Bad Gatewayוקוד השגיאה:messaging.adaptors.http.flow.DecompressionFailureAtResponse.
יומנים של מעבד הודעות
כדי לבצע אימות באמצעות יומני מעבד בקשות:
אם אתם משתמשים ב-Private Cloud, אתם יכולים להשתמש ביומני מעבד בקשות כדי לקבוע את פרטי המפתח לגבי שגיאות HTTP
502.בודקים את היומן של מעבד ההודעות:
/opt/apigee/var/log/edge-message-processor/logs/system.logמחפשים כדי לראות אם יש שגיאות
502במהלך פרק זמן מסוים (אם הבעיה התרחשה בעבר) או אם יש תגובות שעדיין נכשלות עם502. אפשר להשתמש במחרוזת החיפוש הבאה:grep -ri "ZipException"
יוצגו שורות מ-system.log שדומות לשורות הבאות:
תרחיש #1
תרחיש מספר 1: כשבתגובת ה-API מופיעה הכותרת 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 formatoccurred 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השורה
java.util.zip.ZipException: Not in GZIP formatבהודעת השגיאה שלמעלה מציינת שמטען הייעודי (payload) של התגובה לא נשלח בפורמט GZIP, למרות ש-Content-Encodingמצוין כ-gzip. לכן, Apigee Edge מעלה את החריגה ומחזיר קוד סטטוס502עם קוד שגיאהmessaging.adaptors.http.flow.DecompressionFailureAtResponseלאפליקציות לקוח.תרחיש מספר 2
תרחיש מספר 2: כשהתגובה של ה-API כוללת את הכותרת 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השורות
java.util.zip.ZipException: incorrect header checkו-Caused by: java.util.zip.DataFormatException: incorrect header checkבהודעת השגיאה שלמעלה מציינות שמטען הייעודי של התגובה לא נשלח בפורמט deflate ולא תואם לקידוד שצוין בכותרתContent-Encodingשל deflate. לכן, Apigee Edge מפעיל את החריגה ומחזיר קוד סטטוס502עם קוד שגיאהmessaging.adaptors.http.flow.DecompressionFailureAtResponseלאפליקציות לקוח.
-
רזולוציה
- אם אין צורך במטען הייעודי (payload) של התגובה הדחוסה בתהליך של שרת ה-API proxy ב-Apigee Edge ובשרת הקצה העורפי, אל תעבירו את הכותרת
Content-Encoding. אם יש צורך לדחוס את מטען הייעודי (payload) של התגובה, עוברים לשלב 2. - אם יש צורך לדחוס את מטען התגובה, צריך לוודא ששרת הקצה העורפי תמיד שולח את הפרטים הבאים:
- בדוגמה שצוינה למעלה, מטען הייעוד של התגובה הוא בפורמט ZIP, אבל כותרת התגובה מציינת
Content-Encoding: gzip. כדי לפתור את הבעיה, צריך לשלוח את כותרת התגובה בתורContent-Encoding: gzipואת מטען הייעודי לתגובה בפורמט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)>
מפרט
Apigee Edge מגיב עם קוד הסטטוס 502 Bad Gateway וקוד השגיאה messaging.adaptors.http.flow.DecompressionFailureAtResponse, בהתאם למפרטים הבאים של RFC:
| מפרט |
|---|
| RFC 7231, section 6.5.1 |
| RFC 7231, section 3.1.2.2 |
אם עדיין דרושה לך עזרה מצוות התמיכה של Apigee, אפשר לעבור אל איסוף מידע לצורך אבחון.
צריך לאסוף פרטי אבחון
אוספים את נתוני האבחון הבאים ופונים אל התמיכה של Apigee Edge:
אם אתם משתמשי ענן ציבורי, עליכם לספק את הפרטים הבאים:
- שם הארגון
- שם הסביבה
- שם ה-proxy ל-API
- הפקודה
curlשבה השתמשת כדי לשחזר את השגיאה502 - קובץ מעקב לתגובות של ה-API
אם אתם משתמשים ב-Private Cloud, עליכם לספק את הפרטים הבאים:
- הודעת השגיאה המלאה שזוהתה בתשובות שנכשלו
- שם הסביבה
- חבילת proxy ל-API
- קובץ מעקב לתגובות של ה-API
יומני גישה של NGINX
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_logהסבר: מחליפים את ORG, ENV ו-PORT# בערכים בפועל.
- יומני מערכת של מעבד ההודעות
/opt/apigee/var/log/edge-message-processor/logs/system.log