1// Copyright 2022 Google LLC 2// 3// Licensed under the Apache License, Version 2.0 (the "License"); 4// you may not use this file except in compliance with the License. 5// You may obtain a copy of the License at 6// 7// http://www.apache.org/licenses/LICENSE-2.0 8// 9// Unless required by applicable law or agreed to in writing, software 10// distributed under the License is distributed on an "AS IS" BASIS, 11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12// See the License for the specific language governing permissions and 13// limitations under the License. 14 15syntax = "proto3"; 16 17package google.rpc; 18 19import "google/protobuf/duration.proto"; 20 21option go_package = "google.golang.org/genproto/googleapis/rpc/errdetails;errdetails"; 22option java_multiple_files = true; 23option java_outer_classname = "ErrorDetailsProto"; 24option java_package = "com.google.rpc"; 25option objc_class_prefix = "RPC"; 26 27// Describes the cause of the error with structured details. 28// 29// Example of an error when contacting the "pubsub.googleapis.com" API when it 30// is not enabled: 31// 32// { "reason": "API_DISABLED" 33// "domain": "googleapis.com" 34// "metadata": { 35// "resource": "projects/123", 36// "service": "pubsub.googleapis.com" 37// } 38// } 39// 40// This response indicates that the pubsub.googleapis.com API is not enabled. 41// 42// Example of an error that is returned when attempting to create a Spanner 43// instance in a region that is out of stock: 44// 45// { "reason": "STOCKOUT" 46// "domain": "spanner.googleapis.com", 47// "metadata": { 48// "availableRegions": "us-central1,us-east2" 49// } 50// } 51message ErrorInfo { 52 // The reason of the error. This is a constant value that identifies the 53 // proximate cause of the error. Error reasons are unique within a particular 54 // domain of errors. This should be at most 63 characters and match a 55 // regular expression of `[A-Z][A-Z0-9_]+[A-Z0-9]`, which represents 56 // UPPER_SNAKE_CASE. 57 string reason = 1; 58 59 // The logical grouping to which the "reason" belongs. The error domain 60 // is typically the registered service name of the tool or product that 61 // generates the error. Example: "pubsub.googleapis.com". If the error is 62 // generated by some common infrastructure, the error domain must be a 63 // globally unique value that identifies the infrastructure. For Google API 64 // infrastructure, the error domain is "googleapis.com". 65 string domain = 2; 66 67 // Additional structured details about this error. 68 // 69 // Keys should match /[a-zA-Z0-9-_]/ and be limited to 64 characters in 70 // length. When identifying the current value of an exceeded limit, the units 71 // should be contained in the key, not the value. For example, rather than 72 // {"instanceLimit": "100/request"}, should be returned as, 73 // {"instanceLimitPerRequest": "100"}, if the client exceeds the number of 74 // instances that can be created in a single (batch) request. 75 map<string, string> metadata = 3; 76} 77 78// Describes when the clients can retry a failed request. Clients could ignore 79// the recommendation here or retry when this information is missing from error 80// responses. 81// 82// It's always recommended that clients should use exponential backoff when 83// retrying. 84// 85// Clients should wait until `retry_delay` amount of time has passed since 86// receiving the error response before retrying. If retrying requests also 87// fail, clients should use an exponential backoff scheme to gradually increase 88// the delay between retries based on `retry_delay`, until either a maximum 89// number of retries have been reached or a maximum retry delay cap has been 90// reached. 91message RetryInfo { 92 // Clients should wait at least this long between retrying the same request. 93 google.protobuf.Duration retry_delay = 1; 94} 95 96// Describes additional debugging info. 97message DebugInfo { 98 // The stack trace entries indicating where the error occurred. 99 repeated string stack_entries = 1; 100 101 // Additional debugging information provided by the server. 102 string detail = 2; 103} 104 105// Describes how a quota check failed. 106// 107// For example if a daily limit was exceeded for the calling project, 108// a service could respond with a QuotaFailure detail containing the project 109// id and the description of the quota limit that was exceeded. If the 110// calling project hasn't enabled the service in the developer console, then 111// a service could respond with the project id and set `service_disabled` 112// to true. 113// 114// Also see RetryInfo and Help types for other details about handling a 115// quota failure. 116message QuotaFailure { 117 // A message type used to describe a single quota violation. For example, a 118 // daily quota or a custom quota that was exceeded. 119 message Violation { 120 // The subject on which the quota check failed. 121 // For example, "clientip:<ip address of client>" or "project:<Google 122 // developer project id>". 123 string subject = 1; 124 125 // A description of how the quota check failed. Clients can use this 126 // description to find more about the quota configuration in the service's 127 // public documentation, or find the relevant quota limit to adjust through 128 // developer console. 129 // 130 // For example: "Service disabled" or "Daily Limit for read operations 131 // exceeded". 132 string description = 2; 133 } 134 135 // Describes all quota violations. 136 repeated Violation violations = 1; 137} 138 139// Describes what preconditions have failed. 140// 141// For example, if an RPC failed because it required the Terms of Service to be 142// acknowledged, it could list the terms of service violation in the 143// PreconditionFailure message. 144message PreconditionFailure { 145 // A message type used to describe a single precondition failure. 146 message Violation { 147 // The type of PreconditionFailure. We recommend using a service-specific 148 // enum type to define the supported precondition violation subjects. For 149 // example, "TOS" for "Terms of Service violation". 150 string type = 1; 151 152 // The subject, relative to the type, that failed. 153 // For example, "google.com/cloud" relative to the "TOS" type would indicate 154 // which terms of service is being referenced. 155 string subject = 2; 156 157 // A description of how the precondition failed. Developers can use this 158 // description to understand how to fix the failure. 159 // 160 // For example: "Terms of service not accepted". 161 string description = 3; 162 } 163 164 // Describes all precondition violations. 165 repeated Violation violations = 1; 166} 167 168// Describes violations in a client request. This error type focuses on the 169// syntactic aspects of the request. 170message BadRequest { 171 // A message type used to describe a single bad request field. 172 message FieldViolation { 173 // A path that leads to a field in the request body. The value will be a 174 // sequence of dot-separated identifiers that identify a protocol buffer 175 // field. 176 // 177 // Consider the following: 178 // 179 // message CreateContactRequest { 180 // message EmailAddress { 181 // enum Type { 182 // TYPE_UNSPECIFIED = 0; 183 // HOME = 1; 184 // WORK = 2; 185 // } 186 // 187 // optional string email = 1; 188 // repeated EmailType type = 2; 189 // } 190 // 191 // string full_name = 1; 192 // repeated EmailAddress email_addresses = 2; 193 // } 194 // 195 // In this example, in proto `field` could take one of the following values: 196 // 197 // * `full_name` for a violation in the `full_name` value 198 // * `email_addresses[1].email` for a violation in the `email` field of the 199 // first `email_addresses` message 200 // * `email_addresses[3].type[2]` for a violation in the second `type` 201 // value in the third `email_addresses` message. 202 // 203 // In JSON, the same values are represented as: 204 // 205 // * `fullName` for a violation in the `fullName` value 206 // * `emailAddresses[1].email` for a violation in the `email` field of the 207 // first `emailAddresses` message 208 // * `emailAddresses[3].type[2]` for a violation in the second `type` 209 // value in the third `emailAddresses` message. 210 string field = 1; 211 212 // A description of why the request element is bad. 213 string description = 2; 214 } 215 216 // Describes all violations in a client request. 217 repeated FieldViolation field_violations = 1; 218} 219 220// Contains metadata about the request that clients can attach when filing a bug 221// or providing other forms of feedback. 222message RequestInfo { 223 // An opaque string that should only be interpreted by the service generating 224 // it. For example, it can be used to identify requests in the service's logs. 225 string request_id = 1; 226 227 // Any data that was used to serve this request. For example, an encrypted 228 // stack trace that can be sent back to the service provider for debugging. 229 string serving_data = 2; 230} 231 232// Describes the resource that is being accessed. 233message ResourceInfo { 234 // A name for the type of resource being accessed, e.g. "sql table", 235 // "cloud storage bucket", "file", "Google calendar"; or the type URL 236 // of the resource: e.g. "type.googleapis.com/google.pubsub.v1.Topic". 237 string resource_type = 1; 238 239 // The name of the resource being accessed. For example, a shared calendar 240 // name: "[email protected]", if the current 241 // error is 242 // [google.rpc.Code.PERMISSION_DENIED][google.rpc.Code.PERMISSION_DENIED]. 243 string resource_name = 2; 244 245 // The owner of the resource (optional). 246 // For example, "user:<owner email>" or "project:<Google developer project 247 // id>". 248 string owner = 3; 249 250 // Describes what error is encountered when accessing this resource. 251 // For example, updating a cloud project may require the `writer` permission 252 // on the developer console project. 253 string description = 4; 254} 255 256// Provides links to documentation or for performing an out of band action. 257// 258// For example, if a quota check failed with an error indicating the calling 259// project hasn't enabled the accessed service, this can contain a URL pointing 260// directly to the right place in the developer console to flip the bit. 261message Help { 262 // Describes a URL link. 263 message Link { 264 // Describes what the link offers. 265 string description = 1; 266 267 // The URL of the link. 268 string url = 2; 269 } 270 271 // URL(s) pointing to additional information on handling the current error. 272 repeated Link links = 1; 273} 274 275// Provides a localized error message that is safe to return to the user 276// which can be attached to an RPC error. 277message LocalizedMessage { 278 // The locale used following the specification defined at 279 // https://www.rfc-editor.org/rfc/bcp/bcp47.txt. 280 // Examples are: "en-US", "fr-CH", "es-MX" 281 string locale = 1; 282 283 // The localized error message in the above locale. 284 string message = 2; 285} 286