Ответы при ошибках

Стандартные ответы на ошибки

Если запрос API отчетов успешен, API возвращает 200 . Если при запросе возникает ошибка, API возвращает код состояния HTTP, статус и причину в ответе в зависимости от типа ошибки. Кроме того, тело ответа содержит подробное описание причины ошибки. Вот пример ответа об ошибке:

{
 "error": {
  "code": 403,
  "message": "User does not have sufficient permissions for this profile.",
  "status": "PERMISSION_DENIED"
 }
}

Таблица ошибок

Код Положение дел Описание Рекомендованное действие
400 INVALID_ARGUMENT Запрос недействителен; обязательный аргумент может отсутствовать, превышать ограничения или иметь недопустимое значение. Подробные сведения см. в сообщении об ошибке. Эта ошибка снова произойдет, если клиент повторит ее.
401 UNAUTHENTICATED Клиент не аутентифицирован должным образом. Не повторяйте попытку, не устранив проблему. Вам необходимо получить новый токен авторизации.
403 PERMISSION_DENIED Указывает на запрос данных, к которым у пользователя нет доступа. Не повторяйте попытку, не устранив проблему. Вам необходимо получить достаточные разрешения для выполнения операции с указанным объектом.
429 RESOURCE_EXHAUSTED AnalyticsDefaultGroupCLIENT_PROJECT-1d Указывает, что число запросов в день по квоте проекта исчерпано. Не повторяйте попытку, не устранив проблему. Вы израсходовали дневную норму.
429 RESOURCE_EXHAUSTED AnalyticsDefaultGroupCLIENT_PROJECT-100s Указывает, что квота запросов на 100 секунд для каждого проекта исчерпана. Повторите попытку, используя экспоненциальную задержку . Вам необходимо замедлить скорость отправки запросов.
429 RESOURCE_EXHAUSTED AnalyticsDefaultGroupUSER-100s Указывает, что квота запросов на 100 секунд на пользователя на проект исчерпана. Повторите попытку, используя экспоненциальную задержку . Вам необходимо замедлить скорость отправки запросов.
429 RESOURCE_EXHAUSTED DiscoveryGroupCLIENT_PROJECT-100 Указывает, что квота на количество запросов на обнаружение в 100 секунд исчерпана. Реакция на обнаружение не меняется часто; кэшируйте ответ обнаружения локально или повторите попытку, используя экспоненциальную задержку . Вам необходимо замедлить скорость отправки запросов.
500 INTERNAL Произошла непредвиденная внутренняя ошибка сервера. Не повторяйте этот запрос более одного раза.
503 BACKEND_ERROR Сервер вернул ошибку. Не повторяйте этот запрос более одного раза.
503 UNAVAILABLE Службе не удалось обработать запрос. Скорее всего, это временное состояние, которое можно исправить повторной попыткой с экспоненциальной задержкой .

Реализация экспоненциального отката

Экспоненциальная отсрочка — это процесс, при котором клиент периодически повторяет неудачный запрос в течение увеличивающегося промежутка времени. Это стандартная стратегия обработки ошибок для сетевых приложений. API отчетов разработан с расчетом на то, что клиенты, решившие повторить неудачные запросы, будут делать это с использованием экспоненциальной задержки. Помимо того, что использование экспоненциальной задержки является «обязательным», оно повышает эффективность использования полосы пропускания, уменьшает количество запросов, необходимых для получения успешного ответа, и максимизирует пропускную способность запросов в параллельных средах.

Порядок реализации простого экспоненциального отката следующий.

  1. Сделать запрос к API
  2. Получите ответ об ошибке с кодом ошибки, допускающим повторную попытку.
  3. Подождите 1 с + random_number_milliseconds секунд.
  4. Повторить запрос
  5. Получите ответ об ошибке с кодом ошибки, допускающим повторную попытку.
  6. Подождите 2 секунды + random_number_milliseconds секунд.
  7. Повторить запрос
  8. Получите ответ об ошибке с кодом ошибки, допускающим повторную попытку.
  9. Подождите 4 секунды + random_number_milliseconds секунд.
  10. Повторить запрос
  11. Получите ответ об ошибке с кодом ошибки, допускающим повторную попытку.
  12. Подождите 8 секунд + random_number_milliseconds секунд.
  13. Повторить запрос
  14. Получите ответ об ошибке с кодом ошибки, допускающим повторную попытку.
  15. Подождите 16 секунд + random_number_milliseconds секунд.
  16. Повторить запрос
  17. Если вы по-прежнему получаете ошибку, остановитесь и запишите ошибку.

В приведенном выше потоке random_number_milliseconds — это случайное число миллисекунд, меньшее или равное 1000. Это необходимо, чтобы избежать определенных ошибок блокировки в некоторых параллельных реализациях. random_number_milliseconds необходимо переопределять после каждого ожидания.

Примечание : ожидание всегда равно (2 ^ n) + random_number_milliseconds , где n — монотонно увеличивающееся целое число, изначально определенное как 0. n увеличивается на 1 для каждой итерации (каждого запроса).

Алгоритм настроен на завершение, когда n равно 5. Этот потолок установлен только для того, чтобы клиенты не могли бесконечно повторять попытки, и приводит к общей задержке около 32 секунд, прежде чем запрос будет считаться «неустранимой ошибкой».

Следующий код Python представляет собой реализацию описанного выше потока для восстановления ошибок, возникающих в методе 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."