Hata Yanıtları

Standart hata yanıtları

Bir Management API isteği başarılı olursa API, 200 durum kodu 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": {
  "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 iş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ğuna dair bilgi sağlar. Sorunu gidermeden yeniden 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 boyut ya da metrik kombinasyonu geçerli değildi. Sorunu gidermeden yeniden denemeyin. API sorgusunun çalışması için üzerinde değişiklik yapmanız gerekir.
401 invalidCredentials Yetkilendirme jetonunun geçersiz olduğunu veya süresinin dolduğunu belirtir. Sorunu gidermeden yeniden 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 gidermeden yeniden denemeyin. Belirtilen varlıkta işlemi gerçekleştirmek için yeterli izinlere sahip olmanız gerekir.
403 dailyLimitExceeded Kullanıcının günlük kotayı (proje veya görünüm başına (profil)) aştığını belirtir. Sorunu gidermeden yeniden denemeyin. Günlük kotanızı kullandınız. API Sınırları ve Kotaları bölümüne bakın.
403 userRateLimitExceeded Kullanıcı başına 100 saniye başına 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 saniyede 100 sorgudur. Bu sınırı Google API Konsolu'nda en fazla 1.000 olacak şekilde artırabilirsiniz. Üstel geri çekilme yöntemini kullanarak yeniden deneyin. İstekleri gönderme hızınızı azaltmanız gerekir.
403 rateLimitExceeded Projenin 100 saniye başına sorgu hız sınırlarının aşıldığını belirtir. Üstel geri çekilme yöntemini kullanarak yeniden deneyin. İstekleri gönderme hızınızı azaltmanız gerekir.
403 quotaExceeded Temel Raporlama API'sinde görüntüleme (profil) başına 10 eşzamanlı isteğe ulaşıldığını belirtir. Eksponansiyel geri yüklemeyi kullanmayı tekrar deneyin. Bu görünümün (profilin) tamamlanması için en az bir devam eden isteğin tamamlanmasını beklemeniz gerekir.
500 internalServerError Beklenmeyen dahili sunucu hatası oluştu. Bu sorguyu bir defadan fazla tekrarlamayın.
503 backendError Sunucu hata döndürdü. Bu sorguyu bir defadan fazla tekrarlamayın.

500 veya 503 yanıtı işleme

Yoğun yük veya daha büyük ve daha karmaşık istekler sırasında 500 veya 503 hatası ortaya çıkabilir. Daha büyük istekler için daha kısa süreli veri istemeyi değerlendirin. Ayrıca üstel geri yükleme uygulamayı da düşünebilirsiniz. Bu hataların sıklığı görünüme (profile) ve söz konusu görünümle ilişkili raporlama verilerinin miktarına bağlı olabilir. Bir görünüm (profil) için 500 veya 503 hatasına neden olan bir sorgu, aynı sorguda farklı bir görünüme (profile) sahip olmak zorunda değildir.

Ü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. Management API, başarısız istekleri yeniden denemeyi seçen istemcilerin eksponansiyel geri yükleme kullanarak bunu yapması düşünülerek 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."