אתם צופים במסמכי התיעוד של Apigee Edge.
כדאי לעיין במסמכי התיעוד של Apigee X. מידע
תיאור הבעיה
אפליקציית הלקוח מקבלת קוד סטטוס של HTTP 400 Bad Request עם קוד השגיאה messaging.adaptors.http.flow.DecompressionFailureAtRequest כתגובה לקריאות ל-API.
הודעת שגיאה
אפליקציית הלקוח מקבלת את קוד התגובה הבא:
HTTP/1.1 400 Bad Request
בנוסף, יכול להיות שתופיע הודעת שגיאה דומה לזו שמוצגת למטה:
{
"fault":{
"faultstring":"Decompression failure at request",
"detail":{
"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtRequest"
}
}
}גורמים אפשריים
השגיאה הזו מתרחשת רק אם:
- הקידוד שצוין בכותרת בקשת ה-HTTP
Content-Encodingתקף ו נתמך על ידי Apigee Edge, - פורמט המטען הייעודי (payload) שנשלח על ידי הלקוח כחלק מבקשת ה-HTTP לא תואם לפורמט הקידוד שצוין בכותרת
Content-Encoding
BUT
הסיבה לכך היא ש-Apigee Edge לא מצליח לפענח את המטען הייעודי (payload) באמצעות הקידוד שצוין, כי הפורמט של המטען הייעודי לא זהה לפורמט של הקידוד שצוין בכותרת Content-Encoding.
ריכזנו כאן כמה דוגמאות לערכים נתמכים Content-Encoding ולאופן שבו Apigee Edge מצפה לפורמט של מטען הייעודי (payload) במקרים האלה:
| תרחיש | קידוד התוכן | פורמט המטען הייעודי הצפוי |
|---|---|---|
| קידוד יחיד | gzip | הפורמט של |
| קידוד יחיד | deflate | הפורמט הזה משתמש במבנה |
| קידודים מרובים | קידודים מרובים לדוגמה, במקרים שבהם הקידוד נעשה פעמיים, יכול להיות ש:
|
הוחלו כמה קידודים על מטען הייעודי (payload) בסדר שבו הם מופיעים בכותרת. |
אלה הסיבות האפשריות לשגיאה הזו:
| סיבה | תיאור | הוראות לפתרון בעיות שרלוונטיות ל |
|---|---|---|
| פורמט המטען הייעודי (payload) של הבקשה לא תואם לקידוד שצוין בכותרת Content-Encoding | הפורמט של מטען הייעודי (payload) של הבקשה שנשלח על ידי הלקוח לא מקודד או לא תואם לקידוד שצוין בכותרת Content-Encoding. |
משתמשים ב-Edge Public Cloud וב-Edge Private Cloud |
שלבים נפוצים לאבחון
כדי לאבחן את השגיאה הזו, אפשר להשתמש באחד מהכלים או מהטכניקות הבאים:
API Monitoring
כדי לאבחן את השגיאה באמצעות הכלי 'מעקב אחר API':
- נכנסים לממשק המשתמש של Apigee Edge כמשתמש עם תפקיד מתאים.
עוברים לארגון שבו רוצים לבדוק את הבעיה.
- עוברים לדף Analyze > API Monitoring > Investigate.
- בוחרים את מסגרת הזמן הספציפית שבה נתקלת בשגיאות.
- מוודאים שהמסנן Proxy מוגדר לAll.
- משרטטים את קוד התקלה מול הזמן.
בוחרים תא עם קוד השגיאה
messaging.adaptors.http.flow.DecompressionFailureAtRequestכמו בדוגמה הבאה:( הגדלת התמונה)
מוצג מידע על קוד התקלה
messaging.adaptors.http.flow.DecompressionFailureAtRequest, כמו בדוגמה הבאה:( הגדלת התמונה)
לוחצים על הצגת יומנים ומרחיבים את השורה שנכשלה עם השגיאה
400.( הגדלת התמונה)
- בחלון יומנים, רושמים את הפרטים הבאים:
- קוד סטטוס:
400 - מקור התקלה:
proxy - קוד שגיאה:
messaging.adaptors.http.flow.DecompressionFailureAtRequest.
- קוד סטטוס:
- אם הערך של Fault Source הוא
proxy, המשמעות היא שפורמט מטען הייעודי (payload) של הבקשה לא תאם ל קידוד הנתמך שצוין בכותרתContent-Encoding.
כלי המעקב
כדי לאבחן את השגיאה באמצעות הכלי Trace:
- מפעילים את trace session (מעקב אחר סשן) ואחת מהאפשרויות הבאות:
- ממתינים להתרחשות השגיאה
400 Bad Request, או - אם אפשר לשחזר את הבעיה, מבצעים את קריאת ה-API ומשחזרים את
400 Bad Request.
- ממתינים להתרחשות השגיאה
מוודאים שהאפשרות הצגת כל פרטי הזרימה מופעלת:
- בוחרים אחת מהבקשות שנכשלו ובודקים את המעקב.
- אפשר לנווט בין השלבים השונים של ה-trace ולמצוא את המקום שבו התרחשה השגיאה.
בדרך כלל השגיאה מופיעה בתהליך מיד אחרי השלב הבקשה התקבלה מהלקוח, כמו שמוצג כאן:
( הגדלת התמונה)
-
שימו לב לערכים של המאפיינים מהמעקב:
- שגיאה:
Decompression failure at request - error.class:
com.apigee.rest.framework.BadRequestException - error.cause:
Not in GZIP format
ב-error.cause מצוין שמטען הייעודי (payload) של הבקשה הוא לא בפורמט GZIP. כלומר, מערכת Apigee Edge ציפתה שמטען הנתונים של הבקשה יהיה בפורמט GZIP, כפי שצוין בכותרת
Content-Encoding. - שגיאה:
קובעים את הערך של כותרת הבקשה
Content-Encoding. לשם כך, עוברים לשלב Request Received from Client (הבקשה התקבלה מהלקוח) כמו שמוצג בהמשך:( הגדלת התמונה)
שימו לב: הערך של כותרת הבקשה
Content-Encodingהוא אכןgzip.במעקב לדוגמה שלמעלה אפשר לראות שהקידוד שצוין בכותרת הבקשה
Content-Encodingהואgzip, אבל מטען הייעודי (payload) של הבקשה לא בפורמט GZIP. לכן, Apigee לא יכול לבצע דקומפרסיה של מטען הייעודי באמצעות gzip ומחזיר את השגיאהDecompression failure at request.- כדי לראות את קוד הסטטוס ואת הודעת השגיאה שמוחזרים על ידי Apigee Edge, עוברים אל
לשלב Response Sent to Client בנתוני המעקב, כמו שמוצג בהמשך:
( הגדלת התמונה)
שימו לב לפרטים הבאים מהמעקב:
- קוד הסטטוס:
400 Bad Request. - תוכן השגיאה:
{"fault":{"faultstring":"Decompression failure at request","detail":{"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtRequest"}}}
- קוד הסטטוס:
עוברים לשלב 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.DecompressionFailureAtRequestו-policy, מה שמציין שהפורמט של מטען הייעודי (payload) של הבקשה לא תאם לקידוד שצוין בכותרתContent-Encoding.כותרות תגובה ערך X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtRequestX-Apigee-fault-source policy
NGINX
כדי לאבחן את השגיאה באמצעות יומני הגישה של NGINX:
- אם אתם משתמשים ב-Private Cloud, אתם יכולים להשתמש ביומני הגישה של NGINX כדי לקבוע את פרטי המפתח לגבי שגיאות HTTP
400. בודקים את יומני הגישה של NGINX:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_logאיפה: הערכים ORG, ENV ו-PORT# מוחלפים בערכים בפועל.
- מחפשים כדי לראות אם יש
400שגיאות במהלך פרק זמן מסוים (אם הבעיה התרחשה בעבר) או אם יש בקשות שעדיין נכשלות עם400. אם אתם מוצאים שגיאות
400עם הערך של X-Apigee-fault-code שזהה לערך שלmessaging.adaptors.http.flow.DecompressionFailureAtRequest, אתם צריכים לקבוע את הערך של X-Apigee-fault-source.דוגמה לשגיאה 400 מיומן הגישה של NGINX:
בדוגמה של רשומה מיומן הגישה של NGINX שמופיעה למעלה, הערכים של X-Apigee-fault-code ושל X-Apigee-fault-source הם:
כותרות תגובה ערך X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtRequestX-Apigee-fault-source policy
הסיבה: פורמט המטען הייעודי (payload) של הבקשה לא תואם לקידוד שצוין בכותרת Content-Encoding
כברירת מחדל, Apigee Edge תמיד מבצע דקומפרסיה של מטען ייעודי (payload) אם request header
Content-Encoding מכיל קידוד תקין ו
נתמך. לכן, הפורמט של מטען הייעודי (payload) של הבקשה צריך להיות זהה לקידוד שצוין ב-request header Content-Encoding.
אם יש אי התאמה, השגיאה הזו תופיע.
אבחון
- כדי לקבוע את קוד השגיאה ואת מקור השגיאה של השגיאה שנצפתה, אפשר להשתמש בכלי 'מעקב אחר קריאות ל-API', בכלי 'מעקב' או ביומני הגישה של NGINX, כמו שמוסבר בשלבים הנפוצים לאבחון.
- אם קוד השגיאה הוא
messaging.adaptors.http.flow.DecompressionFailureAtRequestומקור השגיאה הואpolicyאוproxy, המשמעות היא שהבקשה שנשלחה מאפליקציית הלקוח מכילה מטען ייעודי (payload) שלא תואם לContent-Encoding אפשר לקבוע את אי ההתאמה כחלק מבקשת ה-HTTP באמצעות אחת מהשיטות הבאות:
הודעת שגיאה
כדי לאמת באמצעות הודעת השגיאה:
-
אם יש לכם גישה להודעת השגיאה המלאה שהתקבלה מ-Apigee Edge, תוכלו לעיין ב
faultstring.הודעת שגיאה לדוגמה:
"faultstring":"Decompression failure at request"
- בהודעת השגיאה שלמעלה מוצג
"Decompression failure at request", מה שאומר שלא הייתה אפשרות לבטל את הדחיסה של הבקשה באמצעות הקידוד שצוין בכותרתContent-Encoding.
מעקב
כדי לבצע אימות באמצעות הכלי Trace:
- כדי לקבוע את הערך של כותרת הבקשה Content-Encoding ואת המאפיין error.cause, משתמשים ב-Trace כמו שמוסבר בשלבים נפוצים לאבחון.
הערכים מהדוגמה של נתוני המעקב הם:
- Content-Encoding:
gzip - error.cause:
Not in GZIP format
הערך ב-request header Content-Encoding הוא gzip; אבל מטען הייעודי (payload) של הבקשה לא בפורמט GZIP (כפי שמצוין ב-error.cause). לכן, Apigee Edge מגיב עם קוד השגיאה
400 Bad Requestוקוד השגיאהmessaging.adaptors.http.flow.DecompressionFailureAtRequest.- Content-Encoding:
הבקשה בפועל
כדי לאמת באמצעות הבקשה בפועל:
אם יש לכם גישה לבקשה בפועל שבוצעה על ידי אפליקציית הלקוח, צריך לבצע את השלבים הבאים:
- קובעים את הערך שמועבר לכותרת הבקשה
Content-Encoding. - קובעים את הפורמט של המטען הייעודי (Payload) שנשלח כחלק מהבקשה.
אם הערך של הכותרת
Content-Encodingמופיע ברשימה של קידוד נתמך אבל הפורמט של מטען הבקשה לא תואם לקידוד שצוין בכותרתContent-Encoding, אז זו הסיבה לבעיה.בקשה לדוגמה:
curl -v "http://HOSTALIAS/v1/testgzip"
-H "Content-Encoding: gzip"-X POST -d @request_payload.zipבדוגמה של הבקשה שלמעלה, הערך
gzipנשלח לכותרתContent-Encoding, שהיא קידוד נתמך ב-Apigee Edge. עם זאת, מטען הייעודי (payload) של הבקשהrequest_payload.zipהוא בפורמט ZIP. לכן, הבקשה הזו נכשלת עם קוד סטטוס400 Bad Requestוקוד השגיאה:messaging.adaptors.http.flow.DecompressionFailureAtRequest.
יומנים של מעבד הודעות
כדי לבצע אימות באמצעות יומני מעבד בקשות:
אם אתם משתמשים ב-Private Cloud, אתם יכולים להשתמש ביומני מעבד בקשות כדי לקבוע את פרטי המפתח לגבי שגיאות HTTP
400.- כדי לקבוע את מזהה ההודעה של הבקשה שנכשלה, משתמשים בכלי המעקב, בכלי לניתוח נתונים או ביומני הגישה של NGINX, כמו שמוסבר בשלבים נפוצים לאבחון.
מחפשים את מזהה ההודעה ביומן של מעבד ההודעות:
/opt/apigee/var/log/edge-message-processor/logs/system.logיוצג אחד מהחריגים הבאים:
תרחיש #1
תרחיש מספר 1: כשבקשת API כוללת את הכותרת Content-Encoding: gzip
2021-07-28 10:21:16,861 NIOThread@0 ERROR HTTP.SERVER - HTTPServer$Context.onInputException() : Message id:rt-57-1 SSLClientChannel[Accepted: Remote:192.168.199.8:8443 Local:192.168.80.234:44284]@28469 useCount=1 bytesRead=0 bytesWritten=28764 age=2739893ms lastIO=0ms isOpen=true.onExceptionRead exception: {} java.util.zip.ZipException: Not in GZIP format 2021-07-28 10:21:16,862 NIOThread@0 ERROR ADAPTORS.HTTP.FLOW - AbstractRequestListener.onException() : Request:POST, uri:/test, message Id:rt-57-1, exception:java.util.zip.ZipException: Not in GZIP format, context:Context@71ea5ac input=ClientInputChannel(SSLClientChannel[Accepted: Remote:192.168.199.8:8443 Local:192.168.80.234:44284]@28469 useCount=1 bytesRead=0 bytesWritten=28764 age=2739894ms lastIO=0ms isOpen=true) 2021-07-28 10:21:16,862 NIOThread@0 INFO HTTP.SERVICE - ExceptionHandler.handleException() : Exceptionjava.util.zip.ZipException: Not in GZIP formatoccurred while writing to channel null 2021-07-28 10:21:16,863 NIOThread@0 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 מעלה את החריגה ומחזיר קוד סטטוס400עם קוד שגיאהmessaging.adaptors.http.flow.DecompressionFailureAtRequestלאפליקציות לקוח.תרחיש מספר 2
תרחיש מספר 2: כשבקשת API כוללת את הכותרת Content-Encoding: deflate
2021-07-28 15:26:31,893 NIOThread@1 ERROR HTTP.SERVER - HTTPServer$Context.onInputException() : Message id:rt-47875-1 SSLClientChannel[Accepted: Remote:192.168.199.8:8443 Local:192.168.81.72:45954]@29276 useCount=1 bytesRead=0 bytesWritten=37230 age=3498856ms lastIO=1ms isOpen=true.onExceptionRead exception: {}java.util.zip.ZipException: incorrect header check….Caused by: java.util.zip.DataFormatException: incorrect header check.. 2021-07-28 15:26:31,894 NIOThread@1 ERROR ADAPTORS.HTTP.FLOW - AbstractRequestListener.onException() : Request:POST, uri:/test, message Id:rrt-47875-1, exception:java.util.zip.ZipException: incorrect header check, context:Context@69b3ac45 input=ClientInputChannel(SSLClientChannel[Accepted: Remote:192.168.199.8:8443 Local:192.168.81.72:45954]@29276 useCount=1 byt esRead=0 bytesWritten=37230 age=3498856ms lastIO=1ms isOpen=true)השורות
java.util.zip.ZipException: incorrect header checkו-Caused by: java.util.zip.DataFormatException: incorrect header checkבהודעת השגיאה שלמעלה מציינות שמטען הייעודי (payload) של הבקשה לא נשלח בפורמט deflate ולא תואם לקידוד שצוין בכותרתContent-Encodingשל deflate. לכן, Apigee Edge מפעיל את החריגה ומחזיר קוד סטטוס400עם קוד שגיאהmessaging.adaptors.http.flow.DecompressionFailureAtRequestלאפליקציות לקוח.
-
רזולוציה
- אם אין צורך במטען הייעודי (payload) של הבקשה הדחוסה בתהליך של שרת proxy ל-API ב-Apigee Edge ובשרת הקצה העורפי, אל תעבירו את הכותרת
Content-Encoding. אם יש צורך לדחוס את מטען הייעודי (payload) של הבקשה, עוברים לשלב 2. - מוודאים שאפליקציית הלקוח תמיד שולחת את הפרטים הבאים:
- בדוגמה שצוינה למעלה, מטען הייעוד של הבקשה הוא בפורמט ZIP, אבל בכותרת הבקשה מצוין
Content-Encoding: gzip. כדי לפתור את הבעיה, צריך לשלוח את כותרת הבקשה כ-Content-Encoding: gzipואת מטען הבקשה גם בפורמטgzip:curl -v "https://HOSTALIAS/v1/testgzip" -H "Content-Encoding: gzip" -X POST -d @request_payload.gz
מפרט
Apigee Edge מגיב עם קוד הסטטוס 400 Bad Request וקוד השגיאה messaging.adaptors.http.flow.DecompressionFailureAtRequest, בהתאם למפרטים הבאים של RFC:
| מפרט |
|---|
| RFC 7231, section 6.5.1 |
| RFC 7231, section 3.1.2.2 |
אם עדיין דרושה לך עזרה מצוות התמיכה של Apigee, אפשר לעבור אל איסוף מידע לצורך אבחון.
צריך לאסוף פרטי אבחון
אוספים את נתוני האבחון הבאים ופונים אל התמיכה של Apigee Edge:
אם אתם משתמשי ענן ציבורי, עליכם לספק את הפרטים הבאים:
- שם הארגון
- שם הסביבה
- שם ה-proxy ל-API
- הפקודה
curlשבה השתמשת כדי לשחזר את השגיאה400 - קובץ מעקב לבקשות ה-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