Respuestas de error

Respuestas de error estándar

Si una solicitud de la API de Tag Manager se realiza correctamente, la API devuelve 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 devuelve un código de estado HTTP y un motivo en la respuesta según el tipo de error. Además, el cuerpo de la respuesta contiene una descripción detallada de lo que ha provocado el error. A continuación se presenta 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 podría cambiar en cualquier momento, por lo que las aplicaciones no deben depender del texto de la descripción real.

Implementar un retardo exponencial

El retardo exponencial es el proceso de un cliente que reintenta periódicamente una solicitud con error durante un periodo que se va incrementando. Se trata de una estrategia de gestión de errores estándar para las aplicaciones de red. La API de Tag Manager se ha diseñado de modo que los clientes que deciden reintentar las solicitudes con error lo hagan con un tiempo de espera exponencial. Además de ser obligatorio, el uso del retardo exponencial aumenta la eficiencia del uso del ancho de banda, reduce el número de solicitudes necesarias para obtener una respuesta correcta y maximiza el rendimiento de las solicitudes en entornos simultáneos.

A continuación se indica el flujo para implementar el retardo exponencial simple.

  1. Realizar una solicitud a la API.
  2. Recibir una respuesta de error que tenga un código de error que permita volver a intentar la solicitud.
  3. Esperar 1 segundo más random_number_milliseconds.
  4. Volver a intentar la solicitud.
  5. Recibir una respuesta de error que tenga un código de error que permita volver a intentar la solicitud.
  6. Esperar 2 segundos más random_number_milliseconds.
  7. Volver a intentar la solicitud.
  8. Recibir una respuesta de error que tenga un código de error que permita volver a intentar la solicitud.
  9. Esperar 4 segundos más random_number_milliseconds.
  10. Volver a intentar la solicitud.
  11. Recibir una respuesta de error que tenga un código de error que permita volver a intentar la solicitud.
  12. Esperar 8 segundos más random_number_milliseconds.
  13. Volver a intentar la solicitud.
  14. Recibir una respuesta de error que tenga un código de error que permita volver a intentar la solicitud.
  15. Esperar 16 segundos más random_number_milliseconds.
  16. Volver a intentar la solicitud.
  17. Si se sigue obteniendo un error, detener la solicitud y registrar el error.

En el flujo anterior, random_number_milliseconds es un número aleatorio de milésimas de segundo menor o igual que 1000. Esto es necesario para evitar determinados errores de bloqueo en algunas implementaciones simultáneas. El valor de random_number_milliseconds debe volverse a definir después de cada espera.

Nota: La espera siempre es (2 ^ n) + random_number_milliseconds, donde n es un entero que se incrementa monotónicamente y que se define inicialmente como 0. La variable n se incrementa en 1 en cada iteración (cada solicitud).

El algoritmo está configurado para terminar cuando n es 5. Este límite solo se aplica para impedir que los clientes vuelvan a intentar la operación indefinidamente. El resultado es un retraso total de aproximadamente 32 segundos antes de que una solicitud se considere "un error irrecuperable".

El siguiente código Python es una implementación del flujo anterior para restablecer la solicitud tras los errores que se producen en un método denominado 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."