Hata Yanıtları

Standart hata yanıtları

Management API isteği başarılı olursa API bir 200 durum kodu döndürür. Bir istekle ilgili hata oluşursa API, hatanın türüne bağlı olarak yanıtta bir HTTP durum kodu, durum ve neden döndürür. Ayrıca, yanıtın gövde bölümünde hatanın nedeniyle ilgili ayrıntılı bir açıklama yer alır. Hata yanıtı örneğini aşağıda bulabilirsiniz:

{
 "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]"
 }
}

Hata tablosu

Kod Neden Açıklama Önerilen İşlem
400 invalidParameter Bir istek parametresinin geçersiz bir değere sahip olduğunu belirtir. Hata yanıtındaki locationType ve location alanları, hangi değerin geçersiz olduğu hakkında bilgi sağlar. Sorunu düzeltmeden tekrar denemeyin. Hata yanıtında belirtilen parametre için geçerli bir değer sağlamanız gerekir.
400 badRequest Sorgunun geçersiz olduğunu belirtir. Örneğin, üst kimlik eksikti veya istenen boyutların ya da metriklerin kombinasyonu geçerli değildi. Sorunu düzeltmeden tekrar denemeyin. Çalışması için API sorgusunda değişiklik yapmanız gerekir.
401 invalidCredentials Kimlik doğrulama jetonunun geçersiz olduğunu veya süresinin dolduğunu belirtir. Sorunu düzeltmeden tekrar denemeyin. Yeni bir yetkilendirme jetonu almanız gerekiyor.
403 insufficientPermissions Kullanıcının sorguda belirtilen varlık için yeterli izne sahip olmadığını belirtir. Sorunu düzeltmeden tekrar denemeyin. Belirtilen varlıkta işlemi gerçekleştirmek için yeterli izne sahip olmalısınız.
403 dailyLimitExceeded Kullanıcının günlük kotayı (proje veya görünüm başına (profil)) aştığını belirtir. Sorunu düzeltmeden tekrar denemeyin. Günlük kotanızı kullandınız. API Sınırları ve Kotaları başlıklı makaleyi inceleyin.
403 userRateLimitExceeded Kullanıcı başına 100 saniyede sorgu sayısı sınırının aşıldığını belirtir. Google API Konsolu'nda ayarlanan varsayılan değer, kullanıcı başına 100 saniye başına 100 sorgudur. Google API Konsolu'nda bu sınırı en fazla 1.000'e çıkarabilirsiniz. Üstel geri çekilme kullanarak yeniden deneyin. İstekleri gönderme hızınızı yavaşlatmanız gerekir.
403 rateLimitExceeded Projenin 100 saniye başına sorgu hız sınırının aşıldığını gösterir. Üstel geri çekilme kullanarak yeniden deneyin. İstekleri gönderme hızınızı yavaşlatmanız gerekir.
403 quotaExceeded Temel Raporlama API'sinde görüntüleme başına 10 eşzamanlı isteğe (profil) ulaşıldığını gösterir. Eksponansiyel geri yüklemeyi kullanarak yeniden deneyin. Bu görünümün (profilin) tamamlanması için en az bir devam eden isteğin beklemesi gerekir.
500 internalServerError Beklenmeyen dahili sunucu hatası oluştu. Bu sorguyu yalnızca bir kez deneyin.
503 backendError Sunucu bir hata döndürdü. Bu sorguyu yalnızca bir kez deneyin.

500 veya 503 yanıtlarını işleme

Ağır yükleme sırasında veya daha karmaşık istekler için 500 ya da 503 hatası ortaya çıkabilir. Daha büyük istekler için daha kısa bir süreye ait verileri talep edebilirsiniz. Ayrıca, üstel geri çekilme uygulamayı da düşünebilirsiniz. Bu hataların sıklığı, görünüme (profil) ve bu görünümle ilişkilendirilen raporlama verilerinin miktarına bağlı olabilir. Bir görünüm (profil) için 500 veya 503 hatasına neden olan bir sorgu, farklı sorgu (profil) içeren aynı sorgu için her zaman bir hataya neden olmaz.

Üstel Geri Alma Uygulama

Üstel geri çekilme, bir istemcinin başarısız isteği artan bir süre boyunca periyodik olarak yeniden deneme işlemidir. Ağ uygulamaları için standart bir hata işleme stratejisidir. Management API, başarısız istekleri yeniden denemeyi seçen istemcilerin eksponansiyel geri yükleme özelliğini kullanarak bunu yapması beklentisiyle tasarlanmıştır. Eksponansiyel geri yüklemenin kullanılması, "gereklidir" ve 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 performansı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 denenebilen bir hata kodu içeren bir hata yanıtı alın
  3. 1 sn. + random_number_milliseconds saniye bekleyin
  4. İsteği yeniden dene
  5. Yeniden denenebilen bir hata kodu içeren bir hata yanıtı alın
  6. 2 sn. + random_number_milliseconds saniye bekleyin
  7. İsteği yeniden dene
  8. Yeniden denenebilen bir hata kodu içeren bir hata yanıtı alın
  9. 4 sn. + random_number_milliseconds saniye bekleyin
  10. İsteği yeniden dene
  11. Yeniden denenebilen bir hata kodu içeren bir hata yanıtı alın
  12. 8 sn + random_number_milliseconds saniye
  13. İsteği yeniden dene
  14. Yeniden denenebilen bir hata kodu içeren bir hata yanıtı alın
  15. 16 sn. + random_number_milliseconds saniye bekleyin
  16. İsteği yeniden dene
  17. Hâlâ hata alıyorsanız durup hatayı kaydedin.

Yukarıdaki akışta random_number_milliseconds rastgele sayıda ve 1.000 veya daha küçük bir milisaniyedir. Bazı eş zamanlı uygulamalarda belirli kilit hatalarından kaçınmak için bu gereklidir. Her beklemenin ardından random_number_milliseconds yeniden tanımlanmalıdır.

Not: Bekleme süresi her zaman (2 ^ n) + random_number_milliseconds şeklindedir. Burada n, ilk olarak 0 olarak tanımlanan, monoton olarak artan bir tam sayıdır. n, her tekrar için (her istek) 1 artar.

Algoritma, n 5 olduğunda feshedilecek şekilde ayarlanır. Bu tavan yalnızca müşterilerin sonsuz bir yeniden deneme işlemini durdurmasını sağlar ve bir isteğin "kurtarılamaz hata" olarak değerlendirilmesi için yaklaşık 32 saniyelik bir gecikmeyle sonuçlanır.

Aşağıdaki Python kodu, makeRequest adlı yöntemde oluşan hatalardan kurtulmak için yukarıdaki akışın 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."