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

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

Если запрос Reporting 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-100s Достигнута квота на количество запросов обнаружения, отправляемых за 100 секунд. Ответы на запросы обнаружения изменяются редко. Сохраняйте их в кеше компьютера или применяйте алгоритм экспоненциальной выдержки, чтобы снизить скорость отправки запросов.
500 INTERNAL Непредвиденная ошибка сервера. Не выполняйте этот запрос повторно.
503 BACKEND_ERROR Ошибка сервера. Не выполняйте этот запрос повторно.
503 UNAVAILABLE Службе не удалось обработать запрос. Скорее всего, это кратковременное явление. В таком случае, чтобы исправить ошибку, можно повторить попытку с экспоненциальной выдержкой.

Реализация алгоритма экспоненциальной выдержки

В рамках алгоритма экспоненциальной выдержки клиент постепенно увеличивает интервалы между попытками выполнить ошибочный запрос. Эта стандартная стратегия обработки ошибок в сетевых приложениях является обязательной для клиентов Management 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 и монотонно увеличивается на 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."