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

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

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

{
 "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 userRateLimitExceeded Указывает, что превышено ограничение количества запросов в 100 секунд на одного пользователя . Значение по умолчанию, установленное в консоли Google API, составляет 100 запросов на 100 секунд на пользователя. Вы можете увеличить это ограничение в консоли Google API максимум до 1000. Повторите попытку, используя экспоненциальную задержку . Вам необходимо замедлить скорость отправки запросов.
403 rateLimitExceeded Указывает, что превышены ограничения скорости запросов проекта за 100 секунд . Повторите попытку, используя экспоненциальную задержку . Вам необходимо замедлить скорость отправки запросов.
403 quotaExceeded Указывает, что достигнуто 10 одновременных запросов на представление (профиль) в Core Reporting API. Повторите попытку, используя экспоненциальную задержку . Для завершения этого представления (профиля) вам необходимо дождаться хотя бы одного текущего запроса.
500 internalServerError Произошла непредвиденная внутренняя ошибка сервера. Не повторяйте этот запрос более одного раза.
503 backendError Сервер вернул ошибку. Не повторяйте этот запрос более одного раза.

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

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

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

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