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.
- API'ye istekte bulunma
- Yeniden denenebilir hata kodu içeren bir hata yanıtı al
- 1 sn +
random_number_milliseconds
saniye bekleyin - İsteği yeniden dene
- Yeniden denenebilir hata kodu içeren bir hata yanıtı al
- 2 sn +
random_number_milliseconds
saniye bekleyin - İsteği yeniden dene
- Yeniden denenebilir hata kodu içeren bir hata yanıtı al
- 4 sn +
random_number_milliseconds
saniye bekleyin - İsteği yeniden dene
- Yeniden denenebilir hata kodu içeren bir hata yanıtı al
- 8 sn +
random_number_milliseconds
saniye bekleyin - İsteği yeniden dene
- Yeniden denenebilir hata kodu içeren bir hata yanıtı al
- 16 sn +
random_number_milliseconds
saniye bekleyin - İsteği yeniden dene
- 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."