Respons Error

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 berisi 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

Code Status Deskripsi Tindakan yang Disarankan
400 INVALID_ARGUMENT Permintaan tidak valid; argumen yang dibutuhkan mungkin tidak ada, melebihi batas, atau memiliki nilai yang tidak valid. Tinjau pesan error untuk mengetahui detailnya. Error ini akan gagal lagi jika klien mencobanya lagi.
401 UNAUTHENTICATED Klien tidak diotentikasi dengan benar. Jangan mencoba lagi tanpa memperbaiki masalah. Anda perlu mendapatkan token autentikasi baru.
403 PERMISSION_DENIED Menunjukkan permintaan data yang tidak dapat diakses pengguna. Jangan mencoba lagi tanpa memperbaiki masalah. Anda perlu mendapatkan izin yang memadai untuk melakukan operasi pada entitas yang ditentukan.
429 RESOURCE_EXHAUSTED AnalyticsDefaultGroupCLIENT_PROJECT-1d Menunjukkan bahwa kuota permintaan per hari per project telah habis. Jangan mencoba lagi tanpa memperbaiki masalah. Kuota harian Anda telah habis.
429 RESOURCE_EXHAUSTEDAnalyticsDefaultGroupCLIENT_PROJECT-100 Menunjukkan bahwa kuota permintaan per 100 detik per project telah habis. Coba lagi menggunakan back-off eksponensial. Anda perlu memperlambat kecepatan pengiriman permintaan.
429 RESOURCE_EXHAUSTEDAnalyticsDefaultGroupUSER-100 Menunjukkan bahwa kuota permintaan per 100 detik per pengguna per project telah habis. Coba lagi menggunakan back-off eksponensial. Anda perlu memperlambat kecepatan pengiriman permintaan.
429 RESOURCE_EXHAUSTED DiscoveryGroupCLIENT_PROJECT-100 Menunjukkan bahwa kuota permintaan per 100 detik penemuan telah habis. Respons penemuan tidak sering berubah. Buat cache respons penemuan secara lokal atau coba lagi menggunakan back-off eksponensial. Anda perlu 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 adalah kondisi sementara dan dapat dikoreksi dengan mencoba lagi menggunakan back-off eksponensial.

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. Reporting API dirancang dengan ekspektasi bahwa klien yang memilih untuk mencoba kembali permintaan yang gagal akan 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.

  1. Membuat permintaan ke API
  2. Menerima respons error yang memiliki kode error yang dapat dicoba lagi
  3. Tunggu 1 detik + random_number_milliseconds detik
  4. Coba lagi permintaan
  5. Menerima respons error yang memiliki kode error yang dapat dicoba lagi
  6. Tunggu 2 dtk + random_number_milliseconds detik
  7. Coba lagi permintaan
  8. Menerima respons error yang memiliki kode error yang dapat dicoba lagi
  9. Tunggu 4 detik + random_number_milliseconds detik
  10. Coba lagi permintaan
  11. Menerima respons error yang memiliki kode error yang dapat dicoba lagi
  12. Menunggu 8 dtk + random_number_milliseconds detik
  13. Coba lagi permintaan
  14. Menerima respons error yang memiliki kode error yang dapat dicoba lagi
  15. Tunggu 16 detik + random_number_milliseconds detik
  16. Coba lagi permintaan
  17. 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."