Respons error standar
Jika permintaan Reporting API berhasil, API akan menampilkan 200
.
Jika terjadi error pada permintaan, API akan menampilkan kode status HTTP, status, dan alasan dalam respons berdasarkan jenis error.
Selain itu, isi respons memuat deskripsi mendetail tentang penyebab error. Berikut adalah contoh respons error:
{
"error": {
"code": 403,
"message": "User does not have sufficient permissions for this profile.",
"status": "PERMISSION_DENIED"
}
}
Tabel error
Kode | Status | Deskripsi | Tindakan yang Direkomendasikan |
---|---|---|---|
400 | INVALID_ARGUMENT |
Permintaan tidak valid; argumen yang diperlukan mungkin tidak ada, melebihi batas, atau memiliki nilai yang tidak valid. | Tinjau pesan error untuk mengetahui detailnya. Error ini akan gagal lagi jika klien mencoba ulang error tersebut. |
401 | UNAUTHENTICATED |
Klien tidak diautentikasi dengan benar. | Jangan mencoba lagi tanpa memperbaiki masalah. Anda perlu mendapatkan token autentikasi baru. |
403 | PERMISSION_DENIED |
Menunjukkan permintaan untuk data yang aksesnya tidak dimiliki pengguna. | Jangan mencoba lagi tanpa memperbaiki masalah. Anda perlu mendapatkan izin yang memadai untuk melakukan operasi pada entity yang ditentukan. |
429 | RESOURCE_EXHAUSTED AnalyticsDefaultGroupCLIENT_PROJECT-1h |
Menunjukkan bahwa permintaan per hari per project kuota telah habis. | Jangan mencoba lagi tanpa memperbaiki masalah. Anda telah menggunakan kuota harian. |
429 | RESOURCE_EXHAUSTED AnalyticsDefaultGroupCLIENT_PROJECT-100 |
Mengindikasikan bahwa kuota permintaan per 100 detik per project telah habis. | Coba lagi menggunakan backoff eksponensial. Anda harus memperlambat kecepatan pengiriman permintaan. |
429 | RESOURCE_EXHAUSTED AnalyticsDefaultGroupUSER-100 |
Mengindikasikan bahwa kuota permintaan per 100 detik per pengguna per project telah habis. | Coba lagi menggunakan backoff eksponensial. Anda harus memperlambat kecepatan pengiriman permintaan. |
429 | RESOURCE_EXHAUSTED DiscoveryGroupCLIENT_PROJECT-100 |
Mengindikasikan bahwa kuota permintaan per 100 detik penemuan telah habis. | Respons penemuan tidak sering berubah; cache respons penemuan secara lokal atau coba lagi menggunakan backoff eksponensial. Anda harus memperlambat kecepatan pengiriman permintaan. |
500 | INTERNAL |
Terjadi error server internal yang tidak terduga. | Jangan mencoba lagi kueri ini lebih dari sekali. |
503 | BACKEND_ERROR |
Server menampilkan error. | Jangan mencoba lagi kueri ini lebih dari sekali. |
503 | UNAVAILABLE |
Layanan tidak dapat memproses permintaan. | Kemungkinan besar ini hanya kondisi sementara dan dapat dikoreksi dengan mencoba lagi dengan backoff eksponensial. |
Menerapkan Backoff Eksponensial
Backoff eksponensial adalah proses klien mencoba kembali permintaan yang gagal secara berkala selama waktu yang meningkat. Ini adalah strategi penanganan error standar untuk aplikasi jaringan. Reporting API dirancang dengan ekspektasi bahwa klien yang memilih untuk mencoba ulang permintaan yang gagal akan melakukannya dengan backoff eksponensial. Selain "wajib", menggunakan backoff eksponensial akan meningkatkan efisiensi penggunaan bandwidth, mengurangi jumlah permintaan yang diperlukan untuk mendapatkan respons yang berhasil, dan memaksimalkan throughput permintaan dalam lingkungan yang serentak.
Alur untuk menerapkan backoff eksponensial sederhana adalah sebagai berikut.
- Membuat permintaan ke API
- Menerima respons error yang memiliki kode error yang dapat dicoba lagi
- Tunggu 1 d +
random_number_milliseconds
detik - Coba lagi permintaan
- Menerima respons error yang memiliki kode error yang dapat dicoba lagi
- Tunggu 2 d +
random_number_milliseconds
detik - Coba lagi permintaan
- Menerima respons error yang memiliki kode error yang dapat dicoba lagi
- Tunggu 4 d +
random_number_milliseconds
detik - Coba lagi permintaan
- Menerima respons error yang memiliki kode error yang dapat dicoba lagi
- Tunggu 8 detik +
random_number_milliseconds
detik - Coba lagi permintaan
- Menerima respons error yang memiliki kode error yang dapat dicoba lagi
- Tunggu 16 dtk +
random_number_milliseconds
detik - Coba lagi permintaan
- Jika Anda masih mendapatkan error, hentikan dan catat error tersebut.
Dalam alur di atas, random_number_milliseconds
adalah angka acak milidetik yang kurang dari atau sama dengan 1.000. Hal ini diperlukan untuk menghindari error penguncian tertentu dalam beberapa implementasi serentak.
random_number_milliseconds
harus ditentukan ulang setelah setiap waktu tunggu.
Catatan: waktu tunggu selalu (2 ^ n) + random_number_milliseconds
, dengan n adalah bilangan bulat yang meningkat secara monoton yang awalnya didefinisikan sebagai 0. n bertambah 1 untuk setiap iterasi (setiap permintaan).
Algoritme disetel untuk dihentikan saat n adalah 5. Batas ini hanya untuk menghentikan klien mencoba kembali tanpa batas, dan menyebabkan penundaan total sekitar 32 detik sebelum permintaan dianggap "error yang tidak dapat dipulihkan".
Kode Python berikut adalah implementasi alur
di atas untuk memulihkan dari error yang terjadi dalam metode yang disebut
makeRequest
.
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."