Résoudre les erreurs d'exécution de la règle Spike Arrest

Vous consultez la documentation d'Apigee Edge.
Accédez à la documentation sur Apigee X.
info

InvalidMessageWeight

Code d'erreur

policies.ratelimit.InvalidMessageWeight

Corps de la réponse d'erreur

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

Exemple de message d'erreur

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

Cause

Cette erreur se produit si la valeur spécifiée pour l'élément <MessageWeight> via une variable de flux n'est pas valide (valeur non entière).

Par exemple, si la valeur de la variable de flux spécifiée pour l'élément <MessageWeight> est 1,5 (valeur non entière), l'erreur se produit.

Diagnostic

  1. Identifiez la valeur non valide utilisée pour l'élément <MessageWeight> dans la règle Spike Arrest. Vous trouverez ces informations dans l'élément faultstring de la réponse d'erreur. Par exemple, dans l'erreur suivante, la valeur non valide utilisée pour l'élément <MessageWeight> est 1.5 :

    "faultstring": "Invalid message weight value 1.5"
    
  2. Examinez toutes les règles Spike Arrest dans le proxy d'API spécifique où l'échec a eu lieu. Il peut y avoir une ou plusieurs règles Spike Arrest dans lesquelles l'élément <MessageWeight> est spécifié.

    Par exemple, la règle suivante spécifie la valeur de <MessageWeight> via une variable de flux appelée 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. Déterminez la valeur de la variable utilisée dans l'élément <MessageWeight> des règles Spike Arrest identifiées. La valeur de la variable de flux peut être extraite à partir d'en-têtes HTTP, de paramètres de requête, d'une charge utile de requête XML ou JSON, ou définie dans une autre règle.

    1. Recherchez le code dans le proxy d'API où la variable a été définie en premier.
    2. Une fois que vous avez identifié la règle dans laquelle la variable est définie et renseignée en premier, vérifiez la valeur de la variable.
    3. Si la valeur de la variable de flux correspond à la valeur identifiée à l'étape 1 ci-dessus, il s'agit de la cause de l'erreur.

    Par exemple, supposons qu'une règle JavaScript soit utilisée avant la règle Spike Arrest pour définir la variable message_weight en fonction de la méthode de requête, comme indiqué ci-dessous :

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

    Notez que la valeur de la variable message_weight est 1.5, et qu'elle n'est donc pas valide (valeur non entière).

Solution

Assurez-vous que la valeur de l'élément MessageWeight est une valeur valide (valeur entière).

Pour corriger l'exemple ci-dessus, vous pouvez modifier la valeur de la variable message_weight dans le code JavaScript de sorte qu'elle soit entière :

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

FailedToResolveSpikeArrestRate

Code d'erreur

policies.ratelimit.FailedToResolveSpikeArrestRate

Corps de la réponse d'erreur

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

Exemple de message d'erreur

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

Cause

Cette erreur se produit si la référence à la variable contenant le paramètre de taux dans l'élément <Rate> ne peut pas être résolue en une valeur comprise dans la règle Spike Arrest. Cet élément est obligatoire et permet de spécifier le taux d'arrêt de pic sous la forme {int}pm ou {int}ps. Par exemple, {int}pm peut être défini sur 500pm, ce qui correspond à 500 appels par minute. De même, une valeur de 10ps correspond à 10 appels par seconde.

Diagnostic

  1. Identifiez la règle Spike Arrest dans laquelle l'erreur s'est produite et le nom de la référence ne pouvant pas être résolue correctement. Vous trouverez ces deux éléments dans l'élément "faultstring" de la réponse d'erreur.

    Par exemple, dans la chaîne d'erreur suivante, le nom de la règle est SpikeArrest_AuthProxy et la référence est request.header.rate :

    "faultstring": "Failed to resolve Spike Arrest Rate reference request.header.rate in SpikeArrest policy SpikeArrest_AuthProxy"
    
  2. Dans le fichier XML de la règle Spike Arrest, vérifiez que le nom de la référence utilisée correspond au nom de référence identifié dans la chaîne d'erreur (étape 1 ci-dessus). ** **

    Par exemple, la règle suivante définit l'élément avec la référence nommée request.header.rate, qui correspond au contenu de la chaîne d'erreur :

    <?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. Déterminez si la variable est définie et disponible dans le flux dans lequel la règle Spike Arrest est en cours d'exécution.

  4. Si la variable est :

    • hors du champ d'application (non disponible dans le flux spécifique où la règle est exécutée) ou
    • impossible à résoudre (non définie),

    alors il s'agit de la cause de l'erreur.

    Dans l'exemple ci-dessus, la valeur du taux d'arrêt de pic de l'élément <Rate> doit être extraite de l'en-tête de requête nommé rate. Cependant, Edge ne peut pas résoudre le request.header.rate. Cela se produit si l'en-tête rate n'est pas transmis dans la requête API.

    Voici un exemple de requête API qui ne transmet pas l'en-tête rate dans la requête :

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

    Étant donné que l'en-tête rate n'est pas transmis dans la requête, la référence request.header.rate utilisée dans l'élément <Rate> de la règle Spike Arrest ci-dessus n'est pas définie et ne peut donc pas être résolue. Vous obtenez donc le code d'erreur suivant :

    policies.ratelimit.FailedToResolveSpikeArrestRate
    

Solution

Vérifiez que la variable référencée dans l'élément <Rate> existe/est définie et disponible dans le flux spécifique où la règle Spike Arrest est exécutée.

Pour corriger l'exemple ci-dessus, vous pouvez modifier la requête pour inclure l'en-tête rate comme indiqué ci-dessous :

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