diff --git a/google/api/annotations.proto b/google/api/annotations.proto index 85c361b..efdab3d 100644 --- a/google/api/annotations.proto +++ b/google/api/annotations.proto @@ -1,4 +1,4 @@ -// Copyright (c) 2015, Google Inc. +// Copyright 2015 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/google/api/auth.proto b/google/api/auth.proto index cdbc1ef..54026e1 100644 --- a/google/api/auth.proto +++ b/google/api/auth.proto @@ -1,4 +1,4 @@ -// Copyright 2018 Google LLC. +// Copyright 2015 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -16,18 +16,16 @@ syntax = "proto3"; package google.api; -import "google/api/annotations.proto"; - option go_package = "google.golang.org/genproto/googleapis/api/serviceconfig;serviceconfig"; option java_multiple_files = true; option java_outer_classname = "AuthProto"; option java_package = "com.google.api"; option objc_class_prefix = "GAPI"; - -// `Authentication` defines the authentication configuration for an API. +// `Authentication` defines the authentication configuration for API methods +// provided by an API service. // -// Example for an API targeted for external use: +// Example: // // name: calendar.googleapis.com // authentication: @@ -39,6 +37,9 @@ option objc_class_prefix = "GAPI"; // - selector: "*" // requirements: // provider_id: google_calendar_auth +// - selector: google.calendar.Delegate +// oauth: +// canonical_scopes: https://www.googleapis.com/auth/calendar.read message Authentication { // A list of authentication rules that apply to individual API methods. // @@ -68,14 +69,37 @@ message AuthenticationRule { OAuthRequirements oauth = 2; // If true, the service accepts API keys without any other credential. + // This flag only applies to HTTP and gRPC requests. bool allow_without_credential = 5; // Requirements for additional authentication providers. repeated AuthRequirement requirements = 7; } -// Configuration for an anthentication provider, including support for -// [JSON Web Token (JWT)](https://tools.ietf.org/html/draft-ietf-oauth-json-web-token-32). +// Specifies a location to extract JWT from an API request. +message JwtLocation { + oneof in { + // Specifies HTTP header name to extract JWT token. + string header = 1; + + // Specifies URL query parameter name to extract JWT token. + string query = 2; + } + + // The value prefix. The value format is "value_prefix{token}" + // Only applies to "in" header type. Must be empty for "in" query type. + // If not empty, the header value has to match (case sensitive) this prefix. + // If not matched, JWT will not be extracted. If matched, JWT will be + // extracted after the prefix is removed. + // + // For example, for "Authorization: Bearer {JWT}", + // value_prefix="Bearer " with a space at the end. + string value_prefix = 3; +} + +// Configuration for an authentication provider, including support for +// [JSON Web Token +// (JWT)](https://tools.ietf.org/html/draft-ietf-oauth-json-web-token-32). message AuthProvider { // The unique identifier of the auth provider. It will be referred to by // `AuthRequirement.provider_id`. @@ -92,12 +116,15 @@ message AuthProvider { string issuer = 2; // URL of the provider's public key set to validate signature of the JWT. See - // [OpenID Discovery](https://openid.net/specs/openid-connect-discovery-1_0.html#ProviderMetadata). + // [OpenID + // Discovery](https://openid.net/specs/openid-connect-discovery-1_0.html#ProviderMetadata). // Optional if the key set document: // - can be retrieved from - // [OpenID Discovery](https://openid.net/specs/openid-connect-discovery-1_0.html + // [OpenID + // Discovery](https://openid.net/specs/openid-connect-discovery-1_0.html) // of the issuer. - // - can be inferred from the email domain of the issuer (e.g. a Google service account). + // - can be inferred from the email domain of the issuer (e.g. a Google + // service account). // // Example: https://www.googleapis.com/oauth2/v1/certs string jwks_uri = 3; @@ -105,11 +132,15 @@ message AuthProvider { // The list of JWT // [audiences](https://tools.ietf.org/html/draft-ietf-oauth-json-web-token-32#section-4.1.3). // that are allowed to access. A JWT containing any of these audiences will - // be accepted. When this setting is absent, only JWTs with audience - // "https://[Service_name][google.api.Service.name]/[API_name][google.protobuf.Api.name]" - // will be accepted. For example, if no audiences are in the setting, - // LibraryService API will only accept JWTs with the following audience - // "https://library-example.googleapis.com/google.example.library.v1.LibraryService". + // be accepted. When this setting is absent, JWTs with audiences: + // - "https://[service.name]/[google.protobuf.Api.name]" + // - "https://[service.name]/" + // will be accepted. + // For example, if no audiences are in the setting, LibraryService API will + // accept JWTs with the following audiences: + // - + // https://library-example.googleapis.com/google.example.library.v1.LibraryService + // - https://library-example.googleapis.com/ // // Example: // @@ -117,9 +148,28 @@ message AuthProvider { // bookstore_web.apps.googleusercontent.com string audiences = 4; - // Redirect URL if JWT token is required but no present or is expired. + // Redirect URL if JWT token is required but not present or is expired. // Implement authorizationUrl of securityDefinitions in OpenAPI spec. string authorization_url = 5; + + // Defines the locations to extract the JWT. + // + // JWT locations can be either from HTTP headers or URL query parameters. + // The rule is that the first match wins. The checking order is: checking + // all headers first, then URL query parameters. + // + // If not specified, default to use following 3 locations: + // 1) Authorization: Bearer + // 2) x-goog-iap-jwt-assertion + // 3) access_token query parameter + // + // Default locations can be specified as followings: + // jwt_locations: + // - header: Authorization + // value_prefix: "Bearer " + // - header: x-goog-iap-jwt-assertion + // - query: access_token + repeated JwtLocation jwt_locations = 6; } // OAuth scopes are a way to define data and permissions on data. For example, @@ -152,7 +202,8 @@ message OAuthRequirements { } // User-defined authentication requirements, including support for -// [JSON Web Token (JWT)](https://tools.ietf.org/html/draft-ietf-oauth-json-web-token-32). +// [JSON Web Token +// (JWT)](https://tools.ietf.org/html/draft-ietf-oauth-json-web-token-32). message AuthRequirement { // [id][google.api.AuthProvider.id] from authentication provider. // diff --git a/google/api/auth_pb2.py b/google/api/auth_pb2.py index 21a25ce..e28305c 100644 --- a/google/api/auth_pb2.py +++ b/google/api/auth_pb2.py @@ -27,17 +27,13 @@ _sym_db = _symbol_database.Default() -from google.api import annotations_pb2 as google_dot_api_dot_annotations__pb2 - - DESCRIPTOR = _descriptor.FileDescriptor( name="google/api/auth.proto", package="google.api", syntax="proto3", serialized_options=b"\n\016com.google.apiB\tAuthProtoP\001ZEgoogle.golang.org/genproto/googleapis/api/serviceconfig;serviceconfig\242\002\004GAPI", create_key=_descriptor._internal_create_key, - serialized_pb=b'\n\x15google/api/auth.proto\x12\ngoogle.api\x1a\x1cgoogle/api/annotations.proto"l\n\x0e\x41uthentication\x12-\n\x05rules\x18\x03 \x03(\x0b\x32\x1e.google.api.AuthenticationRule\x12+\n\tproviders\x18\x04 \x03(\x0b\x32\x18.google.api.AuthProvider"\xa9\x01\n\x12\x41uthenticationRule\x12\x10\n\x08selector\x18\x01 \x01(\t\x12,\n\x05oauth\x18\x02 \x01(\x0b\x32\x1d.google.api.OAuthRequirements\x12 \n\x18\x61llow_without_credential\x18\x05 \x01(\x08\x12\x31\n\x0crequirements\x18\x07 \x03(\x0b\x32\x1b.google.api.AuthRequirement"j\n\x0c\x41uthProvider\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0e\n\x06issuer\x18\x02 \x01(\t\x12\x10\n\x08jwks_uri\x18\x03 \x01(\t\x12\x11\n\taudiences\x18\x04 \x01(\t\x12\x19\n\x11\x61uthorization_url\x18\x05 \x01(\t"-\n\x11OAuthRequirements\x12\x18\n\x10\x63\x61nonical_scopes\x18\x01 \x01(\t"9\n\x0f\x41uthRequirement\x12\x13\n\x0bprovider_id\x18\x01 \x01(\t\x12\x11\n\taudiences\x18\x02 \x01(\tBk\n\x0e\x63om.google.apiB\tAuthProtoP\x01ZEgoogle.golang.org/genproto/googleapis/api/serviceconfig;serviceconfig\xa2\x02\x04GAPIb\x06proto3', - dependencies=[google_dot_api_dot_annotations__pb2.DESCRIPTOR], + serialized_pb=b'\n\x15google/api/auth.proto\x12\ngoogle.api"l\n\x0e\x41uthentication\x12-\n\x05rules\x18\x03 \x03(\x0b\x32\x1e.google.api.AuthenticationRule\x12+\n\tproviders\x18\x04 \x03(\x0b\x32\x18.google.api.AuthProvider"\xa9\x01\n\x12\x41uthenticationRule\x12\x10\n\x08selector\x18\x01 \x01(\t\x12,\n\x05oauth\x18\x02 \x01(\x0b\x32\x1d.google.api.OAuthRequirements\x12 \n\x18\x61llow_without_credential\x18\x05 \x01(\x08\x12\x31\n\x0crequirements\x18\x07 \x03(\x0b\x32\x1b.google.api.AuthRequirement"L\n\x0bJwtLocation\x12\x10\n\x06header\x18\x01 \x01(\tH\x00\x12\x0f\n\x05query\x18\x02 \x01(\tH\x00\x12\x14\n\x0cvalue_prefix\x18\x03 \x01(\tB\x04\n\x02in"\x9a\x01\n\x0c\x41uthProvider\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0e\n\x06issuer\x18\x02 \x01(\t\x12\x10\n\x08jwks_uri\x18\x03 \x01(\t\x12\x11\n\taudiences\x18\x04 \x01(\t\x12\x19\n\x11\x61uthorization_url\x18\x05 \x01(\t\x12.\n\rjwt_locations\x18\x06 \x03(\x0b\x32\x17.google.api.JwtLocation"-\n\x11OAuthRequirements\x12\x18\n\x10\x63\x61nonical_scopes\x18\x01 \x01(\t"9\n\x0f\x41uthRequirement\x12\x13\n\x0bprovider_id\x18\x01 \x01(\t\x12\x11\n\taudiences\x18\x02 \x01(\tBk\n\x0e\x63om.google.apiB\tAuthProtoP\x01ZEgoogle.golang.org/genproto/googleapis/api/serviceconfig;serviceconfig\xa2\x02\x04GAPIb\x06proto3', ) @@ -96,8 +92,8 @@ syntax="proto3", extension_ranges=[], oneofs=[], - serialized_start=67, - serialized_end=175, + serialized_start=37, + serialized_end=145, ) @@ -194,8 +190,96 @@ syntax="proto3", extension_ranges=[], oneofs=[], - serialized_start=178, - serialized_end=347, + serialized_start=148, + serialized_end=317, +) + + +_JWTLOCATION = _descriptor.Descriptor( + name="JwtLocation", + full_name="google.api.JwtLocation", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="header", + full_name="google.api.JwtLocation.header", + index=0, + number=1, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="query", + full_name="google.api.JwtLocation.query", + index=1, + number=2, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="value_prefix", + full_name="google.api.JwtLocation.value_prefix", + index=2, + number=3, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax="proto3", + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name="in", + full_name="google.api.JwtLocation.in", + index=0, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[], + ) + ], + serialized_start=319, + serialized_end=395, ) @@ -302,6 +386,25 @@ file=DESCRIPTOR, create_key=_descriptor._internal_create_key, ), + _descriptor.FieldDescriptor( + name="jwt_locations", + full_name="google.api.AuthProvider.jwt_locations", + index=5, + number=6, + type=11, + cpp_type=10, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), ], extensions=[], nested_types=[], @@ -311,8 +414,8 @@ syntax="proto3", extension_ranges=[], oneofs=[], - serialized_start=349, - serialized_end=455, + serialized_start=398, + serialized_end=552, ) @@ -352,8 +455,8 @@ syntax="proto3", extension_ranges=[], oneofs=[], - serialized_start=457, - serialized_end=502, + serialized_start=554, + serialized_end=599, ) @@ -412,16 +515,26 @@ syntax="proto3", extension_ranges=[], oneofs=[], - serialized_start=504, - serialized_end=561, + serialized_start=601, + serialized_end=658, ) _AUTHENTICATION.fields_by_name["rules"].message_type = _AUTHENTICATIONRULE _AUTHENTICATION.fields_by_name["providers"].message_type = _AUTHPROVIDER _AUTHENTICATIONRULE.fields_by_name["oauth"].message_type = _OAUTHREQUIREMENTS _AUTHENTICATIONRULE.fields_by_name["requirements"].message_type = _AUTHREQUIREMENT +_JWTLOCATION.oneofs_by_name["in"].fields.append(_JWTLOCATION.fields_by_name["header"]) +_JWTLOCATION.fields_by_name["header"].containing_oneof = _JWTLOCATION.oneofs_by_name[ + "in" +] +_JWTLOCATION.oneofs_by_name["in"].fields.append(_JWTLOCATION.fields_by_name["query"]) +_JWTLOCATION.fields_by_name["query"].containing_oneof = _JWTLOCATION.oneofs_by_name[ + "in" +] +_AUTHPROVIDER.fields_by_name["jwt_locations"].message_type = _JWTLOCATION DESCRIPTOR.message_types_by_name["Authentication"] = _AUTHENTICATION DESCRIPTOR.message_types_by_name["AuthenticationRule"] = _AUTHENTICATIONRULE +DESCRIPTOR.message_types_by_name["JwtLocation"] = _JWTLOCATION DESCRIPTOR.message_types_by_name["AuthProvider"] = _AUTHPROVIDER DESCRIPTOR.message_types_by_name["OAuthRequirements"] = _OAUTHREQUIREMENTS DESCRIPTOR.message_types_by_name["AuthRequirement"] = _AUTHREQUIREMENT @@ -449,6 +562,17 @@ ) _sym_db.RegisterMessage(AuthenticationRule) +JwtLocation = _reflection.GeneratedProtocolMessageType( + "JwtLocation", + (_message.Message,), + { + "DESCRIPTOR": _JWTLOCATION, + "__module__": "google.api.auth_pb2" + # @@protoc_insertion_point(class_scope:google.api.JwtLocation) + }, +) +_sym_db.RegisterMessage(JwtLocation) + AuthProvider = _reflection.GeneratedProtocolMessageType( "AuthProvider", (_message.Message,), diff --git a/google/api/backend.proto b/google/api/backend.proto index dd22919..da38786 100644 --- a/google/api/backend.proto +++ b/google/api/backend.proto @@ -1,4 +1,4 @@ -// Copyright 2018 Google LLC. +// Copyright 2015 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -22,7 +22,6 @@ option java_outer_classname = "BackendProto"; option java_package = "com.google.api"; option objc_class_prefix = "GAPI"; - // `Backend` defines the backend configuration for a service. message Backend { // A list of API backend rules that apply to individual API methods. @@ -33,19 +32,151 @@ message Backend { // A backend rule provides configuration for an individual API element. message BackendRule { + // Path Translation specifies how to combine the backend address with the + // request path in order to produce the appropriate forwarding URL for the + // request. + // + // Path Translation is applicable only to HTTP-based backends. Backends which + // do not accept requests over HTTP/HTTPS should leave `path_translation` + // unspecified. + enum PathTranslation { + PATH_TRANSLATION_UNSPECIFIED = 0; + + // Use the backend address as-is, with no modification to the path. If the + // URL pattern contains variables, the variable names and values will be + // appended to the query string. If a query string parameter and a URL + // pattern variable have the same name, this may result in duplicate keys in + // the query string. + // + // # Examples + // + // Given the following operation config: + // + // Method path: /api/company/{cid}/user/{uid} + // Backend address: https://example.cloudfunctions.net/getUser + // + // Requests to the following request paths will call the backend at the + // translated path: + // + // Request path: /api/company/widgetworks/user/johndoe + // Translated: + // https://example.cloudfunctions.net/getUser?cid=widgetworks&uid=johndoe + // + // Request path: /api/company/widgetworks/user/johndoe?timezone=EST + // Translated: + // https://example.cloudfunctions.net/getUser?timezone=EST&cid=widgetworks&uid=johndoe + CONSTANT_ADDRESS = 1; + + // The request path will be appended to the backend address. + // + // # Examples + // + // Given the following operation config: + // + // Method path: /api/company/{cid}/user/{uid} + // Backend address: https://example.appspot.com + // + // Requests to the following request paths will call the backend at the + // translated path: + // + // Request path: /api/company/widgetworks/user/johndoe + // Translated: + // https://example.appspot.com/api/company/widgetworks/user/johndoe + // + // Request path: /api/company/widgetworks/user/johndoe?timezone=EST + // Translated: + // https://example.appspot.com/api/company/widgetworks/user/johndoe?timezone=EST + APPEND_PATH_TO_ADDRESS = 2; + } + // Selects the methods to which this rule applies. // // Refer to [selector][google.api.DocumentationRule.selector] for syntax details. string selector = 1; // The address of the API backend. + // + // The scheme is used to determine the backend protocol and security. + // The following schemes are accepted: + // + // SCHEME PROTOCOL SECURITY + // http:// HTTP None + // https:// HTTP TLS + // grpc:// gRPC None + // grpcs:// gRPC TLS + // + // It is recommended to explicitly include a scheme. Leaving out the scheme + // may cause constrasting behaviors across platforms. + // + // If the port is unspecified, the default is: + // - 80 for schemes without TLS + // - 443 for schemes with TLS + // + // For HTTP backends, use [protocol][google.api.BackendRule.protocol] + // to specify the protocol version. string address = 2; - // The number of seconds to wait for a response from a request. The default - // deadline for gRPC is infinite (no deadline) and HTTP requests is 5 seconds. + // The number of seconds to wait for a response from a request. The default + // varies based on the request protocol and deployment environment. double deadline = 3; // Minimum deadline in seconds needed for this method. Calls having deadline // value lower than this will be rejected. double min_deadline = 4; + + // The number of seconds to wait for the completion of a long running + // operation. The default is no deadline. + double operation_deadline = 5; + + PathTranslation path_translation = 6; + + // Authentication settings used by the backend. + // + // These are typically used to provide service management functionality to + // a backend served on a publicly-routable URL. The `authentication` + // details should match the authentication behavior used by the backend. + // + // For example, specifying `jwt_audience` implies that the backend expects + // authentication via a JWT. + // + // When authentication is unspecified, the resulting behavior is the same + // as `disable_auth` set to `true`. + // + // Refer to https://developers.google.com/identity/protocols/OpenIDConnect for + // JWT ID token. + oneof authentication { + // The JWT audience is used when generating a JWT ID token for the backend. + // This ID token will be added in the HTTP "authorization" header, and sent + // to the backend. + string jwt_audience = 7; + + // When disable_auth is true, a JWT ID token won't be generated and the + // original "Authorization" HTTP header will be preserved. If the header is + // used to carry the original token and is expected by the backend, this + // field must be set to true to preserve the header. + bool disable_auth = 8; + } + + // The protocol used for sending a request to the backend. + // The supported values are "http/1.1" and "h2". + // + // The default value is inferred from the scheme in the + // [address][google.api.BackendRule.address] field: + // + // SCHEME PROTOCOL + // http:// http/1.1 + // https:// http/1.1 + // grpc:// h2 + // grpcs:// h2 + // + // For secure HTTP backends (https://) that support HTTP/2, set this field + // to "h2" for improved performance. + // + // Configuring this field to non-default values is only supported for secure + // HTTP backends. This field will be ignored for all other backends. + // + // See + // https://www.iana.org/assignments/tls-extensiontype-values/tls-extensiontype-values.xhtml#alpn-protocol-ids + // for more details on the supported values. + string protocol = 9; } diff --git a/google/api/backend_pb2.py b/google/api/backend_pb2.py index cb5bcca..b412244 100644 --- a/google/api/backend_pb2.py +++ b/google/api/backend_pb2.py @@ -33,10 +33,50 @@ syntax="proto3", serialized_options=b"\n\016com.google.apiB\014BackendProtoP\001ZEgoogle.golang.org/genproto/googleapis/api/serviceconfig;serviceconfig\242\002\004GAPI", create_key=_descriptor._internal_create_key, - serialized_pb=b'\n\x18google/api/backend.proto\x12\ngoogle.api"1\n\x07\x42\x61\x63kend\x12&\n\x05rules\x18\x01 \x03(\x0b\x32\x17.google.api.BackendRule"X\n\x0b\x42\x61\x63kendRule\x12\x10\n\x08selector\x18\x01 \x01(\t\x12\x0f\n\x07\x61\x64\x64ress\x18\x02 \x01(\t\x12\x10\n\x08\x64\x65\x61\x64line\x18\x03 \x01(\x01\x12\x14\n\x0cmin_deadline\x18\x04 \x01(\x01\x42n\n\x0e\x63om.google.apiB\x0c\x42\x61\x63kendProtoP\x01ZEgoogle.golang.org/genproto/googleapis/api/serviceconfig;serviceconfig\xa2\x02\x04GAPIb\x06proto3', + serialized_pb=b'\n\x18google/api/backend.proto\x12\ngoogle.api"1\n\x07\x42\x61\x63kend\x12&\n\x05rules\x18\x01 \x03(\x0b\x32\x17.google.api.BackendRule"\xf2\x02\n\x0b\x42\x61\x63kendRule\x12\x10\n\x08selector\x18\x01 \x01(\t\x12\x0f\n\x07\x61\x64\x64ress\x18\x02 \x01(\t\x12\x10\n\x08\x64\x65\x61\x64line\x18\x03 \x01(\x01\x12\x14\n\x0cmin_deadline\x18\x04 \x01(\x01\x12\x1a\n\x12operation_deadline\x18\x05 \x01(\x01\x12\x41\n\x10path_translation\x18\x06 \x01(\x0e\x32\'.google.api.BackendRule.PathTranslation\x12\x16\n\x0cjwt_audience\x18\x07 \x01(\tH\x00\x12\x16\n\x0c\x64isable_auth\x18\x08 \x01(\x08H\x00\x12\x10\n\x08protocol\x18\t \x01(\t"e\n\x0fPathTranslation\x12 \n\x1cPATH_TRANSLATION_UNSPECIFIED\x10\x00\x12\x14\n\x10\x43ONSTANT_ADDRESS\x10\x01\x12\x1a\n\x16\x41PPEND_PATH_TO_ADDRESS\x10\x02\x42\x10\n\x0e\x61uthenticationBn\n\x0e\x63om.google.apiB\x0c\x42\x61\x63kendProtoP\x01ZEgoogle.golang.org/genproto/googleapis/api/serviceconfig;serviceconfig\xa2\x02\x04GAPIb\x06proto3', ) +_BACKENDRULE_PATHTRANSLATION = _descriptor.EnumDescriptor( + name="PathTranslation", + full_name="google.api.BackendRule.PathTranslation", + filename=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + values=[ + _descriptor.EnumValueDescriptor( + name="PATH_TRANSLATION_UNSPECIFIED", + index=0, + number=0, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key, + ), + _descriptor.EnumValueDescriptor( + name="CONSTANT_ADDRESS", + index=1, + number=1, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key, + ), + _descriptor.EnumValueDescriptor( + name="APPEND_PATH_TO_ADDRESS", + index=2, + number=2, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key, + ), + ], + containing_type=None, + serialized_options=None, + serialized_start=343, + serialized_end=444, +) +_sym_db.RegisterEnumDescriptor(_BACKENDRULE_PATHTRANSLATION) + + _BACKEND = _descriptor.Descriptor( name="Backend", full_name="google.api.Backend", @@ -162,20 +202,138 @@ file=DESCRIPTOR, create_key=_descriptor._internal_create_key, ), + _descriptor.FieldDescriptor( + name="operation_deadline", + full_name="google.api.BackendRule.operation_deadline", + index=4, + number=5, + type=1, + cpp_type=5, + label=1, + has_default_value=False, + default_value=float(0), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="path_translation", + full_name="google.api.BackendRule.path_translation", + index=5, + number=6, + type=14, + cpp_type=8, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="jwt_audience", + full_name="google.api.BackendRule.jwt_audience", + index=6, + number=7, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="disable_auth", + full_name="google.api.BackendRule.disable_auth", + index=7, + number=8, + type=8, + cpp_type=7, + label=1, + has_default_value=False, + default_value=False, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="protocol", + full_name="google.api.BackendRule.protocol", + index=8, + number=9, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), ], extensions=[], nested_types=[], - enum_types=[], + enum_types=[_BACKENDRULE_PATHTRANSLATION], serialized_options=None, is_extendable=False, syntax="proto3", extension_ranges=[], - oneofs=[], - serialized_start=91, - serialized_end=179, + oneofs=[ + _descriptor.OneofDescriptor( + name="authentication", + full_name="google.api.BackendRule.authentication", + index=0, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[], + ) + ], + serialized_start=92, + serialized_end=462, ) _BACKEND.fields_by_name["rules"].message_type = _BACKENDRULE +_BACKENDRULE.fields_by_name["path_translation"].enum_type = _BACKENDRULE_PATHTRANSLATION +_BACKENDRULE_PATHTRANSLATION.containing_type = _BACKENDRULE +_BACKENDRULE.oneofs_by_name["authentication"].fields.append( + _BACKENDRULE.fields_by_name["jwt_audience"] +) +_BACKENDRULE.fields_by_name[ + "jwt_audience" +].containing_oneof = _BACKENDRULE.oneofs_by_name["authentication"] +_BACKENDRULE.oneofs_by_name["authentication"].fields.append( + _BACKENDRULE.fields_by_name["disable_auth"] +) +_BACKENDRULE.fields_by_name[ + "disable_auth" +].containing_oneof = _BACKENDRULE.oneofs_by_name["authentication"] DESCRIPTOR.message_types_by_name["Backend"] = _BACKEND DESCRIPTOR.message_types_by_name["BackendRule"] = _BACKENDRULE _sym_db.RegisterFileDescriptor(DESCRIPTOR) diff --git a/google/api/billing.proto b/google/api/billing.proto index 54c6cca..cf48179 100644 --- a/google/api/billing.proto +++ b/google/api/billing.proto @@ -1,4 +1,4 @@ -// Copyright 2018 Google LLC. +// Copyright 2015 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -16,7 +16,7 @@ syntax = "proto3"; package google.api; -import "google/api/annotations.proto"; +import "google/api/metric.proto"; option go_package = "google.golang.org/genproto/googleapis/api/serviceconfig;serviceconfig"; option java_multiple_files = true; @@ -24,26 +24,36 @@ option java_outer_classname = "BillingProto"; option java_package = "com.google.api"; option objc_class_prefix = "GAPI"; - // Billing related configuration of the service. // // The following example shows how to configure monitored resources and metrics -// for billing: +// for billing, `consumer_destinations` is the only supported destination and +// the monitored resources need at least one label key +// `cloud.googleapis.com/location` to indicate the location of the billing +// usage, using different monitored resources between monitoring and billing is +// recommended so they can be evolved independently: +// // // monitored_resources: -// - type: library.googleapis.com/branch +// - type: library.googleapis.com/billing_branch // labels: -// - key: /city -// description: The city where the library branch is located in. -// - key: /name -// description: The name of the branch. +// - key: cloud.googleapis.com/location +// description: | +// Predefined label to support billing location restriction. +// - key: city +// description: | +// Custom label to define the city where the library branch is located +// in. +// - key: name +// description: Custom label to define the name of the library branch. // metrics: // - name: library.googleapis.com/book/borrowed_count // metric_kind: DELTA // value_type: INT64 +// unit: "1" // billing: // consumer_destinations: -// - monitored_resource: library.googleapis.com/branch +// - monitored_resource: library.googleapis.com/billing_branch // metrics: // - library.googleapis.com/book/borrowed_count message Billing { diff --git a/google/api/billing_pb2.py b/google/api/billing_pb2.py index b67218a..8fd89ac 100644 --- a/google/api/billing_pb2.py +++ b/google/api/billing_pb2.py @@ -27,7 +27,7 @@ _sym_db = _symbol_database.Default() -from google.api import annotations_pb2 as google_dot_api_dot_annotations__pb2 +from google.api import metric_pb2 as google_dot_api_dot_metric__pb2 DESCRIPTOR = _descriptor.FileDescriptor( @@ -36,8 +36,8 @@ syntax="proto3", serialized_options=b"\n\016com.google.apiB\014BillingProtoP\001ZEgoogle.golang.org/genproto/googleapis/api/serviceconfig;serviceconfig\242\002\004GAPI", create_key=_descriptor._internal_create_key, - serialized_pb=b'\n\x18google/api/billing.proto\x12\ngoogle.api\x1a\x1cgoogle/api/annotations.proto"\x93\x01\n\x07\x42illing\x12\x45\n\x15\x63onsumer_destinations\x18\x08 \x03(\x0b\x32&.google.api.Billing.BillingDestination\x1a\x41\n\x12\x42illingDestination\x12\x1a\n\x12monitored_resource\x18\x01 \x01(\t\x12\x0f\n\x07metrics\x18\x02 \x03(\tBn\n\x0e\x63om.google.apiB\x0c\x42illingProtoP\x01ZEgoogle.golang.org/genproto/googleapis/api/serviceconfig;serviceconfig\xa2\x02\x04GAPIb\x06proto3', - dependencies=[google_dot_api_dot_annotations__pb2.DESCRIPTOR], + serialized_pb=b'\n\x18google/api/billing.proto\x12\ngoogle.api\x1a\x17google/api/metric.proto"\x93\x01\n\x07\x42illing\x12\x45\n\x15\x63onsumer_destinations\x18\x08 \x03(\x0b\x32&.google.api.Billing.BillingDestination\x1a\x41\n\x12\x42illingDestination\x12\x1a\n\x12monitored_resource\x18\x01 \x01(\t\x12\x0f\n\x07metrics\x18\x02 \x03(\tBn\n\x0e\x63om.google.apiB\x0c\x42illingProtoP\x01ZEgoogle.golang.org/genproto/googleapis/api/serviceconfig;serviceconfig\xa2\x02\x04GAPIb\x06proto3', + dependencies=[google_dot_api_dot_metric__pb2.DESCRIPTOR], ) @@ -96,8 +96,8 @@ syntax="proto3", extension_ranges=[], oneofs=[], - serialized_start=153, - serialized_end=218, + serialized_start=148, + serialized_end=213, ) _BILLING = _descriptor.Descriptor( @@ -136,8 +136,8 @@ syntax="proto3", extension_ranges=[], oneofs=[], - serialized_start=71, - serialized_end=218, + serialized_start=66, + serialized_end=213, ) _BILLING_BILLINGDESTINATION.containing_type = _BILLING diff --git a/google/api/client.proto b/google/api/client.proto index 2102623..3b3fd0c 100644 --- a/google/api/client.proto +++ b/google/api/client.proto @@ -1,4 +1,4 @@ -// Copyright 2020 Google LLC +// Copyright 2018 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/google/api/config_change.proto b/google/api/config_change.proto index 1e78793..f1fcde4 100644 --- a/google/api/config_change.proto +++ b/google/api/config_change.proto @@ -1,4 +1,4 @@ -// Copyright 2018 Google LLC. +// Copyright 2015 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -22,7 +22,6 @@ option java_outer_classname = "ConfigChangeProto"; option java_package = "com.google.api"; option objc_class_prefix = "GAPI"; - // Output generated from semantically comparing two versions of a service // configuration. // @@ -36,7 +35,7 @@ message ConfigChange { // 'key' is used. If the field has no unique identifier, the numeric index // is used. // Examples: - // - visibility.rules[selector=="google.LibraryService.CreateBook"].restriction + // - visibility.rules[selector=="google.LibraryService.ListBooks"].restriction // - quota.metric_rules[selector=="google"].metric_costs[key=="reads"].value // - logging.producer_destinations[0] string element = 1; diff --git a/google/api/consumer.proto b/google/api/consumer.proto index 4e96316..b7e5df1 100644 --- a/google/api/consumer.proto +++ b/google/api/consumer.proto @@ -1,4 +1,4 @@ -// Copyright 2016 Google Inc. +// Copyright 2016 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -21,7 +21,6 @@ option java_multiple_files = true; option java_outer_classname = "ConsumerProto"; option java_package = "com.google.api"; - // A descriptor for defining project properties for a service. One service may // have many consumer projects, and the service may want to behave differently // depending on some properties on the project. For example, a project may be diff --git a/google/api/context.proto b/google/api/context.proto index fd03fca..8e776ec 100644 --- a/google/api/context.proto +++ b/google/api/context.proto @@ -1,4 +1,4 @@ -// Copyright 2017 Google Inc. +// Copyright 2015 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -22,7 +22,6 @@ option java_outer_classname = "ContextProto"; option java_package = "com.google.api"; option objc_class_prefix = "GAPI"; - // `Context` defines which contexts an API requests. // // Example: @@ -40,6 +39,25 @@ option objc_class_prefix = "GAPI"; // // Available context types are defined in package // `google.rpc.context`. +// +// This also provides mechanism to allowlist any protobuf message extension that +// can be sent in grpc metadata using “x-goog-ext--bin” and +// “x-goog-ext--jspb” format. For example, list any service +// specific protobuf types that can appear in grpc metadata as follows in your +// yaml file: +// +// Example: +// +// context: +// rules: +// - selector: "google.example.library.v1.LibraryService.CreateBook" +// allowed_request_extensions: +// - google.foo.v1.NewExtension +// allowed_response_extensions: +// - google.foo.v1.NewExtension +// +// You can also specify extension ID instead of fully qualified extension name +// here. message Context { // A list of RPC context rules that apply to individual API methods. // @@ -60,4 +78,12 @@ message ContextRule { // A list of full type names of provided contexts. repeated string provided = 3; + + // A list of full type names or extension IDs of extensions allowed in grpc + // side channel from client to backend. + repeated string allowed_request_extensions = 4; + + // A list of full type names or extension IDs of extensions allowed in grpc + // side channel from backend to client. + repeated string allowed_response_extensions = 5; } diff --git a/google/api/context_pb2.py b/google/api/context_pb2.py index fcded3a..7268c55 100644 --- a/google/api/context_pb2.py +++ b/google/api/context_pb2.py @@ -33,7 +33,7 @@ syntax="proto3", serialized_options=b"\n\016com.google.apiB\014ContextProtoP\001ZEgoogle.golang.org/genproto/googleapis/api/serviceconfig;serviceconfig\242\002\004GAPI", create_key=_descriptor._internal_create_key, - serialized_pb=b'\n\x18google/api/context.proto\x12\ngoogle.api"1\n\x07\x43ontext\x12&\n\x05rules\x18\x01 \x03(\x0b\x32\x17.google.api.ContextRule"D\n\x0b\x43ontextRule\x12\x10\n\x08selector\x18\x01 \x01(\t\x12\x11\n\trequested\x18\x02 \x03(\t\x12\x10\n\x08provided\x18\x03 \x03(\tBn\n\x0e\x63om.google.apiB\x0c\x43ontextProtoP\x01ZEgoogle.golang.org/genproto/googleapis/api/serviceconfig;serviceconfig\xa2\x02\x04GAPIb\x06proto3', + serialized_pb=b'\n\x18google/api/context.proto\x12\ngoogle.api"1\n\x07\x43ontext\x12&\n\x05rules\x18\x01 \x03(\x0b\x32\x17.google.api.ContextRule"\x8d\x01\n\x0b\x43ontextRule\x12\x10\n\x08selector\x18\x01 \x01(\t\x12\x11\n\trequested\x18\x02 \x03(\t\x12\x10\n\x08provided\x18\x03 \x03(\t\x12"\n\x1a\x61llowed_request_extensions\x18\x04 \x03(\t\x12#\n\x1b\x61llowed_response_extensions\x18\x05 \x03(\tBn\n\x0e\x63om.google.apiB\x0c\x43ontextProtoP\x01ZEgoogle.golang.org/genproto/googleapis/api/serviceconfig;serviceconfig\xa2\x02\x04GAPIb\x06proto3', ) @@ -143,6 +143,44 @@ file=DESCRIPTOR, create_key=_descriptor._internal_create_key, ), + _descriptor.FieldDescriptor( + name="allowed_request_extensions", + full_name="google.api.ContextRule.allowed_request_extensions", + index=3, + number=4, + type=9, + cpp_type=9, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="allowed_response_extensions", + full_name="google.api.ContextRule.allowed_response_extensions", + index=4, + number=5, + type=9, + cpp_type=9, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), ], extensions=[], nested_types=[], @@ -152,8 +190,8 @@ syntax="proto3", extension_ranges=[], oneofs=[], - serialized_start=91, - serialized_end=159, + serialized_start=92, + serialized_end=233, ) _CONTEXT.fields_by_name["rules"].message_type = _CONTEXTRULE diff --git a/google/api/control.proto b/google/api/control.proto index 772d611..6eb1958 100644 --- a/google/api/control.proto +++ b/google/api/control.proto @@ -1,4 +1,4 @@ -// Copyright 2018 Google LLC. +// Copyright 2015 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -22,7 +22,6 @@ option java_outer_classname = "ControlProto"; option java_package = "com.google.api"; option objc_class_prefix = "GAPI"; - // Selects and configures the service controller used by the service. The // service controller handles features like abuse, quota, billing, logging, // monitoring, etc. diff --git a/google/api/distribution.proto b/google/api/distribution.proto index f8bb252..b079a43 100644 --- a/google/api/distribution.proto +++ b/google/api/distribution.proto @@ -1,4 +1,4 @@ -// Copyright 2019 Google LLC. +// Copyright 2015 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -11,7 +11,6 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. -// syntax = "proto3"; @@ -26,7 +25,6 @@ option java_outer_classname = "DistributionProto"; option java_package = "com.google.api"; option objc_class_prefix = "GAPI"; - // `Distribution` contains summary statistics for a population of values. It // optionally contains a histogram representing the distribution of those values // across a set of buckets. @@ -151,7 +149,7 @@ message Distribution { // Contextual information about the example value. Examples are: // - // Trace ID: type.googleapis.com/google.devtools.cloudtrace.v1.Trace + // Trace: type.googleapis.com/google.monitoring.v3.SpanContext // // Literal string: type.googleapis.com/google.protobuf.StringValue // @@ -177,7 +175,7 @@ message Distribution { // // Sum[i=1..n]((x_i - mean)^2) // - // Knuth, "The Art of Computer Programming", Vol. 2, page 323, 3rd edition + // Knuth, "The Art of Computer Programming", Vol. 2, page 232, 3rd edition // describes Welford's method for accumulating this sum in one pass. // // If `count` is zero then this field must be zero. diff --git a/google/api/documentation.proto b/google/api/documentation.proto index 03cd731..7288169 100644 --- a/google/api/documentation.proto +++ b/google/api/documentation.proto @@ -1,4 +1,4 @@ -// Copyright 2018 Google LLC. +// Copyright 2015 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -22,7 +22,6 @@ option java_outer_classname = "DocumentationProto"; option java_package = "com.google.api"; option objc_class_prefix = "GAPI"; - // `Documentation` provides the information for describing a service. // // Example: @@ -94,6 +93,12 @@ message Documentation { // The URL to the root of documentation. string documentation_root_url = 4; + // Specifies the service root url if the default one (the service name + // from the yaml file) is not suitable. This can be seen in any fully + // specified service urls as well as sections that show a base that other + // urls are relative to. + string service_root_url = 6; + // Declares a single overview page. For example: //
documentation:
   //   summary: ...
