אתם צופים במסמכי התיעוד של Apigee Edge.
כדאי לעיין במסמכי התיעוד של Apigee X. מידע
תיאור הבעיה
אפליקציית הלקוח מקבלת קוד סטטוס של HTTP 414 Request-URI Too Long עם קוד שגיאה protocol.http.TooBigLine כתגובה לקריאות ל-API.
הודעת שגיאה
אפליקציית הלקוח מקבלת את קוד התגובה הבא:
HTTP/1.1 414 Request-URI Too Long
בנוסף, יכול להיות שתופיע הודעת השגיאה הבאה:
{
"fault":{
"faultstring":"request line size exceeding 7,168",
"detail":{
"errorcode":"protocol.http.TooBigLine"
}
}
}
שימו לב שהערך faultstring בהודעת השגיאה שלמעלה מכיל את המגבלה המותרת לשורת הבקשה ב-Apigee Edge, שהיא 7168 bytes (7 KB).
גורמים אפשריים
השגיאה הזו מתרחשת אם הגודל של שורת הבקשה שנשלחת על ידי אפליקציית הלקוח אל Apigee Edge כחלק מבקשת HTTP גדול מהמגבלה המותרת ב-Apigee Edge.
לפני שנבדוק את הסיבות האפשריות לשגיאה הזו, נסביר מהי שורת הבקשה ואיך בודקים את הגודל שלה.
הסבר על שורת הבקשה
בקשת HTTP טיפוסית מורכבת משלושה חלקים:
- Request-Line
- ( Set of HTTP headers )
- [ Body ]
שורת הבקשה מורכבת משלושה חלקים, כמו שמוצג בהמשך.
Request-Line = <Method> <Request-URI> <HTTP-Version>
כשיישום לקוח שולח בקשת HTTP לשרת, השורה הראשונה שנשלחת לשרת מכילה את Request-Line שמתואר למעלה. אחרי זה מופיעות הכותרות וגוף הבקשה או המטען הייעודי (payload).
צילום המסך הבא לדוגמה מציג בקשת curl טיפוסית, את החלק Request (יחד עם Request-Line) ואת החלק Response.
הסבר על הגודל של שורת הבקשה
- בדוגמה שצוינה למעלה, השורה start (השורה הראשונה) בבקשה, שנקראת גם Request-Line, היא כזו:
GET /test/ HTTP/1.1
הגודל של Request-Line הוא
~19 bytesכי הוא מכיל את19 ASCII characters. מכיוון שהמספר הזה נמצא ב מגבלה המותרת ב-Apigee Edge, הבקשה מעובדת ללא שגיאות ומתקבלת תגובה שהפעולה בוצעה בהצלחה. - באופן דומה, אם בוחנים את
faultstringבהודעת השגיאה שמוצגת למעלה, היא מכילה את"request line size exceeding 7,168". המשמעות היא ששורת הבקשה בבקשת ה-HTTP שנשלחה מהלקוח חרגה מ-7,168 בייט.
אלה הסיבות האפשריות לשגיאה הזו:
| סיבה | תיאור | הוראות לפתרון בעיות שרלוונטיות ל |
|---|---|---|
| גודל המטען הייעודי (payload) של הבקשה גדול מהמגבלה המותרת | הגודל של Request-URI שנשלח על ידי אפליקציית הלקוח כחלק מבקשת HTTP אל Apigee Edge גדול מהמגבלה המותרת ב-Apigee Edge. | משתמשים ב-Edge Public Cloud וב-Edge Private Cloud |
שלבים נפוצים לאבחון
כדי לאבחן את השגיאה הזו, אפשר להשתמש באחד מהכלים או מהטכניקות הבאים:
API Monitoring
כדי לאבחן את השגיאה באמצעות הכלי 'מעקב אחר API':
- נכנסים לממשק המשתמש של Apigee Edge כמשתמש עם תפקיד מתאים.
עוברים לארגון שבו רוצים לבדוק את הבעיה.
- עוברים לדף Analyze > API Monitoring > Investigate.
- בוחרים את מסגרת הזמן הספציפית שבה נתקלת בשגיאות.
- משרטטים את קוד התקלה מול הזמן.
- בוחרים תא עם קוד השגיאה
protocol.http.TooBigLineוקוד הסטטוס414כמו בדוגמה הבאה:( הגדלת התמונה)
יוצג מידע על קוד התקלה
protocol.http.TooBiglineכמו בדוגמה הבאה:( הגדלת התמונה)
לוחצים על הצגת יומנים ומרחיבים את השורה של הבקשה שנכשלה:
( הגדלת התמונה)
בחלון Logs, שימו לב לפרטים הבאים:
- קוד סטטוס:
414 - מקור התקלה:
apigee - קוד שגיאה:
protocol.http.TooBigLine. - אורך הבקשה(בבייט):
7244 (> 7KB)
- קוד סטטוס:
- אם הערך של Fault Source הוא
apigeeאוMP, הערך של Fault Code הואprotocol.http.TooBigLineוהערך של Request-Length גדול מ-7 KB, המשמעות היא שלבקשת ה-HTTP מהלקוח יש URI של בקשה שגדול מהמגבלה המותרת ב- Apigee.
כלי המעקב
NGINX
כדי לאבחן את השגיאה באמצעות יומני הגישה של NGINX:
- אם אתם משתמשים ב-Private Cloud, אתם יכולים להשתמש ביומני הגישה של NGINX כדי לקבוע את פרטי המפתח לגבי שגיאות HTTP
414. בודקים את יומני הגישה של NGINX:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_logאיפה: הערכים ORG, ENV ו-PORT# מוחלפים בערכים בפועל.
- מחפשים כדי לראות אם יש
414שגיאות במהלך פרק זמן מסוים (אם הבעיה התרחשה בעבר) או אם יש בקשות שעדיין נכשלות עם414. אם מופיעות שגיאות
414עם הערך X-Apigee-fault-code שזהה לערך שלprotocol.http.TooBigLine, צריך לקבוע את הערך של X-Apigee-fault-source.
בדוגמה של רשומה מיומן הגישה של NGINX שמופיעה למעלה, הערכים של X-Apigee-fault-code ושל X-Apigee-fault-source הם:
כותרות תגובה ערך X-Apigee-fault-code protocol.http.TooBigLineX-Apigee-fault-source policyהערה לגבי אורך הבקשה:
7244(7.244KB > המגבלה המותרת)
הסיבה: גודל המטען הייעודי (payload) של הבקשה גדול מהמגבלה המותרת
אבחון
- כדי לזהות את קוד השגיאה, מקור השגיאה וגודל אורך הבקשה של השגיאה שנצפתה, אפשר להשתמש בכלי למעקב אחר API, בכלי Trace או ביומני הגישה של NGINX, כמו שמוסבר בשלבים נפוצים לאבחון.
- אם הערך של Fault Source הוא
apigeeאוMP, סימן שגודל הבקשה שנשלחה על ידי אפליקציית הלקוח אל Apigee גדול מהמגבלה המותרת ב-Apigee Edge. - אפשר לוודא שגודל שורת הבקשה חורג מהמגבלה המותרת של 7 KB באחת מהשיטות הבאות:
הודעת שגיאה
כדי לאמת באמצעות הודעת השגיאה:
אם יש לכם גישה להודעת השגיאה המלאה שהתקבלה מ-Apigee Edge, תוכלו לעיין ב
faultstring. התוfaultstringמציין שגודל שורת הבקשה חרג מהמגבלה המותרת של 7 KB.הודעת שגיאה לדוגמה:
"faultstring":"request line size exceeding 7,168"
הבקשה בפועל
כדי לאמת באמצעות הבקשה בפועל:
אם יש לכם גישה לבקשה בפועל שבוצעה על ידי אפליקציית הלקוח, אז צריך לבצע את השלבים הבאים:
- בודקים את הגודל של ה-URI שמועבר בבקשה.
אם תגלו שהגודל של ה-URI גדול מהמגבלה המותרת ב-Apigee Edge, זהו הגורם לבעיה.
בקשה לדוגמה:
curl http://<hostalias>/testtoobigline?_qparam=000000000000000000……..000000<trimmed> -k -X POST
בדוגמה שלמעלה, הערך של פרמטר השאילתה
qparamגדול מ-7 KB, כלומר הוא מכיל יותר מ-7 K תווים ב-ASCII.אם אתם משתמשים בלקוח אחר, אתם יכולים לבדוק את היומנים של הלקוח ולנסות לגלות את הגודל של שורת הבקשה שנשלחת אל Apigee Edge.
יומנים של מעבד הודעות
כדי לבצע אימות באמצעות יומני מעבד בקשות:
אם אתם משתמשים ב-Private Cloud, תוכלו להשתמש ביומני Message Processor כדי לוודא שגודל שורת הבקשה לא חרג מהמגבלה המותרת ב-Apigee Edge.
בודקים את היומנים של מעבד ההודעות:
/opt/apigee/var/log/edge-message-processor/logs/system.log- מחפשים
414שגיאות במהלך פרק זמן מסוים (אם הבעיה קרתה בעבר) או אם יש בקשות שעדיין נכשלות עם414. אפשר להשתמש במחרוזות החיפוש הבאות.grep -ri "exceeding"
grep -ri "RequestURITooLong"
- יוצגו שורות מ-
system.logשדומות לאלה:2021-07-12 08:53:31,461 NIOThread@0 ERROR ADAPTORS.HTTP.FLOW - AbstractRequestListener.onException() : Request:null, uri:null, message Id:null, exception:com.apigee.errors.http.user.RequestURITooLong{ code = protocol.http.TooBigLine, message = request line size exceeding 7,168, associated contexts = []}, context:Context@366f4217 input=ClientInputChannel(SSLClientChannel[Accepted: Remote:192.168.195.90:8443 Local:192.168.67.23:34256]@301912 useCount=1 bytesRead=0 bytesWritten=45849 age=2254670ms lastIO=0ms isOpen=true)
הטקסט
message = request line size exceeding 7,168בהודעת השגיאה שלמעלה מציין שגודל ה-URI של הבקשה הוא יותר מ-7 KB. לכן, ב-Apigee Edge מוצג החריגcom.apigee.errors.http.user.RequestURITooLongומוחזר קוד הסטטוס414עם קוד השגיאהprotocol.http.TooBiglineלאפליקציות הלקוח.
רזולוציה
תיקון המידה
אפשרות 1 [מומלצת]: מתקנים את אפליקציית הלקוח כך שלא תשלח בקשות עם גודל URI שגדול מהמגבלה המותרת
- צריך לנתח את הסיבה לכך שהלקוח הספציפי שולח בקשות עם גודל URI של בקשה שחורג מהמגבלה המותרת שמוגדרת במגבלות.
אם זה לא רצוי, צריך לשנות את אפליקציית הלקוח כך שהיא תשלח בקשות עם URI של בקשה בגודל קטן יותר מהמגבלה המותרת.
בדוגמה שצוינה למעלה, אפשר לפתור את הבעיה על ידי העברת הפרמטר הארוך של השאילתה כחלק מגוף הבקשה או ממטען הייעודי (payload), במקום להעביר אותו כחלק מכתובת ה-URL של הבקשה, כמו שמוצג בהמשך:
curl https://<host>/testtoobigline -k -X GET -d '{_qparam=000000000000000000<trimmed>}' -v- אם רוצים לשלוח URI מעבר למגבלה המותרת, אפשר לעבור לאפשרויות הבאות.
CwC
אפשרות 2 : שימוש במאפיין CwC כדי להגדיל את מגבלת השורות של הבקשה
Apigee מספק מאפיין CwC שמאפשר להגדיל את המגבלה של גודל שורת הבקשה. פרטים נוספים מופיעים במאמר בנושא הגדרת המגבלה על שורת הבקשה במעבד ההודעות
מגבלות
מערכת Apigee מצפה שאפליקציית הלקוח ושרת הקצה העורפי לא ישלחו שורות בקשה/תגובה שגודלן גדול מהמגבלה המותרת, כפי שמפורט במאמר מגבלת שורת בקשה/תגובה במגבלות של Apigee Edge.
- אם אתם משתמשים בענן ציבורי, המגבלה המקסימלית לגודל של שורת הבקשה והתגובה היא כפי שמפורט במאמר גודל שורת הבקשה/התגובה בנושא מגבלות ב-Apigee Edge.
- אם אתם משתמשים ב-Private Cloud, יכול להיות ששיניתם את מגבלת ברירת המחדל המקסימלית של גודל השורה של בקשות ותשובות (למרות שזו לא שיטה מומלצת). כדי לקבוע את המגבלה המקסימלית של גודל שורת הבקשה, אפשר לפעול לפי ההוראות במאמר איך בודקים את המגבלה הנוכחית.
איך בודקים את המגבלה הנוכחית?
בקטע הזה מוסבר איך לוודא שהנכס HTTPRequest.line.limit עודכן עם ערך חדש במעבדי ההודעות.
- במחשב של מעבד ההודעות, מחפשים את המאפיין
HTTPRequest.line.limitבספרייה/opt/apigee/edge-message-processor/confובודקים איזה ערך הוגדר, כמו שמוצג בהמשך:grep -ri "HTTPRequest.line.limit" /opt/apigee/edge-message-processor/conf
- התוצאה לדוגמה מהפקודה שלמעלה היא:
/opt/apigee/edge-message-processor/conf/http.properties:HTTPRequest.line.limit=7k
בדוגמת הפלט שלמעלה, שימו לב שהמאפיין
HTTPRequest.line.limitהוגדר עם הערך7kב-http.properties.המשמעות היא שהמגבלה על גודל שורת הבקשה שהוגדרה ב-Apigee לענן פרטי היא 7KB.
אם עדיין דרושה לך עזרה מצוות התמיכה של Apigee, אפשר לעבור אל איסוף מידע לצורך אבחון.
צריך לאסוף פרטי אבחון
אוספים את נתוני האבחון הבאים ופונים אל התמיכה של Apigee Edge:
אם אתם משתמשי ענן ציבורי, עליכם לספק את הפרטים הבאים:
- שם הארגון
- שם הסביבה
- שם ה-proxy ל-API
- הפקודה
curlשבה השתמשת כדי לשחזר את השגיאה414 - קובץ מעקב לבקשות ה-API
אם אתם משתמשים ב-Private Cloud, עליכם לספק את הפרטים הבאים:
- הודעת השגיאה המלאה שזוהתה בבקשות שנכשלו
- שם הארגון
- שם הסביבה
- חבילת proxy ל-API
- קובץ מעקב של בקשות ה-API שנכשלו
- הפקודה
curlשבה השתמשת כדי לשחזר את השגיאה414 יומני גישה של 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