502 שער שגוי – ביטול הדחיסהFailureAtResponse

אתם צופים במסמכי התיעוד של 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,
  • BUT

  • פורמט המטען הייעודי (payload) שנשלח על ידי השרת העורפי או שרת היעד כחלק מתגובת ה-HTTP לא תואם לפורמט הקידוד שצוין בכותרת Content-Encoding

הסיבה לכך היא ש-Apigee Edge לא מצליח לפענח את המטען הייעודי (payload) באמצעות הקידוד שצוין, כי הפורמט של המטען הייעודי לא זהה לפורמט של הקידוד שצוין בכותרת Content-Encoding.

ריכזנו כאן כמה דוגמאות לערכים נתמכים Content-Encoding ולאופן שבו Apigee Edge מצפה שמטען הייעודי (payload) ייוצג במקרים האלה:

תרחיש קידוד התוכן ייצוג של מטען ייעודי (Payload)
קידוד יחיד gzip

הפורמט של gzip ב-Unix.

RFC1952 GZIP Format

קידוד יחיד deflate

הפורמט הזה משתמש במבנה zlib עם אלגוריתם דחיסה מסוג deflate.

מידע נוסף זמין ב- RFC1950 וב- RFC1951.

קידודים מרובים

קידודים מרובים

לדוגמה, במקרים שבהם הקידוד נעשה פעמיים, יכול להיות ש:

  • gzip, deflate
  • ‫gzip, ‏ gzip
  • deflate, ‏ gzip
  • deflate, deflate
הוחלו כמה קידודים על מטען הייעודי (payload) בסדר שבו הם מופיעים בכותרת.

אלה הסיבות האפשריות לשגיאה הזו:

סיבה תיאור הוראות לפתרון בעיות שרלוונטיות ל
פורמט המטען הייעודי (payload) של התגובה לא תואם לקידוד התוכן הפורמט של מטען הייעודי (payload) של התגובה שנשלח על ידי השרת העורפי או שרת היעד לא מקודד או לא תואם לקידוד שצוין בכותרת Content-Encoding. משתמשים ב-Edge Public Cloud וב-Edge Private Cloud

שלבים נפוצים לאבחון

כדי לאבחן את השגיאה הזו, אפשר להשתמש באחד מהכלים או מהטכניקות הבאים:

API Monitoring

כדי לאבחן את השגיאה באמצעות הכלי 'מעקב אחר API':

  1. נכנסים לממשק המשתמש של Apigee Edge כמשתמש עם תפקיד מתאים.
  2. עוברים לארגון שבו רוצים לבדוק את הבעיה.

  3. עוברים לדף Analyze > API Monitoring > Investigate.
  4. בוחרים את מסגרת הזמן הספציפית שבה נתקלת בשגיאות.
  5. מוודאים שהמסנן Proxy מוגדר לAll.
  6. משרטטים את קוד התקלה מול הזמן.
  7. בוחרים תא עם קוד השגיאה messaging.adaptors.http.flow.DecompressionFailureAtResponse כמו בדוגמה הבאה:

    ( הגדלת התמונה)

  8. מוצג מידע על קוד התקלה messaging.adaptors.http.flow.DecompressionFailureAtResponse, כמו בדוגמה הבאה:

    ( הגדלת התמונה)

  9. לוחצים על הצגת יומנים ומרחיבים את השורה שנכשלה עם השגיאה 502.

    ( הגדלת התמונה)

  10. בחלון יומנים, רושמים את הפרטים הבאים:
    • קוד סטטוס: 502
    • מקור התקלה: target
    • קוד שגיאה: messaging.adaptors.http.flow.DecompressionFailureAtResponse.
  11. אם הערך של Fault Source הוא target, המשמעות היא שפורמט מטען הייעוד של התגובה לא תאם ל קידוד הנתמך שצוין בכותרת התגובה של שרת הקצה העורפי Content-Encoding.

כלי המעקב

