Réponses d'erreur

Réponses d'erreur standards

Si une requête API Reporting aboutit, l'API renvoie un 200. Si une erreur se produit avec une requête, l'API renvoie un code d'état HTTP, un état et 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:

{
 "error": {
  "code": 403,
  "message": "User does not have sufficient permissions for this profile.",
  "status": "PERMISSION_DENIED"
 }
}

Tableau d'erreurs

Code État Description Action recommandée
400 INVALID_ARGUMENT La requête n'est pas valide. Un argument requis est peut-être manquant, dépasse les limites ou comporte une valeur non valide. Pour en savoir plus, consultez le message d'erreur. Cette erreur échouera à nouveau si le client effectue une nouvelle tentative.
401 UNAUTHENTICATED Le client n'est pas authentifié correctement. Ne relancez pas la requête avant d'avoir résolu le problème. Vous devez obtenir un nouveau jeton d'authentification.
403 PERMISSION_DENIED Indique la demande de données à laquelle l'utilisateur n'a pas accès. Ne relancez pas la requête avant d'avoir résolu le problème. Vous devez disposer d'autorisations suffisantes pour effectuer l'opération sur l'entité spécifiée.
429 RESOURCE_EXHAUSTED AnalyticsDefaultGroupCLIENT_PROJECT-1j Indique que le quota de requêtes par jour et par projet est épuisé. Ne relancez pas la requête avant d'avoir résolu le problème. Vous avez utilisé votre quota quotidien.
429 RESOURCE_EXHAUSTED AnalyticsDefaultGroupCLIENT_PROJECT-100s Indique que le quota de requêtes pour 100 secondes par projet a été épuisé. Réessayez en utilisant un intervalle exponentiel entre les tentatives. Vous devez ralentir la fréquence à laquelle vous envoyez les requêtes.
429 RESOURCE_EXHAUSTED AnalyticsDefaultGroupUSER-100s Indique que le quota de requêtes pour 100 secondes par utilisateur et par projet a été épuisé. Réessayez en utilisant un intervalle exponentiel entre les tentatives. Vous devez ralentir la fréquence à laquelle vous envoyez les requêtes.
429 RESOURCE_EXHAUSTED DiscoveryGroupCLIENT_PROJECT-100s Indique que le quota de requêtes de découverte pour 100 secondes a été épuisé. La réponse de découverte ne change pas fréquemment : mettez-la en cache localement ou réessayez en utilisant un intervalle exponentiel entre les tentatives. Vous devez ralentir la fréquence à laquelle vous envoyez les requêtes.
500 INTERNAL Une erreur inattendue s'est produite au niveau du serveur. Ne relancez pas cette requête plus d'une fois.
503 BACKEND_ERROR Le serveur a renvoyé une erreur. Ne relancez pas cette requête plus d'une fois.
503 UNAVAILABLE Le service n'a pas pu traiter la requête. Il s'agit très probablement d'un problème temporaire. Vous pouvez le corriger en effectuant de nouvelles tentatives avec un intervalle exponentiel entre les tentatives.

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 gestion des erreurs pour les applications réseau. L'API Reporting est conçue de manière à 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'utilisation de l'intervalle exponentiel entre les tentatives augmente l'efficacité de l'utilisation de la bande passante, réduit le nombre de requêtes requis pour obtenir une réponse positive et maximise le débit des requêtes dans les environnements simultanés.

Pour implémenter un intervalle exponentiel simple entre les tentatives, procédez comme suit :

  1. Envoyer une requête à l'API
  2. Recevoir une réponse d'erreur avec un code d'erreur qui peut faire l'objet d'une nouvelle tentative
  3. Patientez 1 s + random_number_milliseconds secondes
  4. Réessayer la requête
  5. Recevoir une réponse d'erreur avec un code d'erreur qui peut faire l'objet d'une nouvelle tentative
  6. Patientez 2 s + random_number_milliseconds secondes
  7. Réessayer la requête
  8. Recevoir une réponse d'erreur avec un code d'erreur qui peut faire l'objet d'une nouvelle tentative
  9. Patientez 4 s + random_number_milliseconds secondes
  10. Réessayer la requête
  11. Recevoir une réponse d'erreur avec un code d'erreur qui peut faire l'objet d'une nouvelle tentative
  12. Patientez 8 s + random_number_milliseconds secondes
  13. Réessayer la requête
  14. Recevoir une réponse d'erreur avec un code d'erreur qui peut faire l'objet d'une nouvelle tentative
  15. Patientez 16 s + random_number_milliseconds secondes
  16. Réessayer 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. n est incrémenté de 1 pour chaque itération (chaque requête).

L'algorithme est configuré pour se terminer lorsque "n" vaut 5. Ce plafond est en place uniquement pour empêcher les clients d'effectuer de nouvelles tentatives indéfiniment et entraîne un délai total d'environ 32 secondes avant qu'une requête ne soit considérée comme "une erreur irrécupérable".

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

import random
import time
from apiclient.errors import HttpError

def makeRequestWithExponentialBackoff(analytics):
  """Wrapper to request Google Analytics data with exponential backoff.

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

  Args:
    analytics: The analytics service object

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

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

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