การแก้ปัญหาข้อผิดพลาดเกี่ยวกับรันไทม์ของนโยบาย 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. ตรวจสอบนโยบายการป้องกันการเพิ่มขึ้นของทราฟิกทั้งหมดในพร็อกซี API ที่เฉพาะเจาะจงซึ่งเกิดข้อผิดพลาด อาจมีนโยบายการควบคุมอัตราการเข้าชมที่เพิ่มขึ้นอย่างน้อย 1 รายการซึ่งระบุองค์ประกอบ <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, พารามิเตอร์การค้นหา, เพย์โหลดคำขอ XML หรือ JSON หรือกำหนดไว้ในนโยบายอื่น

    1. ค้นหาโค้ดภายในพร็อกซี 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. ระบุนโยบายการจำกัดอัตราการเข้าชมที่เกิดข้อผิดพลาดและชื่อของ การอ้างอิงที่แก้ไขได้อย่างไม่ถูกต้อง คุณจะเห็นทั้ง 2 รายการนี้ ในองค์ประกอบ faultstring ของการตอบกลับข้อผิดพลาด

    ตัวอย่างเช่น ใน faultstring ต่อไปนี้ ชื่อนโยบายคือ SpikeArrest_AuthProxy และการอ้างอิงคือ request.header.rate

    "faultstring": "Failed to resolve Spike Arrest Rate reference request.header.rate in SpikeArrest policy SpikeArrest_AuthProxy"
    
  2. ใน XML ของนโยบายการควบคุมอัตราการโทรที่ล้มเหลว ให้ตรวจสอบว่าชื่อของการอ้างอิง ที่ใช้ตรงกับชื่อการอ้างอิงที่ระบุในสตริงข้อผิดพลาด (ขั้นตอนที่ 1 ด้านบน) ** **

    ตัวอย่างเช่น นโยบายต่อไปนี้จะตั้งค่าองค์ประกอบ ที่มีการอ้างอิง ชื่อ request.header.rate ซึ่งตรงกับสิ่งที่อยู่ในสตริงข้อผิดพลาด

    <?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> ในนโยบายการป้องกันการเพิ่มขึ้นของทราฟิกข้างต้นจึงไม่ได้รับการกำหนดและไม่สามารถแก้ไขได้ ดังนั้นคุณจะได้รับรหัสข้อผิดพลาดต่อไปนี้

    policies.ratelimit.FailedToResolveSpikeArrestRate
    

ความละเอียด

ตรวจสอบว่าตัวแปรที่อ้างอิงในองค์ประกอบ <Rate> มีอยู่/ได้รับการกำหนด และพร้อมใช้งานในโฟลว์ที่เฉพาะเจาะจง ซึ่งมีการดำเนินการตามนโยบายการจำกัดอัตราการโทร

หากต้องการแก้ไขตัวอย่างที่แสดงด้านบน คุณสามารถแก้ไขคำขอให้รวมส่วนหัว rate ดังที่แสดงด้านล่าง

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