@@ -115,16 +120,16 @@ message DocumentationRule {
   // The selector is a comma-separated list of patterns. Each pattern is a
   // qualified name of the element which may end in "*", indicating a wildcard.
   // Wildcards are only allowed at the end and for a whole component of the
-  // qualified name, i.e. "foo.*" is ok, but not "foo.b*" or "foo.*.bar". To
-  // specify a default for all applicable elements, the whole pattern "*"
-  // is used.
+  // qualified name, i.e. "foo.*" is ok, but not "foo.b*" or "foo.*.bar". A
+  // wildcard will match one or more components. To specify a default for all
+  // applicable elements, the whole pattern "*" is used.
   string selector = 1;
 
   // Description of the selected API(s).
   string description = 2;
 
-  // Deprecation description of the selected element(s). It can be provided if an
-  // element is marked as `deprecated`.
+  // Deprecation description of the selected element(s). It can be provided if
+  // an element is marked as `deprecated`.
   string deprecation_description = 3;
 }
 
@@ -147,8 +152,8 @@ message Page {
   // `[Java][Tutorial.Java]`.
   string name = 1;
 
-  // The Markdown content of the page. You can use (== include {path} ==)
-  // to include content from a Markdown file.
+  // The Markdown content of the page. You can use (== include {path}
+  // ==) to include content from a Markdown file.
   string content = 2;
 
   // Subpages of this page. The order of subpages specified here will be
diff --git a/google/api/documentation_pb2.py b/google/api/documentation_pb2.py
index c9814a8..6f587a5 100644
--- a/google/api/documentation_pb2.py
+++ b/google/api/documentation_pb2.py
@@ -33,7 +33,7 @@
     syntax="proto3",
     serialized_options=b"\n\016com.google.apiB\022DocumentationProtoP\001ZEgoogle.golang.org/genproto/googleapis/api/serviceconfig;serviceconfig\242\002\004GAPI",
     create_key=_descriptor._internal_create_key,
-    serialized_pb=b'\n\x1egoogle/api/documentation.proto\x12\ngoogle.api"\xa1\x01\n\rDocumentation\x12\x0f\n\x07summary\x18\x01 \x01(\t\x12\x1f\n\x05pages\x18\x05 \x03(\x0b\x32\x10.google.api.Page\x12,\n\x05rules\x18\x03 \x03(\x0b\x32\x1d.google.api.DocumentationRule\x12\x1e\n\x16\x64ocumentation_root_url\x18\x04 \x01(\t\x12\x10\n\x08overview\x18\x02 \x01(\t"[\n\x11\x44ocumentationRule\x12\x10\n\x08selector\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x1f\n\x17\x64\x65precation_description\x18\x03 \x01(\t"I\n\x04Page\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0f\n\x07\x63ontent\x18\x02 \x01(\t\x12"\n\x08subpages\x18\x03 \x03(\x0b\x32\x10.google.api.PageBt\n\x0e\x63om.google.apiB\x12\x44ocumentationProtoP\x01ZEgoogle.golang.org/genproto/googleapis/api/serviceconfig;serviceconfig\xa2\x02\x04GAPIb\x06proto3',
+    serialized_pb=b'\n\x1egoogle/api/documentation.proto\x12\ngoogle.api"\xbb\x01\n\rDocumentation\x12\x0f\n\x07summary\x18\x01 \x01(\t\x12\x1f\n\x05pages\x18\x05 \x03(\x0b\x32\x10.google.api.Page\x12,\n\x05rules\x18\x03 \x03(\x0b\x32\x1d.google.api.DocumentationRule\x12\x1e\n\x16\x64ocumentation_root_url\x18\x04 \x01(\t\x12\x18\n\x10service_root_url\x18\x06 \x01(\t\x12\x10\n\x08overview\x18\x02 \x01(\t"[\n\x11\x44ocumentationRule\x12\x10\n\x08selector\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x1f\n\x17\x64\x65precation_description\x18\x03 \x01(\t"I\n\x04Page\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0f\n\x07\x63ontent\x18\x02 \x01(\t\x12"\n\x08subpages\x18\x03 \x03(\x0b\x32\x10.google.api.PageBt\n\x0e\x63om.google.apiB\x12\x44ocumentationProtoP\x01ZEgoogle.golang.org/genproto/googleapis/api/serviceconfig;serviceconfig\xa2\x02\x04GAPIb\x06proto3',
 )
 
 
@@ -121,10 +121,29 @@
             file=DESCRIPTOR,
             create_key=_descriptor._internal_create_key,
         ),
+        _descriptor.FieldDescriptor(
+            name="service_root_url",
+            full_name="google.api.Documentation.service_root_url",
+            index=4,
+            number=6,
+            type=9,
+            cpp_type=9,
+            label=1,
+            has_default_value=False,
+            default_value=b"".decode("utf-8"),
+            message_type=None,
+            enum_type=None,
+            containing_type=None,
+            is_extension=False,
+            extension_scope=None,
+            serialized_options=None,
+            file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
+        ),
         _descriptor.FieldDescriptor(
             name="overview",
             full_name="google.api.Documentation.overview",
-            index=4,
+            index=5,
             number=2,
             type=9,
             cpp_type=9,
@@ -150,7 +169,7 @@
     extension_ranges=[],
     oneofs=[],
     serialized_start=47,
-    serialized_end=208,
+    serialized_end=234,
 )
 
 
@@ -228,8 +247,8 @@
     syntax="proto3",
     extension_ranges=[],
     oneofs=[],
-    serialized_start=210,
-    serialized_end=301,
+    serialized_start=236,
+    serialized_end=327,
 )
 
 
@@ -307,8 +326,8 @@
     syntax="proto3",
     extension_ranges=[],
     oneofs=[],
-    serialized_start=303,
-    serialized_end=376,
+    serialized_start=329,
+    serialized_end=402,
 )
 
 _DOCUMENTATION.fields_by_name["pages"].message_type = _PAGE
diff --git a/google/api/endpoint.proto b/google/api/endpoint.proto
index c7bb13b..a434e8e 100644
--- a/google/api/endpoint.proto
+++ b/google/api/endpoint.proto
@@ -1,4 +1,4 @@
-// Copyright 2018 Google LLC.
+// Copyright 2015 Google LLC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -16,19 +16,16 @@ syntax = "proto3";
 
 package google.api;
 
-import "google/api/annotations.proto";
-
 option go_package = "google.golang.org/genproto/googleapis/api/serviceconfig;serviceconfig";
 option java_multiple_files = true;
 option java_outer_classname = "EndpointProto";
 option java_package = "com.google.api";
 option objc_class_prefix = "GAPI";
 
-
-// `Endpoint` describes a network endpoint that serves a set of APIs.
-// A service may expose any number of endpoints, and all endpoints share the
-// same service configuration, such as quota configuration and monitoring
-// configuration.
+// `Endpoint` describes a network endpoint of a service that serves a set of
+// APIs. It is commonly known as a service endpoint. A service may expose
+// any number of service endpoints, and all service endpoints share the same
+// service definition, such as quota limits and monitoring metrics.
 //
 // Example service configuration:
 //
@@ -45,20 +42,20 @@ message Endpoint {
   // The canonical name of this endpoint.
   string name = 1;
 
+  // Unimplemented. Dot not use.
+  //
   // DEPRECATED: This field is no longer supported. Instead of using aliases,
   // please specify multiple [google.api.Endpoint][google.api.Endpoint] for each of the intended
   // aliases.
   //
   // Additional names that this endpoint will be hosted on.
-  repeated string aliases = 2;
-
-  // The list of features enabled on this endpoint.
-  repeated string features = 4;
+  repeated string aliases = 2 [deprecated = true];
 
   // The specification of an Internet routable address of API frontend that will
-  // handle requests to this [API Endpoint](https://cloud.google.com/apis/design/glossary).
-  // It should be either a valid IPv4 address or a fully-qualified domain name.
-  // For example, "8.8.8.8" or "myservice.appspot.com".
+  // handle requests to this [API
+  // Endpoint](https://cloud.google.com/apis/design/glossary). It should be
+  // either a valid IPv4 address or a fully-qualified domain name. For example,
+  // "8.8.8.8" or "myservice.appspot.com".
   string target = 101;
 
   // Allowing
diff --git a/google/api/endpoint_pb2.py b/google/api/endpoint_pb2.py
index cc8ac35..52685c5 100644
--- a/google/api/endpoint_pb2.py
+++ b/google/api/endpoint_pb2.py
@@ -27,17 +27,13 @@
 _sym_db = _symbol_database.Default()
 
 
-from google.api import annotations_pb2 as google_dot_api_dot_annotations__pb2
-
-
 DESCRIPTOR = _descriptor.FileDescriptor(
     name="google/api/endpoint.proto",
     package="google.api",
     syntax="proto3",
     serialized_options=b"\n\016com.google.apiB\rEndpointProtoP\001ZEgoogle.golang.org/genproto/googleapis/api/serviceconfig;serviceconfig\242\002\004GAPI",
     create_key=_descriptor._internal_create_key,
-    serialized_pb=b'\n\x19google/api/endpoint.proto\x12\ngoogle.api\x1a\x1cgoogle/api/annotations.proto"_\n\x08\x45ndpoint\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0f\n\x07\x61liases\x18\x02 \x03(\t\x12\x10\n\x08\x66\x65\x61tures\x18\x04 \x03(\t\x12\x0e\n\x06target\x18\x65 \x01(\t\x12\x12\n\nallow_cors\x18\x05 \x01(\x08\x42o\n\x0e\x63om.google.apiB\rEndpointProtoP\x01ZEgoogle.golang.org/genproto/googleapis/api/serviceconfig;serviceconfig\xa2\x02\x04GAPIb\x06proto3',
-    dependencies=[google_dot_api_dot_annotations__pb2.DESCRIPTOR],
+    serialized_pb=b'\n\x19google/api/endpoint.proto\x12\ngoogle.api"Q\n\x08\x45ndpoint\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x13\n\x07\x61liases\x18\x02 \x03(\tB\x02\x18\x01\x12\x0e\n\x06target\x18\x65 \x01(\t\x12\x12\n\nallow_cors\x18\x05 \x01(\x08\x42o\n\x0e\x63om.google.apiB\rEndpointProtoP\x01ZEgoogle.golang.org/genproto/googleapis/api/serviceconfig;serviceconfig\xa2\x02\x04GAPIb\x06proto3',
 )
 
 
@@ -83,33 +79,14 @@
             containing_type=None,
             is_extension=False,
             extension_scope=None,
-            serialized_options=None,
-            file=DESCRIPTOR,
-            create_key=_descriptor._internal_create_key,
-        ),
-        _descriptor.FieldDescriptor(
-            name="features",
-            full_name="google.api.Endpoint.features",
-            index=2,
-            number=4,
-            type=9,
-            cpp_type=9,
-            label=3,
-            has_default_value=False,
-            default_value=[],
-            message_type=None,
-            enum_type=None,
-            containing_type=None,
-            is_extension=False,
-            extension_scope=None,
-            serialized_options=None,
+            serialized_options=b"\030\001",
             file=DESCRIPTOR,
             create_key=_descriptor._internal_create_key,
         ),
         _descriptor.FieldDescriptor(
             name="target",
             full_name="google.api.Endpoint.target",
-            index=3,
+            index=2,
             number=101,
             type=9,
             cpp_type=9,
@@ -128,7 +105,7 @@
         _descriptor.FieldDescriptor(
             name="allow_cors",
             full_name="google.api.Endpoint.allow_cors",
-            index=4,
+            index=3,
             number=5,
             type=8,
             cpp_type=7,
@@ -153,8 +130,8 @@
     syntax="proto3",
     extension_ranges=[],
     oneofs=[],
-    serialized_start=71,
-    serialized_end=166,
+    serialized_start=41,
+    serialized_end=122,
 )
 
 DESCRIPTOR.message_types_by_name["Endpoint"] = _ENDPOINT
@@ -173,4 +150,5 @@
 
 
 DESCRIPTOR._options = None
+_ENDPOINT.fields_by_name["aliases"]._options = None
 # @@protoc_insertion_point(module_scope)
diff --git a/google/api/error_reason.proto b/google/api/error_reason.proto
new file mode 100644
index 0000000..393c808
--- /dev/null
+++ b/google/api/error_reason.proto
@@ -0,0 +1,397 @@
+// Copyright 2020 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+syntax = "proto3";
+
+package google.api;
+
+option go_package = "google.golang.org/genproto/googleapis/api/error_reason;error_reason";
+option java_multiple_files = true;
+option java_outer_classname = "ErrorReasonProto";
+option java_package = "com.google.api";
+option objc_class_prefix = "GAPI";
+
+// Defines the supported values for `google.rpc.ErrorInfo.reason` for the
+// `googleapis.com` error domain. This error domain is reserved for [Service
+// Infrastructure](https://cloud.google.com/service-infrastructure/docs/overview).
+// For each error info of this domain, the metadata key "service" refers to the
+// logical identifier of an API service, such as "pubsub.googleapis.com". The
+// "consumer" refers to the entity that consumes an API Service. It typically is
+// a Google project that owns the client application or the server resource,
+// such as "projects/123". Other metadata keys are specific to each error
+// reason. For more information, see the definition of the specific error
+// reason.
+enum ErrorReason {
+  // Do not use this default value.
+  ERROR_REASON_UNSPECIFIED = 0;
+
+  // The request is calling a disabled service for a consumer.
+  //
+  // Example of an ErrorInfo when the consumer "projects/123" contacting
+  // "pubsub.googleapis.com" service which is disabled:
+  //
+  //     { "reason": "SERVICE_DISABLED",
+  //       "domain": "googleapis.com",
+  //       "metadata": {
+  //         "consumer": "projects/123",
+  //         "service": "pubsub.googleapis.com"
+  //       }
+  //     }
+  //
+  // This response indicates the "pubsub.googleapis.com" has been disabled in
+  // "projects/123".
+  SERVICE_DISABLED = 1;
+
+  // The request whose associated billing account is disabled.
+  //
+  // Example of an ErrorInfo when the consumer "projects/123" fails to contact
+  // "pubsub.googleapis.com" service because the associated billing account is
+  // disabled:
+  //
+  //     { "reason": "BILLING_DISABLED",
+  //       "domain": "googleapis.com",
+  //       "metadata": {
+  //         "consumer": "projects/123",
+  //         "service": "pubsub.googleapis.com"
+  //       }
+  //     }
+  //
+  // This response indicates the billing account associated has been disabled.
+  BILLING_DISABLED = 2;
+
+  // The request is denied because the provided [API
+  // key](https://cloud.google.com/docs/authentication/api-keys) is invalid. It
+  // may be in a bad format, cannot be found, or has been expired).
+  //
+  // Example of an ErrorInfo when the request is contacting
+  // "storage.googleapis.com" service with an invalid API key:
+  //
+  //     { "reason": "API_KEY_INVALID",
+  //       "domain": "googleapis.com",
+  //       "metadata": {
+  //         "service": "storage.googleapis.com",
+  //       }
+  //     }
+  API_KEY_INVALID = 3;
+
+  // The request is denied because it violates [API key API
+  // restrictions](https://cloud.google.com/docs/authentication/api-keys#adding_api_restrictions).
+  //
+  // Example of an ErrorInfo when the consumer "projects/123" fails to call the
+  // "storage.googleapis.com" service because this service is restricted in the
+  // API key:
+  //
+  //     { "reason": "API_KEY_SERVICE_BLOCKED",
+  //       "domain": "googleapis.com",
+  //       "metadata": {
+  //         "consumer": "projects/123",
+  //         "service": "storage.googleapis.com"
+  //       }
+  //     }
+  API_KEY_SERVICE_BLOCKED = 4;
+
+  // The request is denied because it violates [API key HTTP
+  // restrictions](https://cloud.google.com/docs/authentication/api-keys#adding_http_restrictions).
+  //
+  // Example of an ErrorInfo when the consumer "projects/123" fails to call
+  // "storage.googleapis.com" service because the http referrer of the request
+  // violates API key HTTP restrictions:
+  //
+  //     { "reason": "API_KEY_HTTP_REFERRER_BLOCKED",
+  //       "domain": "googleapis.com",
+  //       "metadata": {
+  //         "consumer": "projects/123",
+  //         "service": "storage.googleapis.com",
+  //       }
+  //     }
+  API_KEY_HTTP_REFERRER_BLOCKED = 7;
+
+  // The request is denied because it violates [API key IP address
+  // restrictions](https://cloud.google.com/docs/authentication/api-keys#adding_application_restrictions).
+  //
+  // Example of an ErrorInfo when the consumer "projects/123" fails to call
+  // "storage.googleapis.com" service because the caller IP of the request
+  // violates API key IP address restrictions:
+  //
+  //     { "reason": "API_KEY_IP_ADDRESS_BLOCKED",
+  //       "domain": "googleapis.com",
+  //       "metadata": {
+  //         "consumer": "projects/123",
+  //         "service": "storage.googleapis.com",
+  //       }
+  //     }
+  API_KEY_IP_ADDRESS_BLOCKED = 8;
+
+  // The request is denied because it violates [API key Android application
+  // restrictions](https://cloud.google.com/docs/authentication/api-keys#adding_application_restrictions).
+  //
+  // Example of an ErrorInfo when the consumer "projects/123" fails to call
+  // "storage.googleapis.com" service because the request from the Android apps
+  // violates the API key Android application restrictions:
+  //
+  //     { "reason": "API_KEY_ANDROID_APP_BLOCKED",
+  //       "domain": "googleapis.com",
+  //       "metadata": {
+  //         "consumer": "projects/123",
+  //         "service": "storage.googleapis.com"
+  //       }
+  //     }
+  API_KEY_ANDROID_APP_BLOCKED = 9;
+
+  // The request is denied because it violates [API key iOS application
+  // restrictions](https://cloud.google.com/docs/authentication/api-keys#adding_application_restrictions).
+  //
+  // Example of an ErrorInfo when the consumer "projects/123" fails to call
+  // "storage.googleapis.com" service because the request from the iOS apps
+  // violates the API key iOS application restrictions:
+  //
+  //     { "reason": "API_KEY_IOS_APP_BLOCKED",
+  //       "domain": "googleapis.com",
+  //       "metadata": {
+  //         "consumer": "projects/123",
+  //         "service": "storage.googleapis.com"
+  //       }
+  //     }
+  API_KEY_IOS_APP_BLOCKED = 13;
+
+  // The request is denied because there is not enough rate quota for the
+  // consumer.
+  //
+  // Example of an ErrorInfo when the consumer "projects/123" fails to contact
+  // "pubsub.googleapis.com" service because consumer's rate quota usage has
+  // reached the maximum value set for the quota limit
+  // "ReadsPerMinutePerProject" on the quota metric
+  // "pubsub.googleapis.com/read_requests":
+  //
+  //     { "reason": "RATE_LIMIT_EXCEEDED",
+  //       "domain": "googleapis.com",
+  //       "metadata": {
+  //         "consumer": "projects/123",
+  //         "service": "pubsub.googleapis.com",
+  //         "quota_metric": "pubsub.googleapis.com/read_requests",
+  //         "quota_limit": "ReadsPerMinutePerProject"
+  //       }
+  //     }
+  //
+  // Example of an ErrorInfo when the consumer "projects/123" checks quota on
+  // the service "dataflow.googleapis.com" and hits the organization quota
+  // limit "DefaultRequestsPerMinutePerOrganization" on the metric
+  // "dataflow.googleapis.com/default_requests".
+  //
+  //     { "reason": "RATE_LIMIT_EXCEEDED",
+  //       "domain": "googleapis.com",
+  //       "metadata": {
+  //         "consumer": "projects/123",
+  //         "service": "dataflow.googleapis.com",
+  //         "quota_metric": "dataflow.googleapis.com/default_requests",
+  //         "quota_limit": "DefaultRequestsPerMinutePerOrganization"
+  //       }
+  //     }
+  RATE_LIMIT_EXCEEDED = 5;
+
+  // The request is denied because there is not enough resource quota for the
+  // consumer.
+  //
+  // Example of an ErrorInfo when the consumer "projects/123" fails to contact
+  // "compute.googleapis.com" service because consumer's resource quota usage
+  // has reached the maximum value set for the quota limit "VMsPerProject"
+  // on the quota metric "compute.googleapis.com/vms":
+  //
+  //     { "reason": "RESOURCE_QUOTA_EXCEEDED",
+  //       "domain": "googleapis.com",
+  //       "metadata": {
+  //         "consumer": "projects/123",
+  //         "service": "compute.googleapis.com",
+  //         "quota_metric": "compute.googleapis.com/vms",
+  //         "quota_limit": "VMsPerProject"
+  //       }
+  //     }
+  //
+  // Example of an ErrorInfo when the consumer "projects/123" checks resource
+  // quota on the service "dataflow.googleapis.com" and hits the organization
+  // quota limit "jobs-per-organization" on the metric
+  // "dataflow.googleapis.com/job_count".
+  //
+  //     { "reason": "RESOURCE_QUOTA_EXCEEDED",
+  //       "domain": "googleapis.com",
+  //       "metadata": {
+  //         "consumer": "projects/123",
+  //         "service": "dataflow.googleapis.com",
+  //         "quota_metric": "dataflow.googleapis.com/job_count",
+  //         "quota_limit": "jobs-per-organization"
+  //       }
+  //     }
+  RESOURCE_QUOTA_EXCEEDED = 6;
+
+  // The request whose associated billing account address is in a tax restricted
+  // location, violates the local tax restrictions when creating resources in
+  // the restricted region.
+  //
+  // Example of an ErrorInfo when creating the Cloud Storage Bucket in the
+  // container "projects/123" under a tax restricted region
+  // "locations/asia-northeast3":
+  //
+  //     { "reason": "LOCATION_TAX_POLICY_VIOLATED",
+  //       "domain": "googleapis.com",
+  //       "metadata": {
+  //         "consumer": "projects/123",
+  //         "service": "storage.googleapis.com",
+  //         "location": "locations/asia-northeast3"
+  //       }
+  //     }
+  //
+  // This response indicates creating the Cloud Storage Bucket in
+  // "locations/asia-northeast3" violates the location tax restriction.
+  LOCATION_TAX_POLICY_VIOLATED = 10;
+
+  // The request is denied because the caller does not have required permission
+  // on the user project "projects/123" or the user project is invalid. For more
+  // information, check the [userProject System
+  // Parameters](https://cloud.google.com/apis/docs/system-parameters).
+  //
+  // Example of an ErrorInfo when the caller is calling Cloud Storage service
+  // with insufficient permissions on the user project:
+  //
+  //     { "reason": "USER_PROJECT_DENIED",
+  //       "domain": "googleapis.com",
+  //       "metadata": {
+  //         "consumer": "projects/123",
+  //         "service": "storage.googleapis.com"
+  //       }
+  //     }
+  USER_PROJECT_DENIED = 11;
+
+  // The request is denied because the consumer "projects/123" is suspended due
+  // to Terms of Service(Tos) violations. Check [Project suspension
+  // guidelines](https://cloud.google.com/resource-manager/docs/project-suspension-guidelines)
+  // for more information.
+  //
+  // Example of an ErrorInfo when calling Cloud Storage service with the
+  // suspended consumer "projects/123":
+  //
+  //     { "reason": "CONSUMER_SUSPENDED",
+  //       "domain": "googleapis.com",
+  //       "metadata": {
+  //         "consumer": "projects/123",
+  //         "service": "storage.googleapis.com"
+  //       }
+  //     }
+  CONSUMER_SUSPENDED = 12;
+
+  // The request is denied because the associated consumer is invalid. It may be
+  // in a bad format, cannot be found, or have been deleted.
+  //
+  // Example of an ErrorInfo when calling Cloud Storage service with the
+  // invalid consumer "projects/123":
+  //
+  //     { "reason": "CONSUMER_INVALID",
+  //       "domain": "googleapis.com",
+  //       "metadata": {
+  //         "consumer": "projects/123",
+  //         "service": "storage.googleapis.com"
+  //       }
+  //     }
+  CONSUMER_INVALID = 14;
+
+  // The request is denied because it violates [VPC Service
+  // Controls](https://cloud.google.com/vpc-service-controls/docs/overview).
+  // The 'uid' field is a random generated identifier that customer can use it
+  // to search the audit log for a request rejected by VPC Service Controls. For
+  // more information, please refer [VPC Service Controls
+  // Troubleshooting](https://cloud.google.com/vpc-service-controls/docs/troubleshooting#unique-id)
+  //
+  // Example of an ErrorInfo when the consumer "projects/123" fails to call
+  // Cloud Storage service because the request is prohibited by the VPC Service
+  // Controls.
+  //
+  //     { "reason": "SECURITY_POLICY_VIOLATED",
+  //       "domain": "googleapis.com",
+  //       "metadata": {
+  //         "uid": "123456789abcde",
+  //         "consumer": "projects/123",
+  //         "service": "storage.googleapis.com"
+  //       }
+  //     }
+  SECURITY_POLICY_VIOLATED = 15;
+
+  // The request is denied because the provided access token has expired.
+  //
+  // Example of an ErrorInfo when the request is calling Cloud Storage service
+  // with an expired access token:
+  //
+  //     { "reason": "ACCESS_TOKEN_EXPIRED",
+  //       "domain": "googleapis.com",
+  //       "metadata": {
+  //         "service": "storage.googleapis.com",
+  //         "method": "google.storage.v1.Storage.GetObject"
+  //       }
+  //     }
+  ACCESS_TOKEN_EXPIRED = 16;
+
+  // The request is denied because the provided access token doesn't have at
+  // least one of the acceptable scopes required for the API. Please check
+  // [OAuth 2.0 Scopes for Google
+  // APIs](https://developers.google.com/identity/protocols/oauth2/scopes) for
+  // the list of the OAuth 2.0 scopes that you might need to request to access
+  // the API.
+  //
+  // Example of an ErrorInfo when the request is calling Cloud Storage service
+  // with an access token that is missing required scopes:
+  //
+  //     { "reason": "ACCESS_TOKEN_SCOPE_INSUFFICIENT",
+  //       "domain": "googleapis.com",
+  //       "metadata": {
+  //         "service": "storage.googleapis.com",
+  //         "method": "google.storage.v1.Storage.GetObject"
+  //       }
+  //     }
+  ACCESS_TOKEN_SCOPE_INSUFFICIENT = 17;
+
+  // The request is denied because the account associated with the provided
+  // access token is in an invalid state, such as disabled or deleted.
+  // For more information, see https://cloud.google.com/docs/authentication.
+  //
+  // Warning: For privacy reasons, the server may not be able to disclose the
+  // email address for some accounts. The client MUST NOT depend on the
+  // availability of the `email` attribute.
+  //
+  // Example of an ErrorInfo when the request is to the Cloud Storage API with
+  // an access token that is associated with a disabled or deleted [service
+  // account](http://cloud/iam/docs/service-accounts):
+  //
+  //     { "reason": "ACCOUNT_STATE_INVALID",
+  //       "domain": "googleapis.com",
+  //       "metadata": {
+  //         "service": "storage.googleapis.com",
+  //         "method": "google.storage.v1.Storage.GetObject",
+  //         "email": "user@123.iam.gserviceaccount.com"
+  //       }
+  //     }
+  ACCOUNT_STATE_INVALID = 18;
+
+  // The request is denied because the type of the provided access token is not
+  // supported by the API being called.
+  //
+  // Example of an ErrorInfo when the request is to the Cloud Storage API with
+  // an unsupported token type.
+  //
+  //     { "reason": "ACCESS_TOKEN_TYPE_UNSUPPORTED",
+  //       "domain": "googleapis.com",
+  //       "metadata": {
+  //         "service": "storage.googleapis.com",
+  //         "method": "google.storage.v1.Storage.GetObject"
+  //       }
+  //     }
+  ACCESS_TOKEN_TYPE_UNSUPPORTED = 19;
+}
diff --git a/google/api/error_reason_pb2.py b/google/api/error_reason_pb2.py
new file mode 100644
index 0000000..3c2b534
--- /dev/null
+++ b/google/api/error_reason_pb2.py
@@ -0,0 +1,243 @@
+# -*- coding: utf-8 -*-
+
+# Copyright 2020 Google LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: google/api/error_reason.proto
+"""Generated protocol buffer code."""
+from google.protobuf.internal import enum_type_wrapper
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+    name="google/api/error_reason.proto",
+    package="google.api",
+    syntax="proto3",
+    serialized_options=b"\n\016com.google.apiB\020ErrorReasonProtoP\001ZCgoogle.golang.org/genproto/googleapis/api/error_reason;error_reason\242\002\004GAPI",
+    create_key=_descriptor._internal_create_key,
+    serialized_pb=b"\n\x1dgoogle/api/error_reason.proto\x12\ngoogle.api*\xc4\x04\n\x0b\x45rrorReason\x12\x1c\n\x18\x45RROR_REASON_UNSPECIFIED\x10\x00\x12\x14\n\x10SERVICE_DISABLED\x10\x01\x12\x14\n\x10\x42ILLING_DISABLED\x10\x02\x12\x13\n\x0f\x41PI_KEY_INVALID\x10\x03\x12\x1b\n\x17\x41PI_KEY_SERVICE_BLOCKED\x10\x04\x12!\n\x1d\x41PI_KEY_HTTP_REFERRER_BLOCKED\x10\x07\x12\x1e\n\x1a\x41PI_KEY_IP_ADDRESS_BLOCKED\x10\x08\x12\x1f\n\x1b\x41PI_KEY_ANDROID_APP_BLOCKED\x10\t\x12\x1b\n\x17\x41PI_KEY_IOS_APP_BLOCKED\x10\r\x12\x17\n\x13RATE_LIMIT_EXCEEDED\x10\x05\x12\x1b\n\x17RESOURCE_QUOTA_EXCEEDED\x10\x06\x12 \n\x1cLOCATION_TAX_POLICY_VIOLATED\x10\n\x12\x17\n\x13USER_PROJECT_DENIED\x10\x0b\x12\x16\n\x12\x43ONSUMER_SUSPENDED\x10\x0c\x12\x14\n\x10\x43ONSUMER_INVALID\x10\x0e\x12\x1c\n\x18SECURITY_POLICY_VIOLATED\x10\x0f\x12\x18\n\x14\x41\x43\x43\x45SS_TOKEN_EXPIRED\x10\x10\x12#\n\x1f\x41\x43\x43\x45SS_TOKEN_SCOPE_INSUFFICIENT\x10\x11\x12\x19\n\x15\x41\x43\x43OUNT_STATE_INVALID\x10\x12\x12!\n\x1d\x41\x43\x43\x45SS_TOKEN_TYPE_UNSUPPORTED\x10\x13\x42p\n\x0e\x63om.google.apiB\x10\x45rrorReasonProtoP\x01ZCgoogle.golang.org/genproto/googleapis/api/error_reason;error_reason\xa2\x02\x04GAPIb\x06proto3",
+)
+
+_ERRORREASON = _descriptor.EnumDescriptor(
+    name="ErrorReason",
+    full_name="google.api.ErrorReason",
+    filename=None,
+    file=DESCRIPTOR,
+    create_key=_descriptor._internal_create_key,
+    values=[
+        _descriptor.EnumValueDescriptor(
+            name="ERROR_REASON_UNSPECIFIED",
+            index=0,
+            number=0,
+            serialized_options=None,
+            type=None,
+            create_key=_descriptor._internal_create_key,
+        ),
+        _descriptor.EnumValueDescriptor(
+            name="SERVICE_DISABLED",
+            index=1,
+            number=1,
+            serialized_options=None,
+            type=None,
+            create_key=_descriptor._internal_create_key,
+        ),
+        _descriptor.EnumValueDescriptor(
+            name="BILLING_DISABLED",
+            index=2,
+            number=2,
+            serialized_options=None,
+            type=None,
+            create_key=_descriptor._internal_create_key,
+        ),
+        _descriptor.EnumValueDescriptor(
+            name="API_KEY_INVALID",
+            index=3,
+            number=3,
+            serialized_options=None,
+            type=None,
+            create_key=_descriptor._internal_create_key,
+        ),
+        _descriptor.EnumValueDescriptor(
+            name="API_KEY_SERVICE_BLOCKED",
+            index=4,
+            number=4,
+            serialized_options=None,
+            type=None,
+            create_key=_descriptor._internal_create_key,
+        ),
+        _descriptor.EnumValueDescriptor(
+            name="API_KEY_HTTP_REFERRER_BLOCKED",
+            index=5,
+            number=7,
+            serialized_options=None,
+            type=None,
+            create_key=_descriptor._internal_create_key,
+        ),
+        _descriptor.EnumValueDescriptor(
+            name="API_KEY_IP_ADDRESS_BLOCKED",
+            index=6,
+            number=8,
+            serialized_options=None,
+            type=None,
+            create_key=_descriptor._internal_create_key,
+        ),
+        _descriptor.EnumValueDescriptor(
+            name="API_KEY_ANDROID_APP_BLOCKED",
+            index=7,
+            number=9,
+            serialized_options=None,
+            type=None,
+            create_key=_descriptor._internal_create_key,
+        ),
+        _descriptor.EnumValueDescriptor(
+            name="API_KEY_IOS_APP_BLOCKED",
+            index=8,
+            number=13,
+            serialized_options=None,
+            type=None,
+            create_key=_descriptor._internal_create_key,
+        ),
+        _descriptor.EnumValueDescriptor(
+            name="RATE_LIMIT_EXCEEDED",
+            index=9,
+            number=5,
+            serialized_options=None,
+            type=None,
+            create_key=_descriptor._internal_create_key,
+        ),
+        _descriptor.EnumValueDescriptor(
+            name="RESOURCE_QUOTA_EXCEEDED",
+            index=10,
+            number=6,
+            serialized_options=None,
+            type=None,
+            create_key=_descriptor._internal_create_key,
+        ),
+        _descriptor.EnumValueDescriptor(
+            name="LOCATION_TAX_POLICY_VIOLATED",
+            index=11,
+            number=10,
+            serialized_options=None,
+            type=None,
+            create_key=_descriptor._internal_create_key,
+        ),
+        _descriptor.EnumValueDescriptor(
+            name="USER_PROJECT_DENIED",
+            index=12,
+            number=11,
+            serialized_options=None,
+            type=None,
+            create_key=_descriptor._internal_create_key,
+        ),
+        _descriptor.EnumValueDescriptor(
+            name="CONSUMER_SUSPENDED",
+            index=13,
+            number=12,
+            serialized_options=None,
+            type=None,
+            create_key=_descriptor._internal_create_key,
+        ),
+        _descriptor.EnumValueDescriptor(
+            name="CONSUMER_INVALID",
+            index=14,
+            number=14,
+            serialized_options=None,
+            type=None,
+            create_key=_descriptor._internal_create_key,
+        ),
+        _descriptor.EnumValueDescriptor(
+            name="SECURITY_POLICY_VIOLATED",
+            index=15,
+            number=15,
+            serialized_options=None,
+            type=None,
+            create_key=_descriptor._internal_create_key,
+        ),
+        _descriptor.EnumValueDescriptor(
+            name="ACCESS_TOKEN_EXPIRED",
+            index=16,
+            number=16,
+            serialized_options=None,
+            type=None,
+            create_key=_descriptor._internal_create_key,
+        ),
+        _descriptor.EnumValueDescriptor(
+            name="ACCESS_TOKEN_SCOPE_INSUFFICIENT",
+            index=17,
+            number=17,
+            serialized_options=None,
+            type=None,
+            create_key=_descriptor._internal_create_key,
+        ),
+        _descriptor.EnumValueDescriptor(
+            name="ACCOUNT_STATE_INVALID",
+            index=18,
+            number=18,
+            serialized_options=None,
+            type=None,
+            create_key=_descriptor._internal_create_key,
+        ),
+        _descriptor.EnumValueDescriptor(
+            name="ACCESS_TOKEN_TYPE_UNSUPPORTED",
+            index=19,
+            number=19,
+            serialized_options=None,
+            type=None,
+            create_key=_descriptor._internal_create_key,
+        ),
+    ],
+    containing_type=None,
+    serialized_options=None,
+    serialized_start=46,
+    serialized_end=626,
+)
+_sym_db.RegisterEnumDescriptor(_ERRORREASON)
+
+ErrorReason = enum_type_wrapper.EnumTypeWrapper(_ERRORREASON)
+ERROR_REASON_UNSPECIFIED = 0
+SERVICE_DISABLED = 1
+BILLING_DISABLED = 2
+API_KEY_INVALID = 3
+API_KEY_SERVICE_BLOCKED = 4
+API_KEY_HTTP_REFERRER_BLOCKED = 7
+API_KEY_IP_ADDRESS_BLOCKED = 8
+API_KEY_ANDROID_APP_BLOCKED = 9
+API_KEY_IOS_APP_BLOCKED = 13
+RATE_LIMIT_EXCEEDED = 5
+RESOURCE_QUOTA_EXCEEDED = 6
+LOCATION_TAX_POLICY_VIOLATED = 10
+USER_PROJECT_DENIED = 11
+CONSUMER_SUSPENDED = 12
+CONSUMER_INVALID = 14
+SECURITY_POLICY_VIOLATED = 15
+ACCESS_TOKEN_EXPIRED = 16
+ACCESS_TOKEN_SCOPE_INSUFFICIENT = 17
+ACCOUNT_STATE_INVALID = 18
+ACCESS_TOKEN_TYPE_UNSUPPORTED = 19
+
+
+DESCRIPTOR.enum_types_by_name["ErrorReason"] = _ERRORREASON
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+
+DESCRIPTOR._options = None
+# @@protoc_insertion_point(module_scope)
diff --git a/google/api/field_behavior.proto b/google/api/field_behavior.proto
index 6866679..c4abe3b 100644
--- a/google/api/field_behavior.proto
+++ b/google/api/field_behavior.proto
@@ -1,4 +1,4 @@
-// Copyright 2020 Google LLC
+// Copyright 2018 Google LLC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -78,7 +78,13 @@ enum FieldBehavior {
 
   // Denotes that a (repeated) field is an unordered list.
   // This indicates that the service may provide the elements of the list
