Respostas de erro

Esta página lista os erros que você pode receber da API User Deletion e explica como processar 500 erros e implementar espera exponencial.

Respostas de erro padrão

Se uma solicitação da API de exclusão de usuário for bem-sucedida, a API vai retornar um código de status 200. Se ocorrer um erro com uma solicitação, a API vai retornar um código de status HTTP, status e motivo na resposta com base no tipo de erro. Além disso, o corpo da resposta contém uma descrição detalhada do que causou o erro. Confira um exemplo de resposta de erro:

 { "error": { "errors": [ { "domain": "global", "reason": "invalidParameter",
"message": "Invalid value '-1' for max-results. Value must be within the range:
[1, 1000]", "locationType": "parameter", "location": "max-results" } ], "code":
400, "message": "Invalid value '-1' for max-results. Value must be within the
range: [1, 1000]" } }

Tabela de erros

Código Motivo Descrição Ação recomendada
400 invalidParameter Indica que um parâmetro de solicitação tem um valor inválido. Os campos locationType e location na resposta de erro fornecem informações sobre qual valor era inválido. Não tente novamente sem resolver o problema. Você precisa fornecer um valor válido para o parâmetro especificado na resposta de erro.
400 badRequest Indica que a consulta era inválida. Por exemplo, o ID pai estava ausente ou a combinação solicitada de dimensões ou métricas não era válida. Não tente novamente sem corrigir o problema. Você precisa fazer alterações na consulta da API para que ela funcione.
401 invalidCredentials Indica que o token de autenticação é inválido ou expirou. Não tente novamente sem corrigir o problema. Você precisa receber um novo token de autenticação.
403 insufficientPermissions Indica que o usuário não tem permissões suficientes para a entidade especificada na consulta. Não tente novamente sem corrigir o problema. Você precisa receber permissões suficientes para executar a operação na entidade especificada.
403 dailyLimitExceeded Indica que o usuário ultrapassou a cota diária, por projeto ou vista (perfil). Não tente novamente sem corrigir o problema. Você esgotou sua cota diária. Consulte Limites e cotas da API.
403 userRateLimitExceeded Indica que o limite de consultas a cada 100 segundos por usuário foi excedido. O valor padrão definido no Console de APIs do Google é de 100 consultas a cada 100 segundos por usuário. Você pode aumentar esse limite no Console de APIs do Google para até 1.000. Tente novamente usando a espera exponencial. Reduza a taxa de envio das solicitações.
403 rateLimitExceeded Indica que os limites da taxa de consultas a cada 100 segundos do projeto foram excedidos. Tente novamente usando a espera exponencial. Você precisa diminuir a taxa em que está enviando as solicitações.
403 quotaExceeded Indica que o limite de 10 solicitações simultâneas por vista (perfil) na Core Reporting API foi atingido. Tente novamente usando a espera exponencial. É necessário aguardar a conclusão de pelo menos uma solicitação em andamento para essa visualização (perfil).
500 internalServerError Ocorreu um erro interno do servidor inesperado. Não repita essa consulta mais de uma vez.
503 backendError O servidor retornou um erro. Não repita essa consulta mais de uma vez.

Como solucionar respostas 500 ou 503

Um erro 500 ou 503 pode ocorrer durante a carga pesada ou para solicitações maiores e mais complexas. Para solicitações maiores, solicite dados de um período mais curto. Também considere implementar a espera exponencial. A frequência desses erros pode depender da visualização (perfil) e da quantidade de dados de relatórios associados a essa visualização. Uma consulta que causa um erro 500 ou 503 em uma visualização (perfil) não causa necessariamente um erro na mesma consulta com uma visualização (perfil) diferente.

Implementar espera exponencial

A espera exponencial é o processo de um cliente que repete periodicamente uma solicitação com falha ao longo de um período crescente. É uma estratégia padrão de tratamento de erros para aplicativos de rede. A API User Deletion foi projetada com a expectativa de que os clientes que optam por repetir solicitações com falha façam isso usando a espera 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 como implementar a espera exponencial:

  1. Faça uma solicitação para a API.
  2. Receber 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. Receber uma resposta de erro que tem um código de erro que pode ser tentado novamente.
  6. Aguarde 2 segundos e random_number_milliseconds.
  7. Repita a solicitação.
  8. Receba uma resposta de erro com um código de erro que permite uma nova tentativa.
  9. Aguarde 4 segundos e random_number_milliseconds.
  10. Repita a solicitação.
  11. Receber 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. Receber uma resposta de erro que tem um código de erro que pode ser tentado novamente.
  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 anterior, random_number_milliseconds é um número aleatório de milissegundos menor ou igual a 1.000. Isso é necessário para evitar determinados erros de bloqueio em algumas implementações simultâneas. É necessário redefinir o random_number_milliseconds após cada espera.

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

O código Python a seguir é uma implementação do fluxo anterior para recuperação de erros que ocorrem em um método chamado makeRequest.

import random
import time
from apiclient.errors import HttpError

def makeRequestWithExponentialBackoff(analytics):
  """Wrapper to request Google Analytics data with exponential backoff.

  The makeRequest method accepts the analytics service object, makes API
  requests and returns the response. If any error occurs, the makeRequest
  method is retried using exponential backoff.

  Args:
    analytics: The analytics service object

  Returns:
    The API response from the makeRequest method.
  """
  for n in range(0, 5):
    try:
      return makeRequest(analytics)

    except HttpError, error:
      if error.resp.reason in ['userRateLimitExceeded', 'quotaExceeded',
                               'internalServerError', 'backendError']:
        time.sleep((2 ** n) + random.random())
      else:
        break

  print "There has been an error, the request never succeeded."