מוצג המסמך של 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
אבל
הסיבה לכך היא ש-Apigee Edge לא מצליחה לפענח את המטען הייעודי (payload) באמצעות הקידוד שצוין,
של המטען הייעודי (Payload) אינו בפורמט זהה לזה של הקידוד שצוין
הכותרת Content-Encoding
.
הנה כמה דוגמאות לערכים נתמכים של Content-Encoding
ולאופן השימוש ב-Apigee Edge
מצפה שהייצוג של המטען הייעודי (Payload) יהיה במקרים האלה:
תרחיש | קידוד התוכן | ייצוג מטען ייעודי (payload) |
---|---|---|
קידוד יחיד | gzip | פורמט צפייה פורמט RFC1952 GZIP. |
קידוד יחיד | להקטין | בפורמט הזה נעשה שימוש במבנה |
קידוד מרובה | קידוד מרובה לדוגמה, במקרים שבהם הקידוד מתבצע פעמיים, המצב עשוי להיות:
|
קידודים מרובים הופעלו במטען הייעודי (payload) בסדר הנתון כפי שהוא מופיע בכותרת. |
הסיבות האפשריות לשגיאה הזו הן:
סיבה | תיאור | הוראות לפתרון בעיות עבור |
---|---|---|
פורמט המטען הייעודי של התשובות לא תואם לקידוד התוכן | הפורמט של המטען הייעודי (payload) של התגובה שנשלח על ידי שרת הקצה העורפי/שרת היעד הוא
לא מקודד או לא
תואם לקידוד שצוין בכותרת Content-Encoding . |
משתמשי Edge בענן הציבורי והפרטי |
שלבי אבחון נפוצים
יש להשתמש באחד מהכלים או השיטות הבאים כדי לאבחן את השגיאה:
מעקב API
כדי לאבחן את השגיאה באמצעות API Monitoring:
- נכנסים ל-Apigee Edge UI כמשתמש עם התפקיד המתאים.
עוברים לארגון שבו רוצים לחקור את הבעיה.
- מנווטים אל ניתוח > מעקב API > לחקור את הדף.
- בוחרים את מסגרת הזמן הספציפית שבה הבחנתם בשגיאות.
- מוודאים שהמסנן של שרת ה-proxy מוגדר לאפשרות All.
- הציגו את קוד התקלה ביחס ל-Time.
צריך לבחור תא עם קוד התקלה
messaging.adaptors.http.flow.DecompressionFailureAtResponse
בתור מוצגת למטה:מידע על קוד התקלה
messaging.adaptors.http.flow.DecompressionFailureAtResponse
מוצג כפי שמוצג כאן:לוחצים על הצגת היומנים ומרחיבים את השורה שבה מופיעה השגיאה
502
.- בחלון יומנים שימו לב לפרטים הבאים:
- קוד סטטוס:
502
- מקור התקלה:
target
- קוד התקלה:
messaging.adaptors.http.flow.DecompressionFailureAtResponse
.
- קוד סטטוס:
- אם ל-Fault Source יש את הערך
target
, זה מציין שפורמט המטען הייעודי (payload) של התגובה לא התאים קידוד נתמך שמצוין בכותרת התגובה של שרת הקצה העורפיContent-Encoding
.
כלי המעקב
כדי לאבחן את השגיאה באמצעות כלי המעקב:
- מפעילים את סשן המעקב
וגם:
- צריך להמתין עד שהשגיאה
502 Bad Gateway
תתרחש, או - אם הצלחתם לשחזר את הבעיה, יש לבצע את הקריאה ל-API ולשחזר
502 Bad Gateway
- צריך להמתין עד שהשגיאה
מוודאים שהאפשרות Show all FlowInfos מופעלת:
- בוחרים אחת מהתשובות שנכשלו ובודקים את המעקב.
- לעבור בין השלבים השונים במעקב ולאתר את מקום התקלה אירעה שגיאה.
בדרך כלל השגיאה תופיע בתהליך מיד אחרי שלב התגובה התקבלה משרת היעד כפי שמוצג בהמשך:
-
שימו לב לערכי המאפיינים שמופיעים במעקב:
- קידוד תוכן:
gzip
- גוף תוכן התגובה:
{"fault":{"faultstring":"Decompression failure at response","detail":{"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtResponse"}}}
- קידוד תוכן:
מעבר לשלב השגיאה מיד אחרי התגובה שהתקבלה משרת היעד שלב:
הערה לגבי המאפיינים:
- שגיאה:
Decompression failure at response
- error.class:
com.apigee.errors.http.server.BadGateway
error.cause:
Not in GZIP format
התג error.cause מציין שהמטען הייעודי (payload) של התגובה אינו בפורמט GZIP. המשמעות היא ש-Apigee Edge ציפה שהמטען הייעודי (payload) של התגובה יהיה בפורמט GZIP כ- צוין בכותרת
Content-Encoding
(נקבע בסעיף הקודם לכן, Apigee Edge לא יכולה לפתוח את המטען הייעודי (payload) באמצעות gzip ומחזירה את הערך שגיאהDecompression failure at response
.
חשוב לשים לב שהתגובה משרת היעד/שרת הקצה העורפי היא
200
במקרה הזה case; עם זאת, אפליקציית הלקוח תקבל502
מפני שהשגיאה מוחזרת על ידי Apigee Edge.- שגיאה:
עוברים לשלב התגובה נשלחה ללקוח במעקב, ולוחצים עליה.
שימו לב לפרטים הבאים שמופיעים בדוח:
- קוד הסטטוס:
502 Bad Gateway
. - תוכן השגיאה:
{"fault":{"faultstring":"Decompression failure at response","detail":{"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtResponse"}}}
- קוד הסטטוס:
מנווטים לשלב AX (Analytics Data Recorded) במעקב ולוחצים עליה.
- גוללים למטה לקטע פרטי שלב, כותרות של שגיאות ו לקבוע את הערכים של X-Apigee-fault-code ושל X-Apigee-fault-source כפי שמוצג בהמשך:
- יופיעו הערכים של X-Apigee-fault-code ו-X-Apigee-fault-source.
בתור
messaging.adaptors.http.flow.DecompressionFailureAtResponse
וtarget
, שמציין שפורמט המטען הייעודי (payload) של התגובה לא תאם הקידוד שמצוין בכותרתContent-Encoding
.כותרות של תשובות ערך X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtResponse
X-Apigee-fault-source target
NGINX
כדי לאבחן את השגיאה באמצעות יומני הגישה של NGINX:
- אם אתם משתמשים בענן פרטי, תוכלו להשתמש ביומני הגישה ל-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.DecompressionFailureAtResponse
X-Apigee-fault-source target
הסיבה: פורמט המטען הייעודי (payload) של התגובה לא תואם לקידוד התוכן
כברירת מחדל, ב-Apigee Edge תמיד מבטל את הדחיסה של המטען הייעודי (payload) אם כותרת התגובה
Content-Encoding
מכיל ערך תקין של
בקידוד נתמך. לכן, צריך לצפות שהפורמט של המטען הייעודי (Payload) של התגובה
חייב להיות תואם לקידוד שצוין בכותרת התשובה Content-Encoding
.
אם יש חוסר התאמה, מקבלים את השגיאה הזו.
אבחון
- מגדירים את קוד השגיאה ואת מקור התקלה של השגיאה שזוהתה באמצעות ה-API יומני מעקב, כלי מעקב או NGINX, כפי שמוסבר ב שלבי האבחון הנפוצים.
- אם קוד השגיאה הוא
messaging.adaptors.http.flow.DecompressionFailureAtResponse
וגם ל-Fault Source יש את הערך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 כפי שמוסבר בשלבי האבחון הנפוצים.
הערכים מהמעקב לדוגמה הם:
- קידוד תוכן:
gzip
- error.cause:
Not in GZIP format
הערך בכותרת התגובה Content-Encoding הוא gzip; עם זאת, המטען הייעודי (payload) של התגובה הוא לא בפורמט GZIP (כפי שמצוין על ידי error.cause). לכן, Apigee Edge מגיבה
502 Bad Gateway
וקוד השגיאהmessaging.adaptors.http.flow.DecompressionFailureAtResponse
.- קידוד תוכן:
הבקשה בפועל
כדי לאמת באמצעות הבקשה עצמה:
אם יש לכם גישה לבקשה שנשלחה בפועל לשרת היעד או לשרת העורפי מבצעים את השלבים הבאים:
- אם את/ה משתמש/ת בענן ציבורי/בענן פרטי, עליך להגיש בקשה ישירות לשרת הקצה העורפי משרת הקצה העורפי עצמו או מכל מהמכשיר שממנו מותר לך לשלוח את הבקשה לשרת העורפי.
- אם אתם משתמשים ב-Private Cloud, תוכלו גם לשלוח את הבקשה לשרת הקצה העורפי מאחד ממעבדי ההודעות.
- בדיקת התגובה שנשלחה על ידי שרת הקצה העורפי וזיהוי הערך
הועברה בכותרת התגובה
Content-Encoding.
- קובעים את הפורמט של המטען הייעודי (Payload) שנשלח כחלק מהבקשה.
- אם הערך של הכותרת
Content-Encoding
נמצא ברשימה של הקידוד נתמך אבל הפורמט של המטען הייעודי (Payload) של התגובה לא תואם לקידוד שצוין בכותרת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 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השורה
java.util.zip.ZipException: Not in GZIP format
בהודעת השגיאה שלמעלה מציינת שהתגובה המטען הייעודי לא נשלח בפורמט 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
בהודעת השגיאה שלמעלה, מציין שהמטען הייעודי (payload) של התגובה לא נשלח. הוא לא תואם לקידוד שצוין הכותרתContent-Encoding
של deflate. לכן, Apigee Edge זורקת את החריג ומחזירה קוד סטטוס502
עם קוד השגיאהmessaging.adaptors.http.flow.DecompressionFailureAtResponse
לאפליקציות לקוח.
-
רזולוציה
- אם אין צורך במטען הייעודי (payload) של התגובה הדחוסה בתהליך ה-Proxy ל-API ב-Apigee Edge
ובשרת הקצה העורפי, לא מעבירים את הכותרת
Content-Encoding
. אם צריך לדחוס את המטען הייעודי (payload) של התגובות, עוברים לשלב 2. - אם צריך לדחוס את המטען הייעודי (payload) של התגובה, צריך לוודא ששרת הקצה העורפי
תמיד שולח את הנתונים הבאים:
- כל אחד מהתנאים הבאים
קידוד נתמך כערך של הכותרת
Content-Encoding
בקידוד תשובה - המטען הייעודי (payload) של התגובה בפורמט הנתמך ל-Apigee Edge תואם לקידוד
פורמט שצוין בכותרת
Content-Encoding
- כל אחד מהתנאים הבאים
קידוד נתמך כערך של הכותרת
- בדוגמה שלמעלה, המטען הייעודי של התשובות הוא בפורמט ZIP אבל כותרת התגובה.
מציין את הערך
Content-Encoding: gzip
. כדי לפתור את הבעיה, אפשר לשלוח את התשובה הכותרת היאContent-Encoding: gzip
והמטען הייעודי (payload) של התגובה ב-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, סעיף 6.5.1 |
RFC 7231, סעיף 3.1.2.2 |
אם עדיין דרושה לך עזרה מהתמיכה של Apigee, צריך לעבור אל חובה לאסוף את פרטי האבחון.
חובה לאסוף פרטי אבחון
אוספים את פרטי האבחון הבאים ופונים לתמיכה של Apigee Edge:
אם אתם משתמשים ב-Public Cloud, עליכם לספק את הפרטים הבאים:
- שם הארגון
- שם הסביבה
- שם ה-API של ה-Proxy
- צריך להשלים את הפקודה
curl
ששימשה לשחזור השגיאה502
- קובץ מעקב לתגובות ה-API
אם אתם משתמשים בענן פרטי, עליכם לספק את הפרטים הבאים:
- הודעת שגיאה מלאה זוהתה לגבי התגובות שנכשלו
- שם הסביבה
- חבילת API Proxy
- קובץ מעקב לתגובות ה-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