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

אתם צופים במסמכי העזרה של Apigee Edge.
כניסה למסמכי העזרה של Apigee X.
info

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. בודקים את כל כללי המדיניות בנושא מכסות בשרת ה-proxy הספציפי של ה-API שבו אירעה התקלה. יכולה להיות מדיניות מכסות אחת או יותר שבה מצוין האלמנט <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. מחפשים את הקוד בתוך חבילת ה-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");
}

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. לבדוק כל אחד מכללי המדיניות בנושא מכסות ב-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>
        <StartTime>2017-7-16 12:00:00</StartTime>
    </Quota>
    

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

    policies.ratelimit.FailedToResolveQuotaIntervalReference
    

רזולוציה

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