Respuestas de error

Respuestas de error estándar

Si una solicitud a la API de Tag Manager se realiza correctamente, la API muestra un código de estado HTTP 200 junto con los datos solicitados en el cuerpo de la respuesta.

Si se produce un error con una solicitud, la API muestra un código de estado HTTP y el motivo de la respuesta según el tipo de error. Además, el cuerpo de la respuesta contiene una descripción detallada de la causa del error. Este es un ejemplo de una respuesta de error:

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

Nota: La descripción puede cambiar en cualquier momento, por lo que las aplicaciones no deben depender del texto descriptivo real.

Implementar retirada exponencial

La retirada exponencial es el proceso en el que un cliente vuelve a intentar de forma periódica una solicitud con errores durante un período creciente. Es una estrategia estándar de manejo de errores para aplicaciones de red. La API de Tag Manager se diseñó con la expectativa de que los clientes que eligen reintentar las solicitudes con errores lo hagan mediante la retirada exponencial. Además de ser “obligatorio”, la retirada exponencial aumenta la eficiencia del uso del ancho de banda, reduce la cantidad de solicitudes necesarias para obtener una respuesta correcta y maximiza la capacidad de procesamiento de las solicitudes en entornos simultáneos.

El flujo para implementar una retirada exponencial simple es el siguiente.

  1. Realizar una solicitud a la API
  2. Recibir una respuesta de error con un código de error que se puede reintentar.
  3. Espera 1 segundo y random_number_milliseconds segundos.
  4. Vuelve a enviar la solicitud.
  5. Recibir una respuesta de error con un código de error que se puede reintentar.
  6. Espera 2 segundos + random_number_milliseconds segundos.
  7. Vuelve a enviar la solicitud.
  8. Recibir una respuesta de error con un código de error que se puede reintentar.
  9. Espera 4 segundos + random_number_milliseconds segundos.
  10. Vuelve a enviar la solicitud.
  11. Recibir una respuesta de error con un código de error que se puede reintentar.
  12. Espera 8 segundos + random_number_milliseconds segundos.
  13. Vuelve a enviar la solicitud.
  14. Recibir una respuesta de error con un código de error que se puede reintentar.
  15. Espera 16 segundos + random_number_milliseconds segundos.
  16. Vuelve a enviar la solicitud.
  17. Si aún recibes un error, detente y regístralo.

En el flujo anterior, random_number_milliseconds es una cantidad aleatoria de milisegundos menor o igual que 1,000. Esto es necesario para evitar ciertos errores de bloqueo en algunas implementaciones simultáneas. random_number_milliseconds debe volver a definirse después de cada espera.

Nota: La espera siempre es (2 ^ n) + random_number_milliseconds, donde n es un número entero que aumenta de forma monotónica, definido inicialmente como 0. La variable n aumenta de a 1 por cada iteración (cada solicitud).

El algoritmo está configurado para terminar cuando n sea 5. Este límite solo se aplica para evitar que los clientes vuelvan a intentarlo de forma infinita y genera una demora total de alrededor de 32 segundos antes de que una solicitud se considere "un error irrecuperable".

El siguiente código de Python es una implementación del flujo anterior para recuperarse de errores que ocurren en un método llamado 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."