Respons error standar
Jika permintaan Multi-ChannelFunnel Reporting API berhasil, API akan menampilkan kode status
200
. Jika terjadi error pada permintaan, API akan menampilkan kode status HTTP, status, dan alasan dalam respons berdasarkan jenis error.
Selain itu, isi respons berisi deskripsi mendetail
tentang penyebab error. Berikut adalah contoh respons error:
{
"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]"
}
}
Tabel error
Code | Alasan | Deskripsi | Tindakan yang Disarankan |
---|---|---|---|
400 | invalidParameter |
Menunjukkan bahwa parameter permintaan memiliki nilai yang tidak valid. Kolom locationType dan location dalam respons error memberikan informasi tentang nilai mana yang tidak valid. |
Jangan mencoba lagi tanpa memperbaiki masalah. Anda harus memberikan nilai yang valid untuk parameter yang ditentukan dalam respons error. |
400 | badRequest |
Menunjukkan bahwa kueri tidak valid. Misalnya, ID induk tidak ada atau kombinasi dimensi atau metrik yang diminta tidak valid. | Jangan mencoba lagi tanpa memperbaiki masalah. Anda perlu membuat perubahan pada kueri API agar dapat berfungsi. |
401 | invalidCredentials |
Menunjukkan bahwa token autentikasi tidak valid atau sudah tidak berlaku. | Jangan mencoba lagi tanpa memperbaiki masalah. Anda perlu mendapatkan token autentikasi baru. |
403 | insufficientPermissions |
Menunjukkan bahwa pengguna tidak memiliki izin yang memadai untuk entity yang ditentukan dalam kueri. | Jangan mencoba lagi tanpa memperbaiki masalah. Anda perlu mendapatkan izin yang memadai untuk melakukan operasi pada entitas yang ditentukan. |
403 | dailyLimitExceeded |
Menunjukkan bahwa pengguna telah melampaui kuota harian (baik per project atau per tampilan (profil)). | Jangan mencoba lagi tanpa memperbaiki masalah. Kuota harian Anda telah habis. Lihat Batas dan Kuota API. |
403 | userRateLimitExceeded |
Menunjukkan bahwa batas Kueri per 100 detik per pengguna telah terlampaui. Nilai default yang ditetapkan di Konsol API Google adalah 100 kueri per 100 detik per pengguna. Anda dapat meningkatkan batas ini di Konsol API Google hingga maksimum 1.000. | Coba lagi menggunakan back-off eksponensial. Anda perlu memperlambat kecepatan pengiriman permintaan. |
403 | rateLimitExceeded |
Menunjukkan bahwa batas kapasitas kueri per 100 detik project telah terlampaui. | Coba lagi menggunakan back-off eksponensial. Anda perlu memperlambat kecepatan pengiriman permintaan. |
403 | quotaExceeded |
Menunjukkan bahwa 10 permintaan serentak per tampilan (profil) di Core Reporting API telah tercapai. | Coba lagi menggunakan backoff eksponensial. Anda harus menunggu minimal satu permintaan yang sedang berlangsung hingga tampilan (profil) ini selesai. |
500 | internalServerError |
Terjadi error server internal yang tidak terduga. | Jangan mencoba lagi kueri ini lebih dari sekali. |
503 | backendError |
Server menampilkan error. | Jangan mencoba lagi kueri ini lebih dari sekali. |
Menangani respons 500 atau 503
Error 500
atau 503
dapat terjadi selama beban berat atau untuk permintaan yang lebih besar dan lebih kompleks. Untuk permintaan yang lebih besar, pertimbangkan untuk meminta data dalam jangka waktu yang lebih singkat. Pertimbangkan juga untuk menerapkan backoff eksponensial.
Frekuensi error ini dapat bergantung pada tampilan (profil) dan
jumlah data pelaporan yang dikaitkan dengan tampilan tersebut; Kueri yang menyebabkan error
500
atau 503
untuk satu tampilan (profil) belum tentu menyebabkan
error untuk kueri yang sama dengan tampilan (profil) yang berbeda.
Mengimplementasikan Backoff Eksponensial
Backoff eksponensial adalah proses saat klien yang secara berkala mencoba kembali permintaan yang gagal selama jangka waktu yang lebih lama. Ini adalah strategi penanganan error standar untuk aplikasi jaringan. Multi-ChannelFunnel Reporting API dirancang dengan ekspektasi bahwa klien yang memilih untuk mencoba lagi permintaan yang gagal melakukannya menggunakan backoff eksponensial. Selain "diperlukan", penggunaan backoff eksponensial akan meningkatkan efisiensi penggunaan bandwidth, mengurangi jumlah permintaan yang diperlukan untuk mendapatkan respons yang berhasil, dan memaksimalkan throughput permintaan dalam lingkungan serentak.
Alur untuk mengimplementasikan backoff eksponensial sederhana adalah sebagai berikut.
- Membuat permintaan ke API
- Menerima respons error yang memiliki kode error yang dapat dicoba lagi
- Tunggu 1 detik +
random_number_milliseconds
detik - Coba lagi permintaan
- Menerima respons error yang memiliki kode error yang dapat dicoba lagi
- Tunggu 2 dtk +
random_number_milliseconds
detik - Coba lagi permintaan
- Menerima respons error yang memiliki kode error yang dapat dicoba lagi
- Tunggu 4 detik +
random_number_milliseconds
detik - Coba lagi permintaan
- Menerima respons error yang memiliki kode error yang dapat dicoba lagi
- Menunggu 8 dtk +
random_number_milliseconds
detik - Coba lagi permintaan
- Menerima respons error yang memiliki kode error yang dapat dicoba lagi
- Tunggu 16 detik +
random_number_milliseconds
detik - Coba lagi permintaan
- Jika Anda masih mengalami error, hentikan dan catat error tersebut ke dalam log.
Pada 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 ditetapkan ulang setelah setiap periode tunggu.
Catatan: waktu tunggu selalu
(2 ^ n) + random_number_milliseconds
, dengan
n adalah bilangan bulat yang meningkat secara monoton yang awalnya ditentukan
sebagai 0. n bertambah 1 untuk setiap iterasi (setiap permintaan).
Algoritma disetel untuk dihentikan jika n adalah 5. Batas ini diberlakukan hanya untuk menghentikan klien agar tidak terus mencoba tanpa batas, dan mengakibatkan penundaan total sekitar 32 detik sebelum permintaan dianggap "error yang tidak dapat dipulihkan".
Kode Python berikut adalah implementasi dari alur di atas untuk pemulihan 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."