Bab ini berisi ringkasan model error untuk Google API. Panduan ini juga memberikan panduan umum bagi developer tentang cara membuat dan menangani error dengan benar.
Google API menggunakan model error sederhana yang tidak bergantung pada protokol, yang memungkinkan kami menawarkan pengalaman yang konsisten di berbagai API, protokol API yang berbeda (seperti gRPC atau HTTP), dan konteks error yang berbeda (seperti error asinkron, batch, atau alur kerja).
Model Error
Model error untuk Google API ditentukan secara logis oleh
google.rpc.Status
,
yang instancenya ditampilkan ke klien saat terjadi error API. Cuplikan
kode berikut menunjukkan desain model error secara keseluruhan:
package google.rpc;
// The `Status` type defines a logical error model that is suitable for
// different programming environments, including REST APIs and RPC APIs.
message Status {
// A simple error code that can be easily handled by the client. The
// actual error code is defined by `google.rpc.Code`.
int32 code = 1;
// A developer-facing human-readable error message in English. It should
// both explain the error and offer an actionable resolution to it.
string message = 2;
// Additional error information that the client code can use to handle
// the error, such as retry info or a help link.
repeated google.protobuf.Any details = 3;
}
Karena sebagian besar Google API menggunakan desain API berorientasi resource, penanganan error
mengikuti prinsip desain yang sama, yaitu menggunakan sekumpulan kecil error standar dengan
sejumlah besar resource. Misalnya, daripada menetapkan berbagai jenis error "tidak ditemukan", server menggunakan satu kode error google.rpc.Code.NOT_FOUND
standar dan memberi tahu klien resource spesifik mana yang tidak ditemukan. Ruang error yang lebih kecil mengurangi kompleksitas dokumentasi, memberikan pemetaan idiomatis yang lebih baik dalam library klien, dan mengurangi kompleksitas logika klien sekaligus tidak membatasi penyertaan informasi yang dapat ditindaklanjuti.
Kode Error
Google API harus menggunakan kode error kanonis yang ditentukan oleh
google.rpc.Code
.
Setiap API harus menghindari penetapan kode error tambahan, karena
developer sangat tidak mungkin menulis logika untuk menangani kode error
dalam jumlah besar. Sebagai referensi, menangani rata-rata tiga kode error per panggilan API
berarti sebagian besar logika aplikasi hanya digunakan untuk penanganan error, yang
bukanlah pengalaman developer yang baik.
Pesan Error
Pesan error akan membantu pengguna memahami dan mengatasi error API dengan mudah dan cepat. Secara umum, pertimbangkan panduan berikut saat menulis pesan error:
- Jangan berasumsi bahwa pengguna adalah pengguna ahli API Anda. Pengguna dapat berupa developer klien, staf operasional, staf IT, atau pengguna akhir aplikasi.
- Jangan berasumsi bahwa pengguna mengetahui apa pun tentang implementasi layanan Anda atau telah memahami konteks error (seperti analisis log).
- Jika memungkinkan, pesan error harus dibuat sedemikian rupa sehingga pengguna teknis (tetapi tidak selalu developer API Anda) dapat merespons error dan memperbaikinya.
- Jaga agar pesan error tetap singkat. Jika diperlukan, berikan link agar pembaca yang bingung dapat mengajukan pertanyaan, memberikan masukan, atau memperoleh informasi lebih lanjut yang tidak cukup dalam pesan error. Jika tidak, gunakan kolom detail untuk memperluas.
Detail Error
Google API menentukan kumpulan payload error standar untuk detail error, yang dapat Anda temukan di google/rpc/error_details.proto. Hal ini mencakup kebutuhan paling umum untuk error API, seperti kegagalan kuota dan parameter tidak valid. Seperti kode error, developer harus menggunakan payload standar ini jika memungkinkan.
Jenis detail error tambahan hanya boleh diperkenalkan jika dapat membantu kode aplikasi menangani error. Jika informasi error hanya dapat ditangani oleh manusia, andalkan konten pesan error dan biarkan developer menanganinya secara manual, bukan memperkenalkan jenis detail error tambahan.
Berikut beberapa contoh payload error_details
:
ErrorInfo
: Memberikan informasi error terstruktur yang stabil dan dapat diperluas.RetryInfo
: Menjelaskan kapan klien dapat mencoba lagi permintaan yang gagal, dapat ditampilkan padaCode.UNAVAILABLE
atauCode.ABORTED
QuotaFailure
: Menjelaskan cara gagalnya pemeriksaan kuota, dapat ditampilkan padaCode.RESOURCE_EXHAUSTED
BadRequest
: Menjelaskan pelanggaran dalam permintaan klien, dapat ditampilkan padaCode.INVALID_ARGUMENT
Info Error
ErrorInfo
adalah jenis payload error khusus. Class ini memberikan informasi error yang stabil dan
dapat diperluas yang dapat diandalkan oleh manusia dan aplikasi.
Setiap ErrorInfo
memiliki tiga informasi: domain error, alasan
error, dan kumpulan metadata error, seperti
contoh ini.
Untuk informasi selengkapnya, lihat
definisi
ErrorInfo
.
Untuk Google API, domain error utama adalah googleapis.com
, dan
alasan error yang sesuai ditentukan oleh enum google.api.ErrorReason
.
Untuk informasi selengkapnya, lihat
definisi
google.api.ErrorReason
.
Pelokalan Error
Kolom message
di
google.rpc.Status
untuk developer dan harus dalam bahasa Inggris.
Jika pesan error yang ditampilkan kepada pengguna diperlukan, gunakan
google.rpc.LocalizedMessage
sebagai kolom detail Anda. Meskipun kolom pesan di
google.rpc.LocalizedMessage
dapat dilokalkan, pastikan kolom pesan di
google.rpc.Status
dalam bahasa Inggris.
Secara default, layanan API harus menggunakan lokalitas pengguna yang diautentikasi atau header
Accept-Language
HTTP atau parameter language_code
dalam permintaan untuk
menentukan bahasa pelokalan.
Pemetaan Error
Google API dapat diakses di berbagai lingkungan pemrograman. Setiap lingkungan biasanya memiliki cara penanganan error-nya sendiri. Bagian berikut menjelaskan cara pemetaan model error di lingkungan yang biasa digunakan.
Pemetaan HTTP
Meskipun pesan proto3 memiliki encoding JSON native, Platform API Google menggunakan skema error yang berbeda untuk JSON HTTP API Google demi alasan kompatibilitas mundur.
Skema:
// This message defines the error schema for Google's JSON HTTP APIs.
message Error {
// Deprecated. This message is only used by error format v1.
message ErrorProto {}
// This message has the same semantics as `google.rpc.Status`. It uses HTTP
// status code instead of gRPC status code. It has extra fields `status` and
// `errors` for backward compatibility with [Google API Client
// Libraries](https://developers.google.com/api-client-library).
message Status {
// The HTTP status code that corresponds to `google.rpc.Status.code`.
int32 code = 1;
// This corresponds to `google.rpc.Status.message`.
string message = 2;
// Deprecated. This field is only used by error format v1.
repeated ErrorProto errors = 3;
// This is the enum version for `google.rpc.Status.code`.
google.rpc.Code status = 4;
// This corresponds to `google.rpc.Status.details`.
repeated google.protobuf.Any details = 5;
}
// The actual error payload. The nested message structure is for backward
// compatibility with [Google API Client
// Libraries](https://developers.google.com/api-client-library). It also
// makes the error more readable to developers.
Status error = 1;
}
Contoh (link):
{
"error": {
"code": 400,
"message": "API key not valid. Please pass a valid API key.",
"status": "INVALID_ARGUMENT",
"details": [
{
"@type": "type.googleapis.com/google.rpc.ErrorInfo",
"reason": "API_KEY_INVALID",
"domain": "googleapis.com",
"metadata": {
"service": "translate.googleapis.com"
}
}
]
}
}
Pemetaan gRPC
Protokol RPC yang berbeda memetakan model error secara berbeda. Untuk
gRPC, model error didukung secara native oleh kode
yang dihasilkan dan library runtime dalam setiap bahasa yang didukung. Anda dapat mengetahui selengkapnya
di dokumentasi API gRPC. Misalnya, lihat
io.grpc.Status
gRPC Java.
Pemetaan Library Klien
Library klien Google dapat memilih untuk menampilkan error secara berbeda per bahasa agar
konsisten dengan idiom yang ditetapkan. Misalnya, library google-cloud-go akan menampilkan error yang mengimplementasikan antarmuka yang sama dengan google.rpc.Status
, sedangkan google-cloud-java akan memunculkan Pengecualian.
Menangani Error
Berikut adalah tabel yang berisi semua kode error gRPC yang ditentukan dalam
google.rpc.Code
dan deskripsi singkat penyebabnya. Untuk menangani error, Anda dapat memeriksa
deskripsi untuk kode status yang ditampilkan dan mengubah panggilan sebagaimana mestinya.
HTTP | gRPC | Deskripsi |
---|---|---|
200 | OK |
Tidak ada error. |
400 | INVALID_ARGUMENT |
Klien menentukan argumen yang tidak valid. Periksa pesan error dan detail error untuk mengetahui informasi selengkapnya. |
400 | FAILED_PRECONDITION |
Permintaan tidak dapat dieksekusi dalam status sistem saat ini, seperti menghapus direktori yang tidak kosong. |
400 | OUT_OF_RANGE |
Klien menentukan rentang yang tidak valid. |
401 | UNAUTHENTICATED |
Permintaan tidak diautentikasi karena token OAuth tidak ada, tidak valid, atau sudah tidak berlaku. |
403 | PERMISSION_DENIED |
Klien tidak memiliki izin yang memadai. Hal ini dapat terjadi karena token OAuth tidak memiliki cakupan yang tepat, klien tidak memiliki izin, atau API belum diaktifkan. |
404 | NOT_FOUND |
Resource yang ditentukan tidak ditemukan. |
409 | ABORTED |
Konflik serentak, seperti konflik baca-ubah-tulis. |
409 | ALREADY_EXISTS |
Resource yang klien coba buat sudah ada. |
429 | RESOURCE_EXHAUSTED |
Kuota resource telah habis atau mencapai pembatasan kapasitas. Klien akan mencari detail error google.rpc.QuotaFailure untuk informasi selengkapnya. |
499 | CANCELLED |
Permintaan dibatalkan oleh klien. |
500 | DATA_LOSS |
Kehilangan data atau kerusakan data yang tidak dapat dipulihkan. Klien harus melaporkan error tersebut kepada pengguna. |
500 | UNKNOWN |
Terjadi error yang tidak diketahui pada server. Biasanya berupa bug server. |
500 | INTERNAL |
Error server internal. Biasanya berupa bug server. |
501 | NOT_IMPLEMENTED |
Metode API tidak diimplementasikan oleh server. |
502 | T/A | Terjadi error jaringan sebelum menjangkau server. Biasanya terjadi pemadaman atau kesalahan konfigurasi jaringan. |
503 | UNAVAILABLE |
Layanan tidak tersedia. Biasanya server sedang tidak aktif. |
504 | DEADLINE_EXCEEDED |
Batas waktu permintaan terlampaui. Hal ini hanya akan terjadi jika pemanggil menetapkan batas waktu yang lebih pendek daripada batas waktu default metode (yaitu, batas waktu yang diminta tidak cukup bagi server untuk memproses permintaan) dan permintaan tidak selesai dalam batas waktu tersebut. |
Error Percobaan Ulang
Klien dapat mencoba kembali pada error 503 UNAVAILABLE dengan backoff eksponensial. Penundaan minimum harus 1 detik kecuali jika didokumentasikan sebaliknya. Pengulangan pengulangan default harus satu kali kecuali jika didokumentasikan sebaliknya.
Untuk error 429 RESOURCE_EXHAUSTED, klien dapat mencoba lagi pada level yang lebih tinggi dengan penundaan minimum 30 detik. Percobaan ulang tersebut hanya berguna untuk tugas latar belakang yang berjalan lama.
Untuk semua error lainnya, percobaan ulang mungkin tidak berlaku. Pertama-tama, pastikan permintaan Anda
idempoten, dan lihat
google.rpc.RetryInfo
untuk panduan.
Penyebaran Error
Jika layanan API Anda bergantung pada layanan lain, sebaiknya jangan begitu saja menyebarkan error dari layanan tersebut kepada klien Anda. Saat menerjemahkan error, sebaiknya hal berikut:
- Sembunyikan detail penerapan dan informasi rahasia.
- Sesuaikan pihak yang bertanggung jawab atas error tersebut. Misalnya, server yang
menerima error
INVALID_ARGUMENT
dari layanan lain harus menyebarkanINTERNAL
ke pemanggilnya sendiri.
Mereproduksi Error
Jika tidak dapat mengatasi error melalui analisis log dan pemantauan, Anda harus mencoba mereproduksi error dengan pengujian yang sederhana dan dapat diulang. Anda dapat menggunakan pengujian ini untuk mengumpulkan lebih banyak informasi terkait pemecahan masalah, yang dapat Anda berikan saat menghubungi dukungan teknis.
Sebaiknya gunakan curl -v
dan
Parameter Sistem untuk mereproduksi error dengan
Google API. Keduanya dapat mereproduksi hampir semua permintaan Google API,
dan memberi Anda informasi debug panjang. Untuk informasi selengkapnya, lihat
halaman dokumentasi masing-masing untuk API yang Anda panggil.
Menghasilkan Error
Jika Anda adalah developer server, Anda harus membuat error dengan informasi yang memadai untuk membantu developer klien memahami dan menyelesaikan masalah. Pada saat yang sama, Anda harus menyadari keamanan dan privasi data pengguna, dan menghindari pengungkapan informasi sensitif dalam pesan error dan detail error, karena error sering kali dicatat ke dalam log dan dapat diakses oleh orang lain. Misalnya, pesan error seperti "Client IP address is not on whitelist 128.0.0.0/8" akan menampilkan informasi tentang kebijakan sisi server, yang mungkin tidak dapat diakses oleh pengguna yang memiliki akses ke log.
Untuk membuat error yang tepat, Anda harus memahami google.rpc.Code
terlebih dahulu agar
memilih kode error yang paling sesuai untuk setiap kondisi error. Aplikasi
server dapat memeriksa beberapa kondisi error secara paralel, dan menampilkan
kondisi pertama.
Tabel berikut mencantumkan setiap kode error dan contoh pesan error yang baik.
HTTP | gRPC | Contoh Pesan Error |
---|---|---|
400 | INVALID_ARGUMENT |
Kolom permintaan x.y.z adalah xxx, diharapkan salah satu dari [yyy, zzz]. |
400 | FAILED_PRECONDITION |
Resource xxx merupakan direktori yang tidak kosong, sehingga tidak dapat dihapus. |
400 | OUT_OF_RANGE |
Parameter 'age' di luar rentang [0, 125]. |
401 | UNAUTHENTICATED |
Kredensial autentikasi tidak valid. |
403 | PERMISSION_DENIED |
Izin 'xxx' ditolak untuk resource 'yyy'. |
404 | NOT_FOUND |
Resource 'xxx' tidak ditemukan. |
409 | ABORTED |
Tidak dapat memperoleh kunci pada resource 'xxx'. |
409 | ALREADY_EXISTS |
Resource 'xxx' sudah ada. |
429 | RESOURCE_EXHAUSTED |
Batas kuota 'xxx' terlampaui. |
499 | CANCELLED |
Permintaan dibatalkan oleh klien. |
500 | DATA_LOSS |
Lihat catatan. |
500 | UNKNOWN |
Lihat catatan. |
500 | INTERNAL |
Lihat catatan. |
501 | NOT_IMPLEMENTED |
Metode 'xxx' tidak diterapkan. |
503 | UNAVAILABLE |
Lihat catatan. |
504 | DEADLINE_EXCEEDED |
Lihat catatan. |
Payload Error
Paket google.rpc
menentukan kumpulan payload error standar, yang lebih disukai untuk payload error kustom. Tabel berikut mencantumkan setiap kode error
dan payload error standar yang cocok, jika ada. Sebaiknya aplikasi tingkat lanjut mencari payload error ini di google.rpc.Status
saat menangani error.
HTTP | gRPC | Detail Error yang Direkomendasikan |
---|---|---|
400 | INVALID_ARGUMENT |
google.rpc.BadRequest |
400 | FAILED_PRECONDITION |
google.rpc.PreconditionFailure |
400 | OUT_OF_RANGE |
google.rpc.BadRequest |
401 | UNAUTHENTICATED |
google.rpc.ErrorInfo |
403 | PERMISSION_DENIED |
google.rpc.ErrorInfo |
404 | NOT_FOUND |
google.rpc.ResourceInfo |
409 | ABORTED |
google.rpc.ErrorInfo |
409 | ALREADY_EXISTS |
google.rpc.ResourceInfo |
429 | RESOURCE_EXHAUSTED |
google.rpc.QuotaFailure |
499 | CANCELLED |
|
500 | DATA_LOSS |
google.rpc.DebugInfo |
500 | UNKNOWN |
google.rpc.DebugInfo |
500 | INTERNAL |
google.rpc.DebugInfo |
501 | NOT_IMPLEMENTED |
|
503 | UNAVAILABLE |
google.rpc.DebugInfo |
504 | DEADLINE_EXCEEDED |
google.rpc.DebugInfo |