Bab ini memberikan ringkasan model error untuk API Google Distributed Cloud dengan air gap (GDC). Artikel ini juga memberikan panduan umum kepada developer tentang cara membuat dan menangani error dengan benar.
GDC API menggunakan model error sederhana yang agnostik terhadap protokol, sehingga kami dapat menawarkan pengalaman yang konsisten di berbagai API, berbagai protokol API (seperti gRPC atau HTTP), dan berbagai konteks error (seperti error asinkron, batch, atau alur kerja).
Model error
Model error untuk GDC API secara logis ditentukan oleh
google.rpc.Status
,
yang instance-nya ditampilkan ke klien saat terjadi error API. Cuplikan kode berikut menunjukkan desain keseluruhan model error:
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 dengan menggunakan serangkaian kecil error standar dengan sejumlah besar resource. Misalnya, alih-alih menentukan 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 di library klien, dan mengurangi kompleksitas logika klien tanpa membatasi penyertaan informasi yang dapat ditindaklanjuti.
Kode error
GDC API harus menggunakan kode error kanonis yang ditentukan oleh
google.rpc.Code
.
API individual harus menghindari penentuan kode error tambahan, karena
developer sangat tidak mungkin menulis logika untuk menangani sejumlah besar kode
error. Sebagai referensi, penanganan rata-rata tiga kode error per panggilan API akan berarti sebagian besar logika aplikasi hanya untuk penanganan error, yang tidak akan memberikan pengalaman developer yang baik.
Pesan error
Pesan error harus membantu pengguna memahami dan mengatasi error API dengan mudah dan cepat. Secara umum, pertimbangkan panduan berikut saat menulis pesan error:
- Jangan menganggap pengguna adalah pakar API Anda. Pengguna dapat berupa developer klien, staf operasi, staf IT, atau pengguna akhir aplikasi.
- Jangan menganggap pengguna mengetahui apa pun tentang penerapan layanan Anda atau memahami konteks error (seperti analisis log).
- Jika memungkinkan, pesan error harus dibuat sedemikian rupa sehingga pengguna teknis (tetapi tidak harus developer API Anda) dapat merespons error dan memperbaikinya.
- Buat pesan error yang singkat. Jika perlu, berikan link tempat pembaca yang bingung dapat mengajukan pertanyaan, memberikan masukan, atau mendapatkan informasi lebih lanjut yang tidak sesuai dengan pesan error. Jika tidak, gunakan kolom detail untuk meluaskan.
Error details
GDC API menentukan serangkaian payload error standar untuk detail error, yang dapat Anda temukan di google/rpc/error_details.proto. Error 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, daripada memperkenalkan jenis detail error tambahan.
Berikut beberapa contoh payload error_details
:
ErrorInfo
: Menyediakan 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 kegagalan pemeriksaan kuota, dapat ditampilkan diCode.RESOURCE_EXHAUSTED
BadRequest
: Menjelaskan pelanggaran dalam permintaan klien, dapat ditampilkan diCode.INVALID_ARGUMENT
Info error
ErrorInfo
adalah jenis payload error khusus. API ini memberikan informasi error yang stabil dan
dapat diperluas yang dapat diandalkan oleh manusia dan aplikasi.
Setiap ErrorInfo
memiliki tiga bagian informasi: domain error, alasan
error, dan serangkaian metadata error. Untuk mengetahui informasi selengkapnya, lihat definisi
ErrorInfo
.
Untuk GDC API, domain error utama adalah googleapis.com
, dan
alasan error yang sesuai ditentukan oleh enum google.api.ErrorReason
.
Untuk mengetahui informasi selengkapnya, lihat definisi
google.api.ErrorReason
.
Lokalitas error
Kolom message
di
google.rpc.Status
ditampilkan kepada 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
berbahasa Inggris.
Secara default, layanan API harus menggunakan lokalitas pengguna yang diautentikasi atau header HTTP
Accept-Language
atau parameter language_code
dalam permintaan untuk
menentukan bahasa untuk pelokalan.
Pemetaan error
GDC API dapat diakses di lingkungan pemrograman yang berbeda. Setiap lingkungan biasanya memiliki cara penanganan error sendiri. Bagian berikut menjelaskan cara memetakan model error di lingkungan yang umum digunakan.
Pemetaan HTTP
Meskipun pesan proto3 memiliki encoding JSON native, platform GDC API menggunakan skema error yang berbeda untuk GDC JSON HTTP API karena alasan kompatibilitas mundur.
Skema:
// This message defines the error schema for GDC 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 [GDC 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 [GDC API Client
// Libraries](https://developers.google.com/api-client-library). It also
// makes the error more readable to developers.
Status error = 1;
}
Contoh:
{
"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 mempelajari lebih lanjut
di dokumentasi API gRPC. Misalnya, lihat
io.grpc.Status
gRPC Java.
Pemetaan library klien
Library klien GDC dapat memilih untuk menampilkan error secara berbeda per bahasa agar konsisten dengan idiom yang sudah ditetapkan. Misalnya, library
google-cloud-go
akan menampilkan error yang mengimplementasikan antarmuka yang sama dengan
google.rpc.Status
,
sementara
google-cloud-java
akan memunculkan Pengecualian.
Menangani error
Tabel berikut berisi semua kode error gRPC yang ditentukan dalam
google.rpc.Code
dan deskripsi singkat tentang penyebabnya. Untuk menangani error, Anda dapat memeriksa
deskripsi kode status yang ditampilkan dan mengubah panggilan Anda dengan tepat.
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 dijalankan 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 harus mencari detail error google.rpc.QuotaFailure untuk mengetahui informasi selengkapnya. |
499 | CANCELLED |
Permintaan dibatalkan oleh klien. |
500 | DATA_LOSS |
Kehilangan data atau kerusakan data yang tidak dapat dipulihkan. Klien harus melaporkan error kepada pengguna. |
500 | UNKNOWN |
Terjadi error yang tidak diketahui pada server. Biasanya merupakan bug server. |
500 | INTERNAL |
Error server internal. Biasanya merupakan bug server. |
501 | NOT_IMPLEMENTED |
Metode API tidak diimplementasikan oleh server. |
502 | T/A | Terjadi error jaringan sebelum menjangkau server. Biasanya karena gangguan atau kesalahan konfigurasi jaringan. |
503 | UNAVAILABLE |
Layanan tidak tersedia. Biasanya server tidak berfungsi. |
504 | DEADLINE_EXCEEDED |
Batas waktu permintaan terlampaui. Hal ini hanya akan terjadi jika pemanggil menetapkan batas waktu yang lebih singkat daripada batas waktu default metode (yaitu, batas waktu yang diminta tidak cukup bagi server untuk memproses permintaan) dan permintaan tidak selesai dalam batas waktu. |
Mencoba lagi error
Klien dapat mencoba lagi error 503 UNAVAILABLE dengan backoff eksponensial. Penundaan minimum harus 1 detik, kecuali jika didokumentasikan sebaliknya. Pengulangan coba ulang default harus dilakukan sekali, kecuali jika didokumentasikan sebaliknya.
Untuk error 429 RESOURCE_EXHAUSTED, klien dapat mencoba lagi pada tingkat yang lebih tinggi dengan penundaan minimal 30 detik. Upaya percobaan ulang tersebut hanya berguna untuk tugas latar belakang yang berjalan lama.
Untuk semua error lainnya, percobaan ulang mungkin tidak berlaku. Pertama, pastikan permintaan Anda
bersifat idempoten, dan lihat
google.rpc.RetryInfo
untuk mendapatkan panduan.
Menyebarkan error
Jika layanan API Anda bergantung pada layanan lain, Anda tidak boleh menyebarkan kesalahan dari layanan tersebut ke klien Anda secara membabi buta. Saat menerjemahkan error, sebaiknya lakukan hal berikut:
- Sembunyikan detail penerapan dan informasi rahasia.
- Sesuaikan pihak yang bertanggung jawab atas kesalahan tersebut. Misalnya, server yang menerima error
INVALID_ARGUMENT
dari layanan lain harus menyebarkanINTERNAL
ke pemanggilnya sendiri.
Mengulangi error
Jika Anda tidak dapat menyelesaikan error melalui analisis log dan pemantauan, Anda harus mencoba mereproduksi error dengan pengujian yang sederhana dan dapat diulang. Anda dapat menggunakan pengujian untuk mengumpulkan informasi selengkapnya untuk pemecahan masalah, yang dapat Anda berikan saat menghubungi dukungan teknis.
Sebaiknya gunakan
oauth2l
dan
curl -v
serta
Parameter Sistem untuk mereproduksi error dengan
GDC API. Bersama-sama, keduanya dapat mereproduksi hampir semua permintaan GDC API,
dan memberikan informasi debug yang lengkap kepada Anda. Untuk mengetahui informasi selengkapnya, lihat halaman dokumentasi masing-masing API yang Anda panggil.
Membuat kesalahan
Jika Anda adalah developer server, Anda harus menghasilkan error dengan informasi yang cukup untuk membantu developer klien memahami dan menyelesaikan masalah. Pada saat yang sama, Anda harus memahami keamanan dan privasi data pengguna, serta menghindari pengungkapan informasi sensitif dalam pesan error dan detail error, karena error sering dicatat dan mungkin dapat diakses oleh orang lain. Misalnya, pesan error seperti "Alamat IP klien tidak ada dalam daftar yang diizinkan 128.0.0.0/8" mengekspos 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 untuk memilih kode error yang paling sesuai untuk setiap kondisi error. Aplikasi server dapat memeriksa beberapa kondisi error secara paralel, dan menampilkan yang 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, yang diharapkan adalah salah satu dari [yyy, zzz]. |
400 | FAILED_PRECONDITION |
Resource xxx adalah 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 pada 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 serangkaian payload error standar, yang lebih disukai daripada payload error kustom. Tabel berikut mencantumkan setiap kode error
dan payload error standarnya yang cocok, jika ada. Sebaiknya aplikasi lanjutan 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 |