פתרון בעיות בזמן ריצה של מדיניות Spike Arrest

כרגע מוצג התיעוד של Apigee Edge.
כניסה למסמכי התיעוד של Apigee X.
מידע

InvalidMessageWeight

קוד שגיאה

policies.ratelimit.InvalidMessageWeight

גוף התגובה לשגיאה

{
    "fault": {jdoe
        "faultstring": "Invalid message weight value [invalid_value]",
        "detail": {
            "errorcode": "policies.ratelimit.InvalidMessageWeight"
        }
    }
}

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

{
    "fault": {
        "faultstring": "Invalid message weight value 1.5",
        "detail": {
            "errorcode": "policies.ratelimit.InvalidMessageWeight"
        }
    }
}

סיבה

השגיאה הזו מתרחשת אם הערך שצוין לרכיב <MessageWeight> באמצעות משתנה זרימה לא חוקי (ערך שאינו מספר שלם).

לדוגמה, אם הערך של משתנה הזרימה שצוין לרכיב <MessageWeight> הוא 1.5 (ערך שאינו מספר שלם), תופיע השגיאה.

אבחון

  1. יש לזהות את הערך הלא חוקי שמשמש את הרכיב <MessageWeight> במדיניות Spike Arrest. אפשר למצוא את המידע הזה ברכיב faultstring של תגובת השגיאה. לדוגמה, בשגיאה הבאה, הערך הלא חוקי שמשמש לרכיב <MessageWeight> הוא 1.5:

    "faultstring": "Invalid message weight value 1.5"
    
  2. כדאי לבדוק את כל כללי המדיניות של Spike Arrest בשרת ה-proxy הספציפי ל-API, שבו אירעה הכשל. יכול להיות לפחות מדיניות אחת של Spike Arrest שבה צוין הרכיב <MessageWeight>.

    לדוגמה, במדיניות הבאה מצוין הערך של <MessageWeight> באמצעות משתנה זרימה שנקרא message_weight:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
        <SpikeArrest async="false" continueOnError="false" enabled="true" name="SpikeArrest_AuthProxy">
        <DisplayName>SpikeArrest_AuthProxy</DisplayName>
        <Properties/>
        <Identifier ref="request.header.some-header-name"/>
        <Rate>100ps</Rate>
        <MessageWeight ref="message_weight"/>
    </SpikeArrest>
    
  3. קובעים את הערך של המשתנה שמשמש ברכיב <MessageWeight> של המדיניות שזוהתה במסגרת Spike Arrest Policy. אפשר לחלץ את הערך של משתנה הזרימה מכותרות HTTP, מפרמטרים של שאילתות, ממטען ייעודי (payload) של בקשת XML או של JSON או מוגדר במדיניות אחרת.

    1. מאתרים את הקוד בשרת ה-API של שרת ה-proxy, במקום שבו המשתנה הוגדר קודם.
    2. אחרי שמבינים מהי המדיניות שבה המשתנה מוגדר ומאוכלס קודם, צריך לבדוק איך מוגדר הערך של המשתנה.
    3. אם הערך של משתנה הזרימה תואם לערך שזוהה בשלב 1 למעלה, זו הסיבה לשגיאה.

    לדוגמה, נניח שנעשה שימוש במדיניות JavaScript לפני המדיניות Spike Arrest כדי להגדיר את המשתנה message_weight בהתאם לשיטת הבקשה, כפי שמוצג בהמשך:

    var verb = context.getVariable("request.verb");
    context.setVariable("message_weight", "1.5");
    if (verb == 'POST') {
      context.setVariable("message_weight", "2");
    }
    

    שימו לב שהערך של המשתנה message_weight הוא 1.5, וזהו ערך לא חוקי (מספר שאינו שלם).

רזולוציה

צריך לוודא שהערך של הרכיב MessageWeight הוא ערך חוקי (ערך מספר שלם).

כדי לתקן את הדוגמה שלמעלה, אפשר לשנות את הערך של המשתנה message_weight ב-JavaScript כך שיהיה מספר שלם:

var verb = context.getVariable("request.verb");
context.setVariable("message_weight", "1");
if (verb == 'POST') {
  context.setVariable("message_weight", "2");
}

FailedToResolveSpikeArrestRate

קוד שגיאה

policies.ratelimit.FailedToResolveSpikeArrestRate

