오류 응답

표준 오류 응답

Reporting API 요청이 성공하면 API가 200를 반환합니다. 요청에 오류가 발생하면 API는 오류 유형에 따라 응답에서 HTTP 상태 코드, 상태, 이유를 반환합니다. 또한 응답 본문에는 오류의 원인에 관한 자세한 설명이 포함됩니다. 다음은 오류 응답의 예입니다.

{
 "error": {
  "code": 403,
  "message": "User does not have sufficient permissions for this profile.",
  "status": "PERMISSION_DENIED"
 }
}

오류 표

코드 상태 설명 권장 조치
400 INVALID_ARGUMENT 요청이 잘못되었습니다. 필수 인수가 누락되었거나, 한도를 초과하거나, 값이 잘못되었을 수 있습니다. 자세한 내용은 오류 메시지를 검토하세요. 클라이언트가 재시도하면 이 오류가 다시 실패합니다.
401 UNAUTHENTICATED 클라이언트가 제대로 인증되지 않았습니다. 문제를 해결하지 않은 상태로 다시 시도하지 마세요. 새 인증 토큰을 가져와야 합니다.
403 PERMISSION_DENIED 사용자가 액세스할 수 없는 데이터 요청을 나타냅니다. 문제를 해결하지 않은 상태로 다시 시도하지 마세요. 지정된 항목에서 작업을 수행하려면 충분한 권한을 얻어야 합니다.
429 AnalyticsDefaultGroupCLIENT_PROJECT-1d RESOURCE_EXHAUSTED 프로젝트당 일일 요청 할당량이 소진되었음을 나타냅니다. 문제를 해결하지 않은 상태로 다시 시도하지 마세요. 일일 할당량을 모두 사용했습니다.
429 AnalyticsDefaultGroupCLIENT_PROJECT-100 RESOURCE_EXHAUSTED 프로젝트별 100초당 요청 할당량이 소진되었음을 나타냅니다. 지수 백오프를 사용하여 다시 시도합니다. 요청을 전송하는 속도를 낮춰야 합니다.
429 AnalyticsDefaultGroupUSER-100 RESOURCE_EXHAUSTED 프로젝트별 사용자별 100초당 요청 할당량이 소진되었음을 나타냅니다. 지수 백오프를 사용하여 다시 시도합니다. 요청을 전송하는 속도를 낮춰야 합니다.
429 DiscoveryGroupCLIENT_PROJECT-100 RESOURCE_EXHAUSTED 탐색 100초당 요청 할당량이 소진되었음을 나타냅니다. 검색 응답은 자주 변경되지 않습니다. 탐색 응답을 로컬로 캐시하거나 지수 백오프를 사용하여 다시 시도하세요. 요청을 전송하는 속도를 낮춰야 합니다.
500 INTERNAL 예상치 못한 내부 서버 오류가 발생했습니다. 이 쿼리를 두 번 이상 재시도하지 마세요.
503 BACKEND_ERROR 서버에서 오류를 반환했습니다. 이 쿼리를 두 번 이상 재시도하지 마세요.
503 UNAVAILABLE 서비스에서 요청을 처리하지 못했습니다. 일시적인 상태일 가능성이 높으며 지수 백오프로 다시 시도하면 해결될 수 있습니다.

지수 백오프 구현

지수 백오프는 클라이언트가 일정 시간 동안 실패한 요청을 주기적으로 재시도하는 프로세스입니다. 이는 네트워크 애플리케이션을 위한 표준 오류 처리 전략입니다. 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는 1, 000 이하의 임의의 숫자(밀리초 단위)입니다. 이는 일부 동시 구현에서 특정 잠금 오류를 방지하기 위해 필요합니다. 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."