כרגע מוצג התיעוד של 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. - פורמט המטען הייעודי שנשלח על ידי שרת הקצה העורפי/היעד כחלק מתגובת ה-HTTP
לא תואם לפורמט הקידוד שצוין בכותרת
Content-Encoding
אבל
הסיבה לכך היא ש-Apigee Edge לא מצליח לפענח את המטען הייעודי (payload) באמצעות הקידוד שצוין מאחר שהפורמט של המטען הייעודי הוא לא בפורמט זהה לזה של הקידוד שצוין
בכותרת Content-Encoding
.
בהמשך מפורטות כמה דוגמאות לערכים נתמכים של Content-Encoding
, ואיך Apigee Edge
מצפה שהייצוג של המטען הייעודי (payload) יהיה במקרים האלה:
תרחיש | קידוד תוכן | ייצוג של מטען ייעודי (payload) |
---|---|---|
קידוד יחיד | gzip | פורמט Unix פרטים נוספים זמינים במאמר פורמט RFC1952 GZIP. |
קידוד יחיד | deflate | בפורמט הזה נעשה שימוש במבנה |
קידוד מרובה | קידוד מרובה לדוגמה, במקרים שבהם הקידוד מתבצע פעמיים, הוא עשוי להיות:
|
הופעלו כמה קידודים על המטען הייעודי (payload) בסדר הנתון כפי שהוא מופיע בכותרת. |
אלה הסיבות האפשריות לשגיאה הזו:
סיבה | תיאור | ההוראות לפתרון בעיות הרלוונטיות עבור |
---|---|---|
הפורמט של המטען הייעודי (payload) של התגובה לא תואם לקידוד התוכן | הפורמט של המטען הייעודי (payload) של התגובה שנשלח על ידי שרת הקצה העורפי/היעד לא מקודד או לא תואם לקידוד שצוין בכותרת Content-Encoding . |
משתמשי Edge הציבוריים והפרטיים |
שלבים נפוצים באבחון
אפשר להשתמש באחד מהכלים/הטכניקות הבאים כדי לאבחן את השגיאה הזו:
מעקב באמצעות API
כדי לאבחן את השגיאה באמצעות API Monitoring:
- נכנסים לממשק המשתמש של Apigee Edge בתור משתמשים עם תפקיד מתאים.
עוברים לארגון שבו רוצים לבדוק את הבעיה.
- עוברים לדף ניתוח > API Monitoring > חקירה.
- בוחרים את מסגרת הזמן הספציפית שבה הבחנתם בשגיאות.
- מוודאים שמסנן שרת ה-Proxy מוגדר לערך הכול.
- יש להציב את קוד השגיאה ביחס ל-Time.
צריך לבחור תא שמכיל את קוד השגיאה
messaging.adaptors.http.flow.DecompressionFailureAtResponse
כפי שמוצג כאן:מידע על קוד התקלה
messaging.adaptors.http.flow.DecompressionFailureAtResponse
מוצג באופן שמוצג למטה:לוחצים על View Logs (הצגת היומנים) ומרחיבים את השורה שבה הופיעה השגיאה
502
.- בחלון Logs, שימו לב לפרטים הבאים:
- קוד סטטוס:
502
- מקור התקלה:
target
- קוד תקלה:
messaging.adaptors.http.flow.DecompressionFailureAtResponse
.
- קוד סטטוס:
- אם ב-Fault Source יש את הערך
target
, המשמעות היא שפורמט המטען הייעודי של התגובה לא התאים ל הקידוד הנתמך שצוין בכותרת התגובה של שרת הקצה העורפיContent-Encoding
.
כלי המעקב
כדי לאבחן את השגיאה באמצעות כלי המעקב:
- מפעילים את הפעלת המעקב
וגם:
- להמתין עד שהשגיאה
502 Bad Gateway
תתרחש, או - אם הצלחת לשחזר את הבעיה, יש לבצע את הקריאה ל-API ולשחזר את
502 Bad Gateway
.
- להמתין עד שהשגיאה
יש לוודא שהאפשרות Show allflowInfos מופעלת:
- בוחרים באחת מהתשובות שנכשלו ובוחנים את המעקב.
- אפשר לנווט בין השלבים השונים של המעקב ולאתר את המיקום שבו אירעה הכשל.
השגיאה תופיע בדרך כלל מיד אחרי השלב תגובה שהתקבלה משרת היעד, כמו בדוגמה הבאה:
-
שימו לב לערכים של המאפיינים מהמעקב:
- קידוד תוכן:
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
במקרה הזה, אבל אפליקציית הלקוח תקבל את התגובה502
כי השגיאה הוחזרה על ידי Apigee Edge.- שגיאה:
מנווטים לשלב התגובה נשלחה ללקוח במעקב ולוחצים עליו.
חשוב לשים לב לפרטים הבאים מהמעקב:
- קוד סטטוס:
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
. הערכים האלה מציינים שפורמט המטען הייעודי (payload) של התגובה לא תואם לקידוד שצוין בכותרתContent-Encoding
.כותרות תגובה Value 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-code
כותרות תגובה Value 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, כמו שמוסבר במאמר שלבי האבחון הנפוצים.
- אם Fault Code הוא
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
.
נתוני מעקב
כדי לבצע אימות באמצעות נתוני המעקב:
- מאתרים את הערכים 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
.- קידוד תוכן:
בקשה בפועל
כדי לאמת באמצעות הבקשה עצמה:
אם יש לך גישה לבקשה שנשלחה בפועל לאפליקציה של שרת היעד/הקצה העורפי, עליך לבצע את השלבים הבאים:
- אם אתם משתמשים בענן ציבורי או בענן פרטי, עליכם לשלוח בקשה ישירות לשרת הקצה העורפי עצמו או מכל מכונה אחרת שממנה יש לכם הרשאה לשלוח את הבקשה לשרת הקצה העורפי.
- משתמשים בענן פרטי יכולים גם לשלוח את הבקשה לשרת הקצה העורפי מאחד ממעבדי ההודעות.
- בדיקת התגובה שנשלחה על ידי שרת הקצה העורפי וקביעת הערך שהועבר בכותרת התגובה
Content-Encoding.
- יש לקבוע את הפורמט של המטען הייעודי שנשלח כחלק מהבקשה.
- אם הערך של הכותרת
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
.
יומנים של מעבד ההודעות
לאימות באמצעות יומנים של מעבד ההודעות:
משתמשים בענן פרטי יכולים להיעזר ביומנים של מעבד ההודעות כדי לגלות את המידע החשוב לגבי שגיאות 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
בהודעת השגיאה שלמעלה מציינת שהמטען הייעודי (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
בהודעת השגיאה שלמעלה מציינות שהמטען הייעודי (payload) של התגובה לא נשלח בפורמט deflate ולא תואם לקידוד שצוין בכותרתContent-Encoding
של deflate. לכן, Apigee Edge מפעיל את החריג ומחזיר את קוד הסטטוס502
עם קוד השגיאהmessaging.adaptors.http.flow.DecompressionFailureAtResponse
לאפליקציות הלקוח.
-
רזולוציה
- אם אין צורך במטען הייעודי (payload) של התגובה הדחוסה בתהליך ה-API של שרת ה-proxy ב-Apigee Edge ובשרת הקצה העורפי, אין להעביר את הכותרת
Content-Encoding
. אם יש צורך לדחוס את המטען הייעודי (payload) של התגובה, עוברים לשלב 2. - אם צריך לדחוס את המטען הייעודי (payload) של התגובה, צריך לוודא ששרת הקצה העורפי תמיד שולח את הנתונים הבאים:
- כל אחד מ
הקידודים הנתמכים בתור הערך של הכותרת
Content-Encoding
בתגובה - המטען הייעודי (payload) של התגובה בפורמט הנתמך ל-Apigee Edge תואם לפורמט
הקידוד שצוין בכותרת
Content-Encoding
- כל אחד מ
הקידודים הנתמכים בתור הערך של הכותרת
- בדוגמה שלמעלה, המטען הייעודי (payload) של התגובה הוא בפורמט 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, עליכם לספק את הפרטים הבאים:
- שם הארגון
- שם הסביבה
- שם שרת proxy ל-API
- צריך להשלים את הפקודה
curl
שמשמשת לשחזור השגיאה502
- קובץ מעקב לתגובות של ה-API
אם אתם משתמשים בענן פרטי, עליכם לספק את הפרטים הבאים:
- זוהתה הודעת שגיאה מלאה בתשובות הנכשלות
- שם הסביבה
- חבילת שרת 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