Solução de problemas de erro de ambiente de execução da política Spike Arrest

Você está vendo a documentação da Apigee X.
Ver a documentação da Apigee Edge

InvalidMessageWeight

Código do erro

policies.ratelimit.InvalidMessageWeight

Corpo da resposta de erro

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

Exemplo de mensagem de erro

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

Causa

Esse erro ocorrerá se o valor especificado para o elemento <MessageWeight> por meio de uma variável de fluxo for inválido (um valor não inteiro).

Por exemplo, se o valor da variável de fluxo especificada para o elemento <MessageWeight> for 1,5 (um valor não inteiro), o erro ocorrerá.

Diagnóstico

  1. Identifique o valor inválido usado para o elemento <MessageWeight> na política Spike Arrest. Você encontra essas informações no elemento faultstring da resposta de erro. Por exemplo, no erro a seguir, o valor inválido usado para o elemento <MessageWeight> é 1.5:

    "faultstring": "Invalid message weight value 1.5"
    
  2. Examine todas as políticas Spike Arrest no proxy específico de API em que ocorreu a falha. Pode haver uma ou mais políticas Spike Arrest em que o elemento <MessageWeight> foi especificado.

    Por exemplo, a política a seguir especifica o valor de <MessageWeight> por meio de uma variável de fluxo chamada 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. Determine o valor da variável usada no elemento <MessageWeight> das políticas Spike Arrest identificadas. O valor da variável de fluxo pode ser extraído de cabeçalhos HTTP, parâmetros de consulta, payload de solicitação XML ou JSON ou definido em outra política.

    1. Localize o código no proxy de API em que a variável foi definida primeiro.
    2. Depois de descobrir a política em que a variável foi definida e preenchida primeiro, verifique como o valor da variável foi definido.
    3. Se o valor da variável de fluxo corresponder ao valor identificado na Etapa 1 acima, essa será a causa do erro.

    Por exemplo, suponha que uma política JavaScript seja usada antes da política Spike Arrest para definir a variável message_weight com base no método de solicitação, conforme mostrado abaixo:

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

    Observe que o valor da variável message_weight é 1.5, que é inválido (um valor não inteiro).

Resolução

Verifique se o valor do elemento MessageWeight é válido (valor inteiro).

Para corrigir o exemplo mostrado acima, modifique o valor da variável message_weight no JavaScript para ser um número inteiro:

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

FailedToResolveSpikeArrestRate

Código do erro

policies.ratelimit.FailedToResolveSpikeArrestRate

Corpo da resposta de erro

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

Exemplo de mensagem de erro

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

Causa

Esse erro ocorrerá se a referência à variável que contém a configuração de taxa no elemento <Rate> não puder ser resolvida como um valor na política Spike Arrest. Esse elemento é obrigatório e usado para especificar a taxa de parada de pico na forma de {int}pm ou {int}ps. Por exemplo, {int}pm pode ser 500pm, o que significa 500 chamadas por minuto. Da mesma forma, um valor de 10ps significa dez chamadas por segundo.

Diagnóstico

  1. Identifique a política Spike Arrest em que o erro ocorreu e o nome da referência que não pode ser resolvido corretamente. É possível encontrar esses dois itens no elemento de string de falha da resposta de erro.

    Por exemplo, na seguinte string de falha, o nome da política é SpikeArrest_AuthProxy e a referência é request.header.rate:

    "faultstring": "Failed to resolve Spike Arrest Rate reference request.header.rate in SpikeArrest policy SpikeArrest_AuthProxy"
    
  2. No XML da política Spike Arrest com falha, verifique se o nome da referência usada corresponde ao nome da referência identificado na string de falha (etapa 1 acima). ** **

    Por exemplo, a política a seguir define o elemento com a referência chamada request.header.rate, que corresponde ao que está na string de falha:

    <?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. Determine se a variável está definida e disponível no fluxo em que a política Spike Arrest está sendo executada.

  4. Se a variável for:

    • fora do escopo (não disponível no fluxo específico em que a política está sendo executada) ou
    • não é possível resolver (não está definida)

    essa será a causa do erro.

    No exemplo mostrado acima, o valor da taxa de parada de pico no elemento <Rate> precisa ser recuperado do cabeçalho da solicitação denominado rate. No entanto, a Apigee não consegue resolver request.header.rate. Isso acontecerá se o cabeçalho rate não for passado como parte da solicitação de API.

    Veja um exemplo de solicitação de API que não transmite o cabeçalho rate como parte da solicitação:

      curl -v http://your_host_alias/check_spikearrest -H "Content-Type: application/json"
    

    Em que your_host_alias é um domínio aberto ao público usado para acessar suas APIs, conforme configurado na propriedade virtualhosts.hostAliases do arquivo de modificações. Consulte Especificar substituições de configuração.

    Como o cabeçalho rate não foi transmitido como parte da solicitação, a referência request.header.rate usada no elemento <Rate> na política Spike Arrest acima é indefinida e, portanto, não pode ser resolvida. Você receberá o código do erro:

    policies.ratelimit.FailedToResolveSpikeArrestRate
    

Resolução

Verifique se a variável mencionada no elemento <Rate> existe/está definida e disponível no fluxo específico, em que a política Spike Arrest está sendo executada.

Para corrigir o exemplo mostrado acima, você pode modificar a solicitação para incluir o cabeçalho rate como mostrado abaixo:

curl -v  http://your_host_alias/check_spikearrest -H "Content-Type: application/json" -H "rate:30ps"

Em que your_host_alias é um domínio aberto ao público usado para acessar suas APIs, conforme configurado na propriedade virtualhosts.hostAliases do arquivo de modificações. Consulte Especificar substituições de configuração.