Khắc phục lỗi thời gian chạy của chính sách Spike Arrest

Bạn đang xem tài liệu về Apigee Edge.
Chuyển đến tài liệu về Apigee X.
thông tin

InvalidMessageWeight

Mã lỗi

policies.ratelimit.InvalidMessageWeight

Nội dung phản hồi lỗi

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

Ví dụ về thông báo lỗi

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

Nguyên nhân

Lỗi này xảy ra nếu giá trị được chỉ định cho phần tử <MessageWeight> thông qua biến luồng không hợp lệ (một giá trị không phải số nguyên).

Ví dụ: nếu giá trị của biến luồng được chỉ định cho phần tử <MessageWeight> là 1, 5 (một giá trị không phải là số nguyên), thì lỗi sẽ xảy ra.

Chẩn đoán

  1. Xác định giá trị không hợp lệ dùng cho phần tử <MessageWeight> trong chính sách Điểm dừng tăng đột biến. Bạn có thể tìm thấy thông tin này trong phần tử faultstring của phản hồi lỗi. Ví dụ: trong lỗi sau đây, giá trị không hợp lệ dùng cho phần tử <MessageWeight>1.5:

    "faultstring": "Invalid message weight value 1.5"
    
  2. Kiểm tra tất cả các chính sách Tăng đột biến trong Proxy API cụ thể nơi xảy ra lỗi. Có thể có một hoặc nhiều chính sách Tăng đột biến trong đó chỉ định phần tử <MessageWeight>.

    Ví dụ: chính sách sau chỉ định giá trị của <MessageWeight> thông qua biến luồng có tên 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. Xác định giá trị của biến dùng trong phần tử <MessageWeight> của(các) Chính sách bắt giữ tăng đột biến đã xác định. Bạn có thể trích xuất giá trị của biến luồng từ tiêu đề HTTP, tham số truy vấn, tải trọng yêu cầu XML hoặc JSON hoặc được xác định trong một chính sách khác.

    1. Tìm mã trong proxy API, nơi biến được xác định trước.
    2. Sau khi bạn tìm hiểu chính sách xác định và điền biến trước, hãy kiểm tra cách đặt giá trị cho biến.
    3. Nếu giá trị của biến luồng khớp với giá trị đã xác định trong Bước 1 ở trên, thì đó là nguyên nhân gây ra lỗi.

    Ví dụ: giả sử rằng chính sách JavaScript được sử dụng trước Chính sách tăng đột biến để đặt biến message_weight dựa trên phương thức yêu cầu như thể hiện dưới đây:

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

    Lưu ý rằng giá trị của biến message_weight1.5. Đây là giá trị không hợp lệ (không phải số nguyên).

Độ phân giải

Đảm bảo giá trị của phần tử MessageWeight là một giá trị hợp lệ (giá trị số nguyên).

Để sửa ví dụ ở trên, bạn có thể sửa đổi giá trị của biến message_weight trong JavaScript thành một số nguyên:

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

FailedToResolveSpikeArrestRate

Mã lỗi

policies.ratelimit.FailedToResolveSpikeArrestRate

Nội dung phản hồi lỗi

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

Ví dụ về thông báo lỗi

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

Nguyên nhân

Lỗi này xảy ra nếu không thể phân giải tham chiếu đến biến chứa chế độ cài đặt giá trong phần tử <Rate> thành một giá trị trong chính sách Tăng đột biến. Phần tử này là bắt buộc và được dùng để chỉ định tốc độ bắt giữ tăng đột biến ở dạng {int}pm hoặc {int}ps. Ví dụ: {int}pm có thể là 500pm, tức là 500 cuộc gọi mỗi phút. Tương tự, giá trị của 10ps có nghĩa là có 10 lệnh gọi mỗi giây.

Chẩn đoán

  1. Xác định chính sách Tạm ngưng tăng đột biến nơi xảy ra lỗi và tên của tệp đối chiếu không thể giải quyết đúng cách. Bạn có thể tìm thấy cả hai mục này trong phần tử chuỗi lỗi của phản hồi lỗi.

    Ví dụ: trong chuỗi lỗi sau đây, tên chính sách là SpikeArrest_AuthProxy và tệp tham chiếu là request.header.rate:

    "faultstring": "Failed to resolve Spike Arrest Rate reference request.header.rate in SpikeArrest policy SpikeArrest_AuthProxy"
    
  2. Trong tệp XML chính sách Tăng đột biến không thành công, hãy xác minh rằng tên của tệp đối chiếu được sử dụng khớp với tên tham chiếu đã xác định trong chuỗi lỗi (bước #1 ở trên). ** **

    Ví dụ: chính sách sau đây đặt phần tử có tên tham chiếu là request.header.rate, khớp với tên trong chuỗi lỗi:

    <?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. Xác định xem biến đó đã được xác định và có trong quy trình thực thi chính sách về sự bắt giữ của người tiêu dùng hay không.

  4. Nếu biến đó là:

    • nằm ngoài phạm vi (không có trong quy trình cụ thể đang thực thi chính sách) hoặc
    • không thể phân giải (không xác định)

    thì đó chính là nguyên nhân gây ra lỗi.

    Trong ví dụ nêu trên, giá trị của tỷ lệ bắt giữ tăng đột biến trong phần tử <Rate> được phép truy xuất từ tiêu đề yêu cầu có tên là rate. Tuy nhiên, Edge không thể phân giải request.header.rate. Trường hợp này xảy ra nếu tiêu đề rate không được truyền trong yêu cầu API.

    Dưới đây là một yêu cầu API mẫu không chuyển rate vào tiêu đề trong yêu cầu:

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

    Vì tiêu đề rate không được truyền trong yêu cầu, nên tệp tham chiếu request.header.rate dùng trong phần tử <Rate> ở chính sách Tăng đột biến ở trên không xác định được nên không giải quyết được. Vì vậy, bạn sẽ nhận được mã lỗi:

    policies.ratelimit.FailedToResolveSpikeArrestRate
    

Độ phân giải

Đảm bảo rằng biến được tham chiếu trong phần tử <Rate> tồn tại/được xác định và có sẵn trong quy trình cụ thể, nơi chính sách Tăng đột biến đang được thực thi.

Để sửa ví dụ nêu trên, bạn có thể sửa đổi yêu cầu để thêm tiêu đề rate vào tiêu đề như dưới đây:

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