Ответы на ошибки

Оптимизируйте свои подборки Сохраняйте и классифицируйте контент в соответствии со своими настройками.

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

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

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

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

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

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