Untuk mendiagnosis error API, memperbaiki penolakan penyerapan metrik, dan menyelesaikan hasil kueri yang tidak ada saat menggunakan Monitoring API, Anda dapat menggunakan teknik pemecahan masalah dan penyelesaian error dalam panduan ini.
Monitoring API adalah bagian dari Cloud API. Untuk mengetahui daftar kode error bersama dan rekomendasi penanganan umum, lihat Menangani error.
Menggunakan API Explorer untuk proses debug
API Explorer adalah widget yang dibuat di halaman referensi untuk metode API. Dengan alat ini, Anda dapat memanggil metode dengan mengisi kolom; Anda tidak perlu menulis kode.
Jika Anda mengalami masalah saat memanggil metode, gunakan widget APIs Explorer (Coba API ini) di halaman referensi untuk metode tersebut guna men-debug masalah Anda. Untuk mengetahui informasi selengkapnya, lihat APIs Explorer.
Error API dan autentikasi umum
Bagian ini mencantumkan kode error yang dapat ditampilkan oleh berbagai metode Monitoring API.
401 UNAUTHENTICATED
Kode error 401 UNAUTHENTICATED menunjukkan kredensial OAuth2 atau IAM tidak ada, sudah tidak berlaku, atau tidak valid.
Dua pesan error umum untuk kode error ini adalah
Request is missing required authentication credential dan
User is not authorized to access the project (or metric).
- Penyebab: Header
Authorization: Bearer <token>tidak ada, token OAuth2 atau OIDC sudah tidak berlaku, atau kredensial akun layanan tidak valid. - Penyelesaian: Perbarui token autentikasi menggunakan
Kredensial Default Aplikasi (ADC) atau
gcloud auth print-access-token. Selain itu, pastikan kunci akun layanan valid.
403 PERMISSION_DENIED untuk akses project dan penagihan
Kode error 403 PERMISSION_DENIED menunjukkan bahwa Anda tidak memiliki
izin yang diperlukan untuk melakukan tindakan yang diminta.
Ada beberapa pesan error berbeda yang dapat dipasangkan dengan kode error ini. Dua pesan error umum adalah
Billing check failed for project [PROJECT_ID] dan
Billing account disabled:
- Penyebab: Penagihan Cloud dinonaktifkan atau ditangguhkan padaGoogle Cloud proyek. Penyerapan metrik kustom memerlukan akun penagihan yang aktif.
- Penyelesaian: Tautkan akun Penagihan Cloud yang aktif ke project di konsol Google Cloud .
Jika Anda menerima kode error ini saat menulis data metrik, lihat juga
403 PERMISSION_DENIED saat menulis data metrik.
404 NOT_FOUND
Kode error 404 NOT_FOUND menunjukkan bahwa ID project target tidak ada, atau bahwa wilayah atau lokasi tidak dikenali.
Berikut adalah daftar pesan error umum untuk kode error ini:
Project [PROJECT_ID] not found- Penyebab: Project yang ditentukan dalam URI permintaan tidak ada atau telah dihapus.
- Penyelesaian: Periksa ejaan project ID dan pastikan project aktif di konsol Google Cloud .
Unavailable region or locationatauUnrecognized region or location- Penyebab: Lokasi resource yang dimonitor atau label region tidak valid atau tidak dikenali.
- Penyelesaian: Gunakan nama region dan zona Google Cloud yang valid, seperti
us-central1atauus-central1-a.
The requested URL was not found on this server- Penyebab: Jalur resource di URL salah.
- Penyelesaian: Bandingkan URL dengan URL untuk metode yang ditampilkan di halaman referensi metode. Error ini mungkin berarti ada kesalahan ejaan, seperti "project" dan bukan "projects", atau kesalahan kapitalisasi, seperti "TimeSeries" dan bukan "timeSeries".
500 INTERNAL, 503 UNAVAILABLE, 504 DEADLINE_EXCEEDED
Ada dua pesan error umum untuk kode error ini:
Internal error encountered. Please retry after a few seconds dan
The service is currently unavailable.
- Penyebab: Error infrastruktur backend sementara, masalah jaringan, atau penyeimbangan ulang partisi database internal.
- Resolusi: Terapkan backoff eksponensial terpotong dengan jitter pada percobaan ulang, mulai dari 1 detik hingga 32 detik. Tetapkan tenggat waktu klien RPC ke 15 detik atau lebih. Untuk mengetahui informasi selengkapnya, lihat Mencoba lagi error API.
Hasil tidak ada
Jika panggilan API menampilkan kode status 200 dan respons kosong, pertimbangkan
hal berikut:
- Jika panggilan menggunakan filter, filter mungkin tidak cocok dengan apa pun. Kecocokan filter peka huruf besar/kecil. Untuk mengatasi masalah filter, mulailah dengan menentukan hanya satu komponen filter, seperti
metric.type, dan verifikasi bahwa Anda mendapatkan hasil. Tambahkan komponen filter lainnya satu per satu untuk membuat permintaan Anda.
- Saat bekerja dengan metrik kustom, pastikan project yang menentukan metrik telah ditentukan.
Ada beberapa alasan mengapa titik data mungkin tidak ada saat Anda menggunakan metode
timeSeries.list:
Data mungkin sudah tidak berlaku. Untuk mengetahui informasi selengkapnya, lihat Retensi data.
Data mungkin belum disebarkan ke Monitoring. Untuk mengetahui informasi selengkapnya, lihat Latensi data metrik.
Interval tidak valid:
- Pastikan waktu berakhir sudah benar.
- Pastikan waktu mulai sudah benar dan lebih awal dari waktu berakhir. Jika waktu mulai tidak ada atau salah format, API akan menetapkan
waktu mulai ke waktu berakhir. Untuk metrik
GAUGE, interval waktu ini hanya cocok dengan titik yang waktu mulai dan akhirnya sama persis dengan waktu akhir interval. Untuk metrikCUMULATIVEatauDELTA, yang mengukur di seluruh interval waktu, tidak ada titik yang cocok. Untuk mengetahui informasi selengkapnya, lihat Interval waktu.
Error saat membuat kueri data metrik
Bagian ini memberikan informasi tentang error yang dapat terjadi saat Anda
membaca data metrik menggunakan metode seperti
timeSeries.list.
400 INVALID_ARGUMENT saat mengkueri data metrik
Kode error 400 INVALID_ARGUMENT menunjukkan beberapa jenis error validasi
sisi klien. Pesan error yang terkait dengan kode error memberikan informasi yang lebih mendetail dan khusus untuk metode API.
Misalnya, saat membuat kueri data metrik, Anda mungkin mendapatkan pesan berikut:
Field filter had an invalid valueatauField filter had an invalid value of "[FILTER]": [EXPLANATION]- Penyebab: Menunjukkan masalah pada filter pemantauan.
- Penyelesaian: Untuk mengatasi masalah ini, verifikasi ejaan dan pemformatan filter. Untuk mengetahui informasi selengkapnya, lihat bagian Memantau filter.
Request was missing field interval.endTimeatauField interval.endTime had an invalid value- Penyebab: Menunjukkan bahwa permintaan tidak memiliki waktu berakhir atau nilai tidak memiliki format yang benar.
Penyelesaian: Jika Anda menggunakan APIs Explorer, jangan kutip nilai kolom waktu. Berikut adalah format yang valid:
2026-05-11T01:23:45Z 2026-05-11T01:23:45.678Z 2026-05-11T01:23:45.678+05:00 2026-05-11T01:23:45.678-04:30 ```
Error saat menulis data metrik
Bagian ini memberikan informasi tentang error yang dapat terjadi saat Anda
menggunakan metode timeSeries.create untuk menulis
data metrik, termasuk yang berikut:
- Ringkasan kode error.
- Daftar pesan error yang terkait dengan setiap kode error. Entri ini
mencakup penyebab dan informasi tentang penyelesaian.
Error API umum juga berlaku untuk metode
create.
Jika Anda tidak mengaktifkan log audit akses data untuk Monitoring, maka
kegagalan dengan metode timeSeries.create mungkin tidak terlihat. Namun, Anda dapat
melakukan hal berikut:
Gunakan Metrics Explorer untuk mendapatkan informasi tentang rasio error. Gunakan setelan berikut:
- Metrik:
monitoring.googleapis.com/api/request_count - Filter:
method = "google.monitoring.v3.MetricService.CreateTimeSeries" - Agregasi: Kelompokkan menurut
response_code
- Metrik:
Gunakan Logs Explorer untuk mengirim kueri ke log Aktivitas Admin Anda, yang dibuat sistem saat sistem mencoba membuat deskriptor metrik secara otomatis dan tindakan tersebut gagal. Untuk melihat entri log ini, jalankan kueri berikut, setelah mengganti PROJECT_ID dengan ID project Google Cloud Anda:
logName="projects/PROJECT_ID/logs/cloudaudit.googleapis.com%2Factivity" protoPayload.serviceName="monitoring.googleapis.com" protoPayload.methodName="google.monitoring.v3.MetricService.CreateMetricDescriptor" severity>=ERRORGunakan Logs Explorer untuk membuat kueri log sisi klien.
Jika Anda mengaktifkan log audit akses data untuk Cloud Monitoring, sistem akan menulis entri log untuk setiap akses data. Khususnya, entri log ini mencakup detail tentang jumlah titik yang gagal ditulis dan penyebab kegagalan:
Untuk mengetahui informasi tentang cara mengaktifkan log audit akses data, lihat Mengonfigurasi log audit Akses Data.
Untuk melihat entri log ini, gunakan Logs Explorer dan jalankan kueri berikut, setelah mengganti PROJECT_ID dengan ID Google Cloud project Anda:
logName="projects/PROJECT_ID/logs/cloudaudit.googleapis.com%2Fdata_access" protoPayload.serviceName="monitoring.googleapis.com" protoPayload.methodName="google.monitoring.v3.MetricService.CreateTimeSeries" severity>=ERROR
Ringkasan kode error timeSeries.create
| Kode HTTP | Kode Status gRPC | Penyebab Utama |
|---|---|---|
400 |
INVALID_ARGUMENT |
Kegagalan validasi payload—ukuran tumpukan, ukuran atau kunci label, pengurutan stempel waktu, ketidakcocokan skema atau jenis, struktur histogram distribusi. |
400 |
FAILED_PRECONDITION |
Laju pengambilan sampel terlampaui, jenis metrik tidak didukung, atau kedatangan terlambat di luar periode retensi. |
401 |
UNAUTHENTICATED |
Kredensial OAuth2 atau IAM tidak ada, sudah tidak berlaku, atau tidak valid. |
403 |
PERMISSION_DENIED |
Tidak ada roles/monitoring.metricWriter
peran IAM, Penagihan Cloud dinonaktifkan, atau upaya
tidak sah untuk menulis ke domain metrik sistem yang dicadangkan. |
404 |
NOT_FOUND |
Project ID target tidak ada, atau wilayah/lokasi tidak dikenali. |
429 |
RESOURCE_EXHAUSTED |
Batas kardinalitas deret waktu aktif terlampaui pada resource yang dimonitor, batas deskriptor metrik project tercapai, atau batas rasio permintaan API terlampaui. |
500 |
INTERNAL |
Kegagalan layanan skema atau penyimpanan internal. |
503 |
UNAVAILABLE |
Layanan backend tidak tersedia untuk sementara. |
504 |
DEADLINE_EXCEEDED |
Permintaan kehabisan waktu sebelum menulis titik data ke node penyimpanan. |
400 INVALID_ARGUMENT saat menulis data metrik
400 INVALID_ARGUMENT menunjukkan error validasi sisi klien dalam
struktur permintaan, metadata metrik, definisi label, penyelarasan stempel waktu,
atau nilai titik.
Pelanggaran struktur permintaan dan batch
Berikut adalah daftar pesan error yang terkait dengan pelanggaran struktur dan batch:
Request was missing field timeSeries- Penyebab: Array
time_seriesdalam permintaan kosong. - Penyelesaian: Sertakan setidaknya satu objek
TimeSeriesdalam setiap permintaan.
- Penyebab: Array
The maximum number of TimeSeries objects per Create request is 200- Penyebab: Permintaan berisi lebih dari
200 objek
TimeSeries. - Penyelesaian: Batch tulis tidak lebih dari 200 deret waktu per permintaan.
- Penyebab: Permintaan berisi lebih dari
200 objek
Field points had an invalid value: Only one point can be written per TimeSeries per request- Penyebab: Satu objek
TimeSeriesberisi lebih dari satu entri di kolompoints-nya. - Penyelesaian: Berikan tepat satu
Pointper objekTimeSeriesper permintaan. Untuk menulis beberapa titik data dari waktu ke waktu untuk metrik yang sama, kirimkan dalam permintaan terpisah.
- Penyebab: Satu objek
Duplicate TimeSeries encountered. Only one point can be written per TimeSeries per request- Penyebab: Dua atau beberapa objek
TimeSeriesdalam permintaan yang sama memiliki jenis metrik, label metrik, dan label resource yang dimonitor yang identik. - Penyelesaian: Hapus duplikat deret waktu dalam batch sisi klien sehingga setiap deret waktu unik muncul paling banyak satu kali per permintaan.
- Penyebab: Dua atau beberapa objek
user defined metrics are not supported on the metric domain "[DOMAIN]"- Penyebab: Metrik yang ditentukan pengguna tidak didukung di domain yang ditentukan.
- Penyelesaian: Tidak ada.
Label dan batasan penamaan
Berikut adalah daftar pesan error terkait label dan batasan penamaan:
Field metric.labels had an invalid value of "[KEY]": Label value exceeds the maximum string size of 1024 characters- Penyebab: Nilai label metrik atau resource melebihi 1.024 karakter.
- Resolusi: Konfigurasi pengumpul atau aplikasi Anda untuk memangkas nilai label menjadi 1.024 karakter atau kurang. Hindari menyimpan teks bervolume tinggi di label metrik; tulis detail ini ke Cloud Logging.
Field metric.labels had an invalid value of "[KEY]": Label key contains invalid characters- Penyebab: Kunci label berisi karakter di luar pola yang diizinkan. Kunci dapat berisi karakter alfanumerik dan garis bawah, harus terdiri dari 100 karakter atau kurang, dan harus diawali dengan huruf.
- Penyelesaian: Ganti nama kunci label agar hanya menggunakan karakter yang valid.
The metric type must be a URL-formatted string with a domain and non-empty path- Penyebab:
metric.typesalah format atau tidak memiliki awalan domain. - Penyelesaian: Format jenis metrik kustom sebagai
custom.googleapis.com/<category>/<name>atauworkload.googleapis.com/<name>.
- Penyebab:
Field metric.labels had an invalid value: The metric [METRIC_NAME] has more than [LIMIT] labels- Penyebab: Jumlah label pada deskriptor metrik kustom melebihi 30 atau, untuk metrik Prometheus, melebihi 200.
- Penyelesaian: Hapus label yang tidak diperlukan agar tetap berada dalam batas deskriptor.
unrecognized metric label "[LABEL_KEY]"- Penyebab: Deskriptor metrik sudah ada, tetapi permintaan menyediakan kunci label yang tidak ditentukan dalam deskriptor.
- Penyelesaian: Pastikan kunci label cocok dengan
MetricDescriptoryang ada, atau buat deskriptor metrik baru jika modifikasi skema diperlukan.
Ketidakcocokan ID project dan ID resource
Berikut adalah daftar pesan error terkait ketidakcocokan ID project dan resource:
Field resource.labels.project_id had an invalid value of "[VAL]": if present, must be the project number or ID in the request name ([PROJECT])atauField resource.labels.project_id had an invalid value of "[VAL]": if present, must be the resource container ID in the request name [PROJECT]- Penyebab: Label
project_idatauresource_containeryang ditentukan dalamresource.labelstidak cocok dengan project ID atau nomor dalam nama permintaan. - Penyelesaian: Tetapkan label
project_idresource agar cocok dengan project permintaan, atau hapus labelproject_iddariresource.labelssehingga secara default ditetapkan ke project permintaan.
- Penyebab: Label
unrecognized resource type "[RESOURCE_TYPE]"ataumissing resource type- Penyebab:
resource.typetidak dikenali oleh Cloud Monitoring, atau tidak disertakan untuk metrik non-kustom. - Penyelesaian: Gunakan jenis resource yang dimonitor yang valid, seperti
gce_instance,k8s_container,generic_task, atauglobal.
- Penyebab:
Stempel waktu dan interval
Berikut adalah daftar pesan error yang terkait dengan stempel waktu dan interval:
Points must be written in order. One or more of the points specified had an older end time than the most recent point- Penyebab:
end_timetitik data lebih lama atau sama dengan stempel waktu titik data terbaru yang sebelumnya diserap untuk deret waktu tersebut. - Penyelesaian: Masukkan titik secara ketat dalam urutan kronologis.
- Penyebab:
Field points[0].interval.start_time had an invalid value of "[START]": The start time must be equal to the end time ([END]) for the gauge metric '[METRIC]'- Penyebab: Titik metrik
GAUGEdikirimkan denganstart_timetidak sama denganend_time. - Resolusi: Untuk metrik
GAUGE, tetapkanstart_timesama denganend_timeatau hapusstart_time.
- Penyebab: Titik metrik
Field points[0].interval.start_time had an invalid value of "[START]": The start time must be before the end time ([END]) for the non-gauge metric '[METRIC]'- Penyebab: Titik metrik
CUMULATIVEatauDELTAmemiliki nilaistart_timeyang lebih besar dari atau sama dengan nilaiend_time. - Penyelesaian: Pastikan nilai
start_timekurang dari nilaiend_timedan mewakili interval waktu bukan nol.
- Penyebab: Titik metrik
Field points[0].interval.end_time had an invalid value of "[TIME]": Data points cannot be written more than 5m into the future.- Penyebab: Stempel waktu titik lebih dari 5 menit lebih awal dari waktu server saat ini.
- Resolusi: Sinkronkan jam sistem dengan NTP Publik Google
(
time.google.com).
Field points[0].interval.end_time had an invalid value of "[TIME]": Data points cannot be written more than approximately 24 hours in the past- Penyebab: Stempel waktu titik lebih lama dari cakrawala retensi dalam memori, yaitu 24 jam.
- Penyelesaian: Tulis data real-time dalam waktu 24 jam setelah pembuatan.
Jenis dan distribusi nilai
Daftar berikut mencantumkan pesan error terkait jenis dan distribusi nilai:
value type for metric must be [EXPECTED], but is [ACTUAL]ataumetric kind for metric must be [EXPECTED], but is [ACTUAL]- Penyebab: Jenis nilai
masuk—
INT64,DOUBLE,STRING,BOOL,DISTRIBUTION—atau jenis metrik—GAUGE,DELTA,CUMULATIVE—bertentangan denganMetricDescriptoryang ada. - Penyelesaian: Pastikan jenis data cocok dengan deskriptor yang ada. Jenis nilai dan jenis metrik tidak dapat diubah setelah dibuat.
- Penyebab: Jenis nilai
masuk—
Field points[0].value had an invalid value: The metric value exceeds the maximum string size of 1024 characters- Penyebab: Titik metrik jenis nilai
STRINGmelebihi 1024 karakter. - Resolusi: Pangkas nilai metrik string hingga 1.024 karakter atau kurang, atau kirim log ke Cloud Logging.
- Penyebab: Titik metrik jenis nilai
Field points[0].value had an invalid value: Bucket options must be specified for Distribution metric- Penyebab: Titik
DISTRIBUTIONtidak menentukanbucket_options. - Penyelesaian: Tentukan
linear_buckets,exponential_buckets, atauexplicit_bucketsuntuk metrik distribusi.
- Penyebab: Titik
Field points[0].value.distributionValue had an invalid value: Distribution value has |bucket_counts| fields that sum to X which does not equal the |count| field value of Y- Penyebab: Jumlah hitungan di
bucket_countstidak sama dengan kolomcount. - Penyelesaian: Pastikan jumlah semua jumlah bucket sama dengan
sampel
count.
- Penyebab: Jumlah hitungan di
Field points[0].value had an invalid value: Distribution metric has too many buckets- Penyebab: Jumlah bucket histogram melebihi 200.
- Resolusi: Sesuaikan parameter bucket agar jumlah total bucket tetap 200 atau kurang.
400 FAILED_PRECONDITION
Berikut adalah daftar pesan error yang terkait dengan kode error ini:
One or more points were written more frequently than the maximum sampling period configured for the metric- Penyebab: Titik untuk deret waktu yang sama dikirimkan lebih cepat daripada rasio maksimum yang diizinkan, yaitu satu titik setiap 5 detik.
- Resolusi: Batasi kecepatan penyerapan sehingga titik berurutan untuk deret waktu tertentu berjarak setidaknya 5 detik.
ingestion of prometheus delta metrics is not supported in this API- Penyebab: Permintaan mencoba menulis metrik
DELTAPrometheus melaluitimeSeries.create. - Resolusi: Gunakan metrik Prometheus
GAUGEatauCUMULATIVE, atau serap melalui endpoint OTLP Google Cloud Managed Service for Prometheus.
- Penyebab: Permintaan mencoba menulis metrik
One or more points arrived late outside of its aggregation window- Penyebab: Poin tiba setelah periode agregasi untuk metrik yang dikumpulkan dan diagregasi.
- Penyelesaian: Lakukan flush dan streaming titik dengan latensi buffer yang lebih rendah.
403 PERMISSION_DENIED saat menulis data metrik
Saat menulis data metrik, Anda dapat menerima respons 403 PERMISSION_DENIED karena alasan yang terkait dengan akses project dan penagihan, dan karena alasan berikut:
Permission monitoring.timeSeries.create denied on resource (or it may not exist)- Penyebab: Pemanggil tidak memiliki izin
monitoring.timeSeries.createpada project target. - Penyelesaian: Berikan peran
Monitoring Metric Writer(roles/monitoring.metricWriter) ke akun layanan atau akun utama.
- Penyebab: Pemanggil tidak memiliki izin
Billing check failed for project [PROJECT_ID]atauBilling account disabled- Penyebab: Penagihan Cloud dinonaktifkan atau ditangguhkan di Google Cloud project. Penyerapan metrik kustom memerlukan akun penagihan yang aktif.
- Penyelesaian: Tautkan akun Penagihan Cloud yang aktif ke project di konsol Google Cloud .
User does not have permission to write to metric [METRIC]- Penyebab: Pemanggil mencoba menulis metrik kustom langsung ke domain yang dicadangkan sistem, seperti
compute.googleapis.comataustorage.googleapis.com. - Resolusi: Gunakan domain metrik kustom seperti
custom.googleapis.com/atauworkload.googleapis.com/.
- Penyebab: Pemanggil mencoba menulis metrik kustom langsung ke domain yang dicadangkan sistem, seperti
429 RESOURCE_EXHAUSTED
Berikut adalah daftar pesan error yang terkait dengan kode error ini:
Monitored resource ([RESOURCE_ID]) has too many time series (custom metrics)- Penyebab: Batas deret waktu aktif terlampaui (kardinalitas tinggi). Jumlah deret waktu aktif untuk satu resource yang dipantau melampaui batas 200.000 deret aktif dalam jangka waktu 24 jam. Untuk metrik Prometheus, batasnya adalah 1.000.000 deret aktif. Hal ini biasanya terjadi saat ID sementara, seperti ID penampung, UUID pod, ID permintaan, ID pengguna, atau stempel waktu, disertakan dalam label metrik pada resource yang mengalami churn.
- Penyelesaian:
- Hapus label sementara atau kardinalitas tinggi dari metrik Anda.
- Jika Anda harus melacak metrik untuk setiap tugas sementara, gunakan jenis resource yang dimonitor
generic_task, bukan jenis spesifik per resource sepertidataflow_job. Petakan ID sementara ke labeltask_iddari resourcegeneric_task.
Your Metric Ingestion quota has been exhausted- Penyebab: Project melampaui kuota kapasitas penyerapan API.
- Penyelesaian: Tulis deret waktu batch hingga 200 deret per permintaan, atau minta penambahan kuota di halaman Quotas di konsol Google Cloud .
Your Metric Descriptors quota has been exhausted- Penyebab: Project mencapai batas maksimum 10.000 deskriptor metrik kustom per project. Untuk metrik Prometheus, batas ini adalah 25.000 per project.
- Penyelesaian: Hapus deskriptor metrik yang tidak digunakan dengan menggunakan
projects.metricDescriptors.deleteatau kurangi penamaan metrik dinamis.
Rate of metric descriptor creation exceeded- Penyebab: Project mencoba membuat deskriptor metrik baru lebih cepat dari 6.000 per menit per project.
- Penyelesaian: Hindari pembuatan jenis metrik baru secara dinamis selama penyerapan data; buat deskriptor terlebih dahulu jika memungkinkan.
Mencoba lagi error API
Dua kode error Cloud API menunjukkan situasi yang mungkin berguna untuk mencoba ulang permintaan:
503 UNAVAILABLE: percobaan ulang berguna jika masalahnya bersifat singkat atau sementara.429 RESOURCE_EXHAUSTED: percobaan ulang berguna, setelah penundaan, untuk tugas latar belakang yang berjalan lama dengan kuota berbasis waktu seperti n panggilan per t detik. Percobaan ulang tidak berguna jika masalahnya adalah kondisi sementara atau berumur pendek, atau jika Anda telah menghabiskan kuota berbasis volume. Untuk kondisi sementara, pertimbangkan untuk mentoleransi kegagalan. Untuk masalah terkait kuota, pertimbangkan untuk mengurangi penggunaan kuota atau meminta penambahan kuota.
Saat menulis kode yang mungkin mencoba ulang permintaan, pastikan terlebih dahulu bahwa permintaan aman untuk dicoba ulang.
Apakah permintaan aman untuk dicoba lagi?
Jika permintaan Anda bersifat idempoten, maka aman untuk dicoba lagi. Tindakan idempoten adalah tindakan yang setiap perubahan statusnya tidak bergantung pada status saat ini. Contoh:
- Membaca x bersifat idempoten; tidak ada perubahan pada nilai.
- Menetapkan x ke 10 bersifat idempoten; hal ini dapat mengubah status, jika nilai belum 10, tetapi nilai saat ini tidak menjadi masalah. Dan tidak masalah berapa kali Anda mencoba menetapkan nilai.
- Penambahan x tidak bersifat idempoten; nilai baru bergantung pada nilai saat ini.
Coba lagi dengan backoff eksponensial
Saat menerapkan kode untuk mencoba lagi permintaan, Anda tidak ingin mengeluarkan permintaan baru secara cepat tanpa batas. Jika sistem kelebihan beban, pendekatan ini akan memperparah masalah.
Sebagai gantinya, gunakan pendekatan backoff eksponensial yang dipangkas. Jika permintaan gagal karena kelebihan beban sementara, bukan karena tidak tersedia, solusinya adalah mengurangi beban. Backoff eksponensial terpotong mengikuti pola umum ini:
Tentukan berapa lama Anda bersedia menunggu saat mencoba lagi atau berapa kali Anda bersedia mencoba. Jika batas ini terlampaui, anggap layanan tidak tersedia dan tangani kondisi tersebut dengan tepat untuk aplikasi Anda. Hal inilah yang membuat penundaan terpotong; Anda berhenti mencoba lagi pada suatu titik.
Coba lagi permintaan dengan jeda yang semakin lama untuk mengurangi frekuensi percobaan ulang. Coba lagi hingga permintaan berhasil atau batas yang Anda tetapkan tercapai.
Interval biasanya ditingkatkan dengan beberapa fungsi dari pangkat jumlah percobaan ulang, sehingga menjadikannya backoff eksponensial.
Ada banyak cara untuk menerapkan backoff eksponensial. Berikut adalah contoh yang menambahkan penundaan backoff yang meningkat hingga penundaan minimum 1000 md. Penundaan backoff awal adalah 2 md, dan akan meningkat menjadi 2retry_count md dengan setiap percobaan.
Tabel berikut menunjukkan interval percobaan ulang menggunakan nilai awal:
- Penundaan minimum = 1 detik = 1000 ms
- Backoff awal = 2 md
| Jumlah percobaan ulang | Penundaan tambahan (ms) | Coba lagi setelah (mdtk) |
|---|---|---|
| 0 | 20 = 1 | 1001 |
| 1 | 21 = 2 | 1002 |
| 2 | 22 = 4 | 1004 |
| 3 | 23 = 8 | 1008 |
| 4 | 24 = 16 | 1016 |
| ... | ... | ... |
| n | 2n | 1000 + 2n |
Anda dapat memangkas siklus percobaan ulang dengan menghentikan setelah n percobaan atau saat waktu yang dihabiskan melebihi nilai yang wajar untuk aplikasi Anda.
Untuk mengetahui informasi selengkapnya, lihat artikel Wikipedia tentang Backoff eksponensial.