Hata Yanıtları

Standart hata yanıtları

Reporting API isteği başarılı olursa API bir 200 döndürür. Bir istekte hata oluşursa API, hatanın türüne göre yanıtta bir HTTP durum kodu, durum ve neden döndürür. Ayrıca, yanıtın gövdesinde hatanın nedenine dair ayrıntılı bir açıklama yer alır. Bir hata yanıtı örneğini aşağıda bulabilirsiniz:

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

Hata tablosu

Kod Durum Açıklama Önerilen işlem
400 INVALID_ARGUMENT İstek geçersiz. Gerekli bir bağımsız değişken eksik olabilir, sınırları aşıyor veya geçersiz bir değere sahip. Ayrıntılar için hata mesajını inceleyin. İstemci yeniden denerse bu hata yine başarısız olur.
401 UNAUTHENTICATED İstemcinin kimliği doğru şekilde doğrulanmadı. Sorunu gidermeden yeniden denemeyin. Yeni bir yetkilendirme jetonu almanız gerekiyor.
403 PERMISSION_DENIED Kullanıcının erişim sahibi olmadığı veri isteğini belirtir. Sorunu gidermeden yeniden denemeyin. Belirtilen varlıkta işlemi gerçekleştirmek için yeterli izinlere sahip olmanız gerekir.
429 RESOURCE_EXHAUSTED AnalyticsDefaultGroupCLIENT_PROJECT-1d Proje başına günlük istek kotasının tükendiğini belirtir. Sorunu gidermeden yeniden denemeyin. Günlük kotanızı kullandınız.
429 RESOURCE_EXHAUSTED AnalyticsDefaultGroupCLIENT_PROJECT-100 Proje başına 100 saniyede istek sayısı kotasının tükendiğini belirtir. Üstel geri çekilme yöntemini kullanarak yeniden deneyin. İstekleri gönderme hızınızı azaltmanız gerekir.
429 RESOURCE_EXHAUSTED AnalyticsDefaultGroupKULLANICI-100 Proje başına kullanıcı başına 100 saniyelik istek sayısı kotasının tükendiğini belirtir. Üstel geri çekilme yöntemini kullanarak yeniden deneyin. İstekleri gönderme hızınızı azaltmanız gerekir.
429 RESOURCE_EXHAUSTED DiscoveryGroupCLIENT_PROJECT-100'ler 100 saniye başına keşif isteği kotasının tükendiğini belirtir. Keşif yanıtı sık sık değişmiyor. Keşif yanıtını yerel olarak önbelleğe alın veya üstel geri çekilmeyi kullanarak tekrar deneyin. İstekleri gönderme hızınızı azaltmanız gerekir.
500 INTERNAL Beklenmeyen dahili sunucu hatası oluştu. Bu sorguyu bir defadan fazla tekrarlamayın.
503 BACKEND_ERROR Sunucu hata döndürdü. Bu sorguyu bir defadan fazla tekrarlamayın.
503 UNAVAILABLE Hizmet, isteği işleyemedi. Bu büyük olasılıkla geçici bir durumdur ve üstel geri yükleme ile yeniden denenerek düzeltilebilir.

Üstel Geri Alma Uygulama

Eksponansiyel geri yükleme, istemcinin başarısız bir isteği giderek artan bir süre boyunca düzenli olarak yeniden denemesi işlemidir. Bu, ağ uygulamaları için standart bir hata işleme stratejisidir. Reporting API, başarısız istekleri yeniden denemeyi seçen istemcilerin eksponansiyel geri yükleme kullanarak bunu yapması beklenerek tasarlanmıştır. Eksponansiyel geri yükleme özelliğini kullanmak "zorunlu" 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 istek işleme hızını en üst düzeye çıkarır.

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

  1. API'ye istekte bulunma
  2. Yeniden denenebilir hata kodu içeren bir hata yanıtı al
  3. 1 sn + random_number_milliseconds saniye bekleyin
  4. İsteği yeniden dene
  5. Yeniden denenebilir hata kodu içeren bir hata yanıtı al
  6. 2 sn + random_number_milliseconds saniye bekleyin
  7. İsteği yeniden dene
  8. Yeniden denenebilir hata kodu içeren bir hata yanıtı al
  9. 4 sn + random_number_milliseconds saniye bekleyin
  10. İsteği yeniden dene
  11. Yeniden denenebilir hata kodu içeren bir hata yanıtı al
  12. 8 sn + random_number_milliseconds saniye bekleyin
  13. İsteği yeniden dene
  14. Yeniden denenebilir hata kodu içeren bir hata yanıtı al
  15. 16 sn + random_number_milliseconds saniye bekleyin
  16. İsteği yeniden dene
  17. Hâlâ hata alıyorsanız hatayı durdurun ve 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. Eşzamanlı bazı uygulamalarda belirli kilitleme hatalarını önlemek için bu gereklidir. random_number_milliseconds her beklemeden sonra 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 tekdüze şekilde artan bir tam sayıdır. n, her iterasyonda (her istek) 1 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 gecikmeyle sonuçlanır.

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

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