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