כרגע מוצג התיעוד של Apigee Edge.
כניסה למסמכי התיעוד של
Apigee X. מידע
תיאור הבעיה
אפליקציית הלקוח מקבלת קוד סטטוס HTTP של 413 Request Entity Too Large
עם קוד השגיאה protocol.http.TooBigBody
כתגובה לקריאות ל-API.
הודעת שגיאה
אפליקציית הלקוח מקבלת את קוד התגובה הבא:
HTTP/1.1 413 Request Entity Too Large
בנוסף, עשויה להופיע הודעת השגיאה הבאה:
{ "fault":{ "faultstring":"Body buffer overflow", "detail":{ "errorcode":"protocol.http.TooBigBody" } } }
גורמים אפשריים
השגיאה הזו מתרחשת אם גודל המטען הייעודי שנשלח על ידי אפליקציית הלקוח ל-Apigee Edge כחלק מבקשת ה-HTTP גדול מהמגבלה המותרת ב-Apigee Edge .
אלה הסיבות האפשריות לשגיאה הזו :
סיבה | תיאור | ההוראות לפתרון בעיות הרלוונטיות עבור |
---|---|---|
הגודל של המטען הייעודי (payload) של הבקשה חורג מהמגבלה המותרת | גודל המטען הייעודי שנשלח על ידי אפליקציית הלקוח כחלק מבקשת ה-HTTP ל-Apigee Edge חורג מהמגבלה המותרת ב-Apigee Edge. | משתמשי Edge הציבוריים והפרטיים |
הגודל של המטען הייעודי (payload) של הבקשה חורג מהמגבלה המותרת לאחר השחרור של הדחיסה | גודל המטען הייעודי שנשלח על ידי אפליקציית הלקוח בפורמט דחוס כחלק מבקשת ה-HTTP ל-Apigee Edge גדול מהמגבלה המותרת בעת ביטול הדחיסה על ידי Apigee Edge. | משתמשי Edge הציבוריים והפרטיים |
שלבים נפוצים באבחון
אפשר להשתמש באחד מהכלים/הטכניקות הבאים כדי לאבחן את השגיאה הזו:
מעקב באמצעות API
כדי לאבחן את השגיאה באמצעות API Monitoring:
- נכנסים לממשק המשתמש של Apigee Edge בתור משתמשים עם תפקיד מתאים.
עוברים לארגון שבו רוצים לבדוק את הבעיה.
- עוברים לדף ניתוח > API Monitoring > חקירה.
- בוחרים את מסגרת הזמן הספציפית שבה הבחנתם בשגיאות.
- אפשר לבחור במסנן שרת Proxy כדי לצמצם את קוד השגיאה.
- יש להציב את קוד השגיאה ביחס ל-Time.
בוחרים תא שמכיל את קוד השגיאה
protocol.http.TooBigBody
ואת קוד הסטטוס413
כפי שמוצג בהמשך:מידע על קוד התקלה
protocol.http.TooBigBody
מוצג באופן הבא:- לוחצים על View Logs (הצגת היומנים) ומרחיבים את השורה של הבקשה שנכשלה. לאחר מכן, בחלון Logs, שימו לב לפרטים כמו אלה :
לא דחוס
תרחיש מס' 1: בקשת מטען ייעודי (payload) שנשלח בפורמט לא דחוס
בחלון 'יומנים', שימו לב לפרטים הבאים:
- קוד סטטוס:
413
- מקור התקלה:
proxy
- קוד תקלה:
protocol.http.TooBigBody
. - אורך הבקשה(בייטים):
15360440
(~15MB)
אם ב-Fault Source יש את הערך
proxy
, קוד ה-Fault מכיל את הערךprotocol.http.TooBigBody
, ו-Request Length גדול מ-10MB, המשמעות היא שגודל המטען הייעודי של בקשת ה-HTTP מהלקוח גדול מהמגבלה המותרת ב-Apigee.דחוס
תרחיש מס' 2: בקשת מטען ייעודי (payload) שנשלח בפורמט דחוס
בחלון Logs, שימו לב לפרטים הבאים:
- קוד סטטוס:
413
- מקור התקלה:
proxy
- קוד תקלה:
protocol.http.TooBigBody
. - אורך הבקשה(בייטים):
15264
(כ-15kB)
אם ב-Fault Source יש את הערך
proxy
, ב-Fault Code יש את הערךprotocol.http.TooBigBody
ו-Request Length קטן מ-10MB, המשמעות היא שגודל המטען הייעודי של בקשת ה-HTTP מהלקוח נמוך מהמגבלה המותרת בפורמט הדחוס, אבל גודל המטען הייעודי גדול מהמגבלה המותרת כשמתבצעת אי-דחיסה על ידי Apigee. - קוד סטטוס:
נתוני מעקב
כדי לאבחן את השגיאה באמצעות כלי המעקב:
- מפעילים את סשן המעקב ואז
- צריך להמתין עד שהשגיאה
413 Request Entity Too Large
תתרחש, או - אם אפשר לשחזר את הבעיה, יש לבצע את הקריאה ל-API ולשחזר את השגיאה
413 Request Entity Too Large
- צריך להמתין עד שהשגיאה
יש לוודא שהאפשרות הצג את כל פרטי הזרימה מופעלת.
- בוחרים אחת מהבקשות שנכשלו ובודקים את המעקב.
- עוברים לשלב הבקשה התקבלה מהלקוח.
לא דחוס
תרחיש מס' 1: בקשת מטען ייעודי (payload) שנשלח בפורמט לא דחוס
שימו לב לפרטים הבאים:
- קידוד התוכן: לא קיים
- Content-Length:
15360204
דחוס
תרחיש מס' 2: בקשת מטען ייעודי (payload) שנשלח בפורמט דחוס
שימו לב לפרטים הבאים:
- קידוד תוכן:
gzip
- Content-Length:
14969
- סוג תוכן:
application/x-gzip
- אפשר לנווט בשלבים השונים של המעקב ולאתר את המיקום שבו אירעה הכשל.
השגיאה תופיע בדרך כלל ברצף אחרי השלב בקשה שהתקבלה מהלקוח, באופן הבא:
- יש לשים לב לערך השגיאה מתוך המעקב. בדוח לדוגמה שלמעלה מוצגים הפרטים הבאים:
- שגיאה:
Body buffer overflow
- error.class:
com.apigee.errors.http.user.RequestTooLarge
- שגיאה:
עוברים לקטע התגובה שנשלחה ללקוח ורושמים את ערכי השגיאה מתוך המעקב. בדוח לדוגמה שבהמשך אפשר לראות:
- שגיאה:
413 Request Entity Too Large
- תוכן השגיאה:
{"fault":{"faultstring":"Body buffer overflow","detail":{"errorcode":"protocol.http.TooBigBody"}}}
- שגיאה:
- עוברים לשלב AX (רישום נתונים ב-Analytics) במעקב ולוחצים עליו.
בקטע פרטי השלב, גוללים למטה אל קריאת משתנים.
- קובעים את הערך של המשתנה client.received.content.length, שמציין:
- הגודל בפועל של המטען הייעודי (payload) של הבקשה כאשר הוא נשלח בפורמט לא דחוס
- הגודל של המטען הייעודי (payload) של הבקשה לאחר ביטול הדחיסה על ידי Apigee, כאשר המטען הייעודי נשלח בפורמט דחוס. הערך תמיד יהיה זהה לערך של המגבלה המותרת (10MB) בתרחיש הזה.
לא דחוס
תרחיש מס' 1: בקשת מטען ייעודי (payload) בפורמט לא דחוס
המשתנה client.received.content.length:
15360204
דחוס
תרחיש מס' 2: בקשת מטען ייעודי (payload) בפורמט דחוס
המשתנה client.received.content.length:
10489856
- בטבלה הבאה מוסבר למה השגיאה
413
מוחזרת על ידי Apigee בשני התרחישים, שמבוססים על הערך של client.received.content.length:תרחיש הערך של client.received.content.length הסיבה לכשל יש לבקש מטען ייעודי (payload) בפורמט לא דחוס כ-15MB גודל > המגבלה המותרת של 10MB. יש לבקש מטען ייעודי (payload) בפורמט דחוס כ-10MB חרגת ממגבלת הגודל בזמן ביטול הדחיסה
NGINX
כדי לאבחן את השגיאה באמצעות יומני הגישה של NGINX:
- אם אתם משתמשים בענן פרטי, תוכלו להשתמש ביומני הגישה של NGINX כדי לזהות את המידע העיקרי על שגיאות HTTP
413
. כדאי לבדוק את יומני הגישה של NGINX:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
- אפשר לחפש כדי לראות אם יש שגיאות
413
במהלך משך זמן ספציפי (אם הבעיה אירעה בעבר) או אם יש בקשות שעדיין נכשלות עם413
. - אם מצאת שגיאות
413
כאשר X-Apigee-fault-code שתואם לערך שלprotocol.http.TooBigBody
, צריך לקבוע את הערך של X-Apigee-fault-source.לא דחוס
תרחיש מס' 1 : בקשת גודל מטען ייעודי (payload) בפורמט לא דחוס
הרשומה לדוגמה שצוינה למעלה מיומן הגישה של NGINX כוללת את הערכים הבאים עבור X-Apigee-fault-code ו-X-Apigee-fault-code
כותרות תגובה Value X-Apigee-fault-code protocol.http.TooBigBody
X-Apigee-fault-sourc policy
שימו לב לאורך הבקשה:
15360440
(14.6MB > המגבלה המותרת)דחוס
תרחיש מס' 2 : בקשת גודל מטען ייעודי (payload) בפורמט דחוס
הרשומה לדוגמה שצוינה ביומן הגישה של NGINX כוללת את הערכים הבאים עבור X-Apigee-fault-code ו-X-Apigee-fault-code
כותרות תגובה Value X-Apigee-fault-code protocol.http.TooBigBody
X-Apigee-fault-source policy
שימו לב לאורך הבקשה:
15264
(14.9 K < המגבלה המותרת)בתרחיש כזה, Apigee Edge מחזירה את הערך
413
על אף ש-Request Length (אורך הבקשה) נמוך מהמגבלה המותרת, כי ייתכן שהבקשה נשלחה בפורמט דחוס וגודל המטען הייעודי חורג מהמגבלה של Apigee Edge.
הסיבה: הגודל של המטען הייעודי בבקשה גדול מהמגבלה המותרת
אבחון
- קובעים את קוד ה-Fault, Fault Source ו-Request Payload size (גודל המטען הייעודי) של השגיאה שזוהתה באמצעות יומני גישה באמצעות API Monitoring, הכלי למעקב או יומני גישה של NGINX, כמו שמוסבר בשלבים נפוצים לאבחון בתרחיש מס' 1 (לא דחוס).
- אם ב-Fault Source יש את הערך
policy
אוproxy
, המשמעות היא שגודל המטען הייעודי (payload) של הבקשה שאפליקציית הלקוח שולחת ל-Apigee גדול מהמגבלה המותרת ב-Apigee Edge. - מאמתים את גודל המטען הייעודי של הבקשה כפי שנקבע בשלב 1.
- אם גודל המטען הייעודי גדול מ-10MB המותר, זו הסיבה לשגיאה.
- אם גודל המטען הייעודי נמוך מ-10MB, יכול להיות שהמטען הייעודי (payload) של הבקשה מועבר בפורמט דחוס. מעבר אל הסיבה: גודל המטען הייעודי של הבקשה חורג מהמגבלה המותרת לאחר ביטול הדחיסה
- כדי לוודא שגודל המטען הייעודי של הבקשה אכן גדול מההגבלה המותרת של 10MB,
תוכלו לבדוק את הבקשה בפועל באמצעות השלבים הבאים:
- אם אין לך גישה לבקשה שנשלחה בפועל על ידי אפליקציית הלקוח, עליך לעבור אל פתרון.
- אם יש לכם גישה לבקשה שנשלחה בפועל על ידי אפליקציית הלקוח, עליכם לבצע את
השלבים הבאים:
- מאמתים את גודל המטען הייעודי (payload) שהועבר בבקשה.
- אם גודל המטען הייעודי חורג מ המגבלה המותרת ב-Apigee Edge, זו הסיבה לבעיה.
בקשה לדוגמה:
curl http://<hostalias>/testtoobigbody -k -X POST -F file=@test15mbfile -v
במקרה שלמעלה, הקובץ
test15mbfile
הוא בגודל של כ-15MB. אם משתמשים בלקוח אחר, כדאי להוריד את יומני הלקוח כדי לבדוק מה הגודל של המטען הייעודי (payload) שנשלח.
רזולוציה
עוברים אל רזולוציה.
הסיבה: הגודל של המטען הייעודי (payload) של הבקשה חורג מהמגבלה המותרת לאחר שחרור הדחיסה
אם המטען הייעודי של הבקשה נשלח בפורמט דחוס וכותרת הבקשה
Content-Encoding
מוגדרת כ-gzip,
Apigee פורשת את המטען הייעודי של הבקשה. במהלך תהליך ביטול הדחיסה, אם ב-Apigee מתקבל מידע שגודל המטען הייעודי גדול מ-10MB,
המגבלה המותרת, הוא מפסיק את ביטול הדחיסה ומגיב מיד עם
413 Request Entity Too Large
עם קוד שגיאה
protocol.http.TooBigBody
.
אבחון
- קובעים את קוד ה-Fault, Fault Source ואיך מבקשים גודל מטען ייעודי (payload) עבור השגיאה שנצפתה באמצעות יומני API Monitoring, הכלי Trace ויומני גישה של NGINX, כמו שמוסבר בשלבי האבחון הנפוצים בתרחיש מס' 2 (דחוס).
- אם בשדה Fault Source יש את הערך
policy
אוproxy
, המשמעות היא שגודל המטען הייעודי (payload) של הבקשה שאפליקציית הלקוח שולחת ל-Apigee גדול מהמגבלה המותרת ב-Apigee Edge. - מאמתים את גודל המטען הייעודי של הבקשה כפי שנקבע בשלב 1.
- אם גודל המטען הייעודי גדול מ-10MB המותר, זו הסיבה לשגיאה.
- אם גודל המטען הייעודי נמוך מ-10MB, יכול להיות שהמטען הייעודי (payload) של הבקשה מועבר בפורמט דחוס. במקרה כזה, צריך לבדוק את הגודל הלא דחוס של המטען הייעודי (payload) של הבקשה הדחוסה.
- אפשר לבדוק אם הבקשה מהלקוח נשלחה בפורמט דחוס ואם
הגודל הלא דחוס היה גדול מהמגבלה המותרת באחת מהשיטות
הבאות:
נתוני מעקב
כדי לבצע אימות באמצעות כלי המעקב:
- אם תיעדתם נתוני מעקב לבקשה שנכשלה, כדאי לפעול לפי השלבים המפורטים
במעקב וב
- קביעת הערך של המשתנה client.received.content.length
- מוודאים שהבקשה מהלקוח הכילה את הכותרת Content-Encoding:
gzip
- אם הערך של המשתנה client.received.content.length גדול מה- 10MB,
מההגבלה המותרת ומכותרת הבקשה Content-Encoding:
gzip
, זו הסיבה לשגיאה.
בקשה בפועל
כדי לאמת באמצעות הבקשה עצמה:
- אם אין לך גישה לבקשה שנשלחה בפועל על ידי אפליקציית הלקוח, עליך לעבור אל פתרון.
- אם יש לכם גישה לבקשה שנשלחה בפועל על ידי אפליקציית הלקוח, עליכם לבצע את
השלבים הבאים:
- צריך לאמת את גודל המטען הייעודי (payload) שהועבר בבקשה, יחד עם
הכותרת
Content-Encoding
שנשלחה בבקשה. צריך לבדוק אם הגודל הלא דחוס של המטען הייעודי חורג מהמגבלה המותרת ב-Apigee Edge
בקשה לדוגמה:
curl https://<hostalias>/testtoobigbody -k -X POST -F file=@test15mbfile.gz -H "Content-Encoding: gzip" -v
במקרה שלמעלה, הקובץ
test15mbfile.gz
קטן ממגבלת הגודל. עם זאת, הגודל של הקובץ הלא דחוסtest15mbfile
הוא כ-15MB והכותרתContent-Encoding
היאgzip
.אם משתמשים בלקוח אחר, כדאי להוריד את יומני הלקוח כדי לבדוק מה גודל המטען הייעודי (payload) שנשלח ואם הכותרת
Content-Encoding
מוגדרת לערךgzip
.
- צריך לאמת את גודל המטען הייעודי (payload) שהועבר בבקשה, יחד עם
הכותרת
יומנים של מעבד ההודעות
לאימות באמצעות יומנים של מעבד ההודעות:
- משתמשים בענן פרטי יכולים להיעזר ביומנים של מעבד ההודעות כדי לזהות את המידע החשוב לגבי שגיאות HTTP מסוג
413
. כדאי לבדוק את היומנים של מעבד ההודעות:
/opt/apigee/var/log/edge-message-processor/logs/system.log
אפשר לחפש כדי לראות אם יש שגיאות
413
במהלך תקופה מסוימת (אם הבעיה אירעה בעבר) או אם יש בקשות שעדיין נכשלות עם413
.אפשר להשתמש במחרוזות החיפוש הבאות:
grep -ri "chunkCount"
grep -ri "RequestTooLarge"
- יופיעו שורות מ-
system.log
דומות לשורות הבאות (TotalRead
ו-chunkCount
עשויים להשתנות במקרה שלך):2021-07-06 13:29:57,544 NIOThread@1 ERROR HTTP.SERVICE - TrackingInputChannel.checkMessageBodyTooLarge() : Message is too large. TotalRead 10489856 chunkCount 2570 2021-07-06 13:29:57,545 NIOThread@1 INFO HTTP.SERVICE - ExceptionHandler.handleException() : Exception trace: com.apigee.errors.http.user.RequestTooLarge : Body buffer overflow
- בתהליך ביטול הדחיסה, ברגע שמעבד ההודעות קובע שסך כל הבייטים לקריאה גדול מ-10MB, הוא מפסיק ומדפיס את השורה הבאה:
Message is too large. TotalRead 10489856 chunkCount 2570
ניתן להסיק מכך שגודל המטען הייעודי של הבקשה גדול מ-10MB ו-Apigee מקפץ את השגיאה
RequestTooLarge
כשהגודל מתחיל לחרוג מהמגבלה של 10MB עם קוד שגיאה כ-protocol.http.TooBigBody
- אם תיעדתם נתוני מעקב לבקשה שנכשלה, כדאי לפעול לפי השלבים המפורטים
במעקב וב
רזולוציה
תיקון הגודל
אפשרות מס' 1 [מומלץ]: תיקון אפליקציית הלקוח כך שגודל המטען הייעודי לא יישלח יותר מהמגבלה המותרת
- בודקים את הסיבה שבגללה הלקוח הספציפי שולח בקשה או גודל מטען ייעודי (payload) גדול מהמותר כפי שמוגדר במגבלות.
אם היא לא רצויה, משנים את אפליקציית הלקוח כך שהיא תשלח גודל של בקשה / מטען ייעודי שהוא קטן מהמגבלה המותרת.
בדוגמה שלמעלה, אפשר לתקן את הבעיה על ידי העברת קובץ קטן יותר, למשל
test5mbfile
(בגודל של 5MB), כפי שמוצג בהמשך:curl https://<host>/testtoobigbody -k -X POST -F file=@test5mbfile -v
- אם רצוי לשלוח בקשה/מטען ייעודי (payload) שחורג מהמגבלה המותרת, יש לעבור לאפשרויות הבאות.
תבנית של כתובת אתר חתומה
אפשרות מס' 2 [מומלץ]: שימוש בדפוס כתובות URL חתומות בתוך Apigee JavaCallout
עבור מטענים ייעודיים (payloads) בנפח של יותר מ-10MB, ההמלצה של Apigee היא להשתמש בדפוס כתובת URL חתום בתוך Apigee JavaCallout, כפי שמתואר בדוגמה Edge Callout: Signed URL Generator ב-GitHub.
סטרימינג
אפשרות מס' 3 : שימוש בסטרימינג
אם שרת ה-API של ה-API צריך לטפל בבקשות גדולות מאוד ו/או בתגובות גדולות מאוד, אפשר להפעיל סטרימינג ב-Apigee.
CwC
אפשרות מס' 4 : שימוש בנכס CwC כדי להגדיל את מגבלת מאגר הנתונים הזמני
יש להשתמש באפשרות הזו רק כשאי אפשר להשתמש באף אחת מהאפשרויות המומלצות, כי ייתכן שיהיו בעיות בביצועים אם גודל ברירת המחדל גדל.
ב-Apigee יש מאפיין CwC שמאפשר להגדיל את מגבלת הגודל של המטען הייעודי (payload) של הבקשות והתגובה. לפרטים נוספים, אפשר לקרוא את המאמר הגדרת מגבלת גודל ההודעות בנתב או במעבד ההודעות
מגבלות
Apigee מצפה שאפליקציית הלקוח ושרת הקצה העורפי לא ישלחו מטענים ייעודיים שגדולים מהמגבלה המותרת, כפי שמתואר עבור Request/response size
ב-Apigee Edge Limits.
- אם אתם משתמשים ב-Public Cloud, הגודל המקסימלי של המטען הייעודי (payload) של בקשות והיענות, מתועד עבור
Request/response size
ב-Apigee Edge Limits. - אם אתם משתמשים בענן פרטי , יכול להיות ששיניתם את מגבלת ברירת המחדל של גודל המטען הייעודי (payload) של בקשות ושל בקשות התגובה (למרות שזו לא שיטה מומלצת). אפשר לבדוק מה מגבלת הגודל של המטען הייעודי (payload) המקסימלי של בקשות בעזרת ההוראות במאמר איך בודקים את המגבלה הנוכחית.
איך בודקים את המגבלה הנוכחית?
בקטע הזה מוסבר איך לוודא שהמאפיין HTTPRequest.body.buffer.limit
עודכן עם ערך חדש במעבדי ההודעות.
- במחשב, מחפשים את המאפיין
HTTPRequest.body.buffer.limit
בספרייה/opt/apigee/edge-message- processor/conf
ובודקים איזה ערך הוגדר באמצעות הפקודה הבאה:grep -ri "HTTPRequest.body.buffer.limit" /opt/apigee/edge-message-processor/conf
- התוצאה לדוגמה מהפקודה שלמעלה:
/opt/apigee/edge-message-processor/conf/http.properties:HTTPRequest.body.buffer.limit=10m
בפלט לדוגמה שלמעלה, שימו לב שהמאפיין
HTTPRequest.body.buffer.limit
הוגדר עם הערך10m
ב-http.properties
.המגבלה של גודל המטען הייעודי (payload) של הבקשה שהוגדרה ב-Apigee לענן הפרטי היא 10MB.
אם אתם עדיין זקוקים לעזרה מהתמיכה של Apigee, תוכלו לקרוא את המאמר נדרש איסוף פרטי אבחון.
צריך לאסוף פרטי אבחון
יש לאסוף את פרטי האבחון הבאים ולאחר מכן לפנות לתמיכה של Apigee Edge:
אם אתם משתמשים ב-Public Cloud, עליכם לספק את הפרטים הבאים:
- שם הארגון
- שם הסביבה
- שם שרת proxy ל-API
- השלמה של פקודת curl המשמשת לשחזור השגיאה
413
- קובץ מעקב לבקשות API
אם אתם משתמשים בענן פרטי, עליכם לספק את הפרטים הבאים:
- זוהתה הודעת שגיאה מלאה בבקשות שנכשלו
- שם הארגון
- שם הסביבה
- חבילת שרת proxy ל-API
- קובץ מעקב לבקשות API שנכשלו
- השלמה של פקודת curl המשמשת לשחזור השגיאה
413
יומני הגישה של 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