כדי לאבחן את השגיאה באמצעות הכלי Trace:

  1. מפעילים את trace session (מעקב אחר סשן) ואחת מהאפשרויות הבאות:
    1. ממתינים להתרחשות השגיאה 502 Bad Gateway, או
    2. אם אפשר לשחזר את הבעיה, מבצעים את קריאת ה-API ומשחזרים את 502 Bad Gateway.
  2. מוודאים שהאפשרות הצגת כל פרטי הזרימה מופעלת:

  3. בוחרים באחת מהתגובות שנכשלו ובודקים את המעקב.
  4. אפשר לנווט בין השלבים השונים של ה-trace ולמצוא את המקום שבו התרחשה השגיאה.
  5. בדרך כלל השגיאה מופיעה בתהליך מיד אחרי השלב Response Received from target server (התקבלה תגובה משרת היעד), כמו שמוצג כאן:

    ( הגדלת התמונה)

  6. שימו לב לערכים של המאפיינים מהמעקב:

    • Content-Encoding: gzip
    • תוכן התגובה: {"fault":{"faultstring":"Decompression failure at response","detail":{"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtResponse"}}}
  7. עוברים לשלב השגיאה מיד אחרי השלב Response Received from target server (התקבלה תגובה משרת היעד):

    ( הגדלת התמונה)

    שימו לב למאפיינים:

    • שגיאה: Decompression failure at response
    • error.class: com.apigee.errors.http.server.BadGateway
    • error.cause: Not in GZIP format

      ב-error.cause מצוין שמטען הייעודי (payload) של התגובה הוא לא בפורמט GZIP. המשמעות היא שמערכת Apigee Edge ציפתה שמטען התגובה יהיה בפורמט GZIP, כפי שצוין בכותרת Content-Encoding (שנקבעה בשלב הקודם).לכן, מערכת Apigee Edge לא יכולה לבצע דקומפרסיה של המטען באמצעות gzip ומחזירה את השגיאה Decompression failure at response.

    שימו לב שהתשובה משרת היעד או מהשרת העורפי היא 200 במקרה הזה, אבל אפליקציית הלקוח תקבל תשובה מסוג 502 כי השגיאה מוחזרת על ידי Apigee Edge.

  8. עוברים לשלב Response Sent to Client (התשובה נשלחה ללקוח) בנתוני המעקב ולוחצים עליו.

    ( הגדלת התמונה)

    שימו לב לפרטים הבאים מהמעקב:

    • קוד הסטטוס: 502 Bad Gateway.
    • תוכן השגיאה: {"fault":{"faultstring":"Decompression failure at response","detail":{"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtResponse"}}}
  9. עוברים לשלב AX (נתוני Analytics שתועדו) במעקב ולוחצים עליו.

  10. גוללים למטה לקטע Phase Details (פרטי השלב) או Error Headers (כותרות שגיאה) וקובעים את הערכים של X-Apigee-fault-code ו-X-Apigee-fault-source, כמו שמוצג בהמשך:

    ( הגדלת התמונה)

  11. הערכים של X-Apigee-fault-code ו-X-Apigee-fault-source יהיו messaging.adaptors.http.flow.DecompressionFailureAtResponse ו-target, מה שמציין שהפורמט של מטען התגובה לא תאם לקידוד שצוין בכותרת Content-Encoding.
    כותרות תגובה ערך
    X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtResponse
    X-Apigee-fault-source target

NGINX

כדי לאבחן את השגיאה באמצעות יומני הגישה של NGINX:

  1. אם אתם משתמשים ב-Private Cloud, אתם יכולים להשתמש ביומני הגישה של NGINX כדי לקבוע את פרטי המפתח לגבי שגיאות HTTP 502.
  2. בודקים את יומני הגישה של NGINX:

    /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

    איפה: הערכים ORG,‏ ENV ו-PORT# מוחלפים בערכים בפועל.

  3. מחפשים אם יש שגיאות 502 במהלך פרק זמן מסוים (אם הבעיה התרחשה בעבר) או אם יש תגובות שעדיין נכשלות עם 502.
  4. אם אתם מוצאים שגיאות 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. אם יש אי התאמה, השגיאה הזו תופיע.

