エラー レスポンス

標準エラー レスポンス

Tag Manager API のリクエストの処理に成功すると、API は 200 HTTP ステータス コードとリクエストされたデータを含むレスポンス本文を返します。

リクエストでエラーが発生すると、エラーの種類に基づく適切な HTTP ステータス コードと理由を含むレスポンスが返されます。 また、レスポンス本文にエラーの原因についての詳しい説明が記述されます。以下に、エラー レスポンスの例を示します。

400 invalidParameter

{
 "error": {
  "errors": [
   {
    "domain": "usageLimits",
    "reason": "accessNotConfigured",
    "message": "Access Not Configured. Please use Google Developers Console to activate the API for your project.",
   }
  ],
  "code": 403,
  "message": "Access Not Configured. Please use Google Developers Console to activate the API for your project."
 }
}

: 説明は常に変更される可能性があるため、アプリケーションを実際の説明テキストに依拠させないでください。

指数バックオフの実装

指数バックオフは、失敗したリクエストをクライアントが再試行する際、失敗するごとに次の再試行までの待ち時間を増やしていく処理です。これは、ネットワーク アプリケーションに使われる標準的な エラー処理方法です。Tag Manager 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(tagmanager):
  """Wrapper to request Google Tag Manager data with exponential backoff.

  The makeRequest method accepts the tagmanager service object, makes API
  requests and returns the response. If any error occurs, the makeRequest
  method is retried using exponential backoff.

  Args:
    tagmanager: The tagmanager service object

  Returns:
    The API response from the makeRequest method.
  """
  for n in range(0, 5):
    try:
      return makeRequest(tagmanager)

    except HttpError, error:
      if error.resp.reason in ['userRateLimitExceeded', 'quotaExceeded']:
        time.sleep((2 ** n) + random.random())

  print "There has been an error, the request never succeeded."