123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154 |
- # Copyright 2023 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.
- """ We use x-goog-api-client header to report metrics. This module provides
- the constants and helper methods to construct x-goog-api-client header.
- """
- import platform
- from google.auth import version
- API_CLIENT_HEADER = "x-goog-api-client"
- # BYOID Specific consts
- BYOID_HEADER_SECTION = "google-byoid-sdk"
- # Auth request type
- REQUEST_TYPE_ACCESS_TOKEN = "auth-request-type/at"
- REQUEST_TYPE_ID_TOKEN = "auth-request-type/it"
- REQUEST_TYPE_MDS_PING = "auth-request-type/mds"
- REQUEST_TYPE_REAUTH_START = "auth-request-type/re-start"
- REQUEST_TYPE_REAUTH_CONTINUE = "auth-request-type/re-cont"
- # Credential type
- CRED_TYPE_USER = "cred-type/u"
- CRED_TYPE_SA_ASSERTION = "cred-type/sa"
- CRED_TYPE_SA_JWT = "cred-type/jwt"
- CRED_TYPE_SA_MDS = "cred-type/mds"
- CRED_TYPE_SA_IMPERSONATE = "cred-type/imp"
- # Versions
- def python_and_auth_lib_version():
- return "gl-python/{} auth/{}".format(platform.python_version(), version.__version__)
- # Token request metric header values
- # x-goog-api-client header value for access token request via metadata server.
- # Example: "gl-python/3.7 auth/1.1 auth-request-type/at cred-type/mds"
- def token_request_access_token_mds():
- return "{} {} {}".format(
- python_and_auth_lib_version(), REQUEST_TYPE_ACCESS_TOKEN, CRED_TYPE_SA_MDS
- )
- # x-goog-api-client header value for ID token request via metadata server.
- # Example: "gl-python/3.7 auth/1.1 auth-request-type/it cred-type/mds"
- def token_request_id_token_mds():
- return "{} {} {}".format(
- python_and_auth_lib_version(), REQUEST_TYPE_ID_TOKEN, CRED_TYPE_SA_MDS
- )
- # x-goog-api-client header value for impersonated credentials access token request.
- # Example: "gl-python/3.7 auth/1.1 auth-request-type/at cred-type/imp"
- def token_request_access_token_impersonate():
- return "{} {} {}".format(
- python_and_auth_lib_version(),
- REQUEST_TYPE_ACCESS_TOKEN,
- CRED_TYPE_SA_IMPERSONATE,
- )
- # x-goog-api-client header value for impersonated credentials ID token request.
- # Example: "gl-python/3.7 auth/1.1 auth-request-type/it cred-type/imp"
- def token_request_id_token_impersonate():
- return "{} {} {}".format(
- python_and_auth_lib_version(), REQUEST_TYPE_ID_TOKEN, CRED_TYPE_SA_IMPERSONATE
- )
- # x-goog-api-client header value for service account credentials access token
- # request (assertion flow).
- # Example: "gl-python/3.7 auth/1.1 auth-request-type/at cred-type/sa"
- def token_request_access_token_sa_assertion():
- return "{} {} {}".format(
- python_and_auth_lib_version(), REQUEST_TYPE_ACCESS_TOKEN, CRED_TYPE_SA_ASSERTION
- )
- # x-goog-api-client header value for service account credentials ID token
- # request (assertion flow).
- # Example: "gl-python/3.7 auth/1.1 auth-request-type/it cred-type/sa"
- def token_request_id_token_sa_assertion():
- return "{} {} {}".format(
- python_and_auth_lib_version(), REQUEST_TYPE_ID_TOKEN, CRED_TYPE_SA_ASSERTION
- )
- # x-goog-api-client header value for user credentials token request.
- # Example: "gl-python/3.7 auth/1.1 cred-type/u"
- def token_request_user():
- return "{} {}".format(python_and_auth_lib_version(), CRED_TYPE_USER)
- # Miscellenous metrics
- # x-goog-api-client header value for metadata server ping.
- # Example: "gl-python/3.7 auth/1.1 auth-request-type/mds"
- def mds_ping():
- return "{} {}".format(python_and_auth_lib_version(), REQUEST_TYPE_MDS_PING)
- # x-goog-api-client header value for reauth start endpoint calls.
- # Example: "gl-python/3.7 auth/1.1 auth-request-type/re-start"
- def reauth_start():
- return "{} {}".format(python_and_auth_lib_version(), REQUEST_TYPE_REAUTH_START)
- # x-goog-api-client header value for reauth continue endpoint calls.
- # Example: "gl-python/3.7 auth/1.1 cred-type/re-cont"
- def reauth_continue():
- return "{} {}".format(python_and_auth_lib_version(), REQUEST_TYPE_REAUTH_CONTINUE)
- # x-goog-api-client header value for BYOID calls to the Security Token Service exchange token endpoint.
- # Example: "gl-python/3.7 auth/1.1 google-byoid-sdk source/aws sa-impersonation/true sa-impersonation/true"
- def byoid_metrics_header(metrics_options):
- header = "{} {}".format(python_and_auth_lib_version(), BYOID_HEADER_SECTION)
- for key, value in metrics_options.items():
- header = "{} {}/{}".format(header, key, value)
- return header
- def add_metric_header(headers, metric_header_value):
- """Add x-goog-api-client header with the given value.
- Args:
- headers (Mapping[str, str]): The headers to which we will add the
- metric header.
- metric_header_value (Optional[str]): If value is None, do nothing;
- if headers already has a x-goog-api-client header, append the value
- to the existing header; otherwise add a new x-goog-api-client
- header with the given value.
- """
- if not metric_header_value:
- return
- if API_CLIENT_HEADER not in headers:
- headers[API_CLIENT_HEADER] = metric_header_value
- else:
- headers[API_CLIENT_HEADER] += " " + metric_header_value
|