Respostas de erro

Respostas de erro padrão

Se uma solicitação da API Tag Manager for bem-sucedida, a API retornará um código de status HTTP 200, juntamente com os dados solicitados no corpo da resposta.

Se ocorrer um erro com uma solicitação, a API retornará um código de status HTTP e o motivo na resposta com base no tipo de erro. Além disso, o corpo da resposta conterá uma descrição detalhada sobre o que causou o erro. Veja um exemplo de uma resposta de erro:

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

Observação: a descrição pode mudar a qualquer momento. Sendo assim, os aplicativos não devem depender do texto de descrição.

Como implementar backoff exponencial

Backoff exponencial é o processo em que um cliente repete periodicamente uma solicitação com falha por um período cada vez maior. É uma estratégia de gerenciamento de erros padrão para aplicativos de rede. A API Tag Manager foi desenvolvida com a expectativa de que os clientes que optam por repetir solicitações com falha façam isso usando backoff exponencial. Além de ser "necessário", o backoff exponencial aumenta a eficiência do uso de largura de banda, reduz o número de solicitações necessárias para receber uma resposta bem-sucedida e maximiza o rendimento de solicitações em ambientes simultâneos.

Veja a seguir o fluxo de implementação de backoff exponencial simples.

  1. Faça uma solicitação para a API.
  2. Receba uma resposta de erro que tem um código de erro que pode ser repetido.
  3. Aguarde 1 segundo e random_number_milliseconds.
  4. Repita a solicitação.
  5. Receba uma resposta de erro que tem um código de erro que pode ser repetido.
  6. Aguarde 2 segundos e random_number_milliseconds.
  7. Repita a solicitação.
  8. Receba uma resposta de erro que tem um código de erro que pode ser repetido.
  9. Aguarde 4 segundos e random_number_milliseconds.
  10. Repita a solicitação.
  11. Receba uma resposta de erro que tem um código de erro que pode ser repetido.
  12. Aguarde 8 segundos e random_number_milliseconds.
  13. Repita a solicitação.
  14. Receba uma resposta de erro que tem um código de erro que pode ser repetido.
  15. Aguarde 16 segundos e random_number_milliseconds.
  16. Repita a solicitação.
  17. Se você continuar recebendo um erro, pare e registre-o.

No fluxo acima, random_number_milliseconds é um número aleatório de milissegundos inferior ou igual a 1.000. Ele é necessário para evitar determinados erros de bloqueio em algumas implementações simultâneas. É preciso redefinir o random_number_milliseconds após cada espera.

Observação: o período de espera é sempre (2 ^ n) + random_number_milliseconds, em que n é um número inteiro monotonicamente crescente, definido inicialmente como 0. A variável n é incrementada em 1 a cada iteração (a cada solicitação).

O algoritmo é definido para terminar quando n é 5. Esse limite entra em vigor somente para impedir que os clientes façam novas tentativas infinitamente e resulta em um atraso total de cerca de 32 segundos antes de uma solicitação ser considerada "um erro irrecuperável".

O código Python a seguir é uma implementação do fluxo acima para a recuperação de erros que ocorrem em um método chamado 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."