Risoluzione dei problemi relativi agli errori di runtime del criterio SpikeArrest

Stai visualizzando la documentazione di Apigee Edge.
Consulta la documentazione di Apigee X.
info

InvalidMessageWeight

Codice di errore

policies.ratelimit.InvalidMessageWeight

Corpo della risposta di errore

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

Esempio di messaggio di errore

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

Causa

Questo errore si verifica se il valore specificato per l'elemento <MessageWeight> tramite una variabile di flusso non è valido (un valore non intero).

Ad esempio, se il valore della variabile di flusso specificata per l'elemento <MessageWeight> è 1,5 (un valore non intero), si verifica l'errore.

Diagnosi

  1. Identifica il valore non valido utilizzato per l'elemento <MessageWeight> nel criterio Spike Arrest. Puoi trovare queste informazioni nell'elemento faultstring della risposta di errore. Ad esempio, nel seguente errore, il valore non valido utilizzato per l'elemento <MessageWeight> è 1.5:

    "faultstring": "Invalid message weight value 1.5"
    
  2. Esamina tutti i criteri di Spike Arrest nel proxy API specifico in cui si è verificato l'errore. Potrebbero essere presenti una o più policy Spike Arrest in cui è specificato l'elemento <MessageWeight>.

    Ad esempio, la seguente policy specifica il valore di <MessageWeight> tramite una variabile di flusso denominata 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. Determina il valore della variabile utilizzata nell'elemento <MessageWeight> delle norme di Spike Arrest identificate. Il valore della variabile di flusso può essere estratto dalle intestazioni HTTP, dai parametri di query, da un payload della richiesta XML o JSON o definito in un'altra norma.

    1. Individua il codice all'interno del proxy API in cui è stata definita per la prima volta la variabile.
    2. Una volta individuato il criterio in cui la variabile è definita e inserita per prima, controlla come viene impostato il valore della variabile.
    3. Se il valore della variabile di flusso corrisponde a quello identificato nel passaggio 1 precedente, questa è la causa dell'errore.

    Ad esempio, supponiamo che venga utilizzata una policy JavaScript prima della policy Spike Arrest per impostare la variabile message_weight in base al metodo di richiesta come mostrato di seguito:

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

    Nota che il valore della variabile message_weight è 1.5, che è un valore non valido (non intero).

Risoluzione

Assicurati che il valore dell'elemento MessageWeight sia un valore valido (valore intero).

Per correggere l'esempio mostrato sopra, puoi modificare il valore della variabile message_weight in JavaScript in modo che sia un numero intero:

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

FailedToResolveSpikeArrestRate

Codice di errore

policies.ratelimit.FailedToResolveSpikeArrestRate

Corpo della risposta di errore

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

Esempio di messaggio di errore

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

Causa

Questo errore si verifica se il riferimento alla variabile contenente l'impostazione della frequenza all'interno dell'elemento <Rate> non può essere risolto in un valore all'interno del criterio Spike Arrest. Questo elemento è obbligatorio e viene utilizzato per specificare il tasso di arresto dei picchi nel formato {int}pm o {int}ps. Ad esempio, {int}pm potrebbe essere 500pm, il che significa 500 chiamate al minuto. Allo stesso modo, un valore di 10ps indica 10 chiamate al secondo.

Diagnosi

  1. Identifica la policy Spike Arrest in cui si è verificato l'errore e il nome del riferimento che non può essere risolto correttamente. Puoi trovare entrambi questi elementi nell'elemento faultstring della risposta di errore.

    Ad esempio, nella seguente stringa di errore, il nome della policy è SpikeArrest_AuthProxy e il riferimento è request.header.rate:

    "faultstring": "Failed to resolve Spike Arrest Rate reference request.header.rate in SpikeArrest policy SpikeArrest_AuthProxy"
    
  2. Nel file XML della policy Spike Arrest non riuscita, verifica che il nome del riferimento utilizzato corrisponda al nome del riferimento identificato nella stringa di errore (passaggio 1 sopra). ** **

    Ad esempio, la seguente policy imposta l'elemento con il riferimento denominato request.header.rate, che corrisponde a ciò che è presente in 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. Determina se la variabile è definita e disponibile nel flusso in cui viene eseguita la policy Spike Arrest.

  4. Se la variabile è:

    • al di fuori dell'ambito (non disponibile nel flusso specifico in cui viene eseguita la policy) o
    • non può essere risolto (non è definito)

    allora è questa la causa dell'errore.

    Nell'esempio mostrato sopra, il valore della velocità di picco nell'elemento <Rate> deve essere recuperato dall'intestazione della richiesta denominata rate. Tuttavia, Edge non è in grado di risolvere request.header.rate. Ciò accade se l'intestazione rate non viene trasmessa come parte della richiesta API.

    Di seguito è riportata una richiesta API di esempio che non supera l'intestazione rate come parte della richiesta:

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

    Poiché l'intestazione rate non viene trasmessa come parte della richiesta, il riferimento request.header.rate utilizzato nell'elemento <Rate> nella norma di Spike Arrest precedente non è definito e pertanto non può essere risolto. Pertanto, riceverai il codice di errore:

    policies.ratelimit.FailedToResolveSpikeArrestRate
    

Risoluzione

Assicurati che la variabile a cui viene fatto riferimento nell'elemento <Rate> esista/sia definita e disponibile nel flusso specifico in cui viene eseguita la policy Spike Arrest.

Per correggere l'esempio mostrato sopra, puoi modificare la richiesta in modo da includere l'intestazione rate come mostrato di seguito:

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