Réponses aux erreurs standards
Si une requête API Reporting aboutit, l'API renvoie un 200
.
Si une erreur se produit lors d'une requête, l'API renvoie dans la réponse un code d'état HTTP, l'état et le motif, en fonction du type d'erreur.
En outre, 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. Il se peut qu'un argument requis soit manquant, dépasse les limites ou comporte une valeur non valide. | Consultez le message d'erreur pour en savoir plus. 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-1d |
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 atteint votre quota quotidien. |
429 | RESOURCE_EXHAUSTED AnalyticsDefaultGroupCLIENT_PROJECT-100 |
Indique que le quota de requêtes pour 100 secondes par projet est épuisé. | Réessayez avec un intervalle exponentiel entre les tentatives. Vous devez ralentir la fréquence d'envoi des requêtes. |
429 | RESOURCE_EXHAUSTED AnalyticsDefaultGroupUSER-100 |
Indique que le quota de requêtes pour 100 secondes par utilisateur et par projet est épuisé. | Réessayez avec un intervalle exponentiel entre les tentatives. Vous devez ralentir la fréquence d'envoi des requêtes. |
429 | RESOURCE_EXHAUSTED DiscoveryGroupCLIENT_PROJECT-100 |
Indique que le quota de requêtes par 100 secondes de découverte est épuisé. | La réponse de découverte ne change pas fréquemment. Mettez en cache la réponse de découverte localement ou réessayez avec un intervalle exponentiel entre les tentatives. Vous devez ralentir la fréquence d'envoi des requêtes. |
500 | INTERNAL |
Une erreur inattendue s'est produite sur le serveur interne. | Ne relancez pas cette requête plusieurs fois. |
503 | BACKEND_ERROR |
Le serveur a renvoyé une erreur. | Ne relancez pas cette requête plusieurs fois. |
503 | UNAVAILABLE |
Le service n'a pas pu traiter la demande. | Il s'agit probablement d'une condition temporaire qui peut être corrigée en effectuant 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 régulièrement une requête ayant échoué sur une période de temps croissante. Il s'agit d'une stratégie standard de traitement des erreurs pour les applications réseau. L'API Reporting est conçue pour permettre aux clients qui choisissent d'effectuer de nouvelles tentatives de le faire 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 nécessaires 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 entre les tentatives, procédez comme suit :
- Envoyer une requête à l'API
- Recevoir une réponse d'erreur avec un code d'erreur pouvant être renouvelé
- Patientez 1 s +
random_number_milliseconds
seconde - Relancer la demande
- Recevoir une réponse d'erreur avec un code d'erreur pouvant être renouvelé
- Patientez deux secondes et
random_number_milliseconds
secondes - Relancer la demande
- Recevoir une réponse d'erreur avec un code d'erreur pouvant être renouvelé
- Patientez quatre secondes et
random_number_milliseconds
secondes - Relancer la demande
- Recevoir une réponse d'erreur avec un code d'erreur pouvant être renouvelé
- Patientez 8 s +
random_number_milliseconds
secondes - Relancer la demande
- Recevoir une réponse d'erreur avec un code d'erreur pouvant être renouvelé
- Patientez 16 s +
random_number_milliseconds
secondes - Relancer la demande
- Si vous obtenez toujours une erreur, arrêtez-la et consignez-la.
Dans le flux ci-dessus, random_number_milliseconds
correspond à 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 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 n'est destiné qu'à empêcher les clients d'effectuer des tentatives à l'infini. Un délai total d'environ 32 secondes s'écoule avant qu'une requête ne soit considérée comme une "erreur irrécupérable".
Le code Python suivant est une mise en œuvre du flux ci-dessus permettant de récupérer des erreurs survenant 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."