Hata Yanıtları

Standart Hata Yanıtları

Bir Tag Manager API isteği başarılı olursa API, yanıtın gövdesinde istenen verilerle birlikte 200 HTTP durum kodu döndürür.

İstekle ilgili bir hata oluşursa API, hatanın türüne göre yanıtta bir HTTP durum kodu ve neden döndürür. Ayrıca yanıtın gövde bölümünde, hatanın nedenini içeren ayrıntılı bir açıklama da yer alır. Aşağıda, bir hata yanıtı örneği verilmiştir:

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."
 }
}

Not: Açıklama her an değiştirilebilir. Bu nedenle, uygulamalar gerçek açıklama metnine bağlı olmamalıdır.

Üstel Geri Alma Uygulama

Üstel geri yükleme, istemcinin başarısız bir isteği artan bir süre boyunca düzenli olarak yeniden deneme sürecidir. Ağ uygulamaları için standart bir hata işleme stratejisidir. Tag Manager API, başarısız istekleri yeniden denemeyi seçen istemcilerin eksponansiyel geri yükleme kullanarak bunu yapması beklentisiyle tasarlanmıştır. Üstel geri yükleme özelliği, "gerekli" olmasının yanı sıra, bant genişliği kullanımının verimliliğini artırır, başarılı bir yanıt almak için gereken istek sayısını azaltır ve eşzamanlı ortamlarda isteklerin işleme hızını en üst düzeye çıkarır.

Basit üstel geri yükleme uygulama akışı aşağıdaki gibidir.

  1. API'ye istekte bulunun.
  2. Hata kodu içeren bir hata yanıtı alın. Hata kodu yeniden denenebilir.
  3. 1 saniye + random_number_milliseconds saniye bekleyin.
  4. İsteği yeniden deneyin.
  5. Hata kodu içeren bir hata yanıtı alın. Hata kodu yeniden denenebilir.
  6. 2 saniye + random_number_milliseconds saniye bekleyin.
  7. İsteği yeniden deneyin.
  8. Hata kodu içeren bir hata yanıtı alın. Hata kodu yeniden denenebilir.
  9. 4 saniye + random_number_milliseconds saniye bekleyin.
  10. İsteği yeniden deneyin.
  11. Hata kodu içeren bir hata yanıtı alın. Hata kodu yeniden denenebilir.
  12. 8 saniye + random_number_milliseconds saniye bekleyin.
  13. İsteği yeniden deneyin.
  14. Hata kodu içeren bir hata yanıtı alın. Hata kodu yeniden denenebilir.
  15. 16 saniye + random_number_milliseconds saniye bekleyin.
  16. İsteği yeniden deneyin.
  17. Hâlâ hata alıyorsanız durup hatayı günlüğe kaydedin.

Yukarıdaki akışta random_number_milliseconds, 1.000'den küçük veya 1.000'e eşit olan rastgele bir milisaniye sayısıdır. Bazı eşzamanlı uygulamalarda belirli kilit hatalarını önlemek için bu gereklidir. random_number_milliseconds her beklemenin ardından yeniden tanımlanmalıdır.

Not: Bekleme süresi her zaman (2 ^ n) + random_number_milliseconds'dir. Burada n, başlangıçta 0 olarak tanımlanan monoton olarak artan bir tam sayıdır. n değişkeni her iterasyon (her istek) için 1 oranında artar.

Algoritma, n 5 olduğunda sonlandırılacak şekilde ayarlanır. Bu üst sınır yalnızca istemcilerin sonsuza kadar yeniden denemesini durdurmak için uygulanır ve bir istek "kurtarılamaz hata" olarak kabul edilmeden önce toplamda 32 saniyelik bir gecikme yaşanır.

Aşağıdaki Python kodu, makeRequest adlı bir yöntemde ortaya çıkan hataları kurtarmak için yukarıdaki akışın uygulanmasıdır.

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."