Réponses aux erreurs

Réponses d'erreur standards

Si une requête API Tag Manager aboutit, l'API renvoie un code d'état HTTP 200 avec les données demandées dans le corps de la réponse.

Si une erreur se produit lors d'une requête, l'API renvoie un code d'état HTTP ainsi qu'un motif dans la réponse, en fonction du type d'erreur. De plus, le corps de la réponse contient une description détaillée de la cause de l'erreur. Voici un exemple de réponse d'erreur:

400 invalidParameter

{
 "error": {
  "errors": [
   {
    "domain": "usageLimits",
    "reason": "accessNotConfigured",
    "message": "Access Not Configured. Please use Google Developers Console to activate the API for your project.",
   }
  ],
  "code": 403,
  "message": "Access Not Configured. Please use Google Developers Console to activate the API for your project."
 }
}

Remarque: La description peut être modifiée à tout moment. Par conséquent, les applications ne doivent pas dépendre de la description réelle.

Mettre en œuvre l'intervalle exponentiel entre les tentatives

L'intervalle exponentiel entre les tentatives est le processus par lequel un client relance périodiquement une requête ayant échoué sur une durée croissante. Il s'agit d'une stratégie standard de traitement des erreurs pour les applications réseau. L'API Tag Manager est conçue pour s'attendre à ce que les clients qui choisissent de relancer les requêtes ayant échoué le fassent en utilisant un intervalle exponentiel entre les tentatives. En plus d'être "obligatoire", l'intervalle exponentiel entre les tentatives augmente l'efficacité de l'utilisation de la bande passante, réduit le nombre de requêtes nécessaires pour obtenir une réponse positive et maximise le débit des requêtes dans les environnements avec simultanéité.

Le processus d'implémentation d'un intervalle exponentiel simple entre les tentatives se présente comme suit.

  1. Vous envoyez une requête à l'API.
  2. Vous recevez une réponse d'erreur contenant un code d'erreur qui peut être relancé.
  3. Patientez 1 seconde + random_number_milliseconds secondes.
  4. Réessayez la requête.
  5. Vous recevez une réponse d'erreur contenant un code d'erreur qui peut être relancé.
  6. Patientez 2 secondes + random_number_milliseconds secondes.
  7. Réessayez la requête.
  8. Vous recevez une réponse d'erreur contenant un code d'erreur qui peut être relancé.
  9. Patientez 4 secondes + random_number_milliseconds secondes.
  10. Réessayez la requête.
  11. Vous recevez une réponse d'erreur contenant un code d'erreur qui peut être relancé.
  12. Patientez 8 secondes + random_number_milliseconds secondes.
  13. Réessayez la requête.
  14. Vous recevez une réponse d'erreur contenant un code d'erreur qui peut être relancé.
  15. Patientez 16 secondes + random_number_milliseconds secondes.
  16. Réessayez la requête.
  17. Si l'erreur persiste, arrêtez-la et consignez-la.

Dans le flux ci-dessus, random_number_milliseconds est un nombre aléatoire de millisecondes inférieur ou égal à 1 000. Cela est nécessaire pour éviter certaines erreurs de verrouillage dans certaines implémentations simultanées. random_number_milliseconds doit être redéfini après chaque temps d'attente.

Remarque: L'attente correspond toujours à (2 ^ n) + random_number_milliseconds, où n est un entier augmentant de manière monotone défini initialement sur 0. La variable n est incrémentée de 1 pour chaque itération (chaque requête).

L'algorithme est configuré pour se terminer lorsque n est égal à 5. Ce plafond a pour seul objectif d'empêcher les clients d'effectuer des relances indéfiniment. Il entraîne un délai total d'environ 32 secondes avant qu'une requête ne soit considérée comme une "erreur non récupérable".

Le code Python suivant est une implémentation du flux ci-dessus permettant de récupérer les erreurs survenant dans une méthode appelée makeRequest.

import random
import time
from apiclient.errors import HttpError

def makeRequestWithExponentialBackoff(tagmanager):
  """Wrapper to request Google Tag Manager data with exponential backoff.

  The makeRequest method accepts the tagmanager service object, makes API
  requests and returns the response. If any error occurs, the makeRequest
  method is retried using exponential backoff.

  Args:
    tagmanager: The tagmanager service object

  Returns:
    The API response from the makeRequest method.
  """
  for n in range(0, 5):
    try:
      return makeRequest(tagmanager)

    except HttpError, error:
      if error.resp.reason in ['userRateLimitExceeded', 'quotaExceeded']:
        time.sleep((2 ** n) + random.random())

  print "There has been an error, the request never succeeded."