-  // in any arbitrary order, rather than the order the user originally
+  // in any arbitrary  order, rather than the order the user originally
   // provided. Additionally, the list's order may or may not be stable.
   UNORDERED_LIST = 6;
+
+  // Denotes that this field returns a non-empty default value if not set.
+  // This indicates that if the user provides the empty value in a request,
+  // a non-empty value will be returned. The user will not be aware of what
+  // non-empty value to expect.
+  NON_EMPTY_DEFAULT = 7;
 }
diff --git a/google/api/field_behavior_pb2.py b/google/api/field_behavior_pb2.py
index e6d7acc..a0794ad 100644
--- a/google/api/field_behavior_pb2.py
+++ b/google/api/field_behavior_pb2.py
@@ -37,7 +37,7 @@
     syntax="proto3",
     serialized_options=b"\n\016com.google.apiB\022FieldBehaviorProtoP\001ZAgoogle.golang.org/genproto/googleapis/api/annotations;annotations\242\002\004GAPI",
     create_key=_descriptor._internal_create_key,
-    serialized_pb=b"\n\x1fgoogle/api/field_behavior.proto\x12\ngoogle.api\x1a google/protobuf/descriptor.proto*\x8f\x01\n\rFieldBehavior\x12\x1e\n\x1a\x46IELD_BEHAVIOR_UNSPECIFIED\x10\x00\x12\x0c\n\x08OPTIONAL\x10\x01\x12\x0c\n\x08REQUIRED\x10\x02\x12\x0f\n\x0bOUTPUT_ONLY\x10\x03\x12\x0e\n\nINPUT_ONLY\x10\x04\x12\r\n\tIMMUTABLE\x10\x05\x12\x12\n\x0eUNORDERED_LIST\x10\x06:Q\n\x0e\x66ield_behavior\x12\x1d.google.protobuf.FieldOptions\x18\x9c\x08 \x03(\x0e\x32\x19.google.api.FieldBehaviorBp\n\x0e\x63om.google.apiB\x12\x46ieldBehaviorProtoP\x01ZAgoogle.golang.org/genproto/googleapis/api/annotations;annotations\xa2\x02\x04GAPIb\x06proto3",
+    serialized_pb=b"\n\x1fgoogle/api/field_behavior.proto\x12\ngoogle.api\x1a google/protobuf/descriptor.proto*\xa6\x01\n\rFieldBehavior\x12\x1e\n\x1a\x46IELD_BEHAVIOR_UNSPECIFIED\x10\x00\x12\x0c\n\x08OPTIONAL\x10\x01\x12\x0c\n\x08REQUIRED\x10\x02\x12\x0f\n\x0bOUTPUT_ONLY\x10\x03\x12\x0e\n\nINPUT_ONLY\x10\x04\x12\r\n\tIMMUTABLE\x10\x05\x12\x12\n\x0eUNORDERED_LIST\x10\x06\x12\x15\n\x11NON_EMPTY_DEFAULT\x10\x07:Q\n\x0e\x66ield_behavior\x12\x1d.google.protobuf.FieldOptions\x18\x9c\x08 \x03(\x0e\x32\x19.google.api.FieldBehaviorBp\n\x0e\x63om.google.apiB\x12\x46ieldBehaviorProtoP\x01ZAgoogle.golang.org/genproto/googleapis/api/annotations;annotations\xa2\x02\x04GAPIb\x06proto3",
     dependencies=[google_dot_protobuf_dot_descriptor__pb2.DESCRIPTOR],
 )
 
@@ -104,11 +104,19 @@
             type=None,
             create_key=_descriptor._internal_create_key,
         ),
+        _descriptor.EnumValueDescriptor(
+            name="NON_EMPTY_DEFAULT",
+            index=7,
+            number=7,
+            serialized_options=None,
+            type=None,
+            create_key=_descriptor._internal_create_key,
+        ),
     ],
     containing_type=None,
     serialized_options=None,
     serialized_start=82,
-    serialized_end=225,
+    serialized_end=248,
 )
 _sym_db.RegisterEnumDescriptor(_FIELDBEHAVIOR)
 
@@ -120,6 +128,7 @@
 INPUT_ONLY = 4
 IMMUTABLE = 5
 UNORDERED_LIST = 6
