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 một biến flow không hợp lệ (giá trị không phải là số nguyên).

Ví dụ: nếu giá trị của biến flow được chỉ định cho phần tử <MessageWeight> là 1, 5 (một giá trị không phải 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ệ được dùng cho phần tử <MessageWeight> trong chính sách Chặn truy cập 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, 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ả chính sách Chặn sự kiện 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 Ngăn chặn sự kiện tăng đột biến trong đó phần tử <MessageWeight> được chỉ định.

    Ví dụ: chính sách sau đây chỉ định giá trị của <MessageWeight> thông qua một biến flow có tên là 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 được dùng trong phần tử <MessageWeight> của(các) Chính sách về việc chống tăng đột biến đã xác định. Giá trị của biến luồng có thể được trích xuất từ các 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 tiên.
    2. Sau khi bạn tìm ra chính sách trong đó biến được xác định và điền sẵn, hãy kiểm tra cách đặt giá trị cho biến.
    3. Nếu giá trị của biến flow khớp với giá trị được xác định ở Bước 1 ở trên, thì đó là nguyên nhân gây ra lỗi.

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

    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 là giá trị không hợp lệ (không phải số nguyên).

Độ phân giải

Đảm bảo rằng 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 tốc độ trong phần tử <Rate> thành một giá trị trong chính sách Chống tình trạng tăng đột biến. Phần tử này là bắt buộc và dùng để chỉ định tốc độ chặn xung đột ở dạng {int}pm hoặc {int}ps. Ví dụ: {int}pm có thể là 500pm, nghĩa là 500 lệnh gọi mỗi phút. Tương tự, giá trị 10ps có nghĩa là 10 lệnh gọi mỗi giây.

Chẩn đoán

  1. Xác định Chính sách về việc gia tăng đột biến nơi xảy ra lỗi và tên của tệp tham 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, 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 của chính sách Spike Arrest không thành công, hãy xác minh rằng tên của tệp tham chiếu được sử dụng khớp với tên tham chiếu được 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ó tham chiếu tên là request.header.rate, khớp với nội dung trong 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. Xác định xem biến có được xác định và có sẵn trong luồng mà chính sách Chặn sự kiện tăng đột biến đang được thực thi hay không.

  4. Nếu biến là:

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

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

    Trong ví dụ trên, giá trị của tỷ lệ ngăn chặn tăng đột biến trong phần tử <Rate> cần được 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. Điều này xảy ra nếu tiêu đề rate (tốc độ) 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 truyền tiêu đề rate (tốc độ) 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 tham chiếu request.header.rate dùng trong phần tử <Rate> trong chính sách Chặn tăng đột biến ở trên không được xác định và do đó không thể phân giải. 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ó trong luồng cụ thể, nơi chính sách Chặn sự kiện tăng đột biến đang được thực thi.

Để sửa ví dụ ở trên, bạn có thể sửa đổi yêu cầu để thêm tiêu đề rate (tốc độ) như sau:

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