גוף התגובה לשגיאה

{
    "fault": {
        "faultstring": "Failed to resolve Spike Arrest Rate reference [reference] in SpikeArrest policy [api_policy]",
        "detail": {
            "errorcode": "policies.ratelimit.FailedToResolveSpikeArrestRate"
        }
    }
}

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

{
    "fault": {
        "faultstring": "Failed to resolve Spike Arrest Rate reference request.header.rate in SpikeArrest policy SpikeArrest_AuthProxy",
        "detail": {
            "errorcode": "policies.ratelimit.FailedToResolveSpikeArrestRate"
        }
    }
}

סיבה

השגיאה הזו מתקבלת אם לא ניתן לפענח את ההפניה למשתנה שמכיל את הגדרת הקצב של הרכיב <Rate> לערך במדיניות Spike Arrest. הרכיב הזה הוא חובה ומשמש לציון שיעור המעצרים של עלייה חדה, בפורמט {int}pm או {int}ps. לדוגמה, {int}pm יכול להיות 500pm, והמשמעות היא 500 קריאות לדקה. בדומה לכך, הערך 10ps מייצג 10 קריאות בשנייה.

אבחון

  1. מזהים את המדיניות מסוג Spike Arrest שבה התרחשה השגיאה, ואת שם קובץ העזר שלא ניתן לפתור כראוי. אפשר למצוא את שני הפריטים האלה ברכיב faultstring של תגובת השגיאה.

    לדוגמה, במחרוזת הבאג הבאה, שם המדיניות הוא SpikeArrest_AuthProxy וההפניה היא request.header.rate:

    "faultstring": "Failed to resolve Spike Arrest Rate reference request.header.rate in SpikeArrest policy SpikeArrest_AuthProxy"
    
  2. ב-XML של המדיניות מסוג Spike Arrest שנכשל, מוודאים שהשם של קובץ העזר תואם לשם ההפניה שזוהה במחרוזת התקלה (שלב 1 למעלה). ** **

    לדוגמה, במדיניות הבאה מגדירים את הרכיב עם שם ההפניה request.header.rate, שתואם למה שנמצא ב-faultstring:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
        <SpikeArrest async="false" continueOnError="false" enabled="true" name="SpikeArrest_AuthProxy">
        <DisplayName>SpikeArrest_AuthProxy</DisplayName>
        <Properties/>
        <Identifier ref="request.header.some-header-name"/>
        <Rate ref="request.header.rate"/>
    </SpikeArrest>
    
    
  3. החליטו אם המשתנה מוגדר וזמין בתהליך שבו מופעלת מדיניות Spike Arrest.

  4. אם המשתנה הוא:

    • לא חלה עליהם (לא זמינה בתהליך הספציפי שבו המדיניות מופעלת) או
    • לא ניתן לפענח (אינו מוגדר)

    זו הסיבה לשגיאה.

    בדוגמה שלמעלה, הערך של שיעור המעצרים החד-פעמי ברכיב <Rate> אמור להגיע מכותרת הבקשה rate. עם זאת, Edge לא יכול לפתור את הבעיה request.header.rate. המצב הזה קורה אם ה-rate של הכותרת לא מועבר כחלק מבקשת ה-API.

    לפניכם דוגמה לבקשת API שלא מעבירה את ה-rate של הכותרת כחלק מהבקשה:

        curl -v http://jdoe-eval-test.apigee.net/check_spikearrest -H "Content-Type: application/json"
    

    בגלל שהכותרת rate לא מועברת כחלק מהבקשה, צריך לציין את הערך request.header.rate שנמצא בשימוש ברכיב <Rate> במדיניות SpikeArrest שצוינה למעלה, ולכן לא ניתן לפתור אותה. תקבלו את קוד השגיאה:

    policies.ratelimit.FailedToResolveSpikeArrestRate
    

רזולוציה

צריך לוודא שהמשתנה שיש אליו הפניה ברכיב <Rate> קיים או מוגדר וזמין בתהליך הספציפי שבו מתבצעת המדיניות של Spike Arrest.

כדי לתקן את הדוגמה שלמעלה, אפשר לשנות את הבקשה כך שתכלול את הכותרת rate (שיעור) כפי שמוצג בהמשך:

curl -v  http://jdoe-eval-test.apigee.net/check_spikearrest -H "Content-Type: application/json" -H "rate:30ps"