Fehlermeldungen

Standardfehlerantworten

Wenn eine Tag Manager API-Anfrage erfolgreich ist, gibt die API den HTTP-Statuscode 200 zusammen mit den angeforderten Daten im Text der Antwort zurück.

Wenn bei einer Anfrage ein Fehler auftritt, gibt die API in der Antwort einen HTTP-Statuscode und den Grund für den Fehlertyp zurück. Darüber hinaus enthält der Antworttext eine detaillierte Beschreibung der Fehlerursache. Hier ein Beispiel für eine Fehlerantwort:

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."
 }
}

Hinweis: Die Beschreibung kann sich jederzeit ändern. Anwendungen sollten daher nicht vom tatsächlichen Beschreibungstext abhängen.

Exponentiellen Backoff implementieren

Ein exponentieller Backoff ist der Prozess, bei dem ein Client eine fehlgeschlagene Anfrage regelmäßig über einen zunehmenden Zeitraum wiederholt. Es ist eine standardmäßige Fehlerbehandlungsstrategie für Netzwerkanwendungen. Bei der Entwicklung der Tag Manager API wird erwartet, dass Clients, die fehlgeschlagene Anfragen wiederholen, dies mithilfe eines exponentiellen Backoffs tun. Der exponentielle Backoff ist nicht nur „erforderlich“, sondern erhöht auch die Effizienz der Bandbreitennutzung, reduziert die Anzahl der für eine erfolgreiche Antwort erforderlichen Anfragen und maximiert den Durchsatz von Anfragen in gleichzeitigen Umgebungen.

Der Ablauf zur Implementierung eines einfachen exponentiellen Backoffs sieht so aus:

  1. Stellen Sie eine Anfrage an die API.
  2. Sie erhalten eine Fehlerantwort mit einem Fehlercode, der wiederholt werden kann.
  3. Warte 1 Sekunde + random_number_milliseconds Sekunden.
  4. Anfrage wiederholen.
  5. Sie erhalten eine Fehlerantwort mit einem Fehlercode, der wiederholt werden kann.
  6. Warten Sie 2 + random_number_milliseconds Sekunden.
  7. Anfrage wiederholen.
  8. Sie erhalten eine Fehlerantwort mit einem Fehlercode, der wiederholt werden kann.
  9. Warten Sie 4 + random_number_milliseconds Sekunden.
  10. Anfrage wiederholen.
  11. Sie erhalten eine Fehlerantwort mit einem Fehlercode, der wiederholt werden kann.
  12. Warten Sie 8 + random_number_milliseconds Sekunden.
  13. Anfrage wiederholen.
  14. Sie erhalten eine Fehlerantwort mit einem Fehlercode, der wiederholt werden kann.
  15. Warten Sie 16 + random_number_milliseconds Sekunden.
  16. Anfrage wiederholen.
  17. Wenn Sie weiterhin eine Fehlermeldung erhalten, beenden Sie den Vorgang und protokollieren Sie den Fehler.

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 beträgt immer (2 ^ n) + random_number_milliseconds, wobei n eine kontinuierlich ansteigende Ganzzahl ist, die anfänglich als 0 definiert ist. Die Variable n wird bei jedem Durchlauf bzw. jeder Anfrage um 1 erhöht.

Der Algorithmus endet, wenn n gleich 5 ist. Diese Obergrenze verhindert lediglich, dass Clients unbegrenzte Wiederholungen ausführen. 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 zum Beheben von Fehlern, die in einer Methode namens makeRequest auftreten.

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."