Standardfehlerantworten
Wenn eine Reporting API-Anfrage erfolgreich ist, gibt die API einen 200
zurück.
Wenn bei einer Anfrage ein Fehler auftritt, gibt die API je nach Fehlertyp einen HTTP-Statuscode, -status und -grund in der Antwort zurück.
Außerdem enthält der Antworttext eine detaillierte Beschreibung der Fehlerursache. Beispiel für eine Fehlerantwort:
{
"error": {
"code": 403,
"message": "User does not have sufficient permissions for this profile.",
"status": "PERMISSION_DENIED"
}
}
Fehlertabelle
Code | Status | Beschreibung | Empfohlene Maßnahme |
---|---|---|---|
400 | INVALID_ARGUMENT |
Die Anfrage ist ungültig. Möglicherweise fehlt ein erforderliches Argument, überschreitet die Grenzwerte oder hat einen ungültigen Wert. | Weitere Informationen finden Sie in der Fehlermeldung. Dieser Fehler schlägt noch einmal fehl, wenn der Client ihn noch einmal versucht. |
401 | UNAUTHENTICATED |
Der Client ist nicht korrekt authentifiziert. | Wiederholen Sie den Vorgang nur, wenn das Problem behoben ist. Sie benötigen ein neues Authentifizierungstoken. |
403 | PERMISSION_DENIED |
Gibt die Datenanfrage an, auf die der Nutzer keinen Zugriff hat. | Wiederholen Sie den Vorgang nur, wenn das Problem behoben ist. Sie benötigen ausreichende Berechtigungen, um den Vorgang für die angegebene Entität ausführen zu können. |
429 | RESOURCE_EXHAUSTED AnalyticsDefaultGroupCLIENT_PROJECT-1d |
Zeigt an, dass das Kontingent für Anfragen pro Tag und Projekt aufgebraucht ist. | Wiederholen Sie den Vorgang nur, wenn das Problem behoben ist. Ihr Tageskontingent ist aufgebraucht. |
429 | RESOURCE_EXHAUSTED AnalyticsDefaultGroupCLIENT_PROJECT-100s |
Zeigt an, dass das Kontingent für Anfragen pro 100 Sekunden pro Projekt aufgebraucht ist. | Versuchen Sie es noch einmal mit dem exponentiellen Backoff. Sie müssen die Geschwindigkeit verlangsamen, mit der Sie die Anfragen senden. |
429 | RESOURCE_EXHAUSTED AnalyticsDefaultGroupUSER-100s |
Zeigt an, dass das Kontingent für Anfragen pro 100 Sekunden pro Nutzer und Projekt aufgebraucht ist. | Versuchen Sie es noch einmal mit dem exponentiellen Backoff. Sie müssen die Geschwindigkeit verlangsamen, mit der Sie die Anfragen senden. |
429 | RESOURCE_EXHAUSTED DiscoveryGroupCLIENT_PROJECT-100s |
Zeigt an, dass das Erkennungskontingent für Anfragen pro 100 Sekunden aufgebraucht ist. | Die Erkennungsantwort ändert sich nicht häufig. Speichern Sie die Discovery-Antwort lokal im Cache oder versuchen Sie es mit exponentiellem Backoff. Verlangsamen Sie die Rate, mit der Sie die Anfragen senden. |
500 | INTERNAL |
Ein unerwarteter interner Serverfehler ist aufgetreten. | Wiederholen Sie diese Abfrage nicht mehr als einmal. |
503 | BACKEND_ERROR |
Der Server hat einen Fehler zurückgegeben. | Wiederholen Sie diese Abfrage nicht mehr als einmal. |
503 | UNAVAILABLE |
Der Dienst konnte die Anfrage nicht verarbeiten. | Dies ist höchstwahrscheinlich ein vorübergehender Zustand und kann durch einen erneuten Versuch mit exponentiellem Backoff korrigiert werden. |
Exponentiellen Backoff implementieren
Der exponentielle Backoff ist der Prozess, bei dem ein Client eine fehlgeschlagene Anfrage regelmäßig über einen zunehmenden Zeitraum wiederholt. Dies ist eine standardmäßige Strategie zur Fehlerbehandlung von Netzwerkanwendungen. Bei der Reporting API wird davon ausgegangen, dass Clients, die fehlgeschlagene Anfragen wiederholen möchten, einen exponentiellen Backoff verwenden. Die Verwendung eines exponentiellen Backoffs sorgt nicht nur für die Anforderung „exponentiell erforderlich“, sondern erhöht auch die Effizienz der Bandbreitennutzung, verringert die Anzahl der Anfragen, die für den Erhalt einer erfolgreichen Antwort erforderlich sind, und maximiert den Durchsatz von Anfragen in gleichzeitigen Umgebungen.
So implementieren Sie einen einfachen exponentiellen Backoff:
- Anfrage an die API senden
- Eine Fehlermeldung mit einem wiederholbaren Fehlercode empfangen
- 1 Sekunde +
random_number_milliseconds
Sekunden warten - Anfrage wiederholen
- Eine Fehlermeldung mit einem wiederholbaren Fehlercode empfangen
- 2 Sekunden +
random_number_milliseconds
Sekunden warten - Anfrage wiederholen
- Eine Fehlermeldung mit einem wiederholbaren Fehlercode empfangen
- 4 Sekunden +
random_number_milliseconds
Sekunden warten - Anfrage wiederholen
- Eine Fehlermeldung mit einem wiederholbaren Fehlercode empfangen
- 8 s +
random_number_milliseconds
Sekunden warten - Anfrage wiederholen
- Eine Fehlermeldung mit einem wiederholbaren Fehlercode empfangen
- 16 Sekunden +
random_number_milliseconds
Sekunden warten - Anfrage wiederholen
- Wenn Sie weiterhin eine Fehlermeldung erhalten, beenden Sie den Fehler und protokollieren Sie ihn.
Im obigen Ablauf ist random_number_milliseconds
eine zufällige Anzahl von Millisekunden, die kleiner oder gleich 1.000 ist. Dies ist erforderlich, um bestimmte Sperrfehler in einigen gleichzeitigen Implementierungen zu vermeiden.
random_number_milliseconds
muss nach jeder Wartezeit neu definiert werden.
Hinweis: Die Wartezeit ist immer (2 ^ n) + random_number_milliseconds
, wobei n eine monoton ansteigende Ganzzahl ist, die anfangs als 0 definiert ist. n wird für jede Iteration (jede Anfrage) um 1 erhöht.
Der Algorithmus ist so eingerichtet, dass er endet, wenn n = 5. Diese Obergrenze dient lediglich dazu, die unendliche Wiederholung von Clients zu verhindern. Dies führt zu einer Gesamtverzögerung von etwa 32 Sekunden, bevor eine Anfrage als nicht behebbarer Fehler gilt.
Der folgende Python-Code ist eine Implementierung des obigen Ablaufs zur Wiederherstellung nach Fehlern, die in einer Methode namens makeRequest
auftreten.
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."