ดัชนี
BadRequest(ข้อความ)BadRequest.FieldViolation(ข้อความ)Code(enum)ErrorInfo(ข้อความ)Help(ข้อความ)Help.Link(ข้อความ)LocalizedMessage(ข้อความ)PreconditionFailure(ข้อความ)PreconditionFailure.Violation(ข้อความ)QuotaFailure(ข้อความ)QuotaFailure.Violation(ข้อความ)RequestInfo(ข้อความ)ResourceInfo(ข้อความ)RetryInfo(ข้อความ)Status(ข้อความ)
BadRequest
อธิบายการละเมิดในคำขอของไคลเอ็นต์ ข้อผิดพลาดประเภทนี้มุ่งเน้นที่ด้านไวยากรณ์ของคำขอ
| ช่อง | |
|---|---|
field_violations[] |
อธิบายการละเมิดทั้งหมดในคำขอของไคลเอ็นต์ |
FieldViolation
ประเภทข้อความที่ใช้เพื่ออธิบายฟิลด์คำขอที่ไม่ถูกต้องรายการเดียว
| ช่อง | |
|---|---|
field |
เส้นทางที่นำไปยังฟิลด์ในเนื้อหาคำขอ ค่าจะเป็นลำดับของตัวระบุที่คั่นด้วยจุดซึ่งระบุฟิลด์ Protocol Buffer ลองพิจารณาสิ่งเหล่านี้ ในตัวอย่างนี้
ใน JSON ค่าเดียวกันจะแสดงเป็น
|
description |
คำอธิบายว่าเหตุใดองค์ประกอบคำขอจึงไม่ถูกต้อง |
reason |
เหตุผลของข้อผิดพลาดระดับฟิลด์ นี่คือค่าคงที่ที่ระบุสาเหตุที่ใกล้ที่สุดของข้อผิดพลาดระดับฟิลด์ โดยควรระบุประเภท FieldViolation ภายในขอบเขตของ google.rpc.ErrorInfo.domain โดยไม่ซ้ำกัน ควรมีอักขระไม่เกิน 63 ตัวและตรงกับนิพจน์ทั่วไปของ |
localized_message |
แสดงข้อความแสดงข้อผิดพลาดที่แปลเป็นภาษาท้องถิ่นสำหรับข้อผิดพลาดระดับฟิลด์ซึ่งส่งคืนให้ผู้ใช้ API ได้อย่างปลอดภัย |
รหัส
รหัสข้อผิดพลาด Canonical สำหรับ gRPC API
บางครั้งอาจมีรหัสข้อผิดพลาดหลายรายการที่เกี่ยวข้อง บริการควรแสดงรหัสข้อผิดพลาดที่เฉพาะเจาะจงที่สุดที่เกี่ยวข้อง เช่น ให้ใช้รหัส OUT_OF_RANGE แทน FAILED_PRECONDITION หากใช้ได้ทั้ง 2 รหัส ในทำนองเดียวกัน ให้เลือก NOT_FOUND หรือ ALREADY_EXISTS แทน FAILED_PRECONDITION
| Enum | |
|---|---|
OK |
ไม่ใช่ข้อผิดพลาด แต่จะแสดงผลเมื่อสำเร็จ การแมป HTTP: 200 OK |
CANCELLED |
การดำเนินการถูกยกเลิก โดยปกติแล้วผู้โทรจะเป็นผู้ยกเลิก การแมป HTTP: 499 คำขอที่ไคลเอ็นต์ปิดการเชื่อมต่อ |
UNKNOWN |
ข้อผิดพลาดที่ไม่รู้จัก เช่น ระบบอาจแสดงข้อผิดพลาดนี้เมื่อค่า การแมป HTTP: 500 ข้อผิดพลาดภายในเซิร์ฟเวอร์ |
INVALID_ARGUMENT |
ไคลเอ็นต์ระบุอาร์กิวเมนต์ไม่ถูกต้อง โปรดทราบว่าสิ่งนี้แตกต่างจาก การแมป HTTP: 400 คำขอไม่ถูกต้อง |
DEADLINE_EXCEEDED |
กำหนดเวลาหมดอายุก่อนที่การดำเนินการจะเสร็จสมบูรณ์ สำหรับการดำเนินการที่เปลี่ยนสถานะของระบบ ระบบอาจแสดงข้อผิดพลาดนี้แม้ว่าการดำเนินการจะเสร็จสมบูรณ์แล้วก็ตาม เช่น การตอบกลับที่สำเร็จจากเซิร์ฟเวอร์อาจล่าช้าจนเลยกำหนดเวลา การแมป HTTP: 504 เกตเวย์หมดเวลา |
NOT_FOUND |
ไม่พบเอนทิตีที่ขอ (เช่น ไฟล์หรือไดเรกทอรี) หมายเหตุสำหรับนักพัฒนาเซิร์ฟเวอร์: หากคำขอถูกปฏิเสธสำหรับผู้ใช้ทั้งกลุ่ม เช่น การเปิดตัวฟีเจอร์แบบค่อยเป็นค่อยไปหรือรายการที่อนุญาตที่ไม่มีในเอกสาร การแมป HTTP: 404 ไม่พบ |
ALREADY_EXISTS |
มีเอนทิตีที่ไคลเอ็นต์พยายามสร้างอยู่แล้ว (เช่น ไฟล์หรือไดเรกทอรี) การแมป HTTP: 409 เกิดความขัดแย้ง |
PERMISSION_DENIED |
ผู้โทรไม่มีสิทธิ์ดำเนินการที่ระบุ การแมป HTTP: 403 Forbidden |
UNAUTHENTICATED |
คำขอไม่มีข้อมูลเข้าสู่ระบบการตรวจสอบสิทธิ์ที่ถูกต้องสำหรับการดำเนินการ การแมป HTTP: 401 ไม่ได้รับอนุญาต |
RESOURCE_EXHAUSTED |
ทรัพยากรบางอย่างหมดแล้ว อาจเป็นโควต้าต่อผู้ใช้ หรืออาจเป็นระบบไฟล์ทั้งหมดที่ไม่มีพื้นที่ การแมป HTTP: 429 มีคำขอมากเกินไป |
FAILED_PRECONDITION |
ระบบปฏิเสธการดำเนินการเนื่องจากระบบไม่อยู่ในสถานะที่จำเป็นสำหรับการดำเนินการ เช่น ไดเรกทอรีที่จะลบไม่ใช่ไดเรกทอรีว่าง มีการดำเนินการ rmdir กับรายการที่ไม่ใช่ไดเรกทอรี เป็นต้น ผู้ใช้บริการสามารถใช้หลักเกณฑ์ต่อไปนี้เพื่อเลือกระหว่าง การแมป HTTP: 400 คำขอไม่ถูกต้อง |
ABORTED |
การดำเนินการถูกยกเลิก โดยปกติแล้วเกิดจากปัญหาการทำงานพร้อมกัน เช่น การตรวจสอบลำดับไม่สำเร็จหรือการยกเลิกธุรกรรม ดูหลักเกณฑ์ด้านบนเพื่อเลือกระหว่าง การแมป HTTP: 409 เกิดความขัดแย้ง |
OUT_OF_RANGE |
การดำเนินการพยายามดำเนินการนอกช่วงที่ถูกต้อง เช่น การค้นหาหรือการอ่านที่เกินจุดสิ้นสุดของไฟล์ ข้อผิดพลาดนี้ต่างจาก
การแมป HTTP: 400 คำขอไม่ถูกต้อง |
UNIMPLEMENTED |
การดำเนินการนี้ยังไม่เสร็จสิ้นหรือไม่รองรับ/เปิดใช้ในบริการนี้ การแมป HTTP: 501 ไม่มีการใช้งาน |
INTERNAL |
ข้อผิดพลาดภายใน ซึ่งหมายความว่าระบบพื้นฐานไม่เป็นไปตามข้อกำหนดบางอย่างที่คาดไว้ รหัสข้อผิดพลาดนี้สงวนไว้สำหรับข้อผิดพลาดร้ายแรง การแมป HTTP: 500 ข้อผิดพลาดภายในเซิร์ฟเวอร์ |
UNAVAILABLE |
ไม่พร้อมให้บริการนี้ในขณะนี้ ซึ่งมักจะเป็นเงื่อนไขชั่วคราวที่แก้ไขได้โดยการลองอีกครั้งด้วยการหยุดชั่วคราว โปรดทราบว่าการลองดำเนินการที่ไม่ใช่แบบ Idempotent อีกครั้งอาจไม่ปลอดภัยเสมอไป ดูหลักเกณฑ์ด้านบนเพื่อเลือกระหว่าง การแมป HTTP: 503 ไม่พร้อมให้บริการ |
DATA_LOSS |
ข้อมูลสูญหายโดยกู้คืนไม่ได้หรือข้อมูลเสียหาย การแมป HTTP: 500 ข้อผิดพลาดภายในเซิร์ฟเวอร์ |
ErrorInfo
อธิบายสาเหตุของข้อผิดพลาดพร้อมรายละเอียดที่มีโครงสร้าง
ตัวอย่างข้อผิดพลาดเมื่อติดต่อ API "pubsub.googleapis.com" เมื่อไม่ได้เปิดใช้
{ "reason": "API_DISABLED"
"domain": "googleapis.com"
"metadata": {
"resource": "projects/123",
"service": "pubsub.googleapis.com"
}
}
การตอบกลับนี้บ่งชี้ว่าไม่ได้เปิดใช้ API pubsub.googleapis.com
ตัวอย่างข้อผิดพลาดที่แสดงเมื่อพยายามสร้างอินสแตนซ์ Spanner ในภูมิภาคที่สินค้าหมด
{ "reason": "STOCKOUT"
"domain": "spanner.googleapis.com",
"metadata": {
"availableRegions": "us-central1,us-east2"
}
}
| ช่อง | |
|---|---|
reason |
สาเหตุของข้อผิดพลาด นี่คือค่าคงที่ที่ระบุสาเหตุที่ใกล้ที่สุดของข้อผิดพลาด เหตุผลของข้อผิดพลาดจะแตกต่างกันภายในโดเมนของข้อผิดพลาดที่เฉพาะเจาะจง ควรมีอักขระไม่เกิน 63 ตัวและตรงกับนิพจน์ทั่วไปของ |
domain |
การจัดกลุ่มเชิงตรรกะที่ "เหตุผล" อยู่ โดยทั่วไป โดเมนข้อผิดพลาดคือชื่อบริการที่ลงทะเบียนของเครื่องมือหรือผลิตภัณฑ์ที่สร้างข้อผิดพลาด เช่น "pubsub.googleapis.com" หากข้อผิดพลาดเกิดจากโครงสร้างพื้นฐานทั่วไปบางอย่าง โดเมนข้อผิดพลาดต้องเป็นค่าที่ไม่ซ้ำกันทั่วโลกซึ่งระบุโครงสร้างพื้นฐาน สำหรับโครงสร้างพื้นฐานของ Google API โดเมนข้อผิดพลาดคือ "googleapis.com" |
metadata |
รายละเอียดเพิ่มเติมที่มีโครงสร้างเกี่ยวกับข้อผิดพลาดนี้ คีย์ต้องตรงกับนิพจน์ทั่วไปของ |
ความช่วยเหลือ
ระบุลิงก์ไปยังเอกสารประกอบหรือสำหรับการดำเนินการนอกแบนด์
ตัวอย่างเช่น หากการตรวจสอบโควต้าล้มเหลวโดยมีข้อผิดพลาดที่ระบุว่าโปรเจ็กต์ที่เรียกใช้ไม่ได้เปิดใช้บริการที่เข้าถึงอยู่ ข้อความนี้อาจมี URL ที่นำไปยังส่วนที่ถูกต้องในคอนโซลนักพัฒนาแอปโดยตรงเพื่อเปลี่ยนบิต
| ช่อง | |
|---|---|
links[] |
URL ที่ชี้ไปยังข้อมูลเพิ่มเติมเกี่ยวกับการจัดการข้อผิดพลาดปัจจุบัน |
ลิงก์
อธิบายลิงก์ URL
| ช่อง | |
|---|---|
description |
อธิบายว่าลิงก์มีอะไรบ้าง |
url |
URL ของลิงก์ |
LocalizedMessage
แสดงข้อความแสดงข้อผิดพลาดที่แปลแล้วซึ่งส่งคืนให้ผู้ใช้ได้อย่างปลอดภัยและแนบไปกับข้อผิดพลาด RPC ได้
| ช่อง | |
|---|---|
locale |
ภาษาที่ใช้ตามข้อกำหนดที่ระบุไว้ที่ https://www.rfc-editor.org/rfc/bcp/bcp47.txt เช่น "en-US", "fr-CH", "es-MX" |
message |
ข้อความแสดงข้อผิดพลาดที่แปลแล้วในภาษาข้างต้น |
PreconditionFailure
อธิบายว่าเงื่อนไขเบื้องต้นใดไม่สำเร็จ
เช่น หาก RPC ล้มเหลวเนื่องจากต้องยอมรับข้อกำหนดในการให้บริการ ระบบอาจแสดงการละเมิดข้อกำหนดในการให้บริการในข้อความ PreconditionFailure
| ช่อง | |
|---|---|
violations[] |
อธิบายการละเมิดข้อกำหนดเบื้องต้นทั้งหมด |
การทำฟาล์ว
ประเภทข้อความที่ใช้เพื่ออธิบายการไม่เป็นไปตามข้อกำหนดเบื้องต้นรายการเดียว
| ช่อง | |
|---|---|
type |
ประเภทของ PreconditionFailure เราขอแนะนำให้ใช้ประเภทการแจงนับเฉพาะบริการเพื่อกำหนดหัวข้อการละเมิดเงื่อนไขเบื้องต้นที่รองรับ เช่น "TOS" สำหรับ "การละเมิดข้อกำหนดในการให้บริการ" |
subject |
เรื่องที่เกี่ยวข้องกับประเภทที่ไม่สำเร็จ เช่น "google.com/cloud" ที่เกี่ยวข้องกับประเภท "TOS" จะระบุว่ามีการอ้างอิงข้อกำหนดในการให้บริการใด |
description |
คำอธิบายว่าทำไมจึงไม่เป็นไปตามเงื่อนไขที่ต้องดำเนินการก่อน นักพัฒนาแอปสามารถใช้คำอธิบายนี้เพื่อทำความเข้าใจวิธีแก้ไขข้อผิดพลาด เช่น "ไม่ได้ยอมรับข้อกำหนดในการให้บริการ" |
QuotaFailure
อธิบายว่าการตรวจสอบโควต้าไม่สำเร็จได้อย่างไร
เช่น หากโครงการโทรเกินขีดจำกัดรายวัน บริการอาจตอบกลับพร้อมรายละเอียด QuotaFailure ที่มีรหัสโปรเจ็กต์และคำอธิบายของโควต้าที่เกิน หากโปรเจ็กต์การโทรไม่ได้เปิดใช้บริการในคอนโซลนักพัฒนาแอป บริการอาจตอบกลับด้วยรหัสโปรเจ็กต์และตั้งค่า service_disabled เป็นจริง
ดูรายละเอียดอื่นๆ เกี่ยวกับการจัดการโควต้าไม่สำเร็จได้ที่ RetryInfo และประเภทความช่วยเหลือ
| ช่อง | |
|---|---|
violations[] |
อธิบายการละเมิดโควต้าทั้งหมด |
การทำฟาล์ว
ประเภทข้อความที่ใช้เพื่ออธิบายการละเมิดโควต้าครั้งเดียว เช่น โควต้าประจำวันหรือโควต้าที่กำหนดเองที่เกิน
| ช่อง | |
|---|---|
subject |
เรื่องที่การตรวจสอบโควต้าไม่สำเร็จ เช่น "clientip: |
description |
คำอธิบายเกี่ยวกับสาเหตุที่การตรวจสอบโควต้าไม่สำเร็จ ลูกค้าสามารถใช้คำอธิบายนี้เพื่อดูข้อมูลเพิ่มเติมเกี่ยวกับการกำหนดค่าโควต้าในเอกสารประกอบสาธารณะของบริการ หรือค้นหาขีดจำกัดโควต้าที่เกี่ยวข้องเพื่อปรับผ่านคอนโซลนักพัฒนาแอป เช่น "ปิดใช้บริการแล้ว" หรือ "เกินขีดจำกัดรายวันสำหรับการดำเนินการอ่าน" |
api_service |
บริการ API ที่ เช่น หาก API ที่เรียกคือ Kubernetes Engine API (container.googleapis.com) และเกิดการละเมิดโควต้าใน Kubernetes Engine API เอง ฟิลด์นี้จะเป็น "container.googleapis.com" ในทางกลับกัน หากการละเมิดโควต้าเกิดขึ้นเมื่อ Kubernetes Engine API สร้าง VM ใน Compute Engine API (compute.googleapis.com) ฟิลด์นี้จะเป็น "compute.googleapis.com" |
quota_metric |
เมตริกของโควต้าที่ละเมิด เมตริกโควต้าคือตัวนับที่มีชื่อซึ่งใช้ในการวัดการใช้งาน เช่น คำขอ API หรือ CPU เมื่อเกิดกิจกรรมในบริการ เช่น การจัดสรรเครื่องเสมือน เมตริกโควต้าอย่างน้อย 1 รายการอาจได้รับผลกระทบ เช่น "compute.googleapis.com/cpus_per_vm_family", "storage.googleapis.com/internet_egress_bandwidth" |
quota_id |
รหัสของโควต้าที่ละเมิด "ชื่อขีดจํากัด" คือตัวระบุที่ไม่ซ้ำกันของโควต้าในบริบทของบริการ API เช่น "CPUS-PER-VM-FAMILY-per-project-region" |
quota_dimensions |
ขนาดของโควต้าที่ละเมิด โควต้าที่ไม่ใช่โควต้าส่วนกลางทั้งหมดจะบังคับใช้กับชุดมิติข้อมูล ในขณะที่เมตริกโควต้ากำหนดสิ่งที่ต้องนับ มิติข้อมูลจะระบุลักษณะที่ควรเพิ่มตัวนับ เช่น โควต้า "CPU ต่อภูมิภาคต่อตระกูล VM" จะบังคับใช้ขีดจํากัดในเมตริก "compute.googleapis.com/cpus_per_vm_family" ในมิติข้อมูล "region" และ "vm_family" และหากการละเมิดเกิดขึ้นในภูมิภาค "us-central1" และสำหรับตระกูล VM "n1" quota_dimensions จะเป็น { "region": "us-central1", "vm_family": "n1", } เมื่อมีการบังคับใช้โควต้าทั่วโลก quota_dimensions จะว่างเปล่าเสมอ |
quota_value |
ค่าโควต้าที่บังคับใช้ ณ เวลาที่ ตัวอย่างเช่น หากค่าโควต้าที่บังคับใช้ ณ เวลาที่ |
future_quota_value |
ค่าโควต้าใหม่ที่กำลังเปิดตัวในขณะที่มีการละเมิด เมื่อการเปิดตัวเสร็จสมบูรณ์แล้ว ระบบจะบังคับใช้ค่านี้แทน quota_value หากไม่มีการเปิดตัวในขณะที่มีการละเมิด ระบบจะไม่ตั้งค่าฟิลด์นี้ เช่น หากในขณะที่เกิดการละเมิด การเปิดตัวกำลังดำเนินการเพื่อเปลี่ยนโควต้าจำนวน CPU จาก 10 เป็น 20 ค่าของฟิลด์นี้จะเป็น 20 |
RequestInfo
มีข้อมูลเมตาเกี่ยวกับคำขอที่ไคลเอ็นต์สามารถแนบเมื่อรายงานข้อบกพร่องหรือให้ความคิดเห็นในรูปแบบอื่นๆ
| ช่อง | |
|---|---|
request_id |
สตริงทึบแสงที่บริการที่สร้างสตริงนี้เท่านั้นที่ควรตีความ เช่น ใช้เพื่อระบุคำขอในบันทึกของบริการได้ |
serving_data |
ข้อมูลใดๆ ที่ใช้ในการแสดงคำขอนี้ เช่น สแต็กเทรซที่เข้ารหัสซึ่งส่งกลับไปยังผู้ให้บริการเพื่อการแก้ไขข้อบกพร่องได้ |
ResourceInfo
อธิบายทรัพยากรที่กำลังเข้าถึง
| ช่อง | |
|---|---|
resource_type |
ชื่อประเภทของทรัพยากรที่เข้าถึง เช่น "ตาราง SQL" "ที่เก็บข้อมูล Cloud Storage" "ไฟล์" "ปฏิทิน Google" หรือ URL ประเภทของทรัพยากร เช่น "type.googleapis.com/google.pubsub.v1.Topic" |
resource_name |
ชื่อของทรัพยากรที่มีการเข้าถึง เช่น ชื่อปฏิทินที่แชร์: "example.com_4fghdhgsrgh@group.calendar.google.com" หากข้อผิดพลาดปัจจุบันคือ |
owner |
เจ้าของทรัพยากร (ไม่บังคับ) เช่น "user: |
description |
อธิบายข้อผิดพลาดที่พบเมื่อเข้าถึงทรัพยากรนี้ เช่น การอัปเดตโปรเจ็กต์ในระบบคลาวด์อาจต้องใช้สิทธิ์ |
RetryInfo
อธิบายเมื่อไคลเอ็นต์สามารถลองส่งคำขอที่ไม่สำเร็จอีกครั้ง ไคลเอ็นต์สามารถเพิกเฉยต่อคำแนะนำที่นี่หรือลองอีกครั้งเมื่อไม่มีข้อมูลนี้ในการตอบกลับข้อผิดพลาด
เราขอแนะนำให้ไคลเอ็นต์ใช้ Exponential Backoff เมื่อลองอีกครั้งเสมอ
ไคลเอ็นต์ควรรอจนกว่าจะผ่านไป retry_delay ระยะเวลาหนึ่งนับตั้งแต่ได้รับข้อผิดพลาดก่อนที่จะลองอีกครั้ง หากการลองส่งคำขออีกครั้งไม่สำเร็จ ไคลเอ็นต์ควรใช้รูปแบบ Exponential Backoff เพื่อค่อยๆ เพิ่มระยะเวลาระหว่างการลองส่งอีกครั้งตาม retry_delay จนกว่าจะถึงจำนวนการลองส่งอีกครั้งสูงสุดหรือถึงขีดจำกัดการหน่วงเวลาการลองส่งอีกครั้งสูงสุด
| ช่อง | |
|---|---|
retry_delay |
ไคลเอ็นต์ควรรออย่างน้อยเท่านี้ก่อนลองส่งคำขอเดียวกันอีกครั้ง |
สถานะ
Status ประเภทจะกำหนดรูปแบบข้อผิดพลาดเชิงตรรกะที่เหมาะกับสภาพแวดล้อมการเขียนโปรแกรมต่างๆ รวมถึง REST API และ RPC API โดย gRPC จะใช้พอร์ตนี้ Statusแต่ละข้อความจะมีข้อมูล 3 ส่วน ได้แก่ รหัสข้อผิดพลาด ข้อความแสดงข้อผิดพลาด และรายละเอียดข้อผิดพลาด
ดูข้อมูลเพิ่มเติมเกี่ยวกับรูปแบบข้อผิดพลาดนี้และวิธีใช้งานได้ในคู่มือการออกแบบ API
| ช่อง | |
|---|---|
code |
รหัสสถานะซึ่งควรเป็นค่า enum ของ |
message |
ข้อความแสดงข้อผิดพลาดที่ส่งถึงนักพัฒนาแอป ซึ่งควรเป็นภาษาอังกฤษ ข้อความแสดงข้อผิดพลาดที่ผู้ใช้เห็นควรได้รับการแปลและส่งในช่อง |
details[] |
รายการข้อความที่มีรายละเอียดข้อผิดพลาด API จะใช้ชุดประเภทข้อความทั่วไป |