פתרון בעיות שגיאה בסביבת זמן הריצה שקשורות למכסות

אתם צופים במסמכי התיעוד של Apigee Edge.
כדאי לעיין במסמכי התיעוד של Apigee X.
מידע

InvalidMessageWeight

קוד שגיאה

policies.ratelimit.InvalidMessageWeight

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

{
    "fault": {
        "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> במדיניות בנושא מכסות. אפשר למצוא את המידע הזה ברכיב faultstring של תגובת השגיאה. לדוגמה, בשגיאה הבאה, הערך הלא תקין שמשמש לרכיב <MessageWeight> הוא 1.5:

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

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

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
        <Quota async="false" continueOnError="false" enabled="true" name="Quota_with_weight" type="calendar">
        <DisplayName>Quota_with_weight</DisplayName>
        <Properties/>
        <Allow count="3"/>
        <Interval>1</Interval>
        <TimeUnit>minute</TimeUnit>
        <StartTime>2017-7-16 12:00:00</StartTime>
        <MessageWeight ref="message_weight"/>
    </Quota>
    
  3. מגדירים את הערך של המשתנה שמשמש ל-<MessageWeight> במדיניות/יות בנושא מכסות שזוהו. אפשר לחלץ את הערך של משתנה זרימה מכותרות HTTP, מפרמטרים של שאילתות, ממטען ייעודי (payload) של בקשות XML או JSON, או להגדיר אותו במדיניות אחרת:

    1. מאתרים את הקוד בחבילת ה-API Proxy שבה הוגדר המשתנה לראשונה.
    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");
}

FailedToResolveQuotaIntervalReference

קוד שגיאה

policies.ratelimit.FailedToResolveQuotaIntervalReference

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

{
    "fault": {
        "faultstring": "Failed to resolve quota interval reference [reference] in quota policy {1}",
        "detail": {
            "errorcode": "policies.ratelimit.FailedToResolveQuotaIntervalReference"
        }
    }
}

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

{
    "fault": {
        "faultstring": "Failed to resolve quota interval reference api.product.developer.quota.interval in quota policy {1}",
        "detail": {
            "errorcode": "policies.ratelimit.FailedToResolveQuotaIntervalReference"
        }
    }
}

סיבה

השגיאה הזו מתרחשת אם רכיב <Interval> לא מוגדר במדיניות בנושא מכסות. האלמנט הזה הוא חובה ומשמש לציון מרווח הזמן שרלוונטי למכסה. מרווח הזמן יכול להיות דקות, שעות, ימים, שבועות או חודשים, כפי שמוגדר באמצעות רכיב <TimeUnit>.

אבחון

  1. בודקים כל אחת ממדיניות המכסות ב-API Proxy שבו התרחשה הכשל. אם יש מדיניות בנושא מכסות שבה לא מוגדר הרכיב הנדרש <Interval>, זו הסיבה לשגיאה.

    לדוגמה, למדיניות מכסת המינוי הבאה חסר הרכיב הנדרש <Interval>:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
        <Quota async="false" continueOnError="false" enabled="true" name="CheckQuota" type="calendar">
        <DisplayName>CheckQuota</DisplayName>
        <Properties/>
        <Allow count="3"/>
            <TimeUnit ref="verifyapikey.verify-api-key.apiproduct.developer.quota.timeunit">hour</TimeUnit>
        <StartTime>2017-7-16 12:00:00</StartTime>
    </Quota>
    

    מכיוון שהרכיב הנדרש <TimeUnit> לא מוגדר במדיניות בנושא מכסות שמופיעה למעלה, תקבלו את קוד השגיאה:

    policies.ratelimit.FailedToResolveQuotaIntervalReference
    

רזולוציה

צריך לוודא שכל כללי המכסה של שרת proxy נתון של API כוללים את רכיב החובה <Interval> שמוגדר בצורה תקינה.

כדי לתקן את הדוגמה שמוצגת למעלה, אפשר לשנות את המדיניות כך שתכלול את הרכיב <Interval> כמו בדוגמה שלמטה.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Quota async="false" continueOnError="false" enabled="true" name="CheckQuota" type="calendar">
    <DisplayName>CheckQuota</DisplayName>
    <Properties/>
    <Allow count="3"/>
    <TimeUnit ref="verifyapikey.verify-api-key.apiproduct.developer.quota.timeunit">hour</TimeUnit>
    <Interval ref="verifyapikey.verify-api-key.apiproduct.developer.quota.interval">1</Interval>
    <StartTime>2017-7-16 12:00:00</StartTime>
</Quota>

FailedToResolveQuotaIntervalTimeUnitReference

קוד שגיאה

policies.ratelimit.FailedToResolveQuotaIntervalTimeUnitReference

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

{
    "fault": {
        "faultstring": "Failed to resolve quota time unit reference [reference] in quota policy {1}",
        "detail": {
            "errorcode": "policies.ratelimit.FailedToResolveQuotaIntervalTimeUnitReference"
        }
    }
}

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

{
    "fault": {
        "faultstring": "Failed to resolve quota time unit reference apiproduct.developer.quota.timeunity in quota policy {1}",
        "detail": {
            "errorcode": "policies.ratelimit.FailedToResolveQuotaIntervalTimeUnitReference"
        }
    }
}

סיבה

השגיאה הזו מתרחשת אם הרכיב <TimeUnit> לא מוגדר במדיניות בנושא מכסות. זהו רכיב חובה שמשמש לציון יחידת הזמן שרלוונטית למכסת השימוש. מרווח הזמן יכול להיות בדקות, בשעות, בימים, בשבועות או בחודשים.

אבחון

  1. בודקים כל אחת ממדיניות המכסות ב-API Proxy שבו התרחשה הכשל. אם יש מדיניות בנושא מכסות שבה לא מוגדר הרכיב הנדרש <TimeUnit>, זו הסיבה לשגיאה.

    לדוגמה, במדיניות מכסת המינוי הבאה חסר הרכיב הנדרש <TimeUnit>:

    <Quota async="false" continueOnError="false" enabled="true" name="CheckQuota" type="calendar">
      <DisplayName>CheckQuota</DisplayName>
      <Properties/>
      <Allow count="3"/>
          <Interval ref="verifyapikey.verify-api-key.apiproduct.developer.quota.interval">1</Interval>
      <StartTime>2017-7-16 12:00:00</StartTime>
    </Quota>
    

    מכיוון שהרכיב הנדרש <TimeUnit> לא מוגדר במדיניות בנושא מכסות שמופיעה למעלה, תקבלו את קוד השגיאה:

    policies.ratelimit.FailedToResolveQuotaIntervalTimeUnitReference
    

רזולוציה

צריך לוודא שכל כללי המכסה של שרת proxy נתון של API כוללים את רכיב החובה <TimeUnit>.

כדי לתקן את הדוגמה שמוצגת למעלה, אפשר לשנות את המדיניות כך שתכלול את הרכיב <TimeUnit> כמו בדוגמה שלמטה.

<Quota async="false" continueOnError="false" enabled="true" name="CheckQuota" type="calendar">
    <DisplayName>CheckQuota</DisplayName>
    <Properties/>
    <Allow count="3"/>
    <TimeUnit ref="verifyapikey.verify-api-key.apiproduct.developer.quota.timeunit">hour</TimeUnit>
    <Interval ref="verifyapikey.verify-api-key.apiproduct.developer.quota.interval">1</Interval>
    <StartTime>2017-7-16 12:00:00</StartTime>
</Quota>