Respuestas de error

Respuestas de error estándar

Si una solicitud a la API de Tag Manager tiene éxito, la API devuelve un código de estado HTTP 200 junto con el solicitados en el cuerpo de la respuesta.

Si se produce un error con una solicitud, la API muestra una solicitud el código de estado y el motivo en la respuesta según el tipo de error. Además, el cuerpo de la respuesta contiene una descripción detallada qué causó el 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 podría cambiar en cualquier momento. por lo que las aplicaciones no deben depender del texto descriptivo real.

Implementar retirada exponencial

Retirada exponencial es el proceso por el cual un cliente vuelve a realizar una solicitud con errores de forma periódica cada vez más tiempo. Es una estrategia estándar de manejo de errores para las aplicaciones de red. La API de Tag Manager está diseñada con la expectativa de que los clientes que eligen reintentar las solicitudes fallidas es decir, se usa una retirada exponencial. Además de ser “obligatorio”, con la retirada exponencial aumenta la eficiencia del uso del ancho de banda reduce la cantidad de solicitudes necesarias para obtener una y maximiza la capacidad de procesamiento de las solicitudes entornos de prueba.

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

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

En el flujo anterior, random_number_milliseconds es un valor aleatorio. cantidad 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 monótonamente creciente definido inicialmente como 0. La variable n aumenta de a 1 para cada iteración (cada solicitud).

El algoritmo está configurado para terminar cuando n sea 5. Este límite es solo para evitar que los clientes vuelvan a intentarlo El resultado es un retraso total de unos 32 segundos se considera "un error irrecuperable".

El siguiente código de Python es una implementación de lo 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."