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

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

После успешной обработки запроса Real Time Reporting API возвращает в теле ответа код статуса HTTP 200 и запрошенные данные.

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

400 invalidParameter

{
 "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]"
 }
}

Примечание. Текст описания может изменяться и не должен использоваться при обработке в приложении.

В следующей таблице приводятся возможные коды ошибок, из описание и рекомендуемые действия.

Код Причина Описание Рекомендуемые действия
400 invalidParameter Параметр запроса имеет неверное значение. В полях locationType и location ответа приводятся сведения о недопустимом значении. Прежде чем повторить попытку, устраните проблему. Указанный в ответе параметр должен получать допустимое значение.
400 badRequest Неверный запрос. Например, отсутствует идентификатор родительского элемента, или запрошена недопустимая комбинация параметров и показателей. Прежде чем повторить попытку, устраните проблему. Внесите необходимые изменения в запрос к API.
401 invalidCredentials Неверный или устаревший токен аутентификации. Прежде чем повторить попытку, устраните проблему. Получите новый токен аутентификации.
403 insufficientPermissions У пользователя нет разрешений на работу с объектом, указанным в запросе. Прежде чем повторить попытку, устраните проблему. Получите необходимые разрешения для работы с указанным объектом.
403 dailyLimitExceeded Пользователь превысил дневную квоту для проекта или профиля. Прежде чем повторить попытку, устраните проблему. Вы исчерпали свою дневную квоту. Подробнее об ограничениях и квотах в API...
403 usageLimits.userRateLimitExceededUnreg Приложение нужно зарегистрировать в Google API Console. Прежде чем повторить попытку, устраните проблему. Чтобы получить полную квоту, зарегистрируйтесь в API Console.
403 userRateLimitExceeded Пользователь превысил ограничение на количество запросов. По умолчанию с одного IP-адреса можно выполнять 1 запрос в секунду. Это ограничение можно увеличить в Google API Console, но число запросов в секунду в любом случае не должно превышать 10. Попробуйте применить алгоритм экспоненциальной выдержки. Уменьшите скорость отправки запросов.
403 rateLimitExceeded Превышено глобальное или общее ограничение частоты отправки запросов. Попробуйте применить алгоритм экспоненциальной выдержки. Уменьшите скорость отправки запросов.
403 quotaExceeded Достигнуто ограничение в 10 параллельных запросов на один профиль для Core Reporting API. Попробуйте применить алгоритм экспоненциальной выдержки. Подождите, пока будет завершен хотя бы один выполняемый запрос.
429 RESOURCE_EXHAUSTED AnalyticsDefaultGroupCLIENT_PROJECT-1d Достигнута дневная квота запросов для проекта. Прежде чем повторить попытку, устраните проблему. Вы исчерпали свою дневную квоту. Подробнее об ограничениях и квотах в API
429 RESOURCE_EXHAUSTED AnalyticsDefaultGroupCLIENT_PROJECT-100s Достигнута квота для проекта на количество запросов, отправляемых за 100 секунд. Попробуйте применить алгоритм экспоненциальной выдержки. Уменьшите скорость отправки запросов.
429 RESOURCE_EXHAUSTED AnalyticsDefaultGroupUSER-100s Достигнута квота для проекта на количество запросов, отправляемых за 100 секунд. Попробуйте применить алгоритм экспоненциальной выдержки. Уменьшите скорость отправки запросов.
429 RESOURCE_EXHAUSTED DiscoveryGroupCLIENT_PROJECT-100s Достигнута квота на количество запросов обнаружения, отправляемых за 100 секунд. Ответы на запросы обнаружения меняются редко. Сохраняйте их в кеше компьютера или применяйте алгоритм экспоненциальной выдержки. Уменьшите скорость отправки запросов.
500 internalServerError Непредвиденная ошибка сервера. Не выполняйте этот запрос повторно.
503 backendError Ошибка сервера. Не выполняйте этот запрос повторно.

Обработка ответов на ошибки 500 и 503

Ошибки 500 и 503 могут возникнуть при высокой нагрузке или сложных запросах. Попробуйте указать менее продолжительный отрезок времени. Кроме того, можно использовать алгоритм экспоненциальной выдержки. Частота возникновения таких ошибок зависит от представления (профиля) и объема связанных с ним отчетных данных. В одном представлении (профиле) запрос может заканчиваться ошибкой 500 или 503, а в другом выполняться корректно.

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

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