+NON_EMPTY_DEFAULT = 7
 
 FIELD_BEHAVIOR_FIELD_NUMBER = 1052
 field_behavior = _descriptor.FieldDescriptor(
diff --git a/google/api/http.proto b/google/api/http.proto
index 2bd3a19..113fa93 100644
--- a/google/api/http.proto
+++ b/google/api/http.proto
@@ -1,4 +1,4 @@
-// Copyright 2018 Google LLC
+// Copyright 2015 Google LLC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -23,7 +23,6 @@ option java_outer_classname = "HttpProto";
 option java_package = "com.google.api";
 option objc_class_prefix = "GAPI";
 
-
 // Defines the HTTP configuration for an API service. It contains a list of
 // [HttpRule][google.api.HttpRule], each specifying the mapping of an RPC method
 // to one or more HTTP REST API methods.
@@ -33,7 +32,7 @@ message Http {
   // **NOTE:** All service configuration rules follow "last one wins" order.
   repeated HttpRule rules = 1;
 
-  // When set to true, URL path parmeters will be fully URI-decoded except in
+  // When set to true, URL path parameters will be fully URI-decoded except in
   // cases of single segment matches in reserved expansion, where "%2F" will be
   // left encoded.
   //
@@ -42,94 +41,94 @@ message Http {
   bool fully_decode_reserved_expansion = 2;
 }
 
-// `HttpRule` defines the mapping of an RPC method to one or more HTTP
-// REST API methods. The mapping specifies how different portions of the RPC
-// request message are mapped to URL path, URL query parameters, and
-// HTTP request body. The mapping is typically specified as an
-// `google.api.http` annotation on the RPC method,
-// see "google/api/annotations.proto" for details.
-//
-// The mapping consists of a field specifying the path template and
-// method kind.  The path template can refer to fields in the request
-// message, as in the example below which describes a REST GET
-// operation on a resource collection of messages:
-//
+// # gRPC Transcoding
+//
+// gRPC Transcoding is a feature for mapping between a gRPC method and one or
+// more HTTP REST endpoints. It allows developers to build a single API service
+// that supports both gRPC APIs and REST APIs. Many systems, including [Google
+// APIs](https://github.com/googleapis/googleapis),
+// [Cloud Endpoints](https://cloud.google.com/endpoints), [gRPC
+// Gateway](https://github.com/grpc-ecosystem/grpc-gateway),
+// and [Envoy](https://github.com/envoyproxy/envoy) proxy support this feature
+// and use it for large scale production services.
+//
+// `HttpRule` defines the schema of the gRPC/REST mapping. The mapping specifies
+// how different portions of the gRPC request message are mapped to the URL
+// path, URL query parameters, and HTTP request body. It also controls how the
+// gRPC response message is mapped to the HTTP response body. `HttpRule` is
+// typically specified as an `google.api.http` annotation on the gRPC method.
+//
+// Each mapping specifies a URL path template and an HTTP method. The path
+// template may refer to one or more fields in the gRPC request message, as long
+// as each field is a non-repeated field with a primitive (non-message) type.
+// The path template controls how fields of the request message are mapped to
+// the URL path.
+//
+// Example:
 //
 //     service Messaging {
 //       rpc GetMessage(GetMessageRequest) returns (Message) {
-//         option (google.api.http).get = "/v1/messages/{message_id}/{sub.subfield}";
+//         option (google.api.http) = {
+//             get: "/v1/{name=messages/*}"
+//         };
 //       }
 //     }
 //     message GetMessageRequest {
-//       message SubMessage {
-//         string subfield = 1;
-//       }
-//       string message_id = 1; // mapped to the URL
-//       SubMessage sub = 2;    // `sub.subfield` is url-mapped
+//       string name = 1; // Mapped to URL path.
 //     }
 //     message Message {
-//       string text = 1; // content of the resource
+//       string text = 1; // The resource content.
 //     }
 //
-// The same http annotation can alternatively be expressed inside the
-// `GRPC API Configuration` YAML file.
+// This enables an HTTP REST to gRPC mapping as below:
 //
-//     http:
-//       rules:
-//         - selector: .Messaging.GetMessage
-//           get: /v1/messages/{message_id}/{sub.subfield}
-//
-// This definition enables an automatic, bidrectional mapping of HTTP
-// JSON to RPC. Example:
-//
-// HTTP | RPC
+// HTTP | gRPC
 // -----|-----
-// `GET /v1/messages/123456/foo`  | `GetMessage(message_id: "123456" sub: SubMessage(subfield: "foo"))`
-//
-// In general, not only fields but also field paths can be referenced
-// from a path pattern. Fields mapped to the path pattern cannot be
-// repeated and must have a primitive (non-message) type.
-//
-// Any fields in the request message which are not bound by the path
-// pattern automatically become (optional) HTTP query
-// parameters. Assume the following definition of the request message:
+// `GET /v1/messages/123456`  | `GetMessage(name: "messages/123456")`
 //
+// Any fields in the request message which are not bound by the path template
+// automatically become HTTP query parameters if there is no HTTP request body.
+// For example:
 //
 //     service Messaging {
 //       rpc GetMessage(GetMessageRequest) returns (Message) {
-//         option (google.api.http).get = "/v1/messages/{message_id}";
+//         option (google.api.http) = {
+//             get:"/v1/messages/{message_id}"
+//         };
 //       }
 //     }
 //     message GetMessageRequest {
 //       message SubMessage {
 //         string subfield = 1;
 //       }
-//       string message_id = 1; // mapped to the URL
-//       int64 revision = 2;    // becomes a parameter
-//       SubMessage sub = 3;    // `sub.subfield` becomes a parameter
+//       string message_id = 1; // Mapped to URL path.
+//       int64 revision = 2;    // Mapped to URL query parameter `revision`.
+//       SubMessage sub = 3;    // Mapped to URL query parameter `sub.subfield`.
 //     }
 //
-//
 // This enables a HTTP JSON to RPC mapping as below:
 //
-// HTTP | RPC
+// HTTP | gRPC
 // -----|-----
-// `GET /v1/messages/123456?revision=2&sub.subfield=foo` | `GetMessage(message_id: "123456" revision: 2 sub: SubMessage(subfield: "foo"))`
-//
-// Note that fields which are mapped to HTTP parameters must have a
-// primitive type or a repeated primitive type. Message types are not
-// allowed. In the case of a repeated type, the parameter can be
-// repeated in the URL, as in `...?param=A¶m=B`.
-//
-// For HTTP method kinds which allow a request body, the `body` field
+// `GET /v1/messages/123456?revision=2&sub.subfield=foo` |
+// `GetMessage(message_id: "123456" revision: 2 sub: SubMessage(subfield:
+// "foo"))`
+//
+// Note that fields which are mapped to URL query parameters must have a
+// primitive type or a repeated primitive type or a non-repeated message type.
+// In the case of a repeated type, the parameter can be repeated in the URL
+// as `...?param=A¶m=B`. In the case of a message type, each field of the
+// message is mapped to a separate parameter, such as
+// `...?foo.a=A&foo.b=B&foo.c=C`.
+//
+// For HTTP methods that allow a request body, the `body` field
 // specifies the mapping. Consider a REST update method on the
 // message resource collection:
 //
-//
 //     service Messaging {
 //       rpc UpdateMessage(UpdateMessageRequest) returns (Message) {
 //         option (google.api.http) = {
-//           put: "/v1/messages/{message_id}"
+//           patch: "/v1/messages/{message_id}"
 //           body: "message"
 //         };
 //       }
@@ -139,14 +138,14 @@ message Http {
 //       Message message = 2;   // mapped to the body
 //     }
 //
-//
 // The following HTTP JSON to RPC mapping is enabled, where the
 // representation of the JSON in the request body is determined by
 // protos JSON encoding:
 //
-// HTTP | RPC
+// HTTP | gRPC
 // -----|-----
-// `PUT /v1/messages/123456 { "text": "Hi!" }` | `UpdateMessage(message_id: "123456" message { text: "Hi!" })`
+// `PATCH /v1/messages/123456 { "text": "Hi!" }` | `UpdateMessage(message_id:
+// "123456" message { text: "Hi!" })`
 //
 // The special name `*` can be used in the body mapping to define that
 // every field not bound by the path template should be mapped to the
@@ -156,7 +155,7 @@ message Http {
 //     service Messaging {
 //       rpc UpdateMessage(Message) returns (Message) {
 //         option (google.api.http) = {
-//           put: "/v1/messages/{message_id}"
+//           patch: "/v1/messages/{message_id}"
 //           body: "*"
 //         };
 //       }
@@ -169,13 +168,14 @@ message Http {
 //
 // The following HTTP JSON to RPC mapping is enabled:
 //
-// HTTP | RPC
+// HTTP | gRPC
 // -----|-----
-// `PUT /v1/messages/123456 { "text": "Hi!" }` | `UpdateMessage(message_id: "123456" text: "Hi!")`
+// `PATCH /v1/messages/123456 { "text": "Hi!" }` | `UpdateMessage(message_id:
+// "123456" text: "Hi!")`
 //
 // Note that when using `*` in the body mapping, it is not possible to
 // have HTTP parameters, as all fields not bound by the path end in
-// the body. This makes this option more rarely used in practice of
+// the body. This makes this option more rarely used in practice when
 // defining REST APIs. The common usage of `*` is in custom methods
 // which don't use the URL at all for transferring data.
 //
@@ -197,32 +197,31 @@ message Http {
 //       string user_id = 2;
 //     }
 //
+// This enables the following two alternative HTTP JSON to RPC mappings:
 //
-// This enables the following two alternative HTTP JSON to RPC
-// mappings:
-//
-// HTTP | RPC
+// HTTP | gRPC
 // -----|-----
 // `GET /v1/messages/123456` | `GetMessage(message_id: "123456")`
-// `GET /v1/users/me/messages/123456` | `GetMessage(user_id: "me" message_id: "123456")`
-//
-// # Rules for HTTP mapping
-//
-// The rules for mapping HTTP path, query parameters, and body fields
-// to the request message are as follows:
-//
-// 1. The `body` field specifies either `*` or a field path, or is
-//    omitted. If omitted, it indicates there is no HTTP request body.
-// 2. Leaf fields (recursive expansion of nested messages in the
-//    request) can be classified into three types:
-//     (a) Matched in the URL template.
-//     (b) Covered by body (if body is `*`, everything except (a) fields;
-//         else everything under the body field)
-//     (c) All other fields.
-// 3. URL query parameters found in the HTTP request are mapped to (c) fields.
-// 4. Any body sent with an HTTP request can contain only (b) fields.
-//
-// The syntax of the path template is as follows:
+// `GET /v1/users/me/messages/123456` | `GetMessage(user_id: "me" message_id:
+// "123456")`
+//
+// ## Rules for HTTP mapping
+//
+// 1. Leaf request fields (recursive expansion nested messages in the request
+//    message) are classified into three categories:
+//    - Fields referred by the path template. They are passed via the URL path.
+//    - Fields referred by the [HttpRule.body][google.api.HttpRule.body]. They are passed via the HTTP
+//      request body.
+//    - All other fields are passed via the URL query parameters, and the
+//      parameter name is the field path in the request message. A repeated
+//      field can be represented as multiple query parameters under the same
+//      name.
+//  2. If [HttpRule.body][google.api.HttpRule.body] is "*", there is no URL query parameter, all fields
+//     are passed via URL path and HTTP request body.
+//  3. If [HttpRule.body][google.api.HttpRule.body] is omitted, there is no HTTP request body, all
+//     fields are passed via URL path and URL query parameters.
+//
+// ### Path template syntax
 //
 //     Template = "/" Segments [ Verb ] ;
 //     Segments = Segment { "/" Segment } ;
@@ -231,36 +230,88 @@ message Http {
 //     FieldPath = IDENT { "." IDENT } ;
 //     Verb     = ":" LITERAL ;
 //
-// The syntax `*` matches a single path segment. The syntax `**` matches zero
-// or more path segments, which must be the last part of the path except the
-// `Verb`. The syntax `LITERAL` matches literal text in the path.
+// The syntax `*` matches a single URL path segment. The syntax `**` matches
+// zero or more URL path segments, which must be the last part of the URL path
+// except the `Verb`.
 //
 // The syntax `Variable` matches part of the URL path as specified by its
 // template. A variable template must not contain other variables. If a variable
 // matches a single path segment, its template may be omitted, e.g. `{var}`
 // is equivalent to `{var=*}`.
 //
+// The syntax `LITERAL` matches literal text in the URL path. If the `LITERAL`
+// contains any reserved character, such characters should be percent-encoded
+// before the matching.
+//
 // If a variable contains exactly one path segment, such as `"{var}"` or
-// `"{var=*}"`, when such a variable is expanded into a URL path, all characters
-// except `[-_.~0-9a-zA-Z]` are percent-encoded. Such variables show up in the
-// Discovery Document as `{var}`.
-//
-// If a variable contains one or more path segments, such as `"{var=foo/*}"`
-// or `"{var=**}"`, when such a variable is expanded into a URL path, all
-// characters except `[-_.~/0-9a-zA-Z]` are percent-encoded. Such variables
-// show up in the Discovery Document as `{+var}`.
-//
-// NOTE: While the single segment variable matches the semantics of
-// [RFC 6570](https://tools.ietf.org/html/rfc6570) Section 3.2.2
-// Simple String Expansion, the multi segment variable **does not** match
-// RFC 6570 Reserved Expansion. The reason is that the Reserved Expansion
+// `"{var=*}"`, when such a variable is expanded into a URL path on the client
+// side, all characters except `[-_.~0-9a-zA-Z]` are percent-encoded. The
+// server side does the reverse decoding. Such variables show up in the
+// [Discovery
+// Document](https://developers.google.com/discovery/v1/reference/apis) as
+// `{var}`.
+//
+// If a variable contains multiple path segments, such as `"{var=foo/*}"`
+// or `"{var=**}"`, when such a variable is expanded into a URL path on the
+// client side, all characters except `[-_.~/0-9a-zA-Z]` are percent-encoded.
+// The server side does the reverse decoding, except "%2F" and "%2f" are left
+// unchanged. Such variables show up in the
+// [Discovery
+// Document](https://developers.google.com/discovery/v1/reference/apis) as
+// `{+var}`.
+//
+// ## Using gRPC API Service Configuration
+//
+// gRPC API Service Configuration (service config) is a configuration language
+// for configuring a gRPC service to become a user-facing product. The
+// service config is simply the YAML representation of the `google.api.Service`
+// proto message.
+//
+// As an alternative to annotating your proto file, you can configure gRPC
+// transcoding in your service config YAML files. You do this by specifying a
+// `HttpRule` that maps the gRPC method to a REST endpoint, achieving the same
+// effect as the proto annotation. This can be particularly useful if you
+// have a proto that is reused in multiple services. Note that any transcoding
+// specified in the service config will override any matching transcoding
+// configuration in the proto.
+//
+// Example:
+//
+//     http:
+//       rules:
+//         # Selects a gRPC method and applies HttpRule to it.
+//         - selector: example.v1.Messaging.GetMessage
+//           get: /v1/messages/{message_id}/{sub.subfield}
+//
+// ## Special notes
+//
+// When gRPC Transcoding is used to map a gRPC to JSON REST endpoints, the
+// proto to JSON conversion must follow the [proto3
+// specification](https://developers.google.com/protocol-buffers/docs/proto3#json).
+//
+// While the single segment variable follows the semantics of
+// [RFC 6570](https://tools.ietf.org/html/rfc6570) Section 3.2.2 Simple String
+// Expansion, the multi segment variable **does not** follow RFC 6570 Section
+// 3.2.3 Reserved Expansion. The reason is that the Reserved Expansion
 // does not expand special characters like `?` and `#`, which would lead
-// to invalid URLs.
+// to invalid URLs. As the result, gRPC Transcoding uses a custom encoding
+// for multi segment variables.
 //
-// NOTE: the field paths in variables and in the `body` must not refer to
-// repeated fields or map fields.
+// The path variables **must not** refer to any repeated or mapped field,
+// because client libraries are not capable of handling such variable expansion.
+//
+// The path variables **must not** capture the leading "/" character. The reason
+// is that the most common use case "{var}" does not capture the leading "/"
+// character. For consistency, all path variables must share the same behavior.
+//
+// Repeated message fields must not be mapped to URL query parameters, because
+// no client library can support such complicated mapping.
+//
+// If an API needs to use a JSON array for request or response body, it can map
+// the request or response body to a repeated field. However, some gRPC
+// Transcoding implementations may not support this feature.
 message HttpRule {
-  // Selects methods to which this rule applies.
+  // Selects a method to which this rule applies.
   //
   // Refer to [selector][google.api.DocumentationRule.selector] for syntax details.
   string selector = 1;
@@ -269,19 +320,20 @@ message HttpRule {
   // used with any of the {get|put|post|delete|patch} methods. A custom method
   // can be defined using the 'custom' field.
   oneof pattern {
-    // Used for listing and getting information about resources.
+    // Maps to HTTP GET. Used for listing and getting information about
+    // resources.
     string get = 2;
 
-    // Used for updating a resource.
+    // Maps to HTTP PUT. Used for replacing a resource.
     string put = 3;
 
-    // Used for creating a resource.
+    // Maps to HTTP POST. Used for creating a resource or performing an action.
     string post = 4;
 
-    // Used for deleting a resource.
+    // Maps to HTTP DELETE. Used for deleting a resource.
     string delete = 5;
 
-    // Used for updating a resource.
+    // Maps to HTTP PATCH. Used for updating a resource.
     string patch = 6;
 
     // The custom pattern is used for specifying an HTTP method that is not
@@ -291,15 +343,20 @@ message HttpRule {
     CustomHttpPattern custom = 8;
   }
 
-  // The name of the request field whose value is mapped to the HTTP body, or
-  // `*` for mapping all fields not captured by the path pattern to the HTTP
-  // body. NOTE: the referred field must not be a repeated field and must be
-  // present at the top-level of request message type.
+  // The name of the request field whose value is mapped to the HTTP request
+  // body, or `*` for mapping all request fields not captured by the path
+  // pattern to the HTTP body, or omitted for not having any HTTP request body.
+  //
+  // NOTE: the referred field must be present at the top-level of the request
+  // message type.
   string body = 7;
 
   // Optional. The name of the response field whose value is mapped to the HTTP
-  // body of response. Other response fields are ignored. When
-  // not set, the response message will be used as HTTP body of response.
+  // response body. When omitted, the entire response message will be used
+  // as the HTTP response body.
+  //
+  // NOTE: The referred field must be present at the top-level of the response
+  // message type.
   string response_body = 12;
 
   // Additional HTTP bindings for the selector. Nested bindings must
diff --git a/google/api/httpbody.proto b/google/api/httpbody.proto
index 0e86e26..00c80ab 100644
--- a/google/api/httpbody.proto
+++ b/google/api/httpbody.proto
@@ -1,4 +1,4 @@
-// Copyright 2018 Google LLC.
+// Copyright 2015 Google LLC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -18,13 +18,13 @@ package google.api;
 
 import "google/protobuf/any.proto";
 
+option cc_enable_arenas = true;
 option go_package = "google.golang.org/genproto/googleapis/api/httpbody;httpbody";
 option java_multiple_files = true;
 option java_outer_classname = "HttpBodyProto";
 option java_package = "com.google.api";
 option objc_class_prefix = "GAPI";
 
-
 // Message that represents an arbitrary HTTP body. It should only be used for
 // payload formats that can't be represented as JSON, such as raw binary or
 // an HTML page.
@@ -45,11 +45,15 @@ option objc_class_prefix = "GAPI";
 //
 //       // The raw HTTP body is bound to this field.
 //       google.api.HttpBody http_body = 2;
+//
 //     }
 //
 //     service ResourceService {
-//       rpc GetResource(GetResourceRequest) returns (google.api.HttpBody);
-//       rpc UpdateResource(google.api.HttpBody) returns (google.protobuf.Empty);
+//       rpc GetResource(GetResourceRequest)
+//         returns (google.api.HttpBody);
+//       rpc UpdateResource(google.api.HttpBody)
+//         returns (google.protobuf.Empty);
+//
 //     }
 //
 // Example with streaming methods:
@@ -59,15 +63,16 @@ option objc_class_prefix = "GAPI";
 //         returns (stream google.api.HttpBody);
 //       rpc UpdateCalendar(stream google.api.HttpBody)
 //         returns (stream google.api.HttpBody);
+//
 //     }
 //
 // Use of this type only changes how the request and response bodies are
 // handled, all other features will continue to work unchanged.
 message HttpBody {
-  // The HTTP Content-Type string representing the content type of the body.
+  // The HTTP Content-Type header value specifying the content type of the body.
   string content_type = 1;
 
-  // HTTP body binary data.
+  // The HTTP request/response body as raw binary.
   bytes data = 2;
 
   // Application specific response metadata. Must be set in the first response
diff --git a/google/api/httpbody_pb2.py b/google/api/httpbody_pb2.py
index 17973e6..28be373 100644
--- a/google/api/httpbody_pb2.py
+++ b/google/api/httpbody_pb2.py
@@ -34,9 +34,9 @@
     name="google/api/httpbody.proto",
     package="google.api",
     syntax="proto3",
-    serialized_options=b"\n\016com.google.apiB\rHttpBodyProtoP\001Z;google.golang.org/genproto/googleapis/api/httpbody;httpbody\242\002\004GAPI",
+    serialized_options=b"\n\016com.google.apiB\rHttpBodyProtoP\001Z;google.golang.org/genproto/googleapis/api/httpbody;httpbody\370\001\001\242\002\004GAPI",
     create_key=_descriptor._internal_create_key,
-    serialized_pb=b'\n\x19google/api/httpbody.proto\x12\ngoogle.api\x1a\x19google/protobuf/any.proto"X\n\x08HttpBody\x12\x14\n\x0c\x63ontent_type\x18\x01 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\x0c\x12(\n\nextensions\x18\x03 \x03(\x0b\x32\x14.google.protobuf.AnyBe\n\x0e\x63om.google.apiB\rHttpBodyProtoP\x01Z;google.golang.org/genproto/googleapis/api/httpbody;httpbody\xa2\x02\x04GAPIb\x06proto3',
+    serialized_pb=b'\n\x19google/api/httpbody.proto\x12\ngoogle.api\x1a\x19google/protobuf/any.proto"X\n\x08HttpBody\x12\x14\n\x0c\x63ontent_type\x18\x01 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\x0c\x12(\n\nextensions\x18\x03 \x03(\x0b\x32\x14.google.protobuf.AnyBh\n\x0e\x63om.google.apiB\rHttpBodyProtoP\x01Z;google.golang.org/genproto/googleapis/api/httpbody;httpbody\xf8\x01\x01\xa2\x02\x04GAPIb\x06proto3',
     dependencies=[google_dot_protobuf_dot_any__pb2.DESCRIPTOR],
 )
 
diff --git a/google/api/label.proto b/google/api/label.proto
index 3c20752..af294c9 100644
--- a/google/api/label.proto
+++ b/google/api/label.proto
@@ -1,4 +1,4 @@
-// Copyright 2018 Google LLC.
+// Copyright 2015 Google LLC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -23,7 +23,6 @@ option java_outer_classname = "LabelProto";
 option java_package = "com.google.api";
 option objc_class_prefix = "GAPI";
 
-
 // A description of a label.
 message LabelDescriptor {
   // Value types that can be used as label values.
diff --git a/google/api/launch_stage.proto b/google/api/launch_stage.proto
index 55fd914..cca8419 100644
--- a/google/api/launch_stage.proto
+++ b/google/api/launch_stage.proto
@@ -1,4 +1,4 @@
-// Copyright 2019 Google LLC.
+// Copyright 2015 Google LLC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -11,7 +11,6 @@
 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 // See the License for the specific language governing permissions and
 // limitations under the License.
-//
 
 syntax = "proto3";
 
@@ -29,6 +28,12 @@ enum LaunchStage {
   // Do not use this default value.
   LAUNCH_STAGE_UNSPECIFIED = 0;
 
+  // The feature is not yet implemented. Users can not use it.
+  UNIMPLEMENTED = 6;
+
+  // Prelaunch features are hidden from users and are only visible internally.
+  PRELAUNCH = 7;
+
   // Early Access features are limited to a closed group of testers. To use
   // these features, you must sign up in advance and sign a Trusted Tester
   // agreement (which includes confidentiality provisions). These features may
@@ -40,7 +45,7 @@ enum LaunchStage {
   // for widespread use. By Alpha, all significant design issues are resolved
   // and we are in the process of verifying functionality. Alpha customers
   // need to apply for access, agree to applicable terms, and have their
-  // projects whitelisted. Alpha releases don’t have to be feature complete,
+  // projects allowlisted. Alpha releases don’t have to be feature complete,
   // no SLAs are provided, and there are no technical support obligations, but
   // they will be far enough along that customers can actually use them in
   // test environments or for limited-use tests -- just like they would in
diff --git a/google/api/launch_stage_pb2.py b/google/api/launch_stage_pb2.py
index f42df82..779ea36 100644
--- a/google/api/launch_stage_pb2.py
+++ b/google/api/launch_stage_pb2.py
@@ -34,7 +34,7 @@
     syntax="proto3",
     serialized_options=b"\n\016com.google.apiB\020LaunchStageProtoP\001Z-google.golang.org/genproto/googleapis/api;api\242\002\004GAPI",
     create_key=_descriptor._internal_create_key,
-    serialized_pb=b"\n\x1dgoogle/api/launch_stage.proto\x12\ngoogle.api*j\n\x0bLaunchStage\x12\x1c\n\x18LAUNCH_STAGE_UNSPECIFIED\x10\x00\x12\x10\n\x0c\x45\x41RLY_ACCESS\x10\x01\x12\t\n\x05\x41LPHA\x10\x02\x12\x08\n\x04\x42\x45TA\x10\x03\x12\x06\n\x02GA\x10\x04\x12\x0e\n\nDEPRECATED\x10\x05\x42Z\n\x0e\x63om.google.apiB\x10LaunchStageProtoP\x01Z-google.golang.org/genproto/googleapis/api;api\xa2\x02\x04GAPIb\x06proto3",
+    serialized_pb=b"\n\x1dgoogle/api/launch_stage.proto\x12\ngoogle.api*\x8c\x01\n\x0bLaunchStage\x12\x1c\n\x18LAUNCH_STAGE_UNSPECIFIED\x10\x00\x12\x11\n\rUNIMPLEMENTED\x10\x06\x12\r\n\tPRELAUNCH\x10\x07\x12\x10\n\x0c\x45\x41RLY_ACCESS\x10\x01\x12\t\n\x05\x41LPHA\x10\x02\x12\x08\n\x04\x42\x45TA\x10\x03\x12\x06\n\x02GA\x10\x04\x12\x0e\n\nDEPRECATED\x10\x05\x42Z\n\x0e\x63om.google.apiB\x10LaunchStageProtoP\x01Z-google.golang.org/genproto/googleapis/api;api\xa2\x02\x04GAPIb\x06proto3",
 )
 
 _LAUNCHSTAGE = _descriptor.EnumDescriptor(
@@ -53,8 +53,24 @@
             create_key=_descriptor._internal_create_key,
         ),
         _descriptor.EnumValueDescriptor(
-            name="EARLY_ACCESS",
+            name="UNIMPLEMENTED",
             index=1,
+            number=6,
+            serialized_options=None,
+            type=None,
+            create_key=_descriptor._internal_create_key,
+        ),
+        _descriptor.EnumValueDescriptor(
+            name="PRELAUNCH",
+            index=2,
+            number=7,
+            serialized_options=None,
+            type=None,
+            create_key=_descriptor._internal_create_key,
+        ),
+        _descriptor.EnumValueDescriptor(
+            name="EARLY_ACCESS",
+            index=3,
             number=1,
             serialized_options=None,
             type=None,
@@ -62,7 +78,7 @@
         ),
         _descriptor.EnumValueDescriptor(
             name="ALPHA",
-            index=2,
+            index=4,
             number=2,
             serialized_options=None,
             type=None,
@@ -70,7 +86,7 @@
         ),
         _descriptor.EnumValueDescriptor(
             name="BETA",
-            index=3,
+            index=5,
             number=3,
             serialized_options=None,
             type=None,
@@ -78,7 +94,7 @@
         ),
         _descriptor.EnumValueDescriptor(
             name="GA",
-            index=4,
+            index=6,
             number=4,
             serialized_options=None,
             type=None,
@@ -86,7 +102,7 @@
         ),
         _descriptor.EnumValueDescriptor(
             name="DEPRECATED",
-            index=5,
+            index=7,
             number=5,
             serialized_options=None,
             type=None,
@@ -95,13 +111,15 @@
     ],
     containing_type=None,
     serialized_options=None,
-    serialized_start=45,
-    serialized_end=151,
+    serialized_start=46,
+    serialized_end=186,
 )
 _sym_db.RegisterEnumDescriptor(_LAUNCHSTAGE)
 
 LaunchStage = enum_type_wrapper.EnumTypeWrapper(_LAUNCHSTAGE)
 LAUNCH_STAGE_UNSPECIFIED = 0
+UNIMPLEMENTED = 6
+PRELAUNCH = 7
 EARLY_ACCESS = 1
 ALPHA = 2
 BETA = 3
diff --git a/google/api/log.proto b/google/api/log.proto
index 673b524..22ee289 100644
--- a/google/api/log.proto
+++ b/google/api/log.proto
@@ -1,4 +1,4 @@
-// Copyright 2018 Google LLC.
+// Copyright 2015 Google LLC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -24,7 +24,6 @@ option java_outer_classname = "LogProto";
 option java_package = "com.google.api";
 option objc_class_prefix = "GAPI";
 
-
 // A description of a log type. Example in YAML format:
 //
 //     - name: library.googleapis.com/activity_history
diff --git a/google/api/logging.proto b/google/api/logging.proto
index ee7c196..e60f77c 100644
--- a/google/api/logging.proto
+++ b/google/api/logging.proto
@@ -1,4 +1,4 @@
-// Copyright 2018 Google LLC.
+// Copyright 2015 Google LLC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -16,15 +16,12 @@ syntax = "proto3";
 
 package google.api;
 
-import "google/api/annotations.proto";
-
 option go_package = "google.golang.org/genproto/googleapis/api/serviceconfig;serviceconfig";
 option java_multiple_files = true;
 option java_outer_classname = "LoggingProto";
 option java_package = "com.google.api";
 option objc_class_prefix = "GAPI";
 
-
 // Logging configuration of the service.
 //
 // The following example shows how to configure logs to be sent to the
diff --git a/google/api/logging_pb2.py b/google/api/logging_pb2.py
index 6f54706..d4e4578 100644
--- a/google/api/logging_pb2.py
+++ b/google/api/logging_pb2.py
@@ -27,17 +27,13 @@
 _sym_db = _symbol_database.Default()
 
 
-from google.api import annotations_pb2 as google_dot_api_dot_annotations__pb2
-
-
 DESCRIPTOR = _descriptor.FileDescriptor(
     name="google/api/logging.proto",
     package="google.api",
     syntax="proto3",
     serialized_options=b"\n\016com.google.apiB\014LoggingProtoP\001ZEgoogle.golang.org/genproto/googleapis/api/serviceconfig;serviceconfig\242\002\004GAPI",
     create_key=_descriptor._internal_create_key,
-    serialized_pb=b'\n\x18google/api/logging.proto\x12\ngoogle.api\x1a\x1cgoogle/api/annotations.proto"\xd7\x01\n\x07Logging\x12\x45\n\x15producer_destinations\x18\x01 \x03(\x0b\x32&.google.api.Logging.LoggingDestination\x12\x45\n\x15\x63onsumer_destinations\x18\x02 \x03(\x0b\x32&.google.api.Logging.LoggingDestination\x1a>\n\x12LoggingDestination\x12\x1a\n\x12monitored_resource\x18\x03 \x01(\t\x12\x0c\n\x04logs\x18\x01 \x03(\tBn\n\x0e\x63om.google.apiB\x0cLoggingProtoP\x01ZEgoogle.golang.org/genproto/googleapis/api/serviceconfig;serviceconfig\xa2\x02\x04GAPIb\x06proto3',
-    dependencies=[google_dot_api_dot_annotations__pb2.DESCRIPTOR],
+    serialized_pb=b'\n\x18google/api/logging.proto\x12\ngoogle.api"\xd7\x01\n\x07Logging\x12\x45\n\x15producer_destinations\x18\x01 \x03(\x0b\x32&.google.api.Logging.LoggingDestination\x12\x45\n\x15\x63onsumer_destinations\x18\x02 \x03(\x0b\x32&.google.api.Logging.LoggingDestination\x1a>\n\x12LoggingDestination\x12\x1a\n\x12monitored_resource\x18\x03 \x01(\t\x12\x0c\n\x04logs\x18\x01 \x03(\tBn\n\x0e\x63om.google.apiB\x0cLoggingProtoP\x01ZEgoogle.golang.org/genproto/googleapis/api/serviceconfig;serviceconfig\xa2\x02\x04GAPIb\x06proto3',
 )
 
 
@@ -96,8 +92,8 @@
     syntax="proto3",
     extension_ranges=[],
     oneofs=[],
-    serialized_start=224,
-    serialized_end=286,
+    serialized_start=194,
+    serialized_end=256,
 )
 
 _LOGGING = _descriptor.Descriptor(
@@ -155,8 +151,8 @@
     syntax="proto3",
     extension_ranges=[],
     oneofs=[],
-    serialized_start=71,
-    serialized_end=286,
+    serialized_start=41,
+    serialized_end=256,
 )
 
 _LOGGING_LOGGINGDESTINATION.containing_type = _LOGGING
diff --git a/google/api/metric.proto b/google/api/metric.proto
index 5473ce5..aadc196 100644
--- a/google/api/metric.proto
+++ b/google/api/metric.proto
@@ -1,4 +1,4 @@
-// Copyright 2018 Google LLC.
+// Copyright 2015 Google LLC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -17,6 +17,8 @@ syntax = "proto3";
 package google.api;
 
 import "google/api/label.proto";
+import "google/api/launch_stage.proto";
+import "google/protobuf/duration.proto";
 
 option go_package = "google.golang.org/genproto/googleapis/api/metric;metric";
 option java_multiple_files = true;
@@ -24,12 +26,31 @@ option java_outer_classname = "MetricProto";
 option java_package = "com.google.api";
 option objc_class_prefix = "GAPI";
 
-
 // Defines a metric type and its schema. Once a metric descriptor is created,
 // deleting or altering it stops data collection and makes the metric type's
 // existing data unusable.
+//
 message MetricDescriptor {
+  // Additional annotations that can be used to guide the usage of a metric.
+  message MetricDescriptorMetadata {
+    // Deprecated. Must use the [MetricDescriptor.launch_stage][google.api.MetricDescriptor.launch_stage] instead.
+    LaunchStage launch_stage = 1 [deprecated = true];
+
+    // The sampling period of metric data points. For metrics which are written
+    // periodically, consecutive data points are stored at this time interval,
+    // excluding data loss due to errors. Metrics with a higher granularity have
+    // a smaller sampling period.
+    google.protobuf.Duration sample_period = 2;
+
+    // The delay of data points caused by ingestion. Data points older than this
+    // age are guaranteed to be ingested and available to be read, excluding
+    // data loss due to errors.
+    google.protobuf.Duration ingest_delay = 3;
+  }
+
   // The kind of measurement. It describes how the data is reported.
+  // For information on setting the start time and end time based on
+  // the MetricKind, see [TimeInterval][google.monitoring.v3.TimeInterval].
   enum MetricKind {
     // Do not use this default value.
     METRIC_KIND_UNSPECIFIED = 0;
@@ -78,11 +99,12 @@ message MetricDescriptor {
   string name = 1;
 
   // The metric type, including its DNS name prefix. The type is not
-  // URL-encoded.  All user-defined custom metric types have the DNS name
-  // `custom.googleapis.com`.  Metric types should use a natural hierarchical
-  // grouping. For example:
+  // URL-encoded. All user-defined metric types have the DNS name
+  // `custom.googleapis.com` or `external.googleapis.com`. Metric types should
+  // use a natural hierarchical grouping. For example:
   //
   //     "custom.googleapis.com/invoice/paid/amount"
+  //     "external.googleapis.com/prometheus/up"
   //     "appengine.googleapis.com/http/server/response_latencies"
   string type = 8;
 
@@ -102,10 +124,28 @@ message MetricDescriptor {
   // Some combinations of `metric_kind` and `value_type` might not be supported.
   ValueType value_type = 4;
 
-  // The unit in which the metric value is reported. It is only applicable
-  // if the `value_type` is `INT64`, `DOUBLE`, or `DISTRIBUTION`. The
-  // supported units are a subset of [The Unified Code for Units of
-  // Measure](http://unitsofmeasure.org/ucum.html) standard:
+  // The units in which the metric value is reported. It is only applicable
+  // if the `value_type` is `INT64`, `DOUBLE`, or `DISTRIBUTION`. The `unit`
+  // defines the representation of the stored metric values.
+  //
+  // Different systems might scale the values to be more easily displayed (so a
+  // value of `0.02kBy` _might_ be displayed as `20By`, and a value of
+  // `3523kBy` _might_ be displayed as `3.5MBy`). However, if the `unit` is
+  // `kBy`, then the value of the metric is always in thousands of bytes, no
+  // matter how it might be displayed.
+  //
+  // If you want a custom metric to record the exact number of CPU-seconds used
+  // by a job, you can create an `INT64 CUMULATIVE` metric whose `unit` is
+  // `s{CPU}` (or equivalently `1s{CPU}` or just `s`). If the job uses 12,005
+  // CPU-seconds, then the value is written as `12005`.
+  //
+  // Alternatively, if you want a custom metric to record data in a more
+  // granular way, you can create a `DOUBLE CUMULATIVE` metric whose `unit` is
+  // `ks{CPU}`, and then write the value `12.005` (which is `12005/1000`),
+  // or use `Kis{CPU}` and write `11.723` (which is `12005/1024`).
+  //
+  // The supported units are a subset of [The Unified Code for Units of
+  // Measure](https://unitsofmeasure.org/ucum.html) standard:
   //
   // **Basic units (UNIT)**
   //
@@ -115,36 +155,44 @@ message MetricDescriptor {
   // * `min`   minute
   // * `h`     hour
   // * `d`     day
+  // * `1`     dimensionless
   //
   // **Prefixes (PREFIX)**
   //
-  // * `k`     kilo    (10**3)
-  // * `M`     mega    (10**6)
-  // * `G`     giga    (10**9)
-  // * `T`     tera    (10**12)
-  // * `P`     peta    (10**15)
-  // * `E`     exa     (10**18)
-  // * `Z`     zetta   (10**21)
-  // * `Y`     yotta   (10**24)
-  // * `m`     milli   (10**-3)
-  // * `u`     micro   (10**-6)
-  // * `n`     nano    (10**-9)
-  // * `p`     pico    (10**-12)
-  // * `f`     femto   (10**-15)
-  // * `a`     atto    (10**-18)
-  // * `z`     zepto   (10**-21)
-  // * `y`     yocto   (10**-24)
-  // * `Ki`    kibi    (2**10)
-  // * `Mi`    mebi    (2**20)
-  // * `Gi`    gibi    (2**30)
-  // * `Ti`    tebi    (2**40)
+  // * `k`     kilo    (10^3)
+  // * `M`     mega    (10^6)
+  // * `G`     giga    (10^9)
+  // * `T`     tera    (10^12)
+  // * `P`     peta    (10^15)
+  // * `E`     exa     (10^18)
+  // * `Z`     zetta   (10^21)
+  // * `Y`     yotta   (10^24)
+  //
+  // * `m`     milli   (10^-3)
+  // * `u`     micro   (10^-6)
+  // * `n`     nano    (10^-9)
+  // * `p`     pico    (10^-12)
+  // * `f`     femto   (10^-15)
+  // * `a`     atto    (10^-18)
+  // * `z`     zepto   (10^-21)
+  // * `y`     yocto   (10^-24)
+  //
+  // * `Ki`    kibi    (2^10)
+  // * `Mi`    mebi    (2^20)
+  // * `Gi`    gibi    (2^30)
+  // * `Ti`    tebi    (2^40)
+  // * `Pi`    pebi    (2^50)
   //
   // **Grammar**
   //
   // The grammar also includes these connectors:
   //
-  // * `/`    division (as an infix operator, e.g. `1/s`).
-  // * `.`    multiplication (as an infix operator, e.g. `GBy.d`)
+  // * `/`    division or ratio (as an infix operator). For examples,
+  //          `kBy/{email}` or `MiBy/10ms` (although you should almost never
+  //          have `/s` in a metric `unit`; rates should always be computed at
+  //          query time from the underlying cumulative or delta value).
+  // * `.`    multiplication or composition (as an infix operator). For
+  //          examples, `GBy.d` or `k{watt}.h`.
   //
   // The grammar for a unit is as follows:
   //
@@ -159,14 +207,25 @@ message MetricDescriptor {
   //
   // Notes:
   //
-  // * `Annotation` is just a comment if it follows a `UNIT` and is
-  //    equivalent to `1` if it is used alone. For examples,
-  //    `{requests}/s == 1/s`, `By{transmitted}/s == By/s`.
+  // * `Annotation` is just a comment if it follows a `UNIT`. If the annotation
+  //    is used alone, then the unit is equivalent to `1`. For examples,
+  //    `{request}/s == 1/s`, `By{transmitted}/s == By/s`.
   // * `NAME` is a sequence of non-blank printable ASCII characters not
-  //    containing '{' or '}'.
-  // * `1` represents dimensionless value 1, such as in `1/s`.
-  // * `%` represents dimensionless value 1/100, and annotates values giving
-  //    a percentage.
+  //    containing `{` or `}`.
+  // * `1` represents a unitary [dimensionless
+  //    unit](https://en.wikipedia.org/wiki/Dimensionless_quantity) of 1, such
+  //    as in `1/s`. It is typically used when none of the basic units are
+  //    appropriate. For example, "new users per day" can be represented as
+  //    `1/d` or `{new-users}/d` (and a metric value `5` would mean "5 new
+  //    users). Alternatively, "thousands of page views per day" would be
+  //    represented as `1000/d` or `k1/d` or `k{page_views}/d` (and a metric
+  //    value of `5.3` would mean "5300 page views per day").
+  // * `%` represents dimensionless value of 1/100, and annotates values giving
+  //    a percentage (so the metric values are typically in the range of 0..100,
+  //    and a metric value `3` means "3 percent").
+  // * `10^2.%` indicates a metric contains a ratio, typically in the range
+  //    0..1, that will be multiplied by 100 and displayed as a percentage
+  //    (so a metric value `0.03` means "3 percent").
   string unit = 5;
 
   // A detailed description of the metric, which can be used in documentation.
@@ -177,6 +236,19 @@ message MetricDescriptor {
   // This field is optional but it is recommended to be set for any metrics
   // associated with user-visible concepts, such as Quota.
   string display_name = 7;
+
+  // Optional. Metadata which can be used to guide usage of the metric.
+  MetricDescriptorMetadata metadata = 10;
+
+  // Optional. The launch stage of the metric definition.
+  LaunchStage launch_stage = 12;
+
+  // Read-only. If present, then a [time
+  // series][google.monitoring.v3.TimeSeries], which is identified partially by
+  // a metric type and a [MonitoredResourceDescriptor][google.api.MonitoredResourceDescriptor], that is associated
+  // with this metric type can only be associated with one of the monitored
+  // resource types listed here.
+  repeated string monitored_resource_types = 13;
 }
 
 // A specific metric, identified by specifying values for all of the
diff --git a/google/api/metric_pb2.py b/google/api/metric_pb2.py
index 80d047a..a6513dc 100644
--- a/google/api/metric_pb2.py
+++ b/google/api/metric_pb2.py
@@ -28,6 +28,8 @@
 
 
 from google.api import label_pb2 as google_dot_api_dot_label__pb2
+from google.api import launch_stage_pb2 as google_dot_api_dot_launch__stage__pb2
+from google.protobuf import duration_pb2 as google_dot_protobuf_dot_duration__pb2
 
 
 DESCRIPTOR = _descriptor.FileDescriptor(
@@ -36,8 +38,12 @@
     syntax="proto3",
     serialized_options=b"\n\016com.google.apiB\013MetricProtoP\001Z7google.golang.org/genproto/googleapis/api/metric;metric\242\002\004GAPI",
     create_key=_descriptor._internal_create_key,
-    serialized_pb=b'\n\x17google/api/metric.proto\x12\ngoogle.api\x1a\x16google/api/label.proto"\xd2\x03\n\x10MetricDescriptor\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04type\x18\x08 \x01(\t\x12+\n\x06labels\x18\x02 \x03(\x0b\x32\x1b.google.api.LabelDescriptor\x12<\n\x0bmetric_kind\x18\x03 \x01(\x0e\x32\'.google.api.MetricDescriptor.MetricKind\x12:\n\nvalue_type\x18\x04 \x01(\x0e\x32&.google.api.MetricDescriptor.ValueType\x12\x0c\n\x04unit\x18\x05 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x06 \x01(\t\x12\x14\n\x0c\x64isplay_name\x18\x07 \x01(\t"O\n\nMetricKind\x12\x1b\n\x17METRIC_KIND_UNSPECIFIED\x10\x00\x12\t\n\x05GAUGE\x10\x01\x12\t\n\x05\x44\x45LTA\x10\x02\x12\x0e\n\nCUMULATIVE\x10\x03"q\n\tValueType\x12\x1a\n\x16VALUE_TYPE_UNSPECIFIED\x10\x00\x12\x08\n\x04\x42OOL\x10\x01\x12\t\n\x05INT64\x10\x02\x12\n\n\x06\x44OUBLE\x10\x03\x12\n\n\x06STRING\x10\x04\x12\x10\n\x0c\x44ISTRIBUTION\x10\x05\x12\t\n\x05MONEY\x10\x06"u\n\x06Metric\x12\x0c\n\x04type\x18\x03 \x01(\t\x12.\n\x06labels\x18\x02 \x03(\x0b\x32\x1e.google.api.Metric.LabelsEntry\x1a-\n\x0bLabelsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x42_\n\x0e\x63om.google.apiB\x0bMetricProtoP\x01Z7google.golang.org/genproto/googleapis/api/metric;metric\xa2\x02\x04GAPIb\x06proto3',
-    dependencies=[google_dot_api_dot_label__pb2.DESCRIPTOR],
+    serialized_pb=b'\n\x17google/api/metric.proto\x12\ngoogle.api\x1a\x16google/api/label.proto\x1a\x1dgoogle/api/launch_stage.proto\x1a\x1egoogle/protobuf/duration.proto"\x9f\x06\n\x10MetricDescriptor\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04type\x18\x08 \x01(\t\x12+\n\x06labels\x18\x02 \x03(\x0b\x32\x1b.google.api.LabelDescriptor\x12<\n\x0bmetric_kind\x18\x03 \x01(\x0e\x32\'.google.api.MetricDescriptor.MetricKind\x12:\n\nvalue_type\x18\x04 \x01(\x0e\x32&.google.api.MetricDescriptor.ValueType\x12\x0c\n\x04unit\x18\x05 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x06 \x01(\t\x12\x14\n\x0c\x64isplay_name\x18\x07 \x01(\t\x12G\n\x08metadata\x18\n \x01(\x0b\x32\x35.google.api.MetricDescriptor.MetricDescriptorMetadata\x12-\n\x0claunch_stage\x18\x0c \x01(\x0e\x32\x17.google.api.LaunchStage\x12 \n\x18monitored_resource_types\x18\r \x03(\t\x1a\xb0\x01\n\x18MetricDescriptorMetadata\x12\x31\n\x0claunch_stage\x18\x01 \x01(\x0e\x32\x17.google.api.LaunchStageB\x02\x18\x01\x12\x30\n\rsample_period\x18\x02 \x01(\x0b\x32\x19.google.protobuf.Duration\x12/\n\x0cingest_delay\x18\x03 \x01(\x0b\x32\x19.google.protobuf.Duration"O\n\nMetricKind\x12\x1b\n\x17METRIC_KIND_UNSPECIFIED\x10\x00\x12\t\n\x05GAUGE\x10\x01\x12\t\n\x05\x44\x45LTA\x10\x02\x12\x0e\n\nCUMULATIVE\x10\x03"q\n\tValueType\x12\x1a\n\x16VALUE_TYPE_UNSPECIFIED\x10\x00\x12\x08\n\x04\x42OOL\x10\x01\x12\t\n\x05INT64\x10\x02\x12\n\n\x06\x44OUBLE\x10\x03\x12\n\n\x06STRING\x10\x04\x12\x10\n\x0c\x44ISTRIBUTION\x10\x05\x12\t\n\x05MONEY\x10\x06"u\n\x06Metric\x12\x0c\n\x04type\x18\x03 \x01(\t\x12.\n\x06labels\x18\x02 \x03(\x0b\x32\x1e.google.api.Metric.LabelsEntry\x1a-\n\x0bLabelsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x42_\n\x0e\x63om.google.apiB\x0bMetricProtoP\x01Z7google.golang.org/genproto/googleapis/api/metric;metric\xa2\x02\x04GAPIb\x06proto3',
+    dependencies=[
+        google_dot_api_dot_label__pb2.DESCRIPTOR,
+        google_dot_api_dot_launch__stage__pb2.DESCRIPTOR,
+        google_dot_protobuf_dot_duration__pb2.DESCRIPTOR,
+    ],
 )
 
 
@@ -83,8 +89,8 @@
     ],
     containing_type=None,
     serialized_options=None,
-    serialized_start=336,
-    serialized_end=415,
+    serialized_start=732,
+    serialized_end=811,
 )
 _sym_db.RegisterEnumDescriptor(_METRICDESCRIPTOR_METRICKIND)
 
@@ -154,12 +160,90 @@
     ],
     containing_type=None,
     serialized_options=None,
-    serialized_start=417,
-    serialized_end=530,
+    serialized_start=813,
+    serialized_end=926,
 )
 _sym_db.RegisterEnumDescriptor(_METRICDESCRIPTOR_VALUETYPE)
 
 
+_METRICDESCRIPTOR_METRICDESCRIPTORMETADATA = _descriptor.Descriptor(
+    name="MetricDescriptorMetadata",
+    full_name="google.api.MetricDescriptor.MetricDescriptorMetadata",
+    filename=None,
+    file=DESCRIPTOR,
+    containing_type=None,
+    create_key=_descriptor._internal_create_key,
+    fields=[
+        _descriptor.FieldDescriptor(
+            name="launch_stage",
+            full_name="google.api.MetricDescriptor.MetricDescriptorMetadata.launch_stage",
+            index=0,
+            number=1,
+            type=14,
+            cpp_type=8,
+            label=1,
+            has_default_value=False,
+            default_value=0,
+            message_type=None,
+            enum_type=None,
+            containing_type=None,
+            is_extension=False,
+            extension_scope=None,
+            serialized_options=b"\030\001",
+            file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
+        ),
+        _descriptor.FieldDescriptor(
+            name="sample_period",
+            full_name="google.api.MetricDescriptor.MetricDescriptorMetadata.sample_period",
+            index=1,
+            number=2,
+            type=11,
+            cpp_type=10,
+            label=1,
+            has_default_value=False,
+            default_value=None,
+            message_type=None,
+            enum_type=None,
+            containing_type=None,
+            is_extension=False,
+            extension_scope=None,
+            serialized_options=None,
+            file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
+        ),
+        _descriptor.FieldDescriptor(
+            name="ingest_delay",
+            full_name="google.api.MetricDescriptor.MetricDescriptorMetadata.ingest_delay",
+            index=2,
+            number=3,
+            type=11,
+            cpp_type=10,
+            label=1,
+            has_default_value=False,
+            default_value=None,
+            message_type=None,
+            enum_type=None,
+            containing_type=None,
+            is_extension=False,
+            extension_scope=None,
+            serialized_options=None,
+            file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
+        ),
+    ],
+    extensions=[],
+    nested_types=[],
+    enum_types=[],
+    serialized_options=None,
+    is_extendable=False,
+    syntax="proto3",
+    extension_ranges=[],
+    oneofs=[],
+    serialized_start=554,
+    serialized_end=730,
+)
+
 _METRICDESCRIPTOR = _descriptor.Descriptor(
     name="MetricDescriptor",
     full_name="google.api.MetricDescriptor",
@@ -320,17 +404,74 @@
             file=DESCRIPTOR,
             create_key=_descriptor._internal_create_key,
         ),
+        _descriptor.FieldDescriptor(
+            name="metadata",
+            full_name="google.api.MetricDescriptor.metadata",
+            index=8,
+            number=10,
+            type=11,
+            cpp_type=10,
+            label=1,
+            has_default_value=False,
+            default_value=None,
+            message_type=None,
+            enum_type=None,
+            containing_type=None,
+            is_extension=False,
+            extension_scope=None,
+            serialized_options=None,
+            file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
+        ),
+        _descriptor.FieldDescriptor(
+            name="launch_stage",
+            full_name="google.api.MetricDescriptor.launch_stage",
+            index=9,
+            number=12,
+            type=14,
+            cpp_type=8,
+            label=1,
+            has_default_value=False,
+            default_value=0,
+            message_type=None,
+            enum_type=None,
+            containing_type=None,
+            is_extension=False,
+            extension_scope=None,
+            serialized_options=None,
+            file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
+        ),
+        _descriptor.FieldDescriptor(
+            name="monitored_resource_types",
+            full_name="google.api.MetricDescriptor.monitored_resource_types",
+            index=10,
+            number=13,
+            type=9,
+            cpp_type=9,
+            label=3,
+            has_default_value=False,
+            default_value=[],
+            message_type=None,
+            enum_type=None,
+            containing_type=None,
+            is_extension=False,
+            extension_scope=None,
+            serialized_options=None,
+            file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
+        ),
     ],
     extensions=[],
-    nested_types=[],
+    nested_types=[_METRICDESCRIPTOR_METRICDESCRIPTORMETADATA],
     enum_types=[_METRICDESCRIPTOR_METRICKIND, _METRICDESCRIPTOR_VALUETYPE],
     serialized_options=None,
     is_extendable=False,
     syntax="proto3",
     extension_ranges=[],
     oneofs=[],
-    serialized_start=64,
-    serialized_end=530,
+    serialized_start=127,
+    serialized_end=926,
 )
 
 
@@ -389,8 +530,8 @@
     syntax="proto3",
     extension_ranges=[],
     oneofs=[],
-    serialized_start=604,
-    serialized_end=649,
+    serialized_start=1000,
+    serialized_end=1045,
 )
 
 _METRIC = _descriptor.Descriptor(
@@ -448,15 +589,31 @@
     syntax="proto3",
     extension_ranges=[],
     oneofs=[],
-    serialized_start=532,
-    serialized_end=649,
+    serialized_start=928,
+    serialized_end=1045,
 )
 
+_METRICDESCRIPTOR_METRICDESCRIPTORMETADATA.fields_by_name[
+    "launch_stage"
+].enum_type = google_dot_api_dot_launch__stage__pb2._LAUNCHSTAGE
+_METRICDESCRIPTOR_METRICDESCRIPTORMETADATA.fields_by_name[
+    "sample_period"
+].message_type = google_dot_protobuf_dot_duration__pb2._DURATION
+_METRICDESCRIPTOR_METRICDESCRIPTORMETADATA.fields_by_name[
+    "ingest_delay"
+].message_type = google_dot_protobuf_dot_duration__pb2._DURATION
+_METRICDESCRIPTOR_METRICDESCRIPTORMETADATA.containing_type = _METRICDESCRIPTOR
 _METRICDESCRIPTOR.fields_by_name[
     "labels"
 ].message_type = google_dot_api_dot_label__pb2._LABELDESCRIPTOR
 _METRICDESCRIPTOR.fields_by_name["metric_kind"].enum_type = _METRICDESCRIPTOR_METRICKIND
 _METRICDESCRIPTOR.fields_by_name["value_type"].enum_type = _METRICDESCRIPTOR_VALUETYPE
+_METRICDESCRIPTOR.fields_by_name[
+    "metadata"
+].message_type = _METRICDESCRIPTOR_METRICDESCRIPTORMETADATA
+_METRICDESCRIPTOR.fields_by_name[
+    "launch_stage"
+].enum_type = google_dot_api_dot_launch__stage__pb2._LAUNCHSTAGE
 _METRICDESCRIPTOR_METRICKIND.containing_type = _METRICDESCRIPTOR
 _METRICDESCRIPTOR_VALUETYPE.containing_type = _METRICDESCRIPTOR
 _METRIC_LABELSENTRY.containing_type = _METRIC
@@ -469,12 +626,22 @@
     "MetricDescriptor",
     (_message.Message,),
     {
+        "MetricDescriptorMetadata": _reflection.GeneratedProtocolMessageType(
+            "MetricDescriptorMetadata",
+            (_message.Message,),
+            {
+                "DESCRIPTOR": _METRICDESCRIPTOR_METRICDESCRIPTORMETADATA,
+                "__module__": "google.api.metric_pb2"
+                # @@protoc_insertion_point(class_scope:google.api.MetricDescriptor.MetricDescriptorMetadata)
+            },
+        ),
         "DESCRIPTOR": _METRICDESCRIPTOR,
         "__module__": "google.api.metric_pb2"
         # @@protoc_insertion_point(class_scope:google.api.MetricDescriptor)
     },
 )
 _sym_db.RegisterMessage(MetricDescriptor)
+_sym_db.RegisterMessage(MetricDescriptor.MetricDescriptorMetadata)
 
 Metric = _reflection.GeneratedProtocolMessageType(
     "Metric",
@@ -499,5 +666,8 @@
 
 
 DESCRIPTOR._options = None
+_METRICDESCRIPTOR_METRICDESCRIPTORMETADATA.fields_by_name[
+    "launch_stage"
+]._options = None
 _METRIC_LABELSENTRY._options = None
 # @@protoc_insertion_point(module_scope)
diff --git a/google/api/monitored_resource.proto b/google/api/monitored_resource.proto
index 189ccd4..bd5be4e 100644
--- a/google/api/monitored_resource.proto
+++ b/google/api/monitored_resource.proto
@@ -1,4 +1,4 @@
-// Copyright 2018 Google LLC.
+// Copyright 2015 Google LLC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -17,6 +17,7 @@ syntax = "proto3";
 package google.api;
 
 import "google/api/label.proto";
+import "google/api/launch_stage.proto";
 import "google/protobuf/struct.proto";
 
 option cc_enable_arenas = true;
@@ -26,7 +27,6 @@ option java_outer_classname = "MonitoredResourceProto";
 option java_package = "com.google.api";
 option objc_class_prefix = "GAPI";
 
-
 // An object that describes the schema of a [MonitoredResource][google.api.MonitoredResource] object using a
 // type name and a set of labels.  For example, the monitored resource
 // descriptor for Google Compute Engine VM instances has a type of
@@ -36,6 +36,7 @@ option objc_class_prefix = "GAPI";
 // Different APIs can support different monitored resource types. APIs generally
 // provide a `list` method that returns the monitored resource descriptors used
 // by the API.
+//
 message MonitoredResourceDescriptor {
   // Optional. The resource name of the monitored resource descriptor:
   // `"projects/{project_id}/monitoredResourceDescriptors/{type}"` where
@@ -47,7 +48,6 @@ message MonitoredResourceDescriptor {
 
   // Required. The monitored resource type. For example, the type
   // `"cloudsql_database"` represents databases in Google Cloud SQL.
-  // The maximum length of this value is 256 characters.
   string type = 1;
 
   // Optional. A concise name for the monitored resource type that might be
@@ -64,6 +64,9 @@ message MonitoredResourceDescriptor {
   // resource type. For example, an individual Google Cloud SQL database is
   // identified by values for the labels `"database_id"` and `"zone"`.
   repeated LabelDescriptor labels = 4;
+
+  // Optional. The launch stage of the monitored resource definition.
+  LaunchStage launch_stage = 7;
 }
 
 // An object representing a resource that can be used for monitoring, logging,
@@ -94,14 +97,13 @@ message MonitoredResource {
 // Auxiliary metadata for a [MonitoredResource][google.api.MonitoredResource] object.
 // [MonitoredResource][google.api.MonitoredResource] objects contain the minimum set of information to
 // uniquely identify a monitored resource instance. There is some other useful
-// auxiliary metadata. Google Stackdriver Monitoring & Logging uses an ingestion
-// pipeline to extract metadata for cloud resources of all types , and stores
+// auxiliary metadata. Monitoring and Logging use an ingestion
+// pipeline to extract metadata for cloud resources of all types, and store
 // the metadata in this message.
 message MonitoredResourceMetadata {
   // Output only. Values for predefined system metadata labels.
-  // System labels are a kind of metadata extracted by Google Stackdriver.
-  // Stackdriver determines what system labels are useful and how to obtain
-  // their values. Some examples: "machine_image", "vpc", "subnet_id",
+  // System labels are a kind of metadata extracted by Google, including
+  // "machine_image", "vpc", "subnet_id",
   // "security_group", "name", etc.
   // System label values can be only strings, Boolean values, or a list of
   // strings. For example:
diff --git a/google/api/monitored_resource_pb2.py b/google/api/monitored_resource_pb2.py
index 2dd2ffe..31927c4 100644
--- a/google/api/monitored_resource_pb2.py
+++ b/google/api/monitored_resource_pb2.py
@@ -28,6 +28,7 @@
 
 
 from google.api import label_pb2 as google_dot_api_dot_label__pb2
+from google.api import launch_stage_pb2 as google_dot_api_dot_launch__stage__pb2
 from google.protobuf import struct_pb2 as google_dot_protobuf_dot_struct__pb2
 
 
@@ -37,9 +38,10 @@
     syntax="proto3",
     serialized_options=b"\n\016com.google.apiB\026MonitoredResourceProtoP\001ZCgoogle.golang.org/genproto/googleapis/api/monitoredres;monitoredres\370\001\001\242\002\004GAPI",
     create_key=_descriptor._internal_create_key,
-    serialized_pb=b'\n#google/api/monitored_resource.proto\x12\ngoogle.api\x1a\x16google/api/label.proto\x1a\x1cgoogle/protobuf/struct.proto"\x91\x01\n\x1bMonitoredResourceDescriptor\x12\x0c\n\x04name\x18\x05 \x01(\t\x12\x0c\n\x04type\x18\x01 \x01(\t\x12\x14\n\x0c\x64isplay_name\x18\x02 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x03 \x01(\t\x12+\n\x06labels\x18\x04 \x03(\x0b\x32\x1b.google.api.LabelDescriptor"\x8b\x01\n\x11MonitoredResource\x12\x0c\n\x04type\x18\x01 \x01(\t\x12\x39\n\x06labels\x18\x02 \x03(\x0b\x32).google.api.MonitoredResource.LabelsEntry\x1a-\n\x0bLabelsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\xca\x01\n\x19MonitoredResourceMetadata\x12.\n\rsystem_labels\x18\x01 \x01(\x0b\x32\x17.google.protobuf.Struct\x12J\n\x0buser_labels\x18\x02 \x03(\x0b\x32\x35.google.api.MonitoredResourceMetadata.UserLabelsEntry\x1a\x31\n\x0fUserLabelsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x42y\n\x0e\x63om.google.apiB\x16MonitoredResourceProtoP\x01ZCgoogle.golang.org/genproto/googleapis/api/monitoredres;monitoredres\xf8\x01\x01\xa2\x02\x04GAPIb\x06proto3',
+    serialized_pb=b'\n#google/api/monitored_resource.proto\x12\ngoogle.api\x1a\x16google/api/label.proto\x1a\x1dgoogle/api/launch_stage.proto\x1a\x1cgoogle/protobuf/struct.proto"\xc0\x01\n\x1bMonitoredResourceDescriptor\x12\x0c\n\x04name\x18\x05 \x01(\t\x12\x0c\n\x04type\x18\x01 \x01(\t\x12\x14\n\x0c\x64isplay_name\x18\x02 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x03 \x01(\t\x12+\n\x06labels\x18\x04 \x03(\x0b\x32\x1b.google.api.LabelDescriptor\x12-\n\x0claunch_stage\x18\x07 \x01(\x0e\x32\x17.google.api.LaunchStage"\x8b\x01\n\x11MonitoredResource\x12\x0c\n\x04type\x18\x01 \x01(\t\x12\x39\n\x06labels\x18\x02 \x03(\x0b\x32).google.api.MonitoredResource.LabelsEntry\x1a-\n\x0bLabelsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01"\xca\x01\n\x19MonitoredResourceMetadata\x12.\n\rsystem_labels\x18\x01 \x01(\x0b\x32\x17.google.protobuf.Struct\x12J\n\x0buser_labels\x18\x02 \x03(\x0b\x32\x35.google.api.MonitoredResourceMetadata.UserLabelsEntry\x1a\x31\n\x0fUserLabelsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x42y\n\x0e\x63om.google.apiB\x16MonitoredResourceProtoP\x01ZCgoogle.golang.org/genproto/googleapis/api/monitoredres;monitoredres\xf8\x01\x01\xa2\x02\x04GAPIb\x06proto3',
     dependencies=[
         google_dot_api_dot_label__pb2.DESCRIPTOR,
+        google_dot_api_dot_launch__stage__pb2.DESCRIPTOR,
         google_dot_protobuf_dot_struct__pb2.DESCRIPTOR,
     ],
 )
@@ -148,6 +150,25 @@
             file=DESCRIPTOR,
             create_key=_descriptor._internal_create_key,
         ),
+        _descriptor.FieldDescriptor(
+            name="launch_stage",
+            full_name="google.api.MonitoredResourceDescriptor.launch_stage",
+            index=5,
+            number=7,
+            type=14,
+            cpp_type=8,
+            label=1,
+            has_default_value=False,
+            default_value=0,
+            message_type=None,
+            enum_type=None,
+            containing_type=None,
+            is_extension=False,
+            extension_scope=None,
+            serialized_options=None,
+            file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
+        ),
     ],
     extensions=[],
     nested_types=[],
@@ -157,8 +178,8 @@
     syntax="proto3",
     extension_ranges=[],
     oneofs=[],
-    serialized_start=106,
-    serialized_end=251,
+    serialized_start=137,
+    serialized_end=329,
 )
 
 
@@ -217,8 +238,8 @@
     syntax="proto3",
     extension_ranges=[],
     oneofs=[],
-    serialized_start=348,
-    serialized_end=393,
+    serialized_start=426,
+    serialized_end=471,
 )
 
 _MONITOREDRESOURCE = _descriptor.Descriptor(
@@ -276,8 +297,8 @@
     syntax="proto3",
     extension_ranges=[],
     oneofs=[],
-    serialized_start=254,
-    serialized_end=393,
+    serialized_start=332,
+    serialized_end=471,
 )
 
 
@@ -336,8 +357,8 @@
     syntax="proto3",
     extension_ranges=[],
     oneofs=[],
-    serialized_start=549,
-    serialized_end=598,
+    serialized_start=627,
+    serialized_end=676,
 )
 
 _MONITOREDRESOURCEMETADATA = _descriptor.Descriptor(
@@ -395,13 +416,16 @@
     syntax="proto3",
     extension_ranges=[],
     oneofs=[],
-    serialized_start=396,
-    serialized_end=598,
+    serialized_start=474,
+    serialized_end=676,
 )
 
 _MONITOREDRESOURCEDESCRIPTOR.fields_by_name[
     "labels"
 ].message_type = google_dot_api_dot_label__pb2._LABELDESCRIPTOR
+_MONITOREDRESOURCEDESCRIPTOR.fields_by_name[
+    "launch_stage"
+].enum_type = google_dot_api_dot_launch__stage__pb2._LAUNCHSTAGE
 _MONITOREDRESOURCE_LABELSENTRY.containing_type = _MONITOREDRESOURCE
 _MONITOREDRESOURCE.fields_by_name[
     "labels"
diff --git a/google/api/monitoring.proto b/google/api/monitoring.proto
index 3057214..60770ec 100644
--- a/google/api/monitoring.proto
+++ b/google/api/monitoring.proto
@@ -1,4 +1,4 @@
-// Copyright 2018 Google LLC.
+// Copyright 2015 Google LLC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -16,52 +16,64 @@ syntax = "proto3";
 
 package google.api;
 
-import "google/api/annotations.proto";
-
 option go_package = "google.golang.org/genproto/googleapis/api/serviceconfig;serviceconfig";
 option java_multiple_files = true;
 option java_outer_classname = "MonitoringProto";
 option java_package = "com.google.api";
 option objc_class_prefix = "GAPI";
 
-
 // Monitoring configuration of the service.
 //
 // The example below shows how to configure monitored resources and metrics
 // for monitoring. In the example, a monitored resource and two metrics are
 // defined. The `library.googleapis.com/book/returned_count` metric is sent
 // to both producer and consumer projects, whereas the
-// `library.googleapis.com/book/overdue_count` metric is only sent to the
+// `library.googleapis.com/book/num_overdue` metric is only sent to the
 // consumer project.
 //
 //     monitored_resources:
-//     - type: library.googleapis.com/branch
+//     - type: library.googleapis.com/Branch
+//       display_name: "Library Branch"
+//       description: "A branch of a library."
+//       launch_stage: GA
 //       labels:
-//       - key: /city
-//         description: The city where the library branch is located in.
-//       - key: /name
-//         description: The name of the branch.
+//       - key: resource_container
+//         description: "The Cloud container (ie. project id) for the Branch."
+//       - key: location
+//         description: "The location of the library branch."
+//       - key: branch_id
+//         description: "The id of the branch."
 //     metrics:
 //     - name: library.googleapis.com/book/returned_count
+//       display_name: "Books Returned"
+//       description: "The count of books that have been returned."
+//       launch_stage: GA
 //       metric_kind: DELTA
 //       value_type: INT64
+//       unit: "1"
 //       labels:
-//       - key: /customer_id
-//     - name: library.googleapis.com/book/overdue_count
+//       - key: customer_id
+//         description: "The id of the customer."
+//     - name: library.googleapis.com/book/num_overdue
+//       display_name: "Books Overdue"
+//       description: "The current number of overdue books."
+//       launch_stage: GA
 //       metric_kind: GAUGE
 //       value_type: INT64
+//       unit: "1"
 //       labels:
-//       - key: /customer_id
+//       - key: customer_id
+//         description: "The id of the customer."
 //     monitoring:
 //       producer_destinations:
-//       - monitored_resource: library.googleapis.com/branch
+//       - monitored_resource: library.googleapis.com/Branch
 //         metrics:
 //         - library.googleapis.com/book/returned_count
 //       consumer_destinations:
-//       - monitored_resource: library.googleapis.com/branch
+//       - monitored_resource: library.googleapis.com/Branch
 //         metrics:
 //         - library.googleapis.com/book/returned_count
-//         - library.googleapis.com/book/overdue_count
+//         - library.googleapis.com/book/num_overdue
 message Monitoring {
   // Configuration of a specific monitoring destination (the producer project
   // or the consumer project).
@@ -70,20 +82,24 @@ message Monitoring {
     // [Service.monitored_resources][google.api.Service.monitored_resources] section.
     string monitored_resource = 1;
 
-    // Names of the metrics to report to this monitoring destination.
-    // Each name must be defined in [Service.metrics][google.api.Service.metrics] section.
+    // Types of the metrics to report to this monitoring destination.
+    // Each type must be defined in [Service.metrics][google.api.Service.metrics] section.
     repeated string metrics = 2;
   }
 
   // Monitoring configurations for sending metrics to the producer project.
-  // There can be multiple producer destinations, each one must have a
-  // different monitored resource type. A metric can be used in at most
-  // one producer destination.
+  // There can be multiple producer destinations. A monitored resource type may
+  // appear in multiple monitoring destinations if different aggregations are
+  // needed for different sets of metrics associated with that monitored
+  // resource type. A monitored resource and metric pair may only be used once
+  // in the Monitoring configuration.
   repeated MonitoringDestination producer_destinations = 1;
 
   // Monitoring configurations for sending metrics to the consumer project.
-  // There can be multiple consumer destinations, each one must have a
-  // different monitored resource type. A metric can be used in at most
-  // one consumer destination.
+  // There can be multiple consumer destinations. A monitored resource type may
+  // appear in multiple monitoring destinations if different aggregations are
+  // needed for different sets of metrics associated with that monitored
+  // resource type. A monitored resource and metric pair may only be used once
+  // in the Monitoring configuration.
   repeated MonitoringDestination consumer_destinations = 2;
 }
diff --git a/google/api/monitoring_pb2.py b/google/api/monitoring_pb2.py
index 577afac..b729622 100644
--- a/google/api/monitoring_pb2.py
+++ b/google/api/monitoring_pb2.py
@@ -27,17 +27,13 @@
 _sym_db = _symbol_database.Default()
 
 
-from google.api import annotations_pb2 as google_dot_api_dot_annotations__pb2
-
-
 DESCRIPTOR = _descriptor.FileDescriptor(
     name="google/api/monitoring.proto",
     package="google.api",
     syntax="proto3",
     serialized_options=b"\n\016com.google.apiB\017MonitoringProtoP\001ZEgoogle.golang.org/genproto/googleapis/api/serviceconfig;serviceconfig\242\002\004GAPI",
     create_key=_descriptor._internal_create_key,
-    serialized_pb=b'\n\x1bgoogle/api/monitoring.proto\x12\ngoogle.api\x1a\x1cgoogle/api/annotations.proto"\xec\x01\n\nMonitoring\x12K\n\x15producer_destinations\x18\x01 \x03(\x0b\x32,.google.api.Monitoring.MonitoringDestination\x12K\n\x15\x63onsumer_destinations\x18\x02 \x03(\x0b\x32,.google.api.Monitoring.MonitoringDestination\x1a\x44\n\x15MonitoringDestination\x12\x1a\n\x12monitored_resource\x18\x01 \x01(\t\x12\x0f\n\x07metrics\x18\x02 \x03(\tBq\n\x0e\x63om.google.apiB\x0fMonitoringProtoP\x01ZEgoogle.golang.org/genproto/googleapis/api/serviceconfig;serviceconfig\xa2\x02\x04GAPIb\x06proto3',
-    dependencies=[google_dot_api_dot_annotations__pb2.DESCRIPTOR],
+    serialized_pb=b'\n\x1bgoogle/api/monitoring.proto\x12\ngoogle.api"\xec\x01\n\nMonitoring\x12K\n\x15producer_destinations\x18\x01 \x03(\x0b\x32,.google.api.Monitoring.MonitoringDestination\x12K\n\x15\x63onsumer_destinations\x18\x02 \x03(\x0b\x32,.google.api.Monitoring.MonitoringDestination\x1a\x44\n\x15MonitoringDestination\x12\x1a\n\x12monitored_resource\x18\x01 \x01(\t\x12\x0f\n\x07metrics\x18\x02 \x03(\tBq\n\x0e\x63om.google.apiB\x0fMonitoringProtoP\x01ZEgoogle.golang.org/genproto/googleapis/api/serviceconfig;serviceconfig\xa2\x02\x04GAPIb\x06proto3',
 )
 
 
@@ -96,8 +92,8 @@
     syntax="proto3",
     extension_ranges=[],
     oneofs=[],
-    serialized_start=242,
-    serialized_end=310,
+    serialized_start=212,
+    serialized_end=280,
 )
 
 _MONITORING = _descriptor.Descriptor(
@@ -155,8 +151,8 @@
     syntax="proto3",
     extension_ranges=[],
     oneofs=[],
-    serialized_start=74,
-    serialized_end=310,
+    serialized_start=44,
+    serialized_end=280,
 )
 
 _MONITORING_MONITORINGDESTINATION.containing_type = _MONITORING
diff --git a/google/api/quota.proto b/google/api/quota.proto
index aa327a1..dae89de 100644
--- a/google/api/quota.proto
+++ b/google/api/quota.proto
@@ -1,4 +1,4 @@
-// Copyright 2017 Google Inc.
+// Copyright 2015 Google LLC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -16,19 +16,16 @@ syntax = "proto3";
 
 package google.api;
 
-import "google/api/annotations.proto";
-
 option go_package = "google.golang.org/genproto/googleapis/api/serviceconfig;serviceconfig";
 option java_multiple_files = true;
 option java_outer_classname = "QuotaProto";
 option java_package = "com.google.api";
 option objc_class_prefix = "GAPI";
 
-
 // Quota configuration helps to achieve fairness and budgeting in service
 // usage.
 //
-// The quota configuration works this way:
+// The metric based quota configuration works this way:
 // - The service configuration defines a set of metrics.
 // - For API calls, the quota.metric_rules maps methods to metrics with
 //   corresponding costs.
@@ -46,6 +43,7 @@ option objc_class_prefix = "GAPI";
 //        values:
 //          STANDARD: 10000
 //
+//
 //      # The metric rules bind all methods to the read_calls metric,
 //      # except for the UpdateBook and DeleteBook methods. These two methods
 //      # are mapped to the write_calls metric, with the UpdateBook method
@@ -74,24 +72,18 @@ option objc_class_prefix = "GAPI";
 //        metric_kind: DELTA
 //        value_type: INT64
 //
+//
 message Quota {
   // List of `QuotaLimit` definitions for the service.
-  //
-  // Used by metric-based quotas only.
   repeated QuotaLimit limits = 3;
 
   // List of `MetricRule` definitions, each one mapping a selected method to one
   // or more metrics.
-  //
-  // Used by metric-based quotas only.
   repeated MetricRule metric_rules = 4;
 }
 
 // Bind API methods to metrics. Binding a method to a metric causes that
-// metric's configured quota, billing, and monitoring behaviors to apply to the
-// method call.
-//
-// Used by metric-based quotas only.
+// metric's configured quota behaviors to apply to the method call.
 message MetricRule {
   // Selects the methods to which this rule applies.
   //
@@ -111,24 +103,12 @@ message MetricRule {
 // for a limit type. There can be at most one limit for a duration and limit
 // type combination defined within a `QuotaGroup`.
 message QuotaLimit {
-  // Name of the quota limit. The name is used to refer to the limit when
-  // overriding the default limit on per-consumer basis.
-  //
-  // For group-based quota limits, the name must be unique within the quota
-  // group. If a name is not provided, it will be generated from the limit_by
-  // and duration fields.
+  // Name of the quota limit.
   //
-  // For metric-based quota limits, the name must be provided, and it must be
-  // unique within the service. The name can only include alphanumeric
-  // characters as well as '-'.
+  // The name must be provided, and it must be unique within the service. The
+  // name can only include alphanumeric characters as well as '-'.
   //
   // The maximum length of the limit name is 64 characters.
-  //
-  // The name of a limit is used as a unique identifier for this limit.
-  // Therefore, once a limit has been put into use, its name should be
-  // immutable. You can use the display_name field to provide a user-friendly
-  // name for the limit. The display name can be evolved over time without
-  // affecting the identity of the limit.
   string name = 6;
 
   // Optional. User-visible, extended description for this quota limit.
@@ -169,10 +149,7 @@ message QuotaLimit {
   // Used by group-based quotas only.
   int64 free_tier = 7;
 
-  // Duration of this limit in textual notation. Example: "100s", "24h", "1d".
-  // For duration longer than a day, only multiple of days is supported. We
-  // support only "100s" and "1d" for now. Additional support will be added in
-  // the future. "0" indicates indefinite duration.
+  // Duration of this limit in textual notation. Must be "100s" or "1d".
   //
   // Used by group-based quotas only.
   string duration = 5;
@@ -180,75 +157,22 @@ message QuotaLimit {
   // The name of the metric this quota limit applies to. The quota limits with
   // the same metric will be checked together during runtime. The metric must be
   // defined within the service config.
-  //
-  // Used by metric-based quotas only.
   string metric = 8;
 
   // Specify the unit of the quota limit. It uses the same syntax as
   // [Metric.unit][]. The supported unit kinds are determined by the quota
   // backend system.
   //
-  // The [Google Service Control](https://cloud.google.com/service-control)
-  // supports the following unit components:
-  // * One of the time intevals:
-  //   * "/min"  for quota every minute.
-  //   * "/d"  for quota every 24 hours, starting 00:00 US Pacific Time.
-  //   * Otherwise the quota won't be reset by time, such as storage limit.
-  // * One and only one of the granted containers:
-  //   * "/{organization}" quota for an organization.
-  //   * "/{project}" quota for a project.
-  //   * "/{folder}" quota for a folder.
-  //   * "/{resource}" quota for a universal resource.
-  // * Zero or more quota segmentation dimension. Not all combos are valid.
-  //   * "/{region}" quota for every region. Not to be used with time intervals.
-  //   * Otherwise the resources granted on the target is not segmented.
-  //   * "/{zone}" quota for every zone. Not to be used with time intervals.
-  //   * Otherwise the resources granted on the target is not segmented.
-  //   * "/{resource}" quota for a resource associated with a project or org.
-  //
   // Here are some examples:
   // * "1/min/{project}" for quota per minute per project.
-  // * "1/min/{user}" for quota per minute per user.
-  // * "1/min/{organization}" for quota per minute per organization.
   //
   // Note: the order of unit components is insignificant.
   // The "1" at the beginning is required to follow the metric unit syntax.
-  //
-  // Used by metric-based quotas only.
   string unit = 9;
 
-  // Tiered limit values. Also allows for regional or zone overrides for these
-  // values if "/{region}" or "/{zone}" is specified in the unit field.
-  //
-  // Currently supported tiers from low to high:
-  // VERY_LOW, LOW, STANDARD, HIGH, VERY_HIGH
-  //
-  // To apply different limit values for users according to their tiers, specify
-  // the values for the tiers you want to differentiate. For example:
-  // {LOW:100, STANDARD:500, HIGH:1000, VERY_HIGH:5000}
-  //
-  // The limit value for each tier is optional except for the tier STANDARD.
-  // The limit value for an unspecified tier falls to the value of its next
-  // tier towards tier STANDARD. For the above example, the limit value for tier
-  // STANDARD is 500.
-  //
-  // To apply the same limit value for all users, just specify limit value for
-  // tier STANDARD. For example: {STANDARD:500}.
-  //
-  // To apply a regional overide for a tier, add a map entry with key
-  // "/", where  is a region name. Similarly, for a zone
-  // override, add a map entry with key "/{zone}".
-  // Further, a wildcard can be used at the end of a zone name in order to
-  // specify zone level overrides. For example:
-  // LOW: 10, STANDARD: 50, HIGH: 100,
-  // LOW/us-central1: 20, STANDARD/us-central1: 60, HIGH/us-central1: 200,
-  // LOW/us-central1-*: 10, STANDARD/us-central1-*: 20, HIGH/us-central1-*: 80
-  //
-  // The regional overrides tier set for each region must be the same as
-  // the tier set for default limit values. Same rule applies for zone overrides
-  // tier as well.
-  //
-  // Used by metric-based quotas only.
+  // Tiered limit values. You must specify this as a key:value pair, with an
+  // integer value that is the maximum number of requests allowed for the
+  // specified unit. Currently only STANDARD is supported.
   map values = 10;
 
   // User-visible display name for this limit.
diff --git a/google/api/quota_pb2.py b/google/api/quota_pb2.py
index d2a12ce..afc68ea 100644
--- a/google/api/quota_pb2.py
+++ b/google/api/quota_pb2.py
@@ -27,17 +27,13 @@
 _sym_db = _symbol_database.Default()
 
 
-from google.api import annotations_pb2 as google_dot_api_dot_annotations__pb2
-
-
 DESCRIPTOR = _descriptor.FileDescriptor(
     name="google/api/quota.proto",
     package="google.api",
     syntax="proto3",
     serialized_options=b"\n\016com.google.apiB\nQuotaProtoP\001ZEgoogle.golang.org/genproto/googleapis/api/serviceconfig;serviceconfig\242\002\004GAPI",
     create_key=_descriptor._internal_create_key,
-    serialized_pb=b'\n\x16google/api/quota.proto\x12\ngoogle.api\x1a\x1cgoogle/api/annotations.proto"]\n\x05Quota\x12&\n\x06limits\x18\x03 \x03(\x0b\x32\x16.google.api.QuotaLimit\x12,\n\x0cmetric_rules\x18\x04 \x03(\x0b\x32\x16.google.api.MetricRule"\x91\x01\n\nMetricRule\x12\x10\n\x08selector\x18\x01 \x01(\t\x12=\n\x0cmetric_costs\x18\x02 \x03(\x0b\x32\'.google.api.MetricRule.MetricCostsEntry\x1a\x32\n\x10MetricCostsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x03:\x02\x38\x01"\x95\x02\n\nQuotaLimit\x12\x0c\n\x04name\x18\x06 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x15\n\rdefault_limit\x18\x03 \x01(\x03\x12\x11\n\tmax_limit\x18\x04 \x01(\x03\x12\x11\n\tfree_tier\x18\x07 \x01(\x03\x12\x10\n\x08\x64uration\x18\x05 \x01(\t\x12\x0e\n\x06metric\x18\x08 \x01(\t\x12\x0c\n\x04unit\x18\t \x01(\t\x12\x32\n\x06values\x18\n \x03(\x0b\x32".google.api.QuotaLimit.ValuesEntry\x12\x14\n\x0c\x64isplay_name\x18\x0c \x01(\t\x1a-\n\x0bValuesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x03:\x02\x38\x01\x42l\n\x0e\x63om.google.apiB\nQuotaProtoP\x01ZEgoogle.golang.org/genproto/googleapis/api/serviceconfig;serviceconfig\xa2\x02\x04GAPIb\x06proto3',
-    dependencies=[google_dot_api_dot_annotations__pb2.DESCRIPTOR],
+    serialized_pb=b'\n\x16google/api/quota.proto\x12\ngoogle.api"]\n\x05Quota\x12&\n\x06limits\x18\x03 \x03(\x0b\x32\x16.google.api.QuotaLimit\x12,\n\x0cmetric_rules\x18\x04 \x03(\x0b\x32\x16.google.api.MetricRule"\x91\x01\n\nMetricRule\x12\x10\n\x08selector\x18\x01 \x01(\t\x12=\n\x0cmetric_costs\x18\x02 \x03(\x0b\x32\'.google.api.MetricRule.MetricCostsEntry\x1a\x32\n\x10MetricCostsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x03:\x02\x38\x01"\x95\x02\n\nQuotaLimit\x12\x0c\n\x04name\x18\x06 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x15\n\rdefault_limit\x18\x03 \x01(\x03\x12\x11\n\tmax_limit\x18\x04 \x01(\x03\x12\x11\n\tfree_tier\x18\x07 \x01(\x03\x12\x10\n\x08\x64uration\x18\x05 \x01(\t\x12\x0e\n\x06metric\x18\x08 \x01(\t\x12\x0c\n\x04unit\x18\t \x01(\t\x12\x32\n\x06values\x18\n \x03(\x0b\x32".google.api.QuotaLimit.ValuesEntry\x12\x14\n\x0c\x64isplay_name\x18\x0c \x01(\t\x1a-\n\x0bValuesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x03:\x02\x38\x01\x42l\n\x0e\x63om.google.apiB\nQuotaProtoP\x01ZEgoogle.golang.org/genproto/googleapis/api/serviceconfig;serviceconfig\xa2\x02\x04GAPIb\x06proto3',
 )
 
 
@@ -96,8 +92,8 @@
     syntax="proto3",
     extension_ranges=[],
     oneofs=[],
-    serialized_start=68,
-    serialized_end=161,
+    serialized_start=38,
+    serialized_end=131,
 )
 
 
@@ -156,8 +152,8 @@
     syntax="proto3",
     extension_ranges=[],
     oneofs=[],
-    serialized_start=259,
-    serialized_end=309,
+    serialized_start=229,
+    serialized_end=279,
 )
 
 _METRICRULE = _descriptor.Descriptor(
@@ -215,8 +211,8 @@
     syntax="proto3",
     extension_ranges=[],
     oneofs=[],
-    serialized_start=164,
-    serialized_end=309,
+    serialized_start=134,
+    serialized_end=279,
 )
 
 
@@ -275,8 +271,8 @@
     syntax="proto3",
     extension_ranges=[],
     oneofs=[],
-    serialized_start=544,
-    serialized_end=589,
+    serialized_start=514,
+    serialized_end=559,
 )
 
 _QUOTALIMIT = _descriptor.Descriptor(
@@ -486,8 +482,8 @@
     syntax="proto3",
     extension_ranges=[],
     oneofs=[],
-    serialized_start=312,
-    serialized_end=589,
+    serialized_start=282,
+    serialized_end=559,
 )
 
 _QUOTA.fields_by_name["limits"].message_type = _QUOTALIMIT
diff --git a/google/api/resource.proto b/google/api/resource.proto
index fd9ee66..0ce0344 100644
--- a/google/api/resource.proto
+++ b/google/api/resource.proto
@@ -1,4 +1,4 @@
-// Copyright 2020 Google LLC
+// Copyright 2018 Google LLC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -57,11 +57,7 @@ extend google.protobuf.MessageOptions {
 //       // For Kubernetes resources, the format is {api group}/{kind}.
 //       option (google.api.resource) = {
 //         type: "pubsub.googleapis.com/Topic"
-//         name_descriptor: {
-//           pattern: "projects/{project}/topics/{topic}"
-//           parent_type: "cloudresourcemanager.googleapis.com/Project"
-//           parent_name_extractor: "projects/{project}"
-//         }
+//         pattern: "projects/{project}/topics/{topic}"
 //       };
 //     }
 //
@@ -69,10 +65,7 @@ extend google.protobuf.MessageOptions {
 //
 //     resources:
 //     - type: "pubsub.googleapis.com/Topic"
-//       name_descriptor:
-//         - pattern: "projects/{project}/topics/{topic}"
-//           parent_type: "cloudresourcemanager.googleapis.com/Project"
-//           parent_name_extractor: "projects/{project}"
+//       pattern: "projects/{project}/topics/{topic}"
 //
 // Sometimes, resources have multiple patterns, typically because they can
 // live under multiple parents.
@@ -82,26 +75,10 @@ extend google.protobuf.MessageOptions {
 //     message LogEntry {
 //       option (google.api.resource) = {
 //         type: "logging.googleapis.com/LogEntry"
-//         name_descriptor: {
-//           pattern: "projects/{project}/logs/{log}"
-//           parent_type: "cloudresourcemanager.googleapis.com/Project"
-//           parent_name_extractor: "projects/{project}"
-//         }
-//         name_descriptor: {
-//           pattern: "folders/{folder}/logs/{log}"
-//           parent_type: "cloudresourcemanager.googleapis.com/Folder"
-//           parent_name_extractor: "folders/{folder}"
-//         }
-//         name_descriptor: {
-//           pattern: "organizations/{organization}/logs/{log}"
-//           parent_type: "cloudresourcemanager.googleapis.com/Organization"
-//           parent_name_extractor: "organizations/{organization}"
-//         }
-//         name_descriptor: {
-//           pattern: "billingAccounts/{billing_account}/logs/{log}"
-//           parent_type: "billing.googleapis.com/BillingAccount"
-//           parent_name_extractor: "billingAccounts/{billing_account}"
-//         }
+//         pattern: "projects/{project}/logs/{log}"
+//         pattern: "folders/{folder}/logs/{log}"
+//         pattern: "organizations/{organization}/logs/{log}"
+//         pattern: "billingAccounts/{billing_account}/logs/{log}"
 //       };
 //     }
 //
@@ -109,48 +86,10 @@ extend google.protobuf.MessageOptions {
 //
 //     resources:
 //     - type: 'logging.googleapis.com/LogEntry'
-//       name_descriptor:
-//         - pattern: "projects/{project}/logs/{log}"
-//           parent_type: "cloudresourcemanager.googleapis.com/Project"
-//           parent_name_extractor: "projects/{project}"
-//         - pattern: "folders/{folder}/logs/{log}"
-//           parent_type: "cloudresourcemanager.googleapis.com/Folder"
-//           parent_name_extractor: "folders/{folder}"
-//         - pattern: "organizations/{organization}/logs/{log}"
-//           parent_type: "cloudresourcemanager.googleapis.com/Organization"
-//           parent_name_extractor: "organizations/{organization}"
-//         - pattern: "billingAccounts/{billing_account}/logs/{log}"
-//           parent_type: "billing.googleapis.com/BillingAccount"
-//           parent_name_extractor: "billingAccounts/{billing_account}"
-//
-// For flexible resources, the resource name doesn't contain parent names, but
-// the resource itself has parents for policy evaluation.
-//
-// Example:
-//
-//     message Shelf {
-//       option (google.api.resource) = {
-//         type: "library.googleapis.com/Shelf"
-//         name_descriptor: {
-//           pattern: "shelves/{shelf}"
-//           parent_type: "cloudresourcemanager.googleapis.com/Project"
-//         }
-//         name_descriptor: {
-//           pattern: "shelves/{shelf}"
-//           parent_type: "cloudresourcemanager.googleapis.com/Folder"
-//         }
-//       };
-//     }
-//
-// The ResourceDescriptor Yaml config will look like:
-//
-//     resources:
-//     - type: 'library.googleapis.com/Shelf'
-//       name_descriptor:
-//         - pattern: "shelves/{shelf}"
-//           parent_type: "cloudresourcemanager.googleapis.com/Project"
-//         - pattern: "shelves/{shelf}"
-//           parent_type: "cloudresourcemanager.googleapis.com/Folder"
+//       pattern: "projects/{project}/logs/{log}"
+//       pattern: "folders/{folder}/logs/{log}"
+//       pattern: "organizations/{organization}/logs/{log}"
+//       pattern: "billingAccounts/{billing_account}/logs/{log}"
 message ResourceDescriptor {
   // A description of the historical or future-looking state of the
   // resource pattern.
diff --git a/google/api/service.proto b/google/api/service.proto
index 951c7ac..bb988a9 100644
--- a/google/api/service.proto
+++ b/google/api/service.proto
@@ -1,4 +1,4 @@
-// Copyright 2017 Google Inc.
+// Copyright 2015 Google LLC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -16,7 +16,6 @@ syntax = "proto3";
 
 package google.api;
 
-import "google/api/annotations.proto";
 import "google/api/auth.proto";
 import "google/api/backend.proto";
 import "google/api/billing.proto";
@@ -25,15 +24,18 @@ import "google/api/control.proto";
 import "google/api/documentation.proto";
 import "google/api/endpoint.proto";
 import "google/api/http.proto";
+import "google/api/label.proto";
 import "google/api/log.proto";
 import "google/api/logging.proto";
 import "google/api/metric.proto";
 import "google/api/monitored_resource.proto";
 import "google/api/monitoring.proto";
 import "google/api/quota.proto";
+import "google/api/resource.proto";
 import "google/api/source_info.proto";
 import "google/api/system_parameter.proto";
 import "google/api/usage.proto";
+import "google/protobuf/any.proto";
 import "google/protobuf/api.proto";
 import "google/protobuf/type.proto";
 import "google/protobuf/wrappers.proto";
@@ -44,7 +46,6 @@ option java_outer_classname = "ServiceProto";
 option java_package = "com.google.api";
 option objc_class_prefix = "GAPI";
 
-
 // `Service` is the root object of Google service configuration schema. It
 // describes basic information about a service, such as the name and the
 // title, and delegates other aspects to sub-sections. Each sub-section is
@@ -54,7 +55,6 @@ option objc_class_prefix = "GAPI";
 // Example:
 //
 //     type: google.api.Service
-//     config_version: 3
 //     name: calendar.googleapis.com
 //     title: Google Calendar API
 //     apis:
@@ -69,27 +69,24 @@ option objc_class_prefix = "GAPI";
 //         requirements:
 //           provider_id: google_calendar_auth
 message Service {
-  // The semantic version of the service configuration. The config version
-  // affects the interpretation of the service configuration. For example,
-  // certain features are enabled by default for certain config versions.
-  // The latest config version is `3`.
-  google.protobuf.UInt32Value config_version = 20;
-
-  // The DNS address at which this service is available,
-  // e.g. `calendar.googleapis.com`.
+  // The service name, which is a DNS-like logical identifier for the
+  // service, such as `calendar.googleapis.com`. The service name
+  // typically goes through DNS verification to make sure the owner
+  // of the service also owns the DNS name.
   string name = 1;
 
-  // A unique ID for a specific instance of this message, typically assigned
-  // by the client for tracking purpose. If empty, the server may choose to
-  // generate one instead.
-  string id = 33;
-
   // The product title for this service.
   string title = 2;
 
   // The Google project that owns this service.
   string producer_project_id = 22;
 
+  // A unique ID for a specific instance of this message, typically assigned
+  // by the client for tracking purpose. Must be no longer than 63 characters
+  // and only lower case letters, digits, '.', '_' and '-' are allowed. If
+  // empty, the server may choose to generate one instead.
+  string id = 33;
+
   // A list of API interfaces exported by this service. Only the `name` field
   // of the [google.protobuf.Api][google.protobuf.Api] needs to be provided by the configuration
   // author, as the remaining fields will be derived from the IDL during the
@@ -170,6 +167,9 @@ message Service {
   // Output only. The source information for this configuration if available.
   SourceInfo source_info = 37;
 
-  // Experimental configuration.
-  reserved 101;
+  // Obsolete. Do not use.
+  //
+  // This field has no semantic meaning. The service config compiler always
+  // sets this field to `3`.
+  google.protobuf.UInt32Value config_version = 20 [deprecated = true];
 }
diff --git a/google/api/service_pb2.py b/google/api/service_pb2.py
index 330e491..841722d 100644
--- a/google/api/service_pb2.py
+++ b/google/api/service_pb2.py
@@ -27,7 +27,6 @@
 _sym_db = _symbol_database.Default()
 
 
-from google.api import annotations_pb2 as google_dot_api_dot_annotations__pb2
 from google.api import auth_pb2 as google_dot_api_dot_auth__pb2
 from google.api import backend_pb2 as google_dot_api_dot_backend__pb2
 from google.api import billing_pb2 as google_dot_api_dot_billing__pb2
@@ -36,6 +35,7 @@
 from google.api import documentation_pb2 as google_dot_api_dot_documentation__pb2
 from google.api import endpoint_pb2 as google_dot_api_dot_endpoint__pb2
 from google.api import http_pb2 as google_dot_api_dot_http__pb2
+from google.api import label_pb2 as google_dot_api_dot_label__pb2
 from google.api import log_pb2 as google_dot_api_dot_log__pb2
 from google.api import logging_pb2 as google_dot_api_dot_logging__pb2
 from google.api import metric_pb2 as google_dot_api_dot_metric__pb2
@@ -44,9 +44,11 @@
 )
 from google.api import monitoring_pb2 as google_dot_api_dot_monitoring__pb2
 from google.api import quota_pb2 as google_dot_api_dot_quota__pb2
+from google.api import resource_pb2 as google_dot_api_dot_resource__pb2
 from google.api import source_info_pb2 as google_dot_api_dot_source__info__pb2
 from google.api import system_parameter_pb2 as google_dot_api_dot_system__parameter__pb2
 from google.api import usage_pb2 as google_dot_api_dot_usage__pb2
+from google.protobuf import any_pb2 as google_dot_protobuf_dot_any__pb2
 from google.protobuf import api_pb2 as google_dot_protobuf_dot_api__pb2
 from google.protobuf import type_pb2 as google_dot_protobuf_dot_type__pb2
 from google.protobuf import wrappers_pb2 as google_dot_protobuf_dot_wrappers__pb2
@@ -58,9 +60,8 @@
     syntax="proto3",
     serialized_options=b"\n\016com.google.apiB\014ServiceProtoP\001ZEgoogle.golang.org/genproto/googleapis/api/serviceconfig;serviceconfig\242\002\004GAPI",
     create_key=_descriptor._internal_create_key,
-    serialized_pb=b"\n\x18google/api/service.proto\x12\ngoogle.api\x1a\x1cgoogle/api/annotations.proto\x1a\x15google/api/auth.proto\x1a\x18google/api/backend.proto\x1a\x18google/api/billing.proto\x1a\x18google/api/context.proto\x1a\x18google/api/control.proto\x1a\x1egoogle/api/documentation.proto\x1a\x19google/api/endpoint.proto\x1a\x15google/api/http.proto\x1a\x14google/api/log.proto\x1a\x18google/api/logging.proto\x1a\x17google/api/metric.proto\x1a#google/api/monitored_resource.proto\x1a\x1bgoogle/api/monitoring.proto\x1a\x16google/api/quota.proto\x1a\x1cgoogle/api/source_info.proto\x1a!google/api/system_parameter.proto\x1a\x16google/api/usage.proto\x1a\x19google/protobuf/api.proto\x1a\x1agoogle/protobuf/type.proto\x1a\x1egoogle/protobuf/wrappers.proto\"\xdc\x07\n\x07Service\x12\x34\n\x0e\x63onfig_version\x18\x14 \x01(\x0b\x32\x1c.google.protobuf.UInt32Value\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\n\n\x02id\x18! \x01(\t\x12\r\n\x05title\x18\x02 \x01(\t\x12\x1b\n\x13producer_project_id\x18\x16 \x01(\t\x12\"\n\x04\x61pis\x18\x03 \x03(\x0b\x32\x14.google.protobuf.Api\x12$\n\x05types\x18\x04 \x03(\x0b\x32\x15.google.protobuf.Type\x12$\n\x05\x65nums\x18\x05 \x03(\x0b\x32\x15.google.protobuf.Enum\x12\x30\n\rdocumentation\x18\x06 \x01(\x0b\x32\x19.google.api.Documentation\x12$\n\x07\x62\x61\x63kend\x18\x08 \x01(\x0b\x32\x13.google.api.Backend\x12\x1e\n\x04http\x18\t \x01(\x0b\x32\x10.google.api.Http\x12 \n\x05quota\x18\n \x01(\x0b\x32\x11.google.api.Quota\x12\x32\n\x0e\x61uthentication\x18\x0b \x01(\x0b\x32\x1a.google.api.Authentication\x12$\n\x07\x63ontext\x18\x0c \x01(\x0b\x32\x13.google.api.Context\x12 \n\x05usage\x18\x0f \x01(\x0b\x32\x11.google.api.Usage\x12'\n\tendpoints\x18\x12 \x03(\x0b\x32\x14.google.api.Endpoint\x12$\n\x07\x63ontrol\x18\x15 \x01(\x0b\x32\x13.google.api.Control\x12'\n\x04logs\x18\x17 \x03(\x0b\x32\x19.google.api.LogDescriptor\x12-\n\x07metrics\x18\x18 \x03(\x0b\x32\x1c.google.api.MetricDescriptor\x12\x44\n\x13monitored_resources\x18\x19 \x03(\x0b\x32'.google.api.MonitoredResourceDescriptor\x12$\n\x07\x62illing\x18\x1a \x01(\x0b\x32\x13.google.api.Billing\x12$\n\x07logging\x18\x1b \x01(\x0b\x32\x13.google.api.Logging\x12*\n\nmonitoring\x18\x1c \x01(\x0b\x32\x16.google.api.Monitoring\x12\x37\n\x11system_parameters\x18\x1d \x01(\x0b\x32\x1c.google.api.SystemParameters\x12+\n\x0bsource_info\x18% \x01(\x0b\x32\x16.google.api.SourceInfoJ\x04\x08\x65\x10\x66\x42n\n\x0e\x63om.google.apiB\x0cServiceProtoP\x01ZEgoogle.golang.org/genproto/googleapis/api/serviceconfig;serviceconfig\xa2\x02\x04GAPIb\x06proto3",
+    serialized_pb=b"\n\x18google/api/service.proto\x12\ngoogle.api\x1a\x15google/api/auth.proto\x1a\x18google/api/backend.proto\x1a\x18google/api/billing.proto\x1a\x18google/api/context.proto\x1a\x18google/api/control.proto\x1a\x1egoogle/api/documentation.proto\x1a\x19google/api/endpoint.proto\x1a\x15google/api/http.proto\x1a\x16google/api/label.proto\x1a\x14google/api/log.proto\x1a\x18google/api/logging.proto\x1a\x17google/api/metric.proto\x1a#google/api/monitored_resource.proto\x1a\x1bgoogle/api/monitoring.proto\x1a\x16google/api/quota.proto\x1a\x19google/api/resource.proto\x1a\x1cgoogle/api/source_info.proto\x1a!google/api/system_parameter.proto\x1a\x16google/api/usage.proto\x1a\x19google/protobuf/any.proto\x1a\x19google/protobuf/api.proto\x1a\x1agoogle/protobuf/type.proto\x1a\x1egoogle/protobuf/wrappers.proto\"\xda\x07\n\x07Service\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05title\x18\x02 \x01(\t\x12\x1b\n\x13producer_project_id\x18\x16 \x01(\t\x12\n\n\x02id\x18! \x01(\t\x12\"\n\x04\x61pis\x18\x03 \x03(\x0b\x32\x14.google.protobuf.Api\x12$\n\x05types\x18\x04 \x03(\x0b\x32\x15.google.protobuf.Type\x12$\n\x05\x65nums\x18\x05 \x03(\x0b\x32\x15.google.protobuf.Enum\x12\x30\n\rdocumentation\x18\x06 \x01(\x0b\x32\x19.google.api.Documentation\x12$\n\x07\x62\x61\x63kend\x18\x08 \x01(\x0b\x32\x13.google.api.Backend\x12\x1e\n\x04http\x18\t \x01(\x0b\x32\x10.google.api.Http\x12 \n\x05quota\x18\n \x01(\x0b\x32\x11.google.api.Quota\x12\x32\n\x0e\x61uthentication\x18\x0b \x01(\x0b\x32\x1a.google.api.Authentication\x12$\n\x07\x63ontext\x18\x0c \x01(\x0b\x32\x13.google.api.Context\x12 \n\x05usage\x18\x0f \x01(\x0b\x32\x11.google.api.Usage\x12'\n\tendpoints\x18\x12 \x03(\x0b\x32\x14.google.api.Endpoint\x12$\n\x07\x63ontrol\x18\x15 \x01(\x0b\x32\x13.google.api.Control\x12'\n\x04logs\x18\x17 \x03(\x0b\x32\x19.google.api.LogDescriptor\x12-\n\x07metrics\x18\x18 \x03(\x0b\x32\x1c.google.api.MetricDescriptor\x12\x44\n\x13monitored_resources\x18\x19 \x03(\x0b\x32'.google.api.MonitoredResourceDescriptor\x12$\n\x07\x62illing\x18\x1a \x01(\x0b\x32\x13.google.api.Billing\x12$\n\x07logging\x18\x1b \x01(\x0b\x32\x13.google.api.Logging\x12*\n\nmonitoring\x18\x1c \x01(\x0b\x32\x16.google.api.Monitoring\x12\x37\n\x11system_parameters\x18\x1d \x01(\x0b\x32\x1c.google.api.SystemParameters\x12+\n\x0bsource_info\x18% \x01(\x0b\x32\x16.google.api.SourceInfo\x12\x38\n\x0e\x63onfig_version\x18\x14 \x01(\x0b\x32\x1c.google.protobuf.UInt32ValueB\x02\x18\x01\x42n\n\x0e\x63om.google.apiB\x0cServiceProtoP\x01ZEgoogle.golang.org/genproto/googleapis/api/serviceconfig;serviceconfig\xa2\x02\x04GAPIb\x06proto3",
     dependencies=[
-        google_dot_api_dot_annotations__pb2.DESCRIPTOR,
         google_dot_api_dot_auth__pb2.DESCRIPTOR,
         google_dot_api_dot_backend__pb2.DESCRIPTOR,
         google_dot_api_dot_billing__pb2.DESCRIPTOR,
@@ -69,15 +70,18 @@
         google_dot_api_dot_documentation__pb2.DESCRIPTOR,
         google_dot_api_dot_endpoint__pb2.DESCRIPTOR,
         google_dot_api_dot_http__pb2.DESCRIPTOR,
+        google_dot_api_dot_label__pb2.DESCRIPTOR,
         google_dot_api_dot_log__pb2.DESCRIPTOR,
         google_dot_api_dot_logging__pb2.DESCRIPTOR,
         google_dot_api_dot_metric__pb2.DESCRIPTOR,
         google_dot_api_dot_monitored__resource__pb2.DESCRIPTOR,
         google_dot_api_dot_monitoring__pb2.DESCRIPTOR,
         google_dot_api_dot_quota__pb2.DESCRIPTOR,
+        google_dot_api_dot_resource__pb2.DESCRIPTOR,
         google_dot_api_dot_source__info__pb2.DESCRIPTOR,
         google_dot_api_dot_system__parameter__pb2.DESCRIPTOR,
         google_dot_api_dot_usage__pb2.DESCRIPTOR,
+        google_dot_protobuf_dot_any__pb2.DESCRIPTOR,
         google_dot_protobuf_dot_api__pb2.DESCRIPTOR,
         google_dot_protobuf_dot_type__pb2.DESCRIPTOR,
         google_dot_protobuf_dot_wrappers__pb2.DESCRIPTOR,
@@ -93,29 +97,10 @@
     containing_type=None,
     create_key=_descriptor._internal_create_key,
     fields=[
-        _descriptor.FieldDescriptor(
-            name="config_version",
-            full_name="google.api.Service.config_version",
-            index=0,
-            number=20,
-            type=11,
-            cpp_type=10,
-            label=1,
-            has_default_value=False,
-            default_value=None,
-            message_type=None,
-            enum_type=None,
-            containing_type=None,
-            is_extension=False,
-            extension_scope=None,
-            serialized_options=None,
-            file=DESCRIPTOR,
-            create_key=_descriptor._internal_create_key,
-        ),
         _descriptor.FieldDescriptor(
             name="name",
             full_name="google.api.Service.name",
-            index=1,
+            index=0,
             number=1,
             type=9,
             cpp_type=9,
@@ -132,10 +117,10 @@
             create_key=_descriptor._internal_create_key,
         ),
         _descriptor.FieldDescriptor(
-            name="id",
-            full_name="google.api.Service.id",
-            index=2,
-            number=33,
+            name="title",
+            full_name="google.api.Service.title",
+            index=1,
+            number=2,
             type=9,
             cpp_type=9,
             label=1,
@@ -151,10 +136,10 @@
             create_key=_descriptor._internal_create_key,
         ),
         _descriptor.FieldDescriptor(
-            name="title",
-            full_name="google.api.Service.title",
-            index=3,
-            number=2,
+            name="producer_project_id",
+            full_name="google.api.Service.producer_project_id",
+            index=2,
+            number=22,
             type=9,
             cpp_type=9,
             label=1,
@@ -170,10 +155,10 @@
             create_key=_descriptor._internal_create_key,
         ),
         _descriptor.FieldDescriptor(
-            name="producer_project_id",
-            full_name="google.api.Service.producer_project_id",
-            index=4,
-            number=22,
+            name="id",
+            full_name="google.api.Service.id",
+            index=3,
+            number=33,
             type=9,
             cpp_type=9,
             label=1,
@@ -191,7 +176,7 @@
         _descriptor.FieldDescriptor(
             name="apis",
             full_name="google.api.Service.apis",
-            index=5,
+            index=4,
             number=3,
             type=11,
             cpp_type=10,
@@ -210,7 +195,7 @@
         _descriptor.FieldDescriptor(
             name="types",
             full_name="google.api.Service.types",
-            index=6,
+            index=5,
             number=4,
             type=11,
             cpp_type=10,
@@ -229,7 +214,7 @@
         _descriptor.FieldDescriptor(
             name="enums",
             full_name="google.api.Service.enums",
-            index=7,
+            index=6,
             number=5,
             type=11,
             cpp_type=10,
@@ -248,7 +233,7 @@
         _descriptor.FieldDescriptor(
             name="documentation",
             full_name="google.api.Service.documentation",
-            index=8,
+            index=7,
             number=6,
             type=11,
             cpp_type=10,
@@ -267,7 +252,7 @@
         _descriptor.FieldDescriptor(
             name="backend",
             full_name="google.api.Service.backend",
-            index=9,
+            index=8,
             number=8,
             type=11,
             cpp_type=10,
@@ -286,7 +271,7 @@
         _descriptor.FieldDescriptor(
             name="http",
             full_name="google.api.Service.http",
-            index=10,
+            index=9,
             number=9,
             type=11,
             cpp_type=10,
@@ -305,7 +290,7 @@
         _descriptor.FieldDescriptor(
             name="quota",
             full_name="google.api.Service.quota",
-            index=11,
+            index=10,
             number=10,
             type=11,
             cpp_type=10,
@@ -324,7 +309,7 @@
         _descriptor.FieldDescriptor(
             name="authentication",
             full_name="google.api.Service.authentication",
-            index=12,
+            index=11,
             number=11,
             type=11,
             cpp_type=10,
@@ -343,7 +328,7 @@
         _descriptor.FieldDescriptor(
             name="context",
             full_name="google.api.Service.context",
-            index=13,
+            index=12,
             number=12,
             type=11,
             cpp_type=10,
@@ -362,7 +347,7 @@
         _descriptor.FieldDescriptor(
             name="usage",
             full_name="google.api.Service.usage",
-            index=14,
+            index=13,
             number=15,
             type=11,
             cpp_type=10,
@@ -381,7 +366,7 @@
         _descriptor.FieldDescriptor(
             name="endpoints",
             full_name="google.api.Service.endpoints",
-            index=15,
+            index=14,
             number=18,
             type=11,
             cpp_type=10,
@@ -400,7 +385,7 @@
         _descriptor.FieldDescriptor(
             name="control",
             full_name="google.api.Service.control",
-            index=16,
+            index=15,
             number=21,
             type=11,
             cpp_type=10,
@@ -419,7 +404,7 @@
         _descriptor.FieldDescriptor(
             name="logs",
             full_name="google.api.Service.logs",
-            index=17,
+            index=16,
             number=23,
             type=11,
             cpp_type=10,
@@ -438,7 +423,7 @@
         _descriptor.FieldDescriptor(
             name="metrics",
             full_name="google.api.Service.metrics",
-            index=18,
+            index=17,
             number=24,
             type=11,
             cpp_type=10,
@@ -457,7 +442,7 @@
         _descriptor.FieldDescriptor(
             name="monitored_resources",
             full_name="google.api.Service.monitored_resources",
-            index=19,
+            index=18,
             number=25,
             type=11,
             cpp_type=10,
@@ -476,7 +461,7 @@
         _descriptor.FieldDescriptor(
             name="billing",
             full_name="google.api.Service.billing",
-            index=20,
+            index=19,
             number=26,
             type=11,
             cpp_type=10,
@@ -495,7 +480,7 @@
         _descriptor.FieldDescriptor(
             name="logging",
             full_name="google.api.Service.logging",
-            index=21,
+            index=20,
             number=27,
             type=11,
             cpp_type=10,
@@ -514,7 +499,7 @@
         _descriptor.FieldDescriptor(
             name="monitoring",
             full_name="google.api.Service.monitoring",
-            index=22,
+            index=21,
             number=28,
             type=11,
             cpp_type=10,
@@ -533,7 +518,7 @@
         _descriptor.FieldDescriptor(
             name="system_parameters",
             full_name="google.api.Service.system_parameters",
-            index=23,
+            index=22,
             number=29,
             type=11,
             cpp_type=10,
@@ -552,7 +537,7 @@
         _descriptor.FieldDescriptor(
             name="source_info",
             full_name="google.api.Service.source_info",
-            index=24,
+            index=23,
             number=37,
             type=11,
             cpp_type=10,
@@ -568,6 +553,25 @@
             file=DESCRIPTOR,
             create_key=_descriptor._internal_create_key,
         ),
+        _descriptor.FieldDescriptor(
+            name="config_version",
+            full_name="google.api.Service.config_version",
+            index=24,
+            number=20,
+            type=11,
+            cpp_type=10,
+            label=1,
+            has_default_value=False,
+            default_value=None,
+            message_type=None,
+            enum_type=None,
+            containing_type=None,
+            is_extension=False,
+            extension_scope=None,
+            serialized_options=b"\030\001",
+            file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
+        ),
     ],
     extensions=[],
     nested_types=[],
@@ -577,13 +581,10 @@
     syntax="proto3",
     extension_ranges=[],
     oneofs=[],
-    serialized_start=619,
-    serialized_end=1607,
+    serialized_start=667,
+    serialized_end=1653,
 )
 
-_SERVICE.fields_by_name[
-    "config_version"
-].message_type = google_dot_protobuf_dot_wrappers__pb2._UINT32VALUE
 _SERVICE.fields_by_name["apis"].message_type = google_dot_protobuf_dot_api__pb2._API
 _SERVICE.fields_by_name["types"].message_type = google_dot_protobuf_dot_type__pb2._TYPE
 _SERVICE.fields_by_name["enums"].message_type = google_dot_protobuf_dot_type__pb2._ENUM
@@ -634,6 +635,9 @@
 _SERVICE.fields_by_name[
     "source_info"
 ].message_type = google_dot_api_dot_source__info__pb2._SOURCEINFO
+_SERVICE.fields_by_name[
+    "config_version"
+].message_type = google_dot_protobuf_dot_wrappers__pb2._UINT32VALUE
 DESCRIPTOR.message_types_by_name["Service"] = _SERVICE
 _sym_db.RegisterFileDescriptor(DESCRIPTOR)
 
@@ -650,4 +654,5 @@
 
 
 DESCRIPTOR._options = None
+_SERVICE.fields_by_name["config_version"]._options = None
 # @@protoc_insertion_point(module_scope)
diff --git a/google/api/source_info.proto b/google/api/source_info.proto
index 5877785..cbdd625 100644
--- a/google/api/source_info.proto
+++ b/google/api/source_info.proto
@@ -1,4 +1,4 @@
-// Copyright 2018 Google LLC.
+// Copyright 2015 Google LLC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -24,7 +24,6 @@ option java_outer_classname = "SourceInfoProto";
 option java_package = "com.google.api";
 option objc_class_prefix = "GAPI";
 
-
 // Source information used to create a Service Config
 message SourceInfo {
   // All files used during config generation.
diff --git a/google/api/system_parameter.proto b/google/api/system_parameter.proto
index a55212f..7d0b1d5 100644
--- a/google/api/system_parameter.proto
+++ b/google/api/system_parameter.proto
@@ -1,4 +1,4 @@
-// Copyright 2018 Google LLC.
+// Copyright 2015 Google LLC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -22,7 +22,6 @@ option java_outer_classname = "SystemParameterProto";
 option java_package = "com.google.api";
 option objc_class_prefix = "GAPI";
 
-
 // ### System parameter configuration
 //
 // A system parameter is a special kind of parameter defined by the API
diff --git a/google/api/usage.proto b/google/api/usage.proto
index 63299b5..ad2764c 100644
--- a/google/api/usage.proto
+++ b/google/api/usage.proto
@@ -1,4 +1,4 @@
-// Copyright 2018 Google LLC.
+// Copyright 2015 Google LLC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -16,20 +16,23 @@ syntax = "proto3";
 
 package google.api;
 
-import "google/api/annotations.proto";
-
 option go_package = "google.golang.org/genproto/googleapis/api/serviceconfig;serviceconfig";
 option java_multiple_files = true;
 option java_outer_classname = "UsageProto";
 option java_package = "com.google.api";
 option objc_class_prefix = "GAPI";
 
-
 // Configuration controlling usage of a service.
 message Usage {
   // Requirements that must be satisfied before a consumer project can use the
   // service. Each requirement is of the form /;
   // for example 'serviceusage.googleapis.com/billing-enabled'.
+  //
+  // For Google APIs, a Terms of Service requirement must be included here.
+  // Google Cloud APIs must include "serviceusage.googleapis.com/tos/cloud".
+  // Other Google APIs should include
+  // "serviceusage.googleapis.com/tos/universal". Additional ToS can be
+  // included based on the business needs.
   repeated string requirements = 1;
 
   // A list of usage rules that apply to individual API methods.
diff --git a/google/api/usage_pb2.py b/google/api/usage_pb2.py
index 84ebae4..a5ce5ae 100644
--- a/google/api/usage_pb2.py
+++ b/google/api/usage_pb2.py
@@ -27,17 +27,13 @@
 _sym_db = _symbol_database.Default()
 
 
-from google.api import annotations_pb2 as google_dot_api_dot_annotations__pb2
-
-
 DESCRIPTOR = _descriptor.FileDescriptor(
     name="google/api/usage.proto",
     package="google.api",
     syntax="proto3",
     serialized_options=b"\n\016com.google.apiB\nUsageProtoP\001ZEgoogle.golang.org/genproto/googleapis/api/serviceconfig;serviceconfig\242\002\004GAPI",
     create_key=_descriptor._internal_create_key,
-    serialized_pb=b'\n\x16google/api/usage.proto\x12\ngoogle.api\x1a\x1cgoogle/api/annotations.proto"j\n\x05Usage\x12\x14\n\x0crequirements\x18\x01 \x03(\t\x12$\n\x05rules\x18\x06 \x03(\x0b\x32\x15.google.api.UsageRule\x12%\n\x1dproducer_notification_channel\x18\x07 \x01(\t"]\n\tUsageRule\x12\x10\n\x08selector\x18\x01 \x01(\t\x12 \n\x18\x61llow_unregistered_calls\x18\x02 \x01(\x08\x12\x1c\n\x14skip_service_control\x18\x03 \x01(\x08\x42l\n\x0e\x63om.google.apiB\nUsageProtoP\x01ZEgoogle.golang.org/genproto/googleapis/api/serviceconfig;serviceconfig\xa2\x02\x04GAPIb\x06proto3',
-    dependencies=[google_dot_api_dot_annotations__pb2.DESCRIPTOR],
+    serialized_pb=b'\n\x16google/api/usage.proto\x12\ngoogle.api"j\n\x05Usage\x12\x14\n\x0crequirements\x18\x01 \x03(\t\x12$\n\x05rules\x18\x06 \x03(\x0b\x32\x15.google.api.UsageRule\x12%\n\x1dproducer_notification_channel\x18\x07 \x01(\t"]\n\tUsageRule\x12\x10\n\x08selector\x18\x01 \x01(\t\x12 \n\x18\x61llow_unregistered_calls\x18\x02 \x01(\x08\x12\x1c\n\x14skip_service_control\x18\x03 \x01(\x08\x42l\n\x0e\x63om.google.apiB\nUsageProtoP\x01ZEgoogle.golang.org/genproto/googleapis/api/serviceconfig;serviceconfig\xa2\x02\x04GAPIb\x06proto3',
 )
 
 
@@ -115,8 +111,8 @@
     syntax="proto3",
     extension_ranges=[],
     oneofs=[],
-    serialized_start=68,
-    serialized_end=174,
+    serialized_start=38,
+    serialized_end=144,
 )
 
 
@@ -194,8 +190,8 @@
     syntax="proto3",
     extension_ranges=[],
     oneofs=[],
-    serialized_start=176,
-    serialized_end=269,
+    serialized_start=146,
+    serialized_end=239,
 )
 
 _USAGE.fields_by_name["rules"].message_type = _USAGERULE
diff --git a/google/api/visibility.proto b/google/api/visibility.proto
new file mode 100644
index 0000000..bde48dd
--- /dev/null
+++ b/google/api/visibility.proto
@@ -0,0 +1,111 @@
+// Copyright 2021 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+syntax = "proto3";
+
+package google.api;
+
+import "google/protobuf/descriptor.proto";
+
+option cc_enable_arenas = true;
+option go_package = "google.golang.org/genproto/googleapis/api/visibility;visibility";
+option java_multiple_files = true;
+option java_outer_classname = "VisibilityProto";
+option java_package = "com.google.api";
+option objc_class_prefix = "GAPI";
+
+extend google.protobuf.EnumOptions {
+  // See `VisibilityRule`.
+  google.api.VisibilityRule enum_visibility = 72295727;
+}
+
+extend google.protobuf.EnumValueOptions {
+  // See `VisibilityRule`.
+  google.api.VisibilityRule value_visibility = 72295727;
+}
+
+extend google.protobuf.FieldOptions {
+  // See `VisibilityRule`.
+  google.api.VisibilityRule field_visibility = 72295727;
+}
+
+extend google.protobuf.MessageOptions {
+  // See `VisibilityRule`.
+  google.api.VisibilityRule message_visibility = 72295727;
+}
+
+extend google.protobuf.MethodOptions {
+  // See `VisibilityRule`.
+  google.api.VisibilityRule method_visibility = 72295727;
+}
+
+extend google.protobuf.ServiceOptions {
+  // See `VisibilityRule`.
+  google.api.VisibilityRule api_visibility = 72295727;
+}
+
+// `Visibility` defines restrictions for the visibility of service
+// elements.  Restrictions are specified using visibility labels
+// (e.g., PREVIEW) that are elsewhere linked to users and projects.
+//
+// Users and projects can have access to more than one visibility label. The
+// effective visibility for multiple labels is the union of each label's
+// elements, plus any unrestricted elements.
+//
+// If an element and its parents have no restrictions, visibility is
+// unconditionally granted.
+//
+// Example:
+//
+//     visibility:
+//       rules:
+//       - selector: google.calendar.Calendar.EnhancedSearch
+//         restriction: PREVIEW
+//       - selector: google.calendar.Calendar.Delegate
+//         restriction: INTERNAL
+//
+// Here, all methods are publicly visible except for the restricted methods
+// EnhancedSearch and Delegate.
+message Visibility {
+  // A list of visibility rules that apply to individual API elements.
+  //
+  // **NOTE:** All service configuration rules follow "last one wins" order.
+  repeated VisibilityRule rules = 1;
+}
+
+// A visibility rule provides visibility configuration for an individual API
+// element.
+message VisibilityRule {
+  // Selects methods, messages, fields, enums, etc. to which this rule applies.
+  //
+  // Refer to [selector][google.api.DocumentationRule.selector] for syntax details.
+  string selector = 1;
+
+  // A comma-separated list of visibility labels that apply to the `selector`.
+  // Any of the listed labels can be used to grant the visibility.
+  //
+  // If a rule has multiple labels, removing one of the labels but not all of
+  // them can break clients.
+  //
+  // Example:
+  //
+  //     visibility:
+  //       rules:
+  //       - selector: google.calendar.Calendar.EnhancedSearch
+  //         restriction: INTERNAL, PREVIEW
+  //
+  // Removing INTERNAL from this restriction will break clients that rely on
+  // this method and only had access to it through INTERNAL.
+  string restriction = 2;
+}
diff --git a/google/api/visibility_pb2.py b/google/api/visibility_pb2.py
new file mode 100644
index 0000000..7f69690
--- /dev/null
+++ b/google/api/visibility_pb2.py
@@ -0,0 +1,319 @@
+# -*- coding: utf-8 -*-
+
+# Copyright 2020 Google LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: google/api/visibility.proto
+"""Generated protocol buffer code."""
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+from google.protobuf import descriptor_pb2 as google_dot_protobuf_dot_descriptor__pb2
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+    name="google/api/visibility.proto",
+    package="google.api",
+    syntax="proto3",
+    serialized_options=b"\n\016com.google.apiB\017VisibilityProtoP\001Z?google.golang.org/genproto/googleapis/api/visibility;visibility\370\001\001\242\002\004GAPI",
+    create_key=_descriptor._internal_create_key,
+    serialized_pb=b'\n\x1bgoogle/api/visibility.proto\x12\ngoogle.api\x1a google/protobuf/descriptor.proto"7\n\nVisibility\x12)\n\x05rules\x18\x01 \x03(\x0b\x32\x1a.google.api.VisibilityRule"7\n\x0eVisibilityRule\x12\x10\n\x08selector\x18\x01 \x01(\t\x12\x13\n\x0brestriction\x18\x02 \x01(\t:T\n\x0f\x65num_visibility\x12\x1c.google.protobuf.EnumOptions\x18\xaf\xca\xbc" \x01(\x0b\x32\x1a.google.api.VisibilityRule:Z\n\x10value_visibility\x12!.google.protobuf.EnumValueOptions\x18\xaf\xca\xbc" \x01(\x0b\x32\x1a.google.api.VisibilityRule:V\n\x10\x66ield_visibility\x12\x1d.google.protobuf.FieldOptions\x18\xaf\xca\xbc" \x01(\x0b\x32\x1a.google.api.VisibilityRule:Z\n\x12message_visibility\x12\x1f.google.protobuf.MessageOptions\x18\xaf\xca\xbc" \x01(\x0b\x32\x1a.google.api.VisibilityRule:X\n\x11method_visibility\x12\x1e.google.protobuf.MethodOptions\x18\xaf\xca\xbc" \x01(\x0b\x32\x1a.google.api.VisibilityRule:V\n\x0e\x61pi_visibility\x12\x1f.google.protobuf.ServiceOptions\x18\xaf\xca\xbc" \x01(\x0b\x32\x1a.google.api.VisibilityRuleBn\n\x0e\x63om.google.apiB\x0fVisibilityProtoP\x01Z?google.golang.org/genproto/googleapis/api/visibility;visibility\xf8\x01\x01\xa2\x02\x04GAPIb\x06proto3',
+    dependencies=[google_dot_protobuf_dot_descriptor__pb2.DESCRIPTOR],
+)
+
+
+ENUM_VISIBILITY_FIELD_NUMBER = 72295727
+enum_visibility = _descriptor.FieldDescriptor(
+    name="enum_visibility",
+    full_name="google.api.enum_visibility",
+    index=0,
+    number=72295727,
+    type=11,
+    cpp_type=10,
+    label=1,
+    has_default_value=False,
+    default_value=None,
+    message_type=None,
+    enum_type=None,
+    containing_type=None,
+    is_extension=True,
+    extension_scope=None,
+    serialized_options=None,
+    file=DESCRIPTOR,
+    create_key=_descriptor._internal_create_key,
+)
+VALUE_VISIBILITY_FIELD_NUMBER = 72295727
+value_visibility = _descriptor.FieldDescriptor(
+    name="value_visibility",
+    full_name="google.api.value_visibility",
+    index=1,
+    number=72295727,
+    type=11,
+    cpp_type=10,
+    label=1,
+    has_default_value=False,
+    default_value=None,
+    message_type=None,
+    enum_type=None,
+    containing_type=None,
+    is_extension=True,
+    extension_scope=None,
+    serialized_options=None,
+    file=DESCRIPTOR,
+    create_key=_descriptor._internal_create_key,
+)
+FIELD_VISIBILITY_FIELD_NUMBER = 72295727
+field_visibility = _descriptor.FieldDescriptor(
+    name="field_visibility",
+    full_name="google.api.field_visibility",
+    index=2,
+    number=72295727,
+    type=11,
+    cpp_type=10,
+    label=1,
+    has_default_value=False,
+    default_value=None,
+    message_type=None,
+    enum_type=None,
+    containing_type=None,
+    is_extension=True,
+    extension_scope=None,
+    serialized_options=None,
+    file=DESCRIPTOR,
+    create_key=_descriptor._internal_create_key,
+)
+MESSAGE_VISIBILITY_FIELD_NUMBER = 72295727
+message_visibility = _descriptor.FieldDescriptor(
+    name="message_visibility",
+    full_name="google.api.message_visibility",
+    index=3,
+    number=72295727,
+    type=11,
+    cpp_type=10,
+    label=1,
+    has_default_value=False,
+    default_value=None,
+    message_type=None,
+    enum_type=None,
+    containing_type=None,
+    is_extension=True,
+    extension_scope=None,
+    serialized_options=None,
+    file=DESCRIPTOR,
+    create_key=_descriptor._internal_create_key,
+)
+METHOD_VISIBILITY_FIELD_NUMBER = 72295727
+method_visibility = _descriptor.FieldDescriptor(
+    name="method_visibility",
+    full_name="google.api.method_visibility",
+    index=4,
+    number=72295727,
+    type=11,
+    cpp_type=10,
+    label=1,
+    has_default_value=False,
+    default_value=None,
+    message_type=None,
+    enum_type=None,
+    containing_type=None,
+    is_extension=True,
+    extension_scope=None,
+    serialized_options=None,
+    file=DESCRIPTOR,
+    create_key=_descriptor._internal_create_key,
+)
+API_VISIBILITY_FIELD_NUMBER = 72295727
+api_visibility = _descriptor.FieldDescriptor(
+    name="api_visibility",
+    full_name="google.api.api_visibility",
+    index=5,
+    number=72295727,
+    type=11,
+    cpp_type=10,
+    label=1,
+    has_default_value=False,
+    default_value=None,
+    message_type=None,
+    enum_type=None,
+    containing_type=None,
+    is_extension=True,
+    extension_scope=None,
+    serialized_options=None,
+    file=DESCRIPTOR,
+    create_key=_descriptor._internal_create_key,
+)
+
+
+_VISIBILITY = _descriptor.Descriptor(
+    name="Visibility",
+    full_name="google.api.Visibility",
+    filename=None,
+    file=DESCRIPTOR,
+    containing_type=None,
+    create_key=_descriptor._internal_create_key,
+    fields=[
+        _descriptor.FieldDescriptor(
+            name="rules",
+            full_name="google.api.Visibility.rules",
+            index=0,
+            number=1,
+            type=11,
+            cpp_type=10,
+            label=3,
+            has_default_value=False,
+            default_value=[],
+            message_type=None,
+            enum_type=None,
+            containing_type=None,
+            is_extension=False,
+            extension_scope=None,
+            serialized_options=None,
+            file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
+        )
+    ],
+    extensions=[],
+    nested_types=[],
+    enum_types=[],
+    serialized_options=None,
+    is_extendable=False,
+    syntax="proto3",
+    extension_ranges=[],
+    oneofs=[],
+    serialized_start=77,
+    serialized_end=132,
+)
+
+
+_VISIBILITYRULE = _descriptor.Descriptor(
+    name="VisibilityRule",
+    full_name="google.api.VisibilityRule",
+    filename=None,
+    file=DESCRIPTOR,
+    containing_type=None,
+    create_key=_descriptor._internal_create_key,
+    fields=[
+        _descriptor.FieldDescriptor(
+            name="selector",
+            full_name="google.api.VisibilityRule.selector",
+            index=0,
+            number=1,
+            type=9,
+            cpp_type=9,
+            label=1,
+            has_default_value=False,
+            default_value=b"".decode("utf-8"),
+            message_type=None,
+            enum_type=None,
+            containing_type=None,
+            is_extension=False,
+            extension_scope=None,
+            serialized_options=None,
+            file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
+        ),
+        _descriptor.FieldDescriptor(
+            name="restriction",
+            full_name="google.api.VisibilityRule.restriction",
+            index=1,
+            number=2,
+            type=9,
+            cpp_type=9,
+            label=1,
+            has_default_value=False,
+            default_value=b"".decode("utf-8"),
+            message_type=None,
+            enum_type=None,
+            containing_type=None,
+            is_extension=False,
+            extension_scope=None,
+            serialized_options=None,
+            file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
+        ),
+    ],
+    extensions=[],
+    nested_types=[],
+    enum_types=[],
+    serialized_options=None,
+    is_extendable=False,
+    syntax="proto3",
+    extension_ranges=[],
+    oneofs=[],
+    serialized_start=134,
+    serialized_end=189,
+)
+
+_VISIBILITY.fields_by_name["rules"].message_type = _VISIBILITYRULE
+DESCRIPTOR.message_types_by_name["Visibility"] = _VISIBILITY
+DESCRIPTOR.message_types_by_name["VisibilityRule"] = _VISIBILITYRULE
+DESCRIPTOR.extensions_by_name["enum_visibility"] = enum_visibility
+DESCRIPTOR.extensions_by_name["value_visibility"] = value_visibility
+DESCRIPTOR.extensions_by_name["field_visibility"] = field_visibility
+DESCRIPTOR.extensions_by_name["message_visibility"] = message_visibility
+DESCRIPTOR.extensions_by_name["method_visibility"] = method_visibility
+DESCRIPTOR.extensions_by_name["api_visibility"] = api_visibility
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+Visibility = _reflection.GeneratedProtocolMessageType(
+    "Visibility",
+    (_message.Message,),
+    {
+        "DESCRIPTOR": _VISIBILITY,
+        "__module__": "google.api.visibility_pb2"
+        # @@protoc_insertion_point(class_scope:google.api.Visibility)
+    },
+)
+_sym_db.RegisterMessage(Visibility)
+
+VisibilityRule = _reflection.GeneratedProtocolMessageType(
+    "VisibilityRule",
+    (_message.Message,),
+    {
+        "DESCRIPTOR": _VISIBILITYRULE,
+        "__module__": "google.api.visibility_pb2"
+        # @@protoc_insertion_point(class_scope:google.api.VisibilityRule)
+    },
+)
+_sym_db.RegisterMessage(VisibilityRule)
+
+enum_visibility.message_type = _VISIBILITYRULE
+google_dot_protobuf_dot_descriptor__pb2.EnumOptions.RegisterExtension(enum_visibility)
+value_visibility.message_type = _VISIBILITYRULE
+google_dot_protobuf_dot_descriptor__pb2.EnumValueOptions.RegisterExtension(
+    value_visibility
+)
+field_visibility.message_type = _VISIBILITYRULE
+google_dot_protobuf_dot_descriptor__pb2.FieldOptions.RegisterExtension(field_visibility)
+message_visibility.message_type = _VISIBILITYRULE
+google_dot_protobuf_dot_descriptor__pb2.MessageOptions.RegisterExtension(
+    message_visibility
+)
+method_visibility.message_type = _VISIBILITYRULE
+google_dot_protobuf_dot_descriptor__pb2.MethodOptions.RegisterExtension(
+    method_visibility
+)
+api_visibility.message_type = _VISIBILITYRULE
+google_dot_protobuf_dot_descriptor__pb2.ServiceOptions.RegisterExtension(api_visibility)
+
+DESCRIPTOR._options = None
+# @@protoc_insertion_point(module_scope)
diff --git a/google/cloud/location/locations.proto b/google/cloud/location/locations.proto
index b210cc3..a91766c 100644
--- a/google/cloud/location/locations.proto
+++ b/google/cloud/location/locations.proto
@@ -1,4 +1,4 @@
-// Copyright 2022 Google LLC
+// Copyright 2020 Google LLC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
diff --git a/google/logging/type/http_request.proto b/google/logging/type/http_request.proto
index 8b9301f..b878d60 100644
--- a/google/logging/type/http_request.proto
+++ b/google/logging/type/http_request.proto
@@ -1,4 +1,4 @@
-// Copyright 2017 Google Inc.
+// Copyright 2022 Google LLC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -16,7 +16,6 @@ syntax = "proto3";
 
 package google.logging.type;
 
-import "google/api/annotations.proto";
 import "google/protobuf/duration.proto";
 
 option csharp_namespace = "Google.Cloud.Logging.Type";
@@ -25,7 +24,7 @@ option java_multiple_files = true;
 option java_outer_classname = "HttpRequestProto";
 option java_package = "com.google.logging.type";
 option php_namespace = "Google\\Cloud\\Logging\\Type";
-
+option ruby_package = "Google::Cloud::Logging::Type";
 
 // A common proto for logging HTTP requests. Only contains semantics
 // defined by the HTTP specification. Product-specific logging
@@ -52,19 +51,23 @@ message HttpRequest {
   int64 response_size = 5;
 
   // The user agent sent by the client. Example:
-  // `"Mozilla/4.0 (compatible; MSIE 6.0; Windows 98; Q312461; .NET CLR 1.0.3705)"`.
+  // `"Mozilla/4.0 (compatible; MSIE 6.0; Windows 98; Q312461; .NET
+  // CLR 1.0.3705)"`.
   string user_agent = 6;
 
   // The IP address (IPv4 or IPv6) of the client that issued the HTTP
-  // request. Examples: `"192.168.1.1"`, `"FE80::0202:B3FF:FE1E:8329"`.
+  // request. This field can include port information. Examples:
+  // `"192.168.1.1"`, `"10.0.0.1:80"`, `"FE80::0202:B3FF:FE1E:8329"`.
   string remote_ip = 7;
 
   // The IP address (IPv4 or IPv6) of the origin server that the request was
-  // sent to.
+  // sent to. This field can include port information. Examples:
+  // `"192.168.1.1"`, `"10.0.0.1:80"`, `"FE80::0202:B3FF:FE1E:8329"`.
   string server_ip = 13;
 
   // The referer URL of the request, as defined in
-  // [HTTP/1.1 Header Field Definitions](http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html).
+  // [HTTP/1.1 Header Field
+  // Definitions](http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html).
   string referer = 8;
 
   // The request processing latency on the server, from the time the request was
diff --git a/google/logging/type/http_request_pb2.py b/google/logging/type/http_request_pb2.py
index 95de962..abb64b4 100644
--- a/google/logging/type/http_request_pb2.py
+++ b/google/logging/type/http_request_pb2.py
@@ -27,7 +27,6 @@
 _sym_db = _symbol_database.Default()
 
 
-from google.api import annotations_pb2 as google_dot_api_dot_annotations__pb2
 from google.protobuf import duration_pb2 as google_dot_protobuf_dot_duration__pb2
 
 
@@ -35,13 +34,10 @@
     name="google/logging/type/http_request.proto",
     package="google.logging.type",
     syntax="proto3",
-    serialized_options=b"\n\027com.google.logging.typeB\020HttpRequestProtoP\001Z8google.golang.org/genproto/googleapis/logging/type;ltype\252\002\031Google.Cloud.Logging.Type\312\002\031Google\\Cloud\\Logging\\Type",
+    serialized_options=b"\n\027com.google.logging.typeB\020HttpRequestProtoP\001Z8google.golang.org/genproto/googleapis/logging/type;ltype\252\002\031Google.Cloud.Logging.Type\312\002\031Google\\Cloud\\Logging\\Type\352\002\034Google::Cloud::Logging::Type",
     create_key=_descriptor._internal_create_key,
-    serialized_pb=b'\n&google/logging/type/http_request.proto\x12\x13google.logging.type\x1a\x1cgoogle/api/annotations.proto\x1a\x1egoogle/protobuf/duration.proto"\xef\x02\n\x0bHttpRequest\x12\x16\n\x0erequest_method\x18\x01 \x01(\t\x12\x13\n\x0brequest_url\x18\x02 \x01(\t\x12\x14\n\x0crequest_size\x18\x03 \x01(\x03\x12\x0e\n\x06status\x18\x04 \x01(\x05\x12\x15\n\rresponse_size\x18\x05 \x01(\x03\x12\x12\n\nuser_agent\x18\x06 \x01(\t\x12\x11\n\tremote_ip\x18\x07 \x01(\t\x12\x11\n\tserver_ip\x18\r \x01(\t\x12\x0f\n\x07referer\x18\x08 \x01(\t\x12*\n\x07latency\x18\x0e \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x14\n\x0c\x63\x61\x63he_lookup\x18\x0b \x01(\x08\x12\x11\n\tcache_hit\x18\t \x01(\x08\x12*\n"cache_validated_with_origin_server\x18\n \x01(\x08\x12\x18\n\x10\x63\x61\x63he_fill_bytes\x18\x0c \x01(\x03\x12\x10\n\x08protocol\x18\x0f \x01(\tB\x9f\x01\n\x17\x63om.google.logging.typeB\x10HttpRequestProtoP\x01Z8google.golang.org/genproto/googleapis/logging/type;ltype\xaa\x02\x19Google.Cloud.Logging.Type\xca\x02\x19Google\\Cloud\\Logging\\Typeb\x06proto3',
-    dependencies=[
-        google_dot_api_dot_annotations__pb2.DESCRIPTOR,
-        google_dot_protobuf_dot_duration__pb2.DESCRIPTOR,
-    ],
+    serialized_pb=b'\n&google/logging/type/http_request.proto\x12\x13google.logging.type\x1a\x1egoogle/protobuf/duration.proto"\xef\x02\n\x0bHttpRequest\x12\x16\n\x0erequest_method\x18\x01 \x01(\t\x12\x13\n\x0brequest_url\x18\x02 \x01(\t\x12\x14\n\x0crequest_size\x18\x03 \x01(\x03\x12\x0e\n\x06status\x18\x04 \x01(\x05\x12\x15\n\rresponse_size\x18\x05 \x01(\x03\x12\x12\n\nuser_agent\x18\x06 \x01(\t\x12\x11\n\tremote_ip\x18\x07 \x01(\t\x12\x11\n\tserver_ip\x18\r \x01(\t\x12\x0f\n\x07referer\x18\x08 \x01(\t\x12*\n\x07latency\x18\x0e \x01(\x0b\x32\x19.google.protobuf.Duration\x12\x14\n\x0c\x63\x61\x63he_lookup\x18\x0b \x01(\x08\x12\x11\n\tcache_hit\x18\t \x01(\x08\x12*\n"cache_validated_with_origin_server\x18\n \x01(\x08\x12\x18\n\x10\x63\x61\x63he_fill_bytes\x18\x0c \x01(\x03\x12\x10\n\x08protocol\x18\x0f \x01(\tB\xbe\x01\n\x17\x63om.google.logging.typeB\x10HttpRequestProtoP\x01Z8google.golang.org/genproto/googleapis/logging/type;ltype\xaa\x02\x19Google.Cloud.Logging.Type\xca\x02\x19Google\\Cloud\\Logging\\Type\xea\x02\x1cGoogle::Cloud::Logging::Typeb\x06proto3',
+    dependencies=[google_dot_protobuf_dot_duration__pb2.DESCRIPTOR],
 )
 
 
@@ -347,8 +343,8 @@
     syntax="proto3",
     extension_ranges=[],
     oneofs=[],
-    serialized_start=126,
-    serialized_end=493,
+    serialized_start=96,
+    serialized_end=463,
 )
 
 _HTTPREQUEST.fields_by_name[
diff --git a/google/logging/type/log_severity.proto b/google/logging/type/log_severity.proto
index 41351c6..bed7193 100644
--- a/google/logging/type/log_severity.proto
+++ b/google/logging/type/log_severity.proto
@@ -1,4 +1,4 @@
-// Copyright 2017 Google Inc.
+// Copyright 2022 Google LLC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -16,15 +16,14 @@ syntax = "proto3";
 
 package google.logging.type;
 
-import "google/api/annotations.proto";
-
 option csharp_namespace = "Google.Cloud.Logging.Type";
 option go_package = "google.golang.org/genproto/googleapis/logging/type;ltype";
 option java_multiple_files = true;
 option java_outer_classname = "LogSeverityProto";
 option java_package = "com.google.logging.type";
+option objc_class_prefix = "GLOG";
 option php_namespace = "Google\\Cloud\\Logging\\Type";
-
+option ruby_package = "Google::Cloud::Logging::Type";
 
 // The severity of the event described in a log entry, expressed as one of the
 // standard severity levels listed below.  For your reference, the levels are
diff --git a/google/logging/type/log_severity_pb2.py b/google/logging/type/log_severity_pb2.py
index 11f2d1b..18926ce 100644
--- a/google/logging/type/log_severity_pb2.py
+++ b/google/logging/type/log_severity_pb2.py
@@ -28,17 +28,13 @@
 _sym_db = _symbol_database.Default()
 
 
-from google.api import annotations_pb2 as google_dot_api_dot_annotations__pb2
-
-
 DESCRIPTOR = _descriptor.FileDescriptor(
     name="google/logging/type/log_severity.proto",
     package="google.logging.type",
     syntax="proto3",
-    serialized_options=b"\n\027com.google.logging.typeB\020LogSeverityProtoP\001Z8google.golang.org/genproto/googleapis/logging/type;ltype\252\002\031Google.Cloud.Logging.Type\312\002\031Google\\Cloud\\Logging\\Type",
+    serialized_options=b"\n\027com.google.logging.typeB\020LogSeverityProtoP\001Z8google.golang.org/genproto/googleapis/logging/type;ltype\242\002\004GLOG\252\002\031Google.Cloud.Logging.Type\312\002\031Google\\Cloud\\Logging\\Type\352\002\034Google::Cloud::Logging::Type",
     create_key=_descriptor._internal_create_key,
-    serialized_pb=b"\n&google/logging/type/log_severity.proto\x12\x13google.logging.type\x1a\x1cgoogle/api/annotations.proto*\x82\x01\n\x0bLogSeverity\x12\x0b\n\x07\x44\x45\x46\x41ULT\x10\x00\x12\t\n\x05\x44\x45\x42UG\x10\x64\x12\t\n\x04INFO\x10\xc8\x01\x12\x0b\n\x06NOTICE\x10\xac\x02\x12\x0c\n\x07WARNING\x10\x90\x03\x12\n\n\x05\x45RROR\x10\xf4\x03\x12\r\n\x08\x43RITICAL\x10\xd8\x04\x12\n\n\x05\x41LERT\x10\xbc\x05\x12\x0e\n\tEMERGENCY\x10\xa0\x06\x42\x9f\x01\n\x17\x63om.google.logging.typeB\x10LogSeverityProtoP\x01Z8google.golang.org/genproto/googleapis/logging/type;ltype\xaa\x02\x19Google.Cloud.Logging.Type\xca\x02\x19Google\\Cloud\\Logging\\Typeb\x06proto3",
-    dependencies=[google_dot_api_dot_annotations__pb2.DESCRIPTOR],
+    serialized_pb=b"\n&google/logging/type/log_severity.proto\x12\x13google.logging.type*\x82\x01\n\x0bLogSeverity\x12\x0b\n\x07\x44\x45\x46\x41ULT\x10\x00\x12\t\n\x05\x44\x45\x42UG\x10\x64\x12\t\n\x04INFO\x10\xc8\x01\x12\x0b\n\x06NOTICE\x10\xac\x02\x12\x0c\n\x07WARNING\x10\x90\x03\x12\n\n\x05\x45RROR\x10\xf4\x03\x12\r\n\x08\x43RITICAL\x10\xd8\x04\x12\n\n\x05\x41LERT\x10\xbc\x05\x12\x0e\n\tEMERGENCY\x10\xa0\x06\x42\xc5\x01\n\x17\x63om.google.logging.typeB\x10LogSeverityProtoP\x01Z8google.golang.org/genproto/googleapis/logging/type;ltype\xa2\x02\x04GLOG\xaa\x02\x19Google.Cloud.Logging.Type\xca\x02\x19Google\\Cloud\\Logging\\Type\xea\x02\x1cGoogle::Cloud::Logging::Typeb\x06proto3",
 )
 
 _LOGSEVERITY = _descriptor.EnumDescriptor(
@@ -123,8 +119,8 @@
     ],
     containing_type=None,
     serialized_options=None,
-    serialized_start=94,
-    serialized_end=224,
+    serialized_start=64,
+    serialized_end=194,
 )
 _sym_db.RegisterEnumDescriptor(_LOGSEVERITY)
 
diff --git a/google/longrunning/operations.proto b/google/longrunning/operations.proto
index 299eefb..c1fdc6f 100644
--- a/google/longrunning/operations.proto
+++ b/google/longrunning/operations.proto
@@ -1,4 +1,4 @@
-// Copyright 2019 Google LLC.
+// Copyright 2020 Google LLC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -110,9 +110,9 @@ service Operations {
     option (google.api.method_signature) = "name";
   }
 
-  // Waits for the specified long-running operation until it is done or reaches
-  // at most a specified timeout, returning the latest state.  If the operation
-  // is already done, the latest state is immediately returned.  If the timeout
+  // Waits until the specified long-running operation is done or reaches at most
+  // a specified timeout, returning the latest state.  If the operation is
+  // already done, the latest state is immediately returned.  If the timeout
   // specified is greater than the default HTTP/RPC timeout, the HTTP/RPC
   // timeout is used.  If the server does not support this method, it returns
   // `google.rpc.Code.UNIMPLEMENTED`.
diff --git a/google/longrunning/operations_pb2_grpc.py b/google/longrunning/operations_pb2_grpc.py
index 5d010a3..d840270 100644
--- a/google/longrunning/operations_pb2_grpc.py
+++ b/google/longrunning/operations_pb2_grpc.py
@@ -133,9 +133,9 @@ def CancelOperation(self, request, context):
         raise NotImplementedError("Method not implemented!")
 
     def WaitOperation(self, request, context):
-        """Waits for the specified long-running operation until it is done or reaches
-        at most a specified timeout, returning the latest state.  If the operation
-        is already done, the latest state is immediately returned.  If the timeout
+        """Waits until the specified long-running operation is done or reaches at most
+        a specified timeout, returning the latest state.  If the operation is
+        already done, the latest state is immediately returned.  If the timeout
         specified is greater than the default HTTP/RPC timeout, the HTTP/RPC
         timeout is used.  If the server does not support this method, it returns
         `google.rpc.Code.UNIMPLEMENTED`.
diff --git a/google/rpc/context/attribute_context.proto b/google/rpc/context/attribute_context.proto
index e60a5ae..30fe6f2 100644
--- a/google/rpc/context/attribute_context.proto
+++ b/google/rpc/context/attribute_context.proto
@@ -16,6 +16,8 @@ syntax = "proto3";
 
 package google.rpc.context;
 
+import "google/protobuf/any.proto";
+import "google/protobuf/duration.proto";
 import "google/protobuf/struct.proto";
 import "google/protobuf/timestamp.proto";
 
@@ -107,10 +109,10 @@ message AttributeContext {
     // value(s) depends on the `issuer`, but typically include one or more of
     // the following pieces of information:
     //
-    // *  The services intended to receive the credential such as
-    //    ["pubsub.googleapis.com", "storage.googleapis.com"]
+    // *  The services intended to receive the credential. For example,
+    //    ["https://pubsub.googleapis.com/", "https://storage.googleapis.com/"].
     // *  A set of service-based scopes. For example,
-    //    ["https://www.googleapis.com/auth/cloud-platform"]
+    //    ["https://www.googleapis.com/auth/cloud-platform"].
     // *  The client id of an app, such as the Firebase project id for JWTs
     //    from Firebase Auth.
     //
@@ -181,7 +183,7 @@ message AttributeContext {
     // appears in the first line of the HTTP request. No decoding is performed.
     string query = 7;
 
-    // The timestamp when the `destination` service receives the first byte of
+    // The timestamp when the `destination` service receives the last byte of
     // the request.
     google.protobuf.Timestamp time = 9;
 
@@ -217,9 +219,15 @@ message AttributeContext {
     // lowercased, because HTTP header keys are case-insensitive.
     map headers = 3;
 
-    // The timestamp when the `destination` service generates the first byte of
+    // The timestamp when the `destination` service sends the last byte of
     // the response.
     google.protobuf.Timestamp time = 4;
+
+    // The length of time it takes the backend service to fully respond to a
+    // request. Measured from when the destination service starts to send the
+    // request to the backend until when the destination service receives the
+    // complete response from the backend.
+    google.protobuf.Duration backend_latency = 5;
   }
 
   // This message defines core attributes for a resource. A resource is an
@@ -254,6 +262,51 @@ message AttributeContext {
     // The labels or tags on the resource, such as AWS resource tags and
     // Kubernetes resource labels.
     map labels = 4;
+
+    // The unique identifier of the resource. UID is unique in the time
+    // and space for this resource within the scope of the service. It is
+    // typically generated by the server on successful creation of a resource
+    // and must not be changed. UID is used to uniquely identify resources
+    // with resource name reuses. This should be a UUID4.
+    string uid = 5;
+
+    // Annotations is an unstructured key-value map stored with a resource that
+    // may be set by external tools to store and retrieve arbitrary metadata.
+    // They are not queryable and should be preserved when modifying objects.
+    //
+    // More info: https://kubernetes.io/docs/user-guide/annotations
+    map annotations = 6;
+
+    // Mutable. The display name set by clients. Must be <= 63 characters.
+    string display_name = 7;
+
+    // Output only. The timestamp when the resource was created. This may
+    // be either the time creation was initiated or when it was completed.
+    google.protobuf.Timestamp create_time = 8;
+
+    // Output only. The timestamp when the resource was last updated. Any
+    // change to the resource made by users must refresh this value.
+    // Changes to a resource made by the service should refresh this value.
+    google.protobuf.Timestamp update_time = 9;
+
+    // Output only. The timestamp when the resource was deleted.
+    // If the resource is not deleted, this must be empty.
+    google.protobuf.Timestamp delete_time = 10;
+
+    // Output only. An opaque value that uniquely identifies a version or
+    // generation of a resource. It can be used to confirm that the client
+    // and server agree on the ordering of a resource being written.
+    string etag = 11;
+
+    // Immutable. The location of the resource. The location encoding is
+    // specific to the service provider, and new encoding may be introduced
+    // as the service evolves.
+    //
+    // For Google Cloud products, the encoding is what is used by Google Cloud
+    // APIs, such as `us-east1`, `aws-us-east-1`, and `azure-eastus2`. The
+    // semantics of `location` is identical to the
+    // `cloud.googleapis.com/location` label used by some Google Cloud APIs.
+    string location = 12;
   }
 
   // The origin of a network activity. In a multi hop network activity,
@@ -284,4 +337,7 @@ message AttributeContext {
 
   // Represents an API operation that is involved to a network activity.
   Api api = 6;
+
+  // Supports extensions for advanced use cases, such as logs and metrics.
+  repeated google.protobuf.Any extensions = 8;
 }
diff --git a/google/rpc/context/attribute_context_pb2.py b/google/rpc/context/attribute_context_pb2.py
index ada99e8..a2cbcef 100644
--- a/google/rpc/context/attribute_context_pb2.py
+++ b/google/rpc/context/attribute_context_pb2.py
@@ -27,6 +27,8 @@
 _sym_db = _symbol_database.Default()
 
 
+from google.protobuf import any_pb2 as google_dot_protobuf_dot_any__pb2
+from google.protobuf import duration_pb2 as google_dot_protobuf_dot_duration__pb2
 from google.protobuf import struct_pb2 as google_dot_protobuf_dot_struct__pb2
 from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2
 
@@ -37,8 +39,10 @@
     syntax="proto3",
     serialized_options=b"\n\026com.google.rpc.contextB\025AttributeContextProtoP\001ZUgoogle.golang.org/genproto/googleapis/rpc/context/attribute_context;attribute_context\370\001\001",
     create_key=_descriptor._internal_create_key,
-    serialized_pb=b"\n*google/rpc/context/attribute_context.proto\x12\x12google.rpc.context\x1a\x1cgoogle/protobuf/struct.proto\x1a\x1fgoogle/protobuf/timestamp.proto\"\xc6\x0c\n\x10\x41ttributeContext\x12\x39\n\x06origin\x18\x07 \x01(\x0b\x32).google.rpc.context.AttributeContext.Peer\x12\x39\n\x06source\x18\x01 \x01(\x0b\x32).google.rpc.context.AttributeContext.Peer\x12>\n\x0b\x64\x65stination\x18\x02 \x01(\x0b\x32).google.rpc.context.AttributeContext.Peer\x12=\n\x07request\x18\x03 \x01(\x0b\x32,.google.rpc.context.AttributeContext.Request\x12?\n\x08response\x18\x04 \x01(\x0b\x32-.google.rpc.context.AttributeContext.Response\x12?\n\x08resource\x18\x05 \x01(\x0b\x32-.google.rpc.context.AttributeContext.Resource\x12\x35\n\x03\x61pi\x18\x06 \x01(\x0b\x32(.google.rpc.context.AttributeContext.Api\x1a\xbe\x01\n\x04Peer\x12\n\n\x02ip\x18\x01 \x01(\t\x12\x0c\n\x04port\x18\x02 \x01(\x03\x12\x45\n\x06labels\x18\x06 \x03(\x0b\x32\x35.google.rpc.context.AttributeContext.Peer.LabelsEntry\x12\x11\n\tprincipal\x18\x07 \x01(\t\x12\x13\n\x0bregion_code\x18\x08 \x01(\t\x1a-\n\x0bLabelsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x1aL\n\x03\x41pi\x12\x0f\n\x07service\x18\x01 \x01(\t\x12\x11\n\toperation\x18\x02 \x01(\t\x12\x10\n\x08protocol\x18\x03 \x01(\t\x12\x0f\n\x07version\x18\x04 \x01(\t\x1a\x7f\n\x04\x41uth\x12\x11\n\tprincipal\x18\x01 \x01(\t\x12\x11\n\taudiences\x18\x02 \x03(\t\x12\x11\n\tpresenter\x18\x03 \x01(\t\x12'\n\x06\x63laims\x18\x04 \x01(\x0b\x32\x17.google.protobuf.Struct\x12\x15\n\raccess_levels\x18\x05 \x03(\t\x1a\xef\x02\n\x07Request\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0e\n\x06method\x18\x02 \x01(\t\x12J\n\x07headers\x18\x03 \x03(\x0b\x32\x39.google.rpc.context.AttributeContext.Request.HeadersEntry\x12\x0c\n\x04path\x18\x04 \x01(\t\x12\x0c\n\x04host\x18\x05 \x01(\t\x12\x0e\n\x06scheme\x18\x06 \x01(\t\x12\r\n\x05query\x18\x07 \x01(\t\x12(\n\x04time\x18\t \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0c\n\x04size\x18\n \x01(\x03\x12\x10\n\x08protocol\x18\x0b \x01(\t\x12\x0e\n\x06reason\x18\x0c \x01(\t\x12\x37\n\x04\x61uth\x18\r \x01(\x0b\x32).google.rpc.context.AttributeContext.Auth\x1a.\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x1a\xcd\x01\n\x08Response\x12\x0c\n\x04\x63ode\x18\x01 \x01(\x03\x12\x0c\n\x04size\x18\x02 \x01(\x03\x12K\n\x07headers\x18\x03 \x03(\x0b\x32:.google.rpc.context.AttributeContext.Response.HeadersEntry\x12(\n\x04time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x1a.\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x1a\xb1\x01\n\x08Resource\x12\x0f\n\x07service\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x0c\n\x04type\x18\x03 \x01(\t\x12I\n\x06labels\x18\x04 \x03(\x0b\x32\x39.google.rpc.context.AttributeContext.Resource.LabelsEntry\x1a-\n\x0bLabelsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x42\x8b\x01\n\x16\x63om.google.rpc.contextB\x15\x41ttributeContextProtoP\x01ZUgoogle.golang.org/genproto/googleapis/rpc/context/attribute_context;attribute_context\xf8\x01\x01\x62\x06proto3",
+    serialized_pb=b"\n*google/rpc/context/attribute_context.proto\x12\x12google.rpc.context\x1a\x19google/protobuf/any.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1cgoogle/protobuf/struct.proto\x1a\x1fgoogle/protobuf/timestamp.proto\"\x83\x10\n\x10\x41ttributeContext\x12\x39\n\x06origin\x18\x07 \x01(\x0b\x32).google.rpc.context.AttributeContext.Peer\x12\x39\n\x06source\x18\x01 \x01(\x0b\x32).google.rpc.context.AttributeContext.Peer\x12>\n\x0b\x64\x65stination\x18\x02 \x01(\x0b\x32).google.rpc.context.AttributeContext.Peer\x12=\n\x07request\x18\x03 \x01(\x0b\x32,.google.rpc.context.AttributeContext.Request\x12?\n\x08response\x18\x04 \x01(\x0b\x32-.google.rpc.context.AttributeContext.Response\x12?\n\x08resource\x18\x05 \x01(\x0b\x32-.google.rpc.context.AttributeContext.Resource\x12\x35\n\x03\x61pi\x18\x06 \x01(\x0b\x32(.google.rpc.context.AttributeContext.Api\x12(\n\nextensions\x18\x08 \x03(\x0b\x32\x14.google.protobuf.Any\x1a\xbe\x01\n\x04Peer\x12\n\n\x02ip\x18\x01 \x01(\t\x12\x0c\n\x04port\x18\x02 \x01(\x03\x12\x45\n\x06labels\x18\x06 \x03(\x0b\x32\x35.google.rpc.context.AttributeContext.Peer.LabelsEntry\x12\x11\n\tprincipal\x18\x07 \x01(\t\x12\x13\n\x0bregion_code\x18\x08 \x01(\t\x1a-\n\x0bLabelsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x1aL\n\x03\x41pi\x12\x0f\n\x07service\x18\x01 \x01(\t\x12\x11\n\toperation\x18\x02 \x01(\t\x12\x10\n\x08protocol\x18\x03 \x01(\t\x12\x0f\n\x07version\x18\x04 \x01(\t\x1a\x7f\n\x04\x41uth\x12\x11\n\tprincipal\x18\x01 \x01(\t\x12\x11\n\taudiences\x18\x02 \x03(\t\x12\x11\n\tpresenter\x18\x03 \x01(\t\x12'\n\x06\x63laims\x18\x04 \x01(\x0b\x32\x17.google.protobuf.Struct\x12\x15\n\raccess_levels\x18\x05 \x03(\t\x1a\xef\x02\n\x07Request\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0e\n\x06method\x18\x02 \x01(\t\x12J\n\x07headers\x18\x03 \x03(\x0b\x32\x39.google.rpc.context.AttributeContext.Request.HeadersEntry\x12\x0c\n\x04path\x18\x04 \x01(\t\x12\x0c\n\x04host\x18\x05 \x01(\t\x12\x0e\n\x06scheme\x18\x06 \x01(\t\x12\r\n\x05query\x18\x07 \x01(\t\x12(\n\x04time\x18\t \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0c\n\x04size\x18\n \x01(\x03\x12\x10\n\x08protocol\x18\x0b \x01(\t\x12\x0e\n\x06reason\x18\x0c \x01(\t\x12\x37\n\x04\x61uth\x18\r \x01(\x0b\x32).google.rpc.context.AttributeContext.Auth\x1a.\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x1a\x81\x02\n\x08Response\x12\x0c\n\x04\x63ode\x18\x01 \x01(\x03\x12\x0c\n\x04size\x18\x02 \x01(\x03\x12K\n\x07headers\x18\x03 \x03(\x0b\x32:.google.rpc.context.AttributeContext.Response.HeadersEntry\x12(\n\x04time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x32\n\x0f\x62\x61\x63kend_latency\x18\x05 \x01(\x0b\x32\x19.google.protobuf.Duration\x1a.\n\x0cHeadersEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x1a\x90\x04\n\x08Resource\x12\x0f\n\x07service\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x0c\n\x04type\x18\x03 \x01(\t\x12I\n\x06labels\x18\x04 \x03(\x0b\x32\x39.google.rpc.context.AttributeContext.Resource.LabelsEntry\x12\x0b\n\x03uid\x18\x05 \x01(\t\x12S\n\x0b\x61nnotations\x18\x06 \x03(\x0b\x32>.google.rpc.context.AttributeContext.Resource.AnnotationsEntry\x12\x14\n\x0c\x64isplay_name\x18\x07 \x01(\t\x12/\n\x0b\x63reate_time\x18\x08 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12/\n\x0bupdate_time\x18\t \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12/\n\x0b\x64\x65lete_time\x18\n \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x0c\n\x04\x65tag\x18\x0b \x01(\t\x12\x10\n\x08location\x18\x0c \x01(\t\x1a-\n\x0bLabelsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x1a\x32\n\x10\x41nnotationsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x42\x8b\x01\n\x16\x63om.google.rpc.contextB\x15\x41ttributeContextProtoP\x01ZUgoogle.golang.org/genproto/googleapis/rpc/context/attribute_context;attribute_context\xf8\x01\x01\x62\x06proto3",
     dependencies=[
+        google_dot_protobuf_dot_any__pb2.DESCRIPTOR,
+        google_dot_protobuf_dot_duration__pb2.DESCRIPTOR,
         google_dot_protobuf_dot_struct__pb2.DESCRIPTOR,
         google_dot_protobuf_dot_timestamp__pb2.DESCRIPTOR,
     ],
@@ -100,8 +104,8 @@
     syntax="proto3",
     extension_ranges=[],
     oneofs=[],
-    serialized_start=726,
-    serialized_end=771,
+    serialized_start=827,
+    serialized_end=872,
 )
 
 _ATTRIBUTECONTEXT_PEER = _descriptor.Descriptor(
@@ -216,8 +220,8 @@
     syntax="proto3",
     extension_ranges=[],
     oneofs=[],
-    serialized_start=581,
-    serialized_end=771,
+    serialized_start=682,
+    serialized_end=872,
 )
 
 _ATTRIBUTECONTEXT_API = _descriptor.Descriptor(
@@ -313,8 +317,8 @@
     syntax="proto3",
     extension_ranges=[],
     oneofs=[],
-    serialized_start=773,
-    serialized_end=849,
+    serialized_start=874,
+    serialized_end=950,
 )
 
 _ATTRIBUTECONTEXT_AUTH = _descriptor.Descriptor(
@@ -429,8 +433,8 @@
     syntax="proto3",
     extension_ranges=[],
     oneofs=[],
-    serialized_start=851,
-    serialized_end=978,
+    serialized_start=952,
+    serialized_end=1079,
 )
 
 _ATTRIBUTECONTEXT_REQUEST_HEADERSENTRY = _descriptor.Descriptor(
@@ -488,8 +492,8 @@
     syntax="proto3",
     extension_ranges=[],
     oneofs=[],
-    serialized_start=1302,
-    serialized_end=1348,
+    serialized_start=1403,
+    serialized_end=1449,
 )
 
 _ATTRIBUTECONTEXT_REQUEST = _descriptor.Descriptor(
@@ -737,8 +741,8 @@
     syntax="proto3",
     extension_ranges=[],
     oneofs=[],
-    serialized_start=981,
-    serialized_end=1348,
+    serialized_start=1082,
+    serialized_end=1449,
 )
 
 _ATTRIBUTECONTEXT_RESPONSE_HEADERSENTRY = _descriptor.Descriptor(
@@ -796,8 +800,8 @@
     syntax="proto3",
     extension_ranges=[],
     oneofs=[],
-    serialized_start=1302,
-    serialized_end=1348,
+    serialized_start=1403,
+    serialized_end=1449,
 )
 
 _ATTRIBUTECONTEXT_RESPONSE = _descriptor.Descriptor(
@@ -884,6 +888,25 @@
             file=DESCRIPTOR,
             create_key=_descriptor._internal_create_key,
         ),
+        _descriptor.FieldDescriptor(
+            name="backend_latency",
+            full_name="google.rpc.context.AttributeContext.Response.backend_latency",
+            index=4,
+            number=5,
+            type=11,
+            cpp_type=10,
+            label=1,
+            has_default_value=False,
+            default_value=None,
+            message_type=None,
+            enum_type=None,
+            containing_type=None,
+            is_extension=False,
+            extension_scope=None,
+            serialized_options=None,
+            file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
+        ),
     ],
     extensions=[],
     nested_types=[_ATTRIBUTECONTEXT_RESPONSE_HEADERSENTRY],
@@ -893,8 +916,8 @@
     syntax="proto3",
     extension_ranges=[],
     oneofs=[],
-    serialized_start=1351,
-    serialized_end=1556,
+    serialized_start=1452,
+    serialized_end=1709,
 )
 
 _ATTRIBUTECONTEXT_RESOURCE_LABELSENTRY = _descriptor.Descriptor(
@@ -952,8 +975,67 @@
     syntax="proto3",
     extension_ranges=[],
     oneofs=[],
-    serialized_start=726,
-    serialized_end=771,
+    serialized_start=827,
+    serialized_end=872,
+)
+
+_ATTRIBUTECONTEXT_RESOURCE_ANNOTATIONSENTRY = _descriptor.Descriptor(
+    name="AnnotationsEntry",
+    full_name="google.rpc.context.AttributeContext.Resource.AnnotationsEntry",
+    filename=None,
+    file=DESCRIPTOR,
+    containing_type=None,
+    create_key=_descriptor._internal_create_key,
+    fields=[
+        _descriptor.FieldDescriptor(
+            name="key",
+            full_name="google.rpc.context.AttributeContext.Resource.AnnotationsEntry.key",
+            index=0,
+            number=1,
+            type=9,
+            cpp_type=9,
+            label=1,
+            has_default_value=False,
+            default_value=b"".decode("utf-8"),
+            message_type=None,
+            enum_type=None,
+            containing_type=None,
+            is_extension=False,
+            extension_scope=None,
+            serialized_options=None,
+            file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
+        ),
+        _descriptor.FieldDescriptor(
+            name="value",
+            full_name="google.rpc.context.AttributeContext.Resource.AnnotationsEntry.value",
+            index=1,
+            number=2,
+            type=9,
+            cpp_type=9,
+            label=1,
+            has_default_value=False,
+            default_value=b"".decode("utf-8"),
+            message_type=None,
+            enum_type=None,
+            containing_type=None,
+            is_extension=False,
+            extension_scope=None,
+            serialized_options=None,
+            file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
+        ),
+    ],
+    extensions=[],
+    nested_types=[],
+    enum_types=[],
+    serialized_options=b"8\001",
+    is_extendable=False,
+    syntax="proto3",
+    extension_ranges=[],
+    oneofs=[],
+    serialized_start=2190,
+    serialized_end=2240,
 )
 
 _ATTRIBUTECONTEXT_RESOURCE = _descriptor.Descriptor(
@@ -1040,17 +1122,172 @@
             file=DESCRIPTOR,
             create_key=_descriptor._internal_create_key,
         ),
+        _descriptor.FieldDescriptor(
+            name="uid",
+            full_name="google.rpc.context.AttributeContext.Resource.uid",
+            index=4,
+            number=5,
+            type=9,
+            cpp_type=9,
+            label=1,
+            has_default_value=False,
+            default_value=b"".decode("utf-8"),
+            message_type=None,
+            enum_type=None,
+            containing_type=None,
+            is_extension=False,
+            extension_scope=None,
+            serialized_options=None,
+            file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
+        ),
+        _descriptor.FieldDescriptor(
+            name="annotations",
+            full_name="google.rpc.context.AttributeContext.Resource.annotations",
+            index=5,
+            number=6,
+            type=11,
+            cpp_type=10,
+            label=3,
+            has_default_value=False,
+            default_value=[],
+            message_type=None,
+            enum_type=None,
+            containing_type=None,
+            is_extension=False,
+            extension_scope=None,
+            serialized_options=None,
+            file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
+        ),
+        _descriptor.FieldDescriptor(
+            name="display_name",
+            full_name="google.rpc.context.AttributeContext.Resource.display_name",
+            index=6,
+            number=7,
+            type=9,
+            cpp_type=9,
+            label=1,
+            has_default_value=False,
+            default_value=b"".decode("utf-8"),
+            message_type=None,
+            enum_type=None,
+            containing_type=None,
+            is_extension=False,
+            extension_scope=None,
+            serialized_options=None,
+            file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
+        ),
+        _descriptor.FieldDescriptor(
+            name="create_time",
+            full_name="google.rpc.context.AttributeContext.Resource.create_time",
+            index=7,
+            number=8,
+            type=11,
+            cpp_type=10,
+            label=1,
+            has_default_value=False,
+            default_value=None,
+            message_type=None,
+            enum_type=None,
+            containing_type=None,
+            is_extension=False,
+            extension_scope=None,
+            serialized_options=None,
+            file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
+        ),
+        _descriptor.FieldDescriptor(
+            name="update_time",
+            full_name="google.rpc.context.AttributeContext.Resource.update_time",
+            index=8,
+            number=9,
+            type=11,
+            cpp_type=10,
+            label=1,
+            has_default_value=False,
+            default_value=None,
+            message_type=None,
+            enum_type=None,
+            containing_type=None,
+            is_extension=False,
+            extension_scope=None,
+            serialized_options=None,
+            file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
+        ),
+        _descriptor.FieldDescriptor(
+            name="delete_time",
+            full_name="google.rpc.context.AttributeContext.Resource.delete_time",
+            index=9,
+            number=10,
+            type=11,
+            cpp_type=10,
+            label=1,
+            has_default_value=False,
+            default_value=None,
+            message_type=None,
+            enum_type=None,
+            containing_type=None,
+            is_extension=False,
+            extension_scope=None,
+            serialized_options=None,
+            file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
+        ),
+        _descriptor.FieldDescriptor(
+            name="etag",
+            full_name="google.rpc.context.AttributeContext.Resource.etag",
+            index=10,
+            number=11,
+            type=9,
+            cpp_type=9,
+            label=1,
+            has_default_value=False,
+            default_value=b"".decode("utf-8"),
+            message_type=None,
+            enum_type=None,
+            containing_type=None,
+            is_extension=False,
+            extension_scope=None,
+            serialized_options=None,
+            file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
+        ),
+        _descriptor.FieldDescriptor(
+            name="location",
+            full_name="google.rpc.context.AttributeContext.Resource.location",
+            index=11,
+            number=12,
+            type=9,
+            cpp_type=9,
+            label=1,
+            has_default_value=False,
+            default_value=b"".decode("utf-8"),
+            message_type=None,
+            enum_type=None,
+            containing_type=None,
+            is_extension=False,
+            extension_scope=None,
+            serialized_options=None,
+            file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
+        ),
     ],
     extensions=[],
-    nested_types=[_ATTRIBUTECONTEXT_RESOURCE_LABELSENTRY],
+    nested_types=[
+        _ATTRIBUTECONTEXT_RESOURCE_LABELSENTRY,
+        _ATTRIBUTECONTEXT_RESOURCE_ANNOTATIONSENTRY,
+    ],
     enum_types=[],
     serialized_options=None,
     is_extendable=False,
     syntax="proto3",
     extension_ranges=[],
     oneofs=[],
-    serialized_start=1559,
-    serialized_end=1736,
+    serialized_start=1712,
+    serialized_end=2240,
 )
 
 _ATTRIBUTECONTEXT = _descriptor.Descriptor(
@@ -1194,6 +1431,25 @@
             file=DESCRIPTOR,
             create_key=_descriptor._internal_create_key,
         ),
+        _descriptor.FieldDescriptor(
+            name="extensions",
+            full_name="google.rpc.context.AttributeContext.extensions",
+            index=7,
+            number=8,
+            type=11,
+            cpp_type=10,
+            label=3,
+            has_default_value=False,
+            default_value=[],
+            message_type=None,
+            enum_type=None,
+            containing_type=None,
+            is_extension=False,
+            extension_scope=None,
+            serialized_options=None,
+            file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
+        ),
     ],
     extensions=[],
     nested_types=[
@@ -1210,8 +1466,8 @@
     syntax="proto3",
     extension_ranges=[],
     oneofs=[],
-    serialized_start=130,
-    serialized_end=1736,
+    serialized_start=189,
+    serialized_end=2240,
 )
 
 _ATTRIBUTECONTEXT_PEER_LABELSENTRY.containing_type = _ATTRIBUTECONTEXT_PEER
@@ -1240,11 +1496,27 @@
 _ATTRIBUTECONTEXT_RESPONSE.fields_by_name[
     "time"
 ].message_type = google_dot_protobuf_dot_timestamp__pb2._TIMESTAMP
+_ATTRIBUTECONTEXT_RESPONSE.fields_by_name[
+    "backend_latency"
+].message_type = google_dot_protobuf_dot_duration__pb2._DURATION
 _ATTRIBUTECONTEXT_RESPONSE.containing_type = _ATTRIBUTECONTEXT
 _ATTRIBUTECONTEXT_RESOURCE_LABELSENTRY.containing_type = _ATTRIBUTECONTEXT_RESOURCE
+_ATTRIBUTECONTEXT_RESOURCE_ANNOTATIONSENTRY.containing_type = _ATTRIBUTECONTEXT_RESOURCE
 _ATTRIBUTECONTEXT_RESOURCE.fields_by_name[
     "labels"
 ].message_type = _ATTRIBUTECONTEXT_RESOURCE_LABELSENTRY
+_ATTRIBUTECONTEXT_RESOURCE.fields_by_name[
+    "annotations"
+].message_type = _ATTRIBUTECONTEXT_RESOURCE_ANNOTATIONSENTRY
+_ATTRIBUTECONTEXT_RESOURCE.fields_by_name[
+    "create_time"
+].message_type = google_dot_protobuf_dot_timestamp__pb2._TIMESTAMP
+_ATTRIBUTECONTEXT_RESOURCE.fields_by_name[
+    "update_time"
+].message_type = google_dot_protobuf_dot_timestamp__pb2._TIMESTAMP
+_ATTRIBUTECONTEXT_RESOURCE.fields_by_name[
+    "delete_time"
+].message_type = google_dot_protobuf_dot_timestamp__pb2._TIMESTAMP
 _ATTRIBUTECONTEXT_RESOURCE.containing_type = _ATTRIBUTECONTEXT
 _ATTRIBUTECONTEXT.fields_by_name["origin"].message_type = _ATTRIBUTECONTEXT_PEER
 _ATTRIBUTECONTEXT.fields_by_name["source"].message_type = _ATTRIBUTECONTEXT_PEER
@@ -1253,6 +1525,9 @@
 _ATTRIBUTECONTEXT.fields_by_name["response"].message_type = _ATTRIBUTECONTEXT_RESPONSE
 _ATTRIBUTECONTEXT.fields_by_name["resource"].message_type = _ATTRIBUTECONTEXT_RESOURCE
 _ATTRIBUTECONTEXT.fields_by_name["api"].message_type = _ATTRIBUTECONTEXT_API
+_ATTRIBUTECONTEXT.fields_by_name[
+    "extensions"
+].message_type = google_dot_protobuf_dot_any__pb2._ANY
 DESCRIPTOR.message_types_by_name["AttributeContext"] = _ATTRIBUTECONTEXT
 _sym_db.RegisterFileDescriptor(DESCRIPTOR)
 
@@ -1345,6 +1620,15 @@
                         # @@protoc_insertion_point(class_scope:google.rpc.context.AttributeContext.Resource.LabelsEntry)
                     },
                 ),
+                "AnnotationsEntry": _reflection.GeneratedProtocolMessageType(
+                    "AnnotationsEntry",
+                    (_message.Message,),
+                    {
+                        "DESCRIPTOR": _ATTRIBUTECONTEXT_RESOURCE_ANNOTATIONSENTRY,
+                        "__module__": "google.rpc.context.attribute_context_pb2"
+                        # @@protoc_insertion_point(class_scope:google.rpc.context.AttributeContext.Resource.AnnotationsEntry)
+                    },
+                ),
                 "DESCRIPTOR": _ATTRIBUTECONTEXT_RESOURCE,
                 "__module__": "google.rpc.context.attribute_context_pb2"
                 # @@protoc_insertion_point(class_scope:google.rpc.context.AttributeContext.Resource)
@@ -1366,6 +1650,7 @@
 _sym_db.RegisterMessage(AttributeContext.Response.HeadersEntry)
 _sym_db.RegisterMessage(AttributeContext.Resource)
 _sym_db.RegisterMessage(AttributeContext.Resource.LabelsEntry)
+_sym_db.RegisterMessage(AttributeContext.Resource.AnnotationsEntry)
 
 
 DESCRIPTOR._options = None
@@ -1373,4 +1658,5 @@
 _ATTRIBUTECONTEXT_REQUEST_HEADERSENTRY._options = None
 _ATTRIBUTECONTEXT_RESPONSE_HEADERSENTRY._options = None
 _ATTRIBUTECONTEXT_RESOURCE_LABELSENTRY._options = None
+_ATTRIBUTECONTEXT_RESOURCE_ANNOTATIONSENTRY._options = None
 # @@protoc_insertion_point(module_scope)
diff --git a/google/rpc/error_details.proto b/google/rpc/error_details.proto
index 4862ebf..c4d6c4b 100644
--- a/google/rpc/error_details.proto
+++ b/google/rpc/error_details.proto
@@ -89,24 +89,26 @@ message QuotaFailure {
 //
 // Example of an error when contacting the "pubsub.googleapis.com" API when it
 // is not enabled:
-//     { "reason":   "API_DISABLED"
+//
+//     { "reason": "API_DISABLED"
 //       "domain": "googleapis.com"
 //       "metadata": {
 //         "resource": "projects/123",
 //         "service": "pubsub.googleapis.com"
 //       }
 //     }
+//
 // This response indicates that the pubsub.googleapis.com API is not enabled.
 //
 // Example of an error that is returned when attempting to create a Spanner
 // instance in a region that is out of stock:
-//     { "reason":   "STOCKOUT"
+//
+//     { "reason": "STOCKOUT"
 //       "domain": "spanner.googleapis.com",
 //       "metadata": {
 //         "availableRegions": "us-central1,us-east2"
 //       }
 //     }
-//
 message ErrorInfo {
   // The reason of the error. This is a constant value that identifies the
   // proximate cause of the error. Error reasons are unique within a particular
@@ -114,11 +116,12 @@ message ErrorInfo {
   // /[A-Z0-9_]+/.
   string reason = 1;
 
-  // The logical grouping to which the "reason" belongs.  Often "domain" will
-  // contain the registered service name of the tool or product that is the
-  // source of the error. Example: "pubsub.googleapis.com". If the error is
-  // common across many APIs, the first segment of the example above will be
-  // omitted.  The value will be, "googleapis.com".
+  // The logical grouping to which the "reason" belongs. The error domain
+  // is typically the registered service name of the tool or product that
+  // generates the error. Example: "pubsub.googleapis.com". If the error is
+  // generated by some common infrastructure, the error domain must be a
+  // globally unique value that identifies the infrastructure. For Google API
+  // infrastructure, the error domain is "googleapis.com".
   string domain = 2;
 
   // Additional structured details about this error.
diff --git a/google/type/calendar_period.proto b/google/type/calendar_period.proto
index a91d0c3..82f5690 100644
--- a/google/type/calendar_period.proto
+++ b/google/type/calendar_period.proto
@@ -1,4 +1,4 @@
-// Copyright 2019 Google LLC.
+// Copyright 2021 Google LLC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -11,7 +11,6 @@
 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 // See the License for the specific language governing permissions and
 // limitations under the License.
-//
 
 syntax = "proto3";
 
diff --git a/google/type/color.proto b/google/type/color.proto
index 417f1c4..5dc85a6 100644
--- a/google/type/color.proto
+++ b/google/type/color.proto
@@ -1,4 +1,4 @@
-// Copyright 2019 Google LLC.
+// Copyright 2021 Google LLC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -11,7 +11,6 @@
 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 // See the License for the specific language governing permissions and
 // limitations under the License.
-//
 
 syntax = "proto3";
 
@@ -28,17 +27,22 @@ option objc_class_prefix = "GTP";
 
 // Represents a color in the RGBA color space. This representation is designed
 // for simplicity of conversion to/from color representations in various
-// languages over compactness; for example, the fields of this representation
-// can be trivially provided to the constructor of "java.awt.Color" in Java; it
-// can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
+// languages over compactness. For example, the fields of this representation
+// can be trivially provided to the constructor of `java.awt.Color` in Java; it
+// can also be trivially provided to UIColor's `+colorWithRed:green:blue:alpha`
 // method in iOS; and, with just a little work, it can be easily formatted into
-// a CSS "rgba()" string in JavaScript, as well.
+// a CSS `rgba()` string in JavaScript.
 //
-// Note: this proto does not carry information about the absolute color space
+// This reference page doesn't carry information about the absolute color
+// space
 // that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
-// DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
+// DCI-P3, BT.2020, etc.). By default, applications should assume the sRGB color
 // space.
 //
+// When color equality needs to be decided, implementations, unless
+// documented otherwise, treat two colors as equal if all their red,
+// green, blue, and alpha values each differ by at most 1e-5.
+//
 // Example (Java):
 //
 //      import com.google.type.Color;
@@ -124,7 +128,7 @@ option objc_class_prefix = "GTP";
 //        var blue = Math.floor(blueFrac * 255);
 //
 //        if (!('alpha' in rgb_color)) {
-//           return rgbToCssColor_(red, green, blue);
+//           return rgbToCssColor(red, green, blue);
 //        }
 //
 //        var alphaFrac = rgb_color.alpha.value || 0.0;
@@ -132,7 +136,7 @@ option objc_class_prefix = "GTP";
 //        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
 //     };
 //
-//     var rgbToCssColor_ = function(red, green, blue) {
+//     var rgbToCssColor = function(red, green, blue) {
 //       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
 //       var hexString = rgbNumber.toString(16);
 //       var missingZeros = 6 - hexString.length;
@@ -158,13 +162,13 @@ message Color {
   // The fraction of this color that should be applied to the pixel. That is,
   // the final pixel color is defined by the equation:
   //
-  //   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
+  //   `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)`
   //
   // This means that a value of 1.0 corresponds to a solid color, whereas
   // a value of 0.0 corresponds to a completely transparent color. This
   // uses a wrapper message rather than a simple float scalar so that it is
   // possible to distinguish between a default value and the value being unset.
-  // If omitted, this color object is to be rendered as a solid color
-  // (as if the alpha value had been explicitly given with a value of 1.0).
+  // If omitted, this color object is rendered as a solid color
+  // (as if the alpha value had been explicitly given a value of 1.0).
   google.protobuf.FloatValue alpha = 4;
 }
diff --git a/google/type/date.proto b/google/type/date.proto
index b958fee..e4e730e 100644
--- a/google/type/date.proto
+++ b/google/type/date.proto
@@ -1,4 +1,4 @@
-// Copyright 2019 Google LLC.
+// Copyright 2021 Google LLC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -11,7 +11,6 @@
 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 // See the License for the specific language governing permissions and
 // limitations under the License.
-//
 
 syntax = "proto3";
 
@@ -24,27 +23,30 @@ option java_outer_classname = "DateProto";
 option java_package = "com.google.type";
 option objc_class_prefix = "GTP";
 
-// Represents a whole or partial calendar date, e.g. a birthday. The time of day
-// and time zone are either specified elsewhere or are not significant. The date
-// is relative to the Proleptic Gregorian Calendar. This can represent:
+// Represents a whole or partial calendar date, such as a birthday. The time of
+// day and time zone are either specified elsewhere or are insignificant. The
+// date is relative to the Gregorian Calendar. This can represent one of the
+// following:
 //
-// * A full date, with non-zero year, month and day values
-// * A month and day value, with a zero year, e.g. an anniversary
+// * A full date, with non-zero year, month, and day values
+// * A month and day value, with a zero year, such as an anniversary
 // * A year on its own, with zero month and day values
-// * A year and month value, with a zero day, e.g. a credit card expiration date
+// * A year and month value, with a zero day, such as a credit card expiration
+// date
 //
-// Related types are [google.type.TimeOfDay][google.type.TimeOfDay] and `google.protobuf.Timestamp`.
+// Related types are [google.type.TimeOfDay][google.type.TimeOfDay] and
+// `google.protobuf.Timestamp`.
 message Date {
-  // Year of date. Must be from 1 to 9999, or 0 if specifying a date without
+  // Year of the date. Must be from 1 to 9999, or 0 to specify a date without
   // a year.
   int32 year = 1;
 
-  // Month of year. Must be from 1 to 12, or 0 if specifying a year without a
+  // Month of a year. Must be from 1 to 12, or 0 to specify a year without a
   // month and day.
   int32 month = 2;
 
-  // Day of month. Must be from 1 to 31 and valid for the year and month, or 0
-  // if specifying a year by itself or a year and month where the day is not
+  // Day of a month. Must be from 1 to 31 and valid for the year and month, or 0
+  // to specify a year by itself or a year and month where the day isn't
   // significant.
   int32 day = 3;
 }
diff --git a/google/type/datetime.proto b/google/type/datetime.proto
index 5aebc4b..cfed85d 100644
--- a/google/type/datetime.proto
+++ b/google/type/datetime.proto
@@ -1,4 +1,4 @@
-// Copyright 2019 Google LLC.
+// Copyright 2021 Google LLC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -11,7 +11,6 @@
 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 // See the License for the specific language governing permissions and
 // limitations under the License.
-//
 
 syntax = "proto3";
 
@@ -26,7 +25,9 @@ option java_outer_classname = "DateTimeProto";
 option java_package = "com.google.type";
 option objc_class_prefix = "GTP";
 
-// Represents civil time in one of a few possible ways:
+// Represents civil time (or occasionally physical time).
+//
+// This type can represent a civil time in one of a few possible ways:
 //
 //  * When utc_offset is set and time_zone is unset: a civil time on a calendar
 //    day with a particular offset from UTC.
@@ -40,6 +41,12 @@ option objc_class_prefix = "GTP";
 // If year is 0, the DateTime is considered not to have a specific year. month
 // and day must have valid, non-zero values.
 //
+// This type may also be used to represent a physical time if all the date and
+// time fields are set and either case of the `time_offset` oneof is set.
+// Consider using `Timestamp` message for physical time instead. If your use
+// case also would like to store the user's timezone, that can be done in
+// another field.
+//
 // This type is more flexible than some applications may want. Make sure to
 // document and validate your application's limitations.
 message DateTime {
diff --git a/google/type/dayofweek.proto b/google/type/dayofweek.proto
index 7544e15..4c80c62 100644
--- a/google/type/dayofweek.proto
+++ b/google/type/dayofweek.proto
@@ -1,4 +1,4 @@
-// Copyright 2019 Google LLC.
+// Copyright 2021 Google LLC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -11,7 +11,6 @@
 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 // See the License for the specific language governing permissions and
 // limitations under the License.
-//
 
 syntax = "proto3";
 
@@ -23,29 +22,29 @@ option java_outer_classname = "DayOfWeekProto";
 option java_package = "com.google.type";
 option objc_class_prefix = "GTP";
 
-// Represents a day of week.
+// Represents a day of the week.
 enum DayOfWeek {
-  // The unspecified day-of-week.
+  // The day of the week is unspecified.
   DAY_OF_WEEK_UNSPECIFIED = 0;
 
-  // The day-of-week of Monday.
+  // Monday
   MONDAY = 1;
 
-  // The day-of-week of Tuesday.
+  // Tuesday
   TUESDAY = 2;
 
-  // The day-of-week of Wednesday.
+  // Wednesday
   WEDNESDAY = 3;
 
-  // The day-of-week of Thursday.
+  // Thursday
   THURSDAY = 4;
 
-  // The day-of-week of Friday.
+  // Friday
   FRIDAY = 5;
 
-  // The day-of-week of Saturday.
+  // Saturday
   SATURDAY = 6;
 
-  // The day-of-week of Sunday.
+  // Sunday
   SUNDAY = 7;
 }
diff --git a/google/type/decimal.proto b/google/type/decimal.proto
new file mode 100644
index 0000000..beb18a5
--- /dev/null
+++ b/google/type/decimal.proto
@@ -0,0 +1,95 @@
+// Copyright 2021 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+syntax = "proto3";
+
+package google.type;
+
+option cc_enable_arenas = true;
+option go_package = "google.golang.org/genproto/googleapis/type/decimal;decimal";
+option java_multiple_files = true;
+option java_outer_classname = "DecimalProto";
+option java_package = "com.google.type";
+option objc_class_prefix = "GTP";
+
+// A representation of a decimal value, such as 2.5. Clients may convert values
+// into language-native decimal formats, such as Java's [BigDecimal][] or
+// Python's [decimal.Decimal][].
+//
+// [BigDecimal]:
+// https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/math/BigDecimal.html
+// [decimal.Decimal]: https://docs.python.org/3/library/decimal.html
+message Decimal {
+  // The decimal value, as a string.
+  //
+  // The string representation consists of an optional sign, `+` (`U+002B`)
+  // or `-` (`U+002D`), followed by a sequence of zero or more decimal digits
+  // ("the integer"), optionally followed by a fraction, optionally followed
+  // by an exponent.
+  //
+  // The fraction consists of a decimal point followed by zero or more decimal
+  // digits. The string must contain at least one digit in either the integer
+  // or the fraction. The number formed by the sign, the integer and the
+  // fraction is referred to as the significand.
+  //
+  // The exponent consists of the character `e` (`U+0065`) or `E` (`U+0045`)
+  // followed by one or more decimal digits.
+  //
+  // Services **should** normalize decimal values before storing them by:
+  //
+  //   - Removing an explicitly-provided `+` sign (`+2.5` -> `2.5`).
+  //   - Replacing a zero-length integer value with `0` (`.5` -> `0.5`).
+  //   - Coercing the exponent character to lower-case (`2.5E8` -> `2.5e8`).
+  //   - Removing an explicitly-provided zero exponent (`2.5e0` -> `2.5`).
+  //
+  // Services **may** perform additional normalization based on its own needs
+  // and the internal decimal implementation selected, such as shifting the
+  // decimal point and exponent value together (example: `2.5e-1` <-> `0.25`).
+  // Additionally, services **may** preserve trailing zeroes in the fraction
+  // to indicate increased precision, but are not required to do so.
+  //
+  // Note that only the `.` character is supported to divide the integer
+  // and the fraction; `,` **should not** be supported regardless of locale.
+  // Additionally, thousand separators **should not** be supported. If a
+  // service does support them, values **must** be normalized.
+  //
+  // The ENBF grammar is:
+  //
+  //     DecimalString =
+  //       [Sign] Significand [Exponent];
+  //
+  //     Sign = '+' | '-';
+  //
+  //     Significand =
+  //       Digits ['.'] [Digits] | [Digits] '.' Digits;
+  //
+  //     Exponent = ('e' | 'E') [Sign] Digits;
+  //
+  //     Digits = { '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' };
+  //
+  // Services **should** clearly document the range of supported values, the
+  // maximum supported precision (total number of digits), and, if applicable,
+  // the scale (number of digits after the decimal point), as well as how it
+  // behaves when receiving out-of-bounds values.
+  //
+  // Services **may** choose to accept values passed as input even when the
+  // value has a higher precision or scale than the service supports, and
+  // **should** round the value to fit the supported scale. Alternatively, the
+  // service **may** error with `400 Bad Request` (`INVALID_ARGUMENT` in gRPC)
+  // if precision would be lost.
+  //
+  // Services **should** error with `400 Bad Request` (`INVALID_ARGUMENT` in
+  // gRPC) if the service receives a value outside of the supported range.
+  string value = 1;
+}
diff --git a/google/type/decimal_pb2.py b/google/type/decimal_pb2.py
new file mode 100644
index 0000000..ac1a847
--- /dev/null
+++ b/google/type/decimal_pb2.py
@@ -0,0 +1,96 @@
+# -*- coding: utf-8 -*-
+
+# Copyright 2020 Google LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: google/type/decimal.proto
+"""Generated protocol buffer code."""
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+    name="google/type/decimal.proto",
+    package="google.type",
+    syntax="proto3",
+    serialized_options=b"\n\017com.google.typeB\014DecimalProtoP\001Z:google.golang.org/genproto/googleapis/type/decimal;decimal\370\001\001\242\002\003GTP",
+    create_key=_descriptor._internal_create_key,
+    serialized_pb=b'\n\x19google/type/decimal.proto\x12\x0bgoogle.type"\x18\n\x07\x44\x65\x63imal\x12\r\n\x05value\x18\x01 \x01(\tBf\n\x0f\x63om.google.typeB\x0c\x44\x65\x63imalProtoP\x01Z:google.golang.org/genproto/googleapis/type/decimal;decimal\xf8\x01\x01\xa2\x02\x03GTPb\x06proto3',
+)
+
+
+_DECIMAL = _descriptor.Descriptor(
+    name="Decimal",
+    full_name="google.type.Decimal",
+    filename=None,
+    file=DESCRIPTOR,
+    containing_type=None,
+    create_key=_descriptor._internal_create_key,
+    fields=[
+        _descriptor.FieldDescriptor(
+            name="value",
+            full_name="google.type.Decimal.value",
+            index=0,
+            number=1,
+            type=9,
+            cpp_type=9,
+            label=1,
+            has_default_value=False,
+            default_value=b"".decode("utf-8"),
+            message_type=None,
+            enum_type=None,
+            containing_type=None,
+            is_extension=False,
+            extension_scope=None,
+            serialized_options=None,
+            file=DESCRIPTOR,
+            create_key=_descriptor._internal_create_key,
+        )
+    ],
+    extensions=[],
+    nested_types=[],
+    enum_types=[],
+    serialized_options=None,
+    is_extendable=False,
+    syntax="proto3",
+    extension_ranges=[],
+    oneofs=[],
+    serialized_start=42,
+    serialized_end=66,
+)
+
+DESCRIPTOR.message_types_by_name["Decimal"] = _DECIMAL
+_sym_db.RegisterFileDescriptor(DESCRIPTOR)
+
+Decimal = _reflection.GeneratedProtocolMessageType(
+    "Decimal",
+    (_message.Message,),
+    {
+        "DESCRIPTOR": _DECIMAL,
+        "__module__": "google.type.decimal_pb2"
+        # @@protoc_insertion_point(class_scope:google.type.Decimal)
+    },
+)
+_sym_db.RegisterMessage(Decimal)
+
+
+DESCRIPTOR._options = None
+# @@protoc_insertion_point(module_scope)
diff --git a/google/type/expr.proto b/google/type/expr.proto
index 5d4f2f7..af0778c 100644
--- a/google/type/expr.proto
+++ b/google/type/expr.proto
@@ -1,4 +1,4 @@
-// Copyright 2019 Google LLC.
+// Copyright 2021 Google LLC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -11,7 +11,6 @@
 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 // See the License for the specific language governing permissions and
 // limitations under the License.
-//
 
 syntax = "proto3";
 
@@ -23,29 +22,52 @@ option java_outer_classname = "ExprProto";
 option java_package = "com.google.type";
 option objc_class_prefix = "GTP";
 
-// Represents an expression text. Example:
+// Represents a textual expression in the Common Expression Language (CEL)
+// syntax. CEL is a C-like expression language. The syntax and semantics of CEL
+// are documented at https://github.com/google/cel-spec.
+//
+// Example (Comparison):
+//
+//     title: "Summary size limit"
+//     description: "Determines if a summary is less than 100 chars"
+//     expression: "document.summary.size() < 100"
+//
+// Example (Equality):
+//
+//     title: "Requestor is owner"
+//     description: "Determines if requestor is the document owner"
+//     expression: "document.owner == request.auth.claims.email"
+//
+// Example (Logic):
+//
+//     title: "Public documents"
+//     description: "Determine whether the document should be publicly visible"
+//     expression: "document.type != 'private' && document.type != 'internal'"
+//
+// Example (Data Manipulation):
+//
+//     title: "Notification string"
+//     description: "Create a notification string with a timestamp."
+//     expression: "'New message received at ' + string(document.create_time)"
 //
-//     title: "User account presence"
-//     description: "Determines whether the request has a user account"
-//     expression: "size(request.user) > 0"
+// The exact variables and functions that may be referenced within an expression
+// are determined by the service that evaluates it. See the service
+// documentation for additional information.
 message Expr {
-  // Textual representation of an expression in
-  // Common Expression Language syntax.
-  //
-  // The application context of the containing message determines which
-  // well-known feature set of CEL is supported.
+  // Textual representation of an expression in Common Expression Language
+  // syntax.
   string expression = 1;
 
-  // An optional title for the expression, i.e. a short string describing
+  // Optional. Title for the expression, i.e. a short string describing
   // its purpose. This can be used e.g. in UIs which allow to enter the
   // expression.
   string title = 2;
 
-  // An optional description of the expression. This is a longer text which
+  // Optional. Description of the expression. This is a longer text which
   // describes the expression, e.g. when hovered over it in a UI.
   string description = 3;
 
-  // An optional string indicating the location of the expression for error
+  // Optional. String indicating the location of the expression for error
   // reporting, e.g. a file name and a position in the file.
   string location = 4;
 }
diff --git a/google/type/fraction.proto b/google/type/fraction.proto
index 8ad008d..6c5ae6e 100644
--- a/google/type/fraction.proto
+++ b/google/type/fraction.proto
@@ -1,4 +1,4 @@
-// Copyright 2019 Google LLC.
+// Copyright 2021 Google LLC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -11,7 +11,6 @@
 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 // See the License for the specific language governing permissions and
 // limitations under the License.
-//
 
 syntax = "proto3";
 
@@ -25,7 +24,7 @@ option objc_class_prefix = "GTP";
 
 // Represents a fraction in terms of a numerator divided by a denominator.
 message Fraction {
-  // The portion of the denominator in the faction, e.g. 2 in 2/3.
+  // The numerator in the fraction, e.g. 2 in 2/3.
   int64 numerator = 1;
 
   // The value by which the numerator is divided, e.g. 3 in 2/3. Must be
diff --git a/google/type/interval.proto b/google/type/interval.proto
new file mode 100644
index 0000000..9702324
--- /dev/null
+++ b/google/type/interval.proto
@@ -0,0 +1,46 @@
+// Copyright 2021 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+syntax = "proto3";
+
+package google.type;
+
+import "google/protobuf/timestamp.proto";
+
+option cc_enable_arenas = true;
+option go_package = "google.golang.org/genproto/googleapis/type/interval;interval";
+option java_multiple_files = true;
+option java_outer_classname = "IntervalProto";
+option java_package = "com.google.type";
+option objc_class_prefix = "GTP";
+
+// Represents a time interval, encoded as a Timestamp start (inclusive) and a
+// Timestamp end (exclusive).
+//
+// The start must be less than or equal to the end.
+// When the start equals the end, the interval is empty (matches no time).
+// When both start and end are unspecified, the interval matches any time.
+message Interval {
+  // Optional. Inclusive start of the interval.
+  //
+  // If specified, a Timestamp matching this interval will have to be the same
+  // or after the start.
+  google.protobuf.Timestamp start_time = 1;
+
+  // Optional. Exclusive end of the interval.
+  //
+  // If specified, a Timestamp matching this interval will have to be before the
+  // end.
+  google.protobuf.Timestamp end_time = 2;
+}
diff --git a/google/type/interval_pb2.py b/google/type/interval_pb2.py
new file mode 100644
index 0000000..cb7cfc2
--- /dev/null
+++ b/google/type/interval_pb2.py
@@ -0,0 +1,125 @@
+# -*- coding: utf-8 -*-
+
+# Copyright 2020 Google LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Generated by the protocol buffer compiler.  DO NOT EDIT!
+# source: google/type/interval.proto
+"""Generated protocol buffer code."""
+from google.protobuf import descriptor as _descriptor
+from google.protobuf import message as _message
+from google.protobuf import reflection as _reflection
+from google.protobuf import symbol_database as _symbol_database
+
+# @@protoc_insertion_point(imports)
+
+_sym_db = _symbol_database.Default()
+
+
+from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2
+
+
+DESCRIPTOR = _descriptor.FileDescriptor(
+    name="google/type/interval.proto",
+    package="google.type",
+    syntax="proto3",
+    serialized_options=b"\n\017com.google.typeB\rIntervalProtoP\001Z