Hata Yanıtları

Standart hata yanıtları

Temel Hazırlık API'sı isteği başarılı olursa API bir 200 durum kodu döndürür. Bir istekle birlikte 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 da yer alır. Aşağıda, bir hata yanıtı örneği verilmiştir:

{
 "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ğuyla ilgili 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 gösterir. Örneğin, üst kimlik eksikti veya istenen boyut ya da metrik kombinasyonu geçerli değildi. Sorunu düzeltmeden tekrar denemeyin. Bu API sorgusunun çalışması için değişiklik yapmanız gerekir.
401 invalidCredentials Yetkilendirme jetonunun geçersiz olduğunu veya süresinin sona erdiğini 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 izinlere sahip olmadığını belirtir. Sorunu düzeltmeden tekrar denemeyin. İşlemi belirtilen varlık üzerinde gerçekleştirmek için yeterli izinleri almanız gerekir.
403 dailyLimitExceeded Kullanıcının günlük kotayı aştığını belirtir (proje veya görünüm (profil) başına). 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 saniyedeki sorgu sayısı sınırının aşıldığını gösterir. 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. Eksponansiyel geri yükleme yöntemini kullanmayı yeniden deneyin. İstekleri gönderdiğiniz hızı yavaşlatmanız gerekir.
403 rateLimitExceeded Projenin 100 saniye başına sorgu sayısı hız sınırlarının aşıldığını gösterir. Eksponansiyel geri yükleme yöntemini kullanmayı yeniden deneyin. İstekleri gönderdiğiniz hızı yavaşlatmanız gerekir.
403 quotaExceeded Core Reporting API'de görünüm (profil) başına 10 eşzamanlı isteğe ulaşıldığını belirtir. Eksponansiyel geri yükleme işlevini kullanmayı yeniden deneyin. Bu görünüm (profil) için işleme devam eden en az bir isteğin tamamlanmasını beklemeniz gerekir.
500 internalServerError Beklenmeyen dahili sunucu hatası oluştu. Bu sorguyu bir defadan fazla yeniden denemeyin.
503 backendError Sunucu hata döndürdü. Bu sorguyu bir defadan fazla yeniden denemeyin.

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

500 ya da 503 hatası, ağır yük sırasında veya daha büyük ve daha karmaşık isteklerde ortaya çıkabilir. Daha büyük talepler için daha kısa bir dönem için veri talep etmeniz önerilir. Eksponansiyel geri yükleme uygulamayı da düşünebilirsiniz. Bu hataların sıklığı görünüm (profil) 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ı sorgu için farklı bir görünümle (profil) ilgili hataya neden olmayabilir.

Üstel Geri Alma Uygulama

Üstel geri yükleme, bir istemcinin başarısız bir isteği artan bir süre boyunca düzenli aralıklarla yeniden denemesi işlemidir. Ağ uygulamaları için standart bir hata işleme stratejisidir. Temel Hazırlık API'sı, başarısız istekleri yeniden denemek isteyen istemcilerin bunu eksponansiyel geri yükleme ile yapacağı düşünülerek tasarlanmıştır. Üstel geri yükleme, "gerekli" olmanı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'den istekte bulunma
  2. Yeniden denenebilir hata kodu içeren bir hata yanıtı alma
  3. 1 sn + random_number_milliseconds saniye bekleyin
  4. İsteği yeniden dene
  5. Yeniden denenebilir hata kodu içeren bir hata yanıtı alma
  6. 2 sn + random_number_milliseconds saniye bekleyin
  7. İsteği yeniden dene
  8. Yeniden denenebilir hata kodu içeren bir hata yanıtı alma
  9. 4 sn + random_number_milliseconds saniye bekleyin
  10. İsteği yeniden dene
  11. Yeniden denenebilir hata kodu içeren bir hata yanıtı alma
  12. 8 sn + random_number_milliseconds saniye bekleyin
  13. İsteği yeniden dene
  14. Yeniden denenebilir hata kodu içeren bir hata yanıtı alma
  15. 16 sn + random_number_milliseconds saniye bekleyin
  16. İsteği yeniden dene
  17. Hâlâ hata alıyorsanız işlemi durdurun ve hatayı 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. Bu, eşzamanlı olarak yapılan bazı uygulamalarda belirli kilit hatalarını önlemek için gereklidir. random_number_milliseconds her beklemeden sonra yeniden tanımlanmalıdır.

Not: Bekleme her zaman (2 ^ n) + random_number_milliseconds şeklindedir. Burada n, başlangıçta 0 olarak tanımlanan monoton olarak artan bir tam sayıdır. n her iterasyon (her istek) için 1'lik artırılır.

Algoritma, n değeri 5 olduğunda sona erecek şekilde ayarlanmıştır. Bu üst sınır, yalnızca istemcilerin sonsuza kadar yeniden denemelerini önlemek için uygulanır ve bir istek "kurtarılamaz hata" olarak değerlendirilmeden önce toplam 32 saniye gecikmeyle sonuçlanır.

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