אבחון

  1. כדי לקבוע את קוד השגיאה ואת מקור השגיאה של השגיאה שנצפתה, אפשר להשתמש בכלי 'מעקב אחר קריאות ל-API', בכלי 'מעקב' או ביומני הגישה של NGINX, כמו שמוסבר בשלבים הנפוצים לאבחון.
  2. אם קוד השגיאה הוא messaging.adaptors.http.flow.DecompressionFailureAtResponse ומקור השגיאה הוא target, המשמעות היא שפורמט מטען הייעודי (payload) של התגובה שנשלח על ידי השרת העורפי או שרת היעד לא תואם ל Content-Encoding שצוין בכותרת התגובה.
  3. אפשר לקבוע את אי ההתאמה כחלק מתגובת ה-HTTP באחת מהשיטות הבאות:

    הודעת שגיאה

    כדי לאמת באמצעות הודעת השגיאה:

    1. אם יש לכם גישה להודעת השגיאה המלאה שהתקבלה מ-Apigee Edge, תוכלו לעיין בfaultstring.

      הודעת שגיאה לדוגמה:

      "faultstring":"Decompression failure at response"
    2. בהודעת השגיאה שלמעלה מוצג "Decompression failure at response", מה שאומר שלא הייתה אפשרות לבצע דקומפרסיה של התגובה באמצעות הקידוד שצוין בכותרת Content-Encoding.

    מעקב

    כדי לבצע אימות באמצעות הכלי Trace:

    1. קובעים את הערכים של Content-Type ו-error.cause באמצעות Trace כפי שמוסבר במאמר שלבים נפוצים לאבחון.
    2. הערכים מהדוגמה של נתוני המעקב הם:

      • Content-Encoding: gzip
      • error.cause: Not in GZIP format

      הערך בכותרת התגובה Content-Encoding הוא gzip; אבל מטען הייעודי (payload) של התגובה לא בפורמט GZIP (כפי שמצוין ב-error.cause). לכן, Apigee Edge מגיב עם קוד השגיאה 502 Bad Gateway וקוד השגיאה messaging.adaptors.http.flow.DecompressionFailureAtResponse.

    הבקשה בפועל

    כדי לאמת באמצעות הבקשה בפועל:

    אם יש לכם גישה לבקשה בפועל שנשלחה לאפליקציית השרת של היעד או העורף, אתם יכולים לבצע את השלבים הבאים:

    1. אם אתם משתמשים ב-Public Cloud או ב-Private Cloud, אתם יכולים לשלוח בקשה ישירות לשרת הקצה העורפי משרת הקצה העורפי עצמו או מכל מכונה אחרת שממנה מותר לכם לשלוח בקשה לשרת הקצה העורפי.
    2. אם אתם משתמשים ב-Private Cloud, אתם יכולים לשלוח את הבקשה לשרת הקצה העורפי מאחד ממעבדי ההודעות.
    3. בודקים את התגובה שנשלחה על ידי שרת הקצה העורפי ומזהים את הערך שמועבר בכותרת התגובה Content-Encoding.
    4. קובעים את הפורמט של המטען הייעודי (Payload) שנשלח כחלק מהבקשה.
    5. אם הערך של הכותרת 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.

    יומנים של מעבד הודעות

    כדי לבצע אימות באמצעות יומני מעבד בקשות:

    אם אתם משתמשים ב-Private Cloud, אתם יכולים להשתמש ביומני מעבד בקשות כדי לקבוע את פרטי המפתח לגבי שגיאות HTTP 502.

    1. בודקים את היומן של מעבד ההודעות:

      /opt/apigee/var/log/edge-message-processor/logs/system.log

    2. מחפשים כדי לראות אם יש שגיאות 502 במהלך פרק זמן מסוים (אם הבעיה התרחשה בעבר) או אם יש תגובות שעדיין נכשלות עם 502. אפשר להשתמש במחרוזת החיפוש הבאה:

      grep -ri "ZipException"
      
    3. יוצגו שורות מ-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() : Exception
      java.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 בהודעת השגיאה שלמעלה מציינות שמטען הייעודי של התגובה לא נשלח בפורמט deflate ולא תואם לקידוד שצוין בכותרת Content-Encoding של deflate. לכן, Apigee Edge מפעיל את החריגה ומחזיר קוד סטטוס 502 עם קוד שגיאה messaging.adaptors.http.flow.DecompressionFailureAtResponse לאפליקציות לקוח.

רזולוציה

  1. אם אין צורך במטען הייעודי (payload) של התגובה הדחוסה בתהליך של שרת ה-API proxy ב-Apigee Edge ובשרת הקצה העורפי, אל תעבירו את הכותרת Content-Encoding. אם יש צורך לדחוס את מטען הייעודי (payload) של התגובה, עוברים לשלב 2.
  2. אם יש צורך לדחוס את מטען התגובה, צריך לוודא ששרת הקצה העורפי תמיד שולח את הפרטים הבאים:
    • אחד מ הערכים של Content-Encoding בכותרת בתגובה
    • מטען הייעודי (payload) של התגובה בפורמט הנתמך ב-Apigee Edge תואם לפורמט הקידוד שצוין בכותרת Content-Encoding
  3. בדוגמה שצוינה למעלה, מטען הייעוד של התגובה הוא בפורמט ZIP, אבל כותרת התגובה מציינת Content-Encoding: gzip. כדי לפתור את הבעיה, צריך לשלוח את כותרת התגובה בתור Content-Encoding: gzip ואת מטען הייעודי לתגובה בפורמט 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, section 6.5.1
RFC 7231, section 3.1.2.2

אם עדיין דרושה לך עזרה מצוות התמיכה של Apigee, אפשר לעבור אל איסוף מידע לצורך אבחון.

צריך לאסוף פרטי אבחון

אוספים את נתוני האבחון הבאים ופונים אל התמיכה של Apigee Edge:

אם אתם משתמשי ענן ציבורי, עליכם לספק את הפרטים הבאים:

  • שם הארגון
  • שם הסביבה
  • שם ה-proxy ל-API
  • הפקודה curl שבה השתמשת כדי לשחזר את השגיאה 502
  • קובץ מעקב לתגובות של ה-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