Стандартные ответы об ошибках
Если запрос 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 разработан с расчетом на то, что клиенты, решившие повторить неудачные запросы, сделают это с экспоненциальной задержкой. Помимо того, что это «обязательно», использование экспоненциальной отсрочки повышает эффективность использования полосы пропускания, уменьшает количество запросов, необходимых для получения успешного ответа, и максимизирует пропускную способность запросов в параллельных средах.
Алгоритм реализации простой экспоненциальной отсрочки выглядит следующим образом.
- Сделать запрос к API
- Получите ответ об ошибке с кодом ошибки, который можно повторить.
- Подождите 1 с +
random_number_milliseconds
секунд - Повторить запрос
- Получите ответ об ошибке с кодом ошибки, который можно повторить.
- Подождите 2 секунды +
random_number_milliseconds
секунд - Повторить запрос
- Получите ответ об ошибке с кодом ошибки, который можно повторить.
- Подождите 4 секунды +
random_number_milliseconds
секунд - Повторить запрос
- Получите ответ об ошибке с кодом ошибки, который можно повторить.
- Подождите 8 секунд +
random_number_milliseconds
секунд - Повторить запрос
- Получите ответ об ошибке с кодом ошибки, который можно повторить.
- Подождите 16 секунд +
random_number_milliseconds
секунд - Повторить запрос
- Если вы по-прежнему получаете сообщение об ошибке, остановитесь и зарегистрируйте ошибку.
В приведенном выше потоке 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."