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

מוצג המסמך של Apigee Edge.
כניסה למסמכי העזרה של Apigee X.
info

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

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

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

  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"
    

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

    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"