From cff785c99130c5347144d1ec4299cb3939d37716 Mon Sep 17 00:00:00 2001 From: chalmer lowe Date: Tue, 18 Aug 2026 08:10:13 -0400 Subject: [PATCH 1/6] feat(secretmanager): inject OTel interceptor explicitly in gRPC transport --- .../services/secret_manager_service/client.py | 49 +++++++++++++------ .../secret_manager_service/transports/grpc.py | 11 ++++- 2 files changed, 43 insertions(+), 17 deletions(-) diff --git a/packages/google-cloud-secret-manager/google/cloud/secretmanager_v1/services/secret_manager_service/client.py b/packages/google-cloud-secret-manager/google/cloud/secretmanager_v1/services/secret_manager_service/client.py index ff26bddcc57d..fea3ebfcf210 100644 --- a/packages/google-cloud-secret-manager/google/cloud/secretmanager_v1/services/secret_manager_service/client.py +++ b/packages/google-cloud-secret-manager/google/cloud/secretmanager_v1/services/secret_manager_service/client.py @@ -35,17 +35,16 @@ ) import google.protobuf +from google.api_core import _feature_gating_helpers, gapic_v1 from google.api_core import client_options as client_options_lib from google.api_core import exceptions as core_exceptions -from google.api_core import gapic_v1 from google.api_core import retry as retries from google.auth import credentials as ga_credentials # type: ignore from google.auth.exceptions import MutualTLSChannelError # type: ignore from google.auth.transport import mtls # type: ignore from google.auth.transport.grpc import SslCredentials # type: ignore -from google.oauth2 import service_account # type: ignore - from google.cloud.secretmanager_v1 import gapic_version as package_version +from google.oauth2 import service_account # type: ignore try: OptionalRetry = Union[retries.Retry, gapic_v1.method._MethodDefault, None] @@ -68,7 +67,6 @@ import google.protobuf.field_mask_pb2 as field_mask_pb2 # type: ignore import google.protobuf.timestamp_pb2 as timestamp_pb2 # type: ignore from google.cloud.location import locations_pb2 # type: ignore - from google.cloud.secretmanager_v1.services.secret_manager_service import pagers from google.cloud.secretmanager_v1.types import resources, service @@ -745,18 +743,39 @@ def __init__( if isinstance(transport, str) or transport is None else cast(Callable[..., SecretManagerServiceTransport], transport) ) + # Resolve interceptors for gRPC + interceptors = None + if transport_init is SecretManagerServiceGrpcTransport: + is_tracing_enabled = _feature_gating_helpers.resolve_feature_flags( + env_var="GOOGLE_CLOUD_PYTHON_TRACING_ENABLED", + feature_key="tracer_provider", + configuration=self._client_options, + ) + if is_tracing_enabled: + try: + import opentelemetry.instrumentation.grpc as otel_grpc # type: ignore[import-not-found] + tracer_provider = getattr(self._client_options, "tracer_provider", None) + interceptor = otel_grpc.client_interceptor(tracer_provider=tracer_provider) + interceptors = [interceptor] + except ImportError: + pass + # initialize with the provided callable or the passed in class - self._transport = transport_init( - credentials=credentials, - credentials_file=self._client_options.credentials_file, - host=self._api_endpoint, - scopes=self._client_options.scopes, - client_cert_source_for_mtls=self._client_cert_source, - quota_project_id=self._client_options.quota_project_id, - client_info=client_info, - always_use_jwt_access=True, - api_audience=self._client_options.api_audience, - ) + transport_kwargs = { + "credentials": credentials, + "credentials_file": self._client_options.credentials_file, + "host": self._api_endpoint, + "scopes": self._client_options.scopes, + "client_cert_source_for_mtls": self._client_cert_source, + "quota_project_id": self._client_options.quota_project_id, + "client_info": client_info, + "always_use_jwt_access": True, + "api_audience": self._client_options.api_audience, + } + if interceptors is not None: + transport_kwargs["interceptors"] = interceptors + + self._transport = transport_init(**transport_kwargs) if "async" not in str(self._transport): if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( diff --git a/packages/google-cloud-secret-manager/google/cloud/secretmanager_v1/services/secret_manager_service/transports/grpc.py b/packages/google-cloud-secret-manager/google/cloud/secretmanager_v1/services/secret_manager_service/transports/grpc.py index 51530553e705..fa9f87d2d81e 100644 --- a/packages/google-cloud-secret-manager/google/cloud/secretmanager_v1/services/secret_manager_service/transports/grpc.py +++ b/packages/google-cloud-secret-manager/google/cloud/secretmanager_v1/services/secret_manager_service/transports/grpc.py @@ -30,9 +30,8 @@ from google.auth import credentials as ga_credentials # type: ignore from google.auth.transport.grpc import SslCredentials # type: ignore from google.cloud.location import locations_pb2 # type: ignore -from google.protobuf.json_format import MessageToJson - from google.cloud.secretmanager_v1.types import resources, service +from google.protobuf.json_format import MessageToJson from .base import DEFAULT_CLIENT_INFO, SecretManagerServiceTransport @@ -148,6 +147,7 @@ def __init__( client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, always_use_jwt_access: Optional[bool] = False, api_audience: Optional[str] = None, + interceptors: Optional[Sequence[object]] = None, ) -> None: """Instantiate the transport. @@ -198,6 +198,9 @@ def __init__( to the service that will be set when using certain 3rd party authentication flows. Audience is typically a resource identifier. If not set, the host value will be used as a default. + interceptors (Optional[Sequence[grpc.ClientInterceptor]]): + Additional interceptors to be injected into the gRPC channel pipeline. + These are executed in order. Raises: google.auth.exceptions.MutualTLSChannelError: If mutual TLS transport @@ -274,6 +277,10 @@ def __init__( ], ) + if interceptors: + for i in interceptors: + self._grpc_channel = grpc.intercept_channel(self._grpc_channel, i) + self._interceptor = _LoggingClientInterceptor() self._logged_channel = grpc.intercept_channel( self._grpc_channel, self._interceptor From bdef56b761fb6b3f6dd5e3a4fb44910bae44611d Mon Sep 17 00:00:00 2001 From: chalmer lowe Date: Fri, 21 Aug 2026 07:54:23 -0400 Subject: [PATCH 2/6] feat(secretmanager): refactor OTel interceptor injection to use centralized helper --- .../services/secret_manager_service/client.py | 18 ++------ .../test_secret_manager_service.py | 46 ++++++++++++++++++- 2 files changed, 49 insertions(+), 15 deletions(-) diff --git a/packages/google-cloud-secret-manager/google/cloud/secretmanager_v1/services/secret_manager_service/client.py b/packages/google-cloud-secret-manager/google/cloud/secretmanager_v1/services/secret_manager_service/client.py index fea3ebfcf210..e1de597276f4 100644 --- a/packages/google-cloud-secret-manager/google/cloud/secretmanager_v1/services/secret_manager_service/client.py +++ b/packages/google-cloud-secret-manager/google/cloud/secretmanager_v1/services/secret_manager_service/client.py @@ -35,7 +35,7 @@ ) import google.protobuf -from google.api_core import _feature_gating_helpers, gapic_v1 +from google.api_core import _feature_gating_helpers, _otel_helpers, gapic_v1 from google.api_core import client_options as client_options_lib from google.api_core import exceptions as core_exceptions from google.api_core import retry as retries @@ -746,19 +746,11 @@ def __init__( # Resolve interceptors for gRPC interceptors = None if transport_init is SecretManagerServiceGrpcTransport: - is_tracing_enabled = _feature_gating_helpers.resolve_feature_flags( - env_var="GOOGLE_CLOUD_PYTHON_TRACING_ENABLED", - feature_key="tracer_provider", - configuration=self._client_options, + otel_interceptor = _otel_helpers.get_otel_grpc_interceptor( + self._client_options ) - if is_tracing_enabled: - try: - import opentelemetry.instrumentation.grpc as otel_grpc # type: ignore[import-not-found] - tracer_provider = getattr(self._client_options, "tracer_provider", None) - interceptor = otel_grpc.client_interceptor(tracer_provider=tracer_provider) - interceptors = [interceptor] - except ImportError: - pass + if otel_interceptor: + interceptors = [otel_interceptor] # initialize with the provided callable or the passed in class transport_kwargs = { diff --git a/packages/google-cloud-secret-manager/tests/unit/gapic/secretmanager_v1/test_secret_manager_service.py b/packages/google-cloud-secret-manager/tests/unit/gapic/secretmanager_v1/test_secret_manager_service.py index 722ac1109a06..83be4cdc9e40 100644 --- a/packages/google-cloud-secret-manager/tests/unit/gapic/secretmanager_v1/test_secret_manager_service.py +++ b/packages/google-cloud-secret-manager/tests/unit/gapic/secretmanager_v1/test_secret_manager_service.py @@ -61,8 +61,6 @@ from google.auth import credentials as ga_credentials from google.auth.exceptions import MutualTLSChannelError from google.cloud.location import locations_pb2 -from google.oauth2 import service_account - from google.cloud.secretmanager_v1.services.secret_manager_service import ( SecretManagerServiceAsyncClient, SecretManagerServiceClient, @@ -70,6 +68,7 @@ transports, ) from google.cloud.secretmanager_v1.types import resources, service +from google.oauth2 import service_account CRED_INFO_JSON = { "credential_source": "/path/to/file", @@ -770,6 +769,49 @@ def test_secret_manager_service_client_client_options( ) +def test_secret_manager_service_client_otel_interceptor_injection(): + # Mock the helper to return a sentinel interceptor + mock_interceptor = mock.Mock() + + with mock.patch( + "google.cloud.secretmanager_v1.services.secret_manager_service.client._otel_helpers.get_otel_grpc_interceptor" + ) as mock_get_interceptor: + mock_get_interceptor.return_value = mock_interceptor + + with mock.patch.object( + transports.SecretManagerServiceGrpcTransport, "__init__" + ) as patched_transport_init: + patched_transport_init.return_value = None + + client = SecretManagerServiceClient(transport="grpc") + + mock_get_interceptor.assert_called_once() + + called_kwargs = patched_transport_init.call_args.kwargs + assert "interceptors" in called_kwargs + assert called_kwargs["interceptors"] == [mock_interceptor] + + +def test_secret_manager_service_client_otel_interceptor_injection_disabled(): + # The helper does not return an interceptor + with mock.patch( + "google.cloud.secretmanager_v1.services.secret_manager_service.client._otel_helpers.get_otel_grpc_interceptor" + ) as mock_get_interceptor: + mock_get_interceptor.return_value = None + + with mock.patch.object( + transports.SecretManagerServiceGrpcTransport, "__init__" + ) as patched_transport_init: + patched_transport_init.return_value = None + + client = SecretManagerServiceClient(transport="grpc") + + mock_get_interceptor.assert_called_once() + + called_kwargs = patched_transport_init.call_args.kwargs + assert "interceptors" not in called_kwargs + + @pytest.mark.parametrize( "client_class,transport_class,transport_name,use_client_cert_env", [ From dab79949e41fe6821073b331d7ff179095c6c9c9 Mon Sep 17 00:00:00 2001 From: chalmer lowe Date: Mon, 24 Aug 2026 08:22:35 -0400 Subject: [PATCH 3/6] feat(otel): implement eager channel wrapping (Variant B) for OTel compatibility --- .../services/secret_manager_service/client.py | 32 +++++--- .../test_secret_manager_service.py | 81 +++++++++++-------- 2 files changed, 68 insertions(+), 45 deletions(-) diff --git a/packages/google-cloud-secret-manager/google/cloud/secretmanager_v1/services/secret_manager_service/client.py b/packages/google-cloud-secret-manager/google/cloud/secretmanager_v1/services/secret_manager_service/client.py index e1de597276f4..544aef6e3c80 100644 --- a/packages/google-cloud-secret-manager/google/cloud/secretmanager_v1/services/secret_manager_service/client.py +++ b/packages/google-cloud-secret-manager/google/cloud/secretmanager_v1/services/secret_manager_service/client.py @@ -743,15 +743,6 @@ def __init__( if isinstance(transport, str) or transport is None else cast(Callable[..., SecretManagerServiceTransport], transport) ) - # Resolve interceptors for gRPC - interceptors = None - if transport_init is SecretManagerServiceGrpcTransport: - otel_interceptor = _otel_helpers.get_otel_grpc_interceptor( - self._client_options - ) - if otel_interceptor: - interceptors = [otel_interceptor] - # initialize with the provided callable or the passed in class transport_kwargs = { "credentials": credentials, @@ -764,8 +755,27 @@ def __init__( "always_use_jwt_access": True, "api_audience": self._client_options.api_audience, } - if interceptors is not None: - transport_kwargs["interceptors"] = interceptors + + # 🎯 VARIANT B: Eager Channel Creation and Tracing Application + if transport_init is SecretManagerServiceGrpcTransport: + if _otel_helpers.is_otel_capabilities_enabled(self._client_options): + # Eagerly create the channel using the Transport's classmethod + raw_channel = transport_init.create_channel( + self._api_endpoint, + credentials=credentials, + credentials_file=self._client_options.credentials_file, + scopes=self._client_options.scopes, + quota_project_id=self._client_options.quota_project_id, + ) + + # Apply OTel capabilities to the channel + wrapped_channel = _otel_helpers.apply_otel_capabilities_to_channel( + raw_channel, + self._client_options + ) + + # Inject the wrapped channel into transport kwargs + transport_kwargs["channel"] = wrapped_channel self._transport = transport_init(**transport_kwargs) diff --git a/packages/google-cloud-secret-manager/tests/unit/gapic/secretmanager_v1/test_secret_manager_service.py b/packages/google-cloud-secret-manager/tests/unit/gapic/secretmanager_v1/test_secret_manager_service.py index 83be4cdc9e40..537a5e662294 100644 --- a/packages/google-cloud-secret-manager/tests/unit/gapic/secretmanager_v1/test_secret_manager_service.py +++ b/packages/google-cloud-secret-manager/tests/unit/gapic/secretmanager_v1/test_secret_manager_service.py @@ -769,47 +769,60 @@ def test_secret_manager_service_client_client_options( ) -def test_secret_manager_service_client_otel_interceptor_injection(): - # Mock the helper to return a sentinel interceptor - mock_interceptor = mock.Mock() +def test_secret_manager_service_client_otel_eager_channel_injection(): + # Mock the helpers to simulate OTel being enabled + mock_raw_channel = mock.Mock() + mock_wrapped_channel = mock.Mock() with mock.patch( - "google.cloud.secretmanager_v1.services.secret_manager_service.client._otel_helpers.get_otel_grpc_interceptor" - ) as mock_get_interceptor: - mock_get_interceptor.return_value = mock_interceptor - - with mock.patch.object( - transports.SecretManagerServiceGrpcTransport, "__init__" - ) as patched_transport_init: - patched_transport_init.return_value = None - - client = SecretManagerServiceClient(transport="grpc") - - mock_get_interceptor.assert_called_once() - - called_kwargs = patched_transport_init.call_args.kwargs - assert "interceptors" in called_kwargs - assert called_kwargs["interceptors"] == [mock_interceptor] - - -def test_secret_manager_service_client_otel_interceptor_injection_disabled(): - # The helper does not return an interceptor + "google.cloud.secretmanager_v1.services.secret_manager_service.client._otel_helpers.is_otel_capabilities_enabled", + return_value=True + ) as mock_is_enabled: + with mock.patch( + "google.cloud.secretmanager_v1.services.secret_manager_service.client._otel_helpers.apply_otel_capabilities_to_channel", + return_value=mock_wrapped_channel + ) as mock_apply_otel: + with mock.patch.object( + transports.SecretManagerServiceGrpcTransport, "create_channel", + return_value=mock_raw_channel + ) as mock_create_channel: + with mock.patch.object( + transports.SecretManagerServiceGrpcTransport, "__init__" + ) as patched_transport_init: + patched_transport_init.return_value = None + + client = SecretManagerServiceClient(transport="grpc") + + mock_is_enabled.assert_called_once() + mock_create_channel.assert_called_once() + mock_apply_otel.assert_called_once_with(mock_raw_channel, mock.ANY) + + called_kwargs = patched_transport_init.call_args.kwargs + assert "channel" in called_kwargs + assert called_kwargs["channel"] == mock_wrapped_channel + + +def test_secret_manager_service_client_otel_eager_channel_injection_disabled(): + # Simulate OTel being disabled with mock.patch( - "google.cloud.secretmanager_v1.services.secret_manager_service.client._otel_helpers.get_otel_grpc_interceptor" - ) as mock_get_interceptor: - mock_get_interceptor.return_value = None - + "google.cloud.secretmanager_v1.services.secret_manager_service.client._otel_helpers.is_otel_capabilities_enabled", + return_value=False + ) as mock_is_enabled: with mock.patch.object( - transports.SecretManagerServiceGrpcTransport, "__init__" - ) as patched_transport_init: - patched_transport_init.return_value = None + transports.SecretManagerServiceGrpcTransport, "create_channel" + ) as mock_create_channel: + with mock.patch.object( + transports.SecretManagerServiceGrpcTransport, "__init__" + ) as patched_transport_init: + patched_transport_init.return_value = None - client = SecretManagerServiceClient(transport="grpc") + client = SecretManagerServiceClient(transport="grpc") - mock_get_interceptor.assert_called_once() + mock_is_enabled.assert_called_once() + mock_create_channel.assert_not_called() - called_kwargs = patched_transport_init.call_args.kwargs - assert "interceptors" not in called_kwargs + called_kwargs = patched_transport_init.call_args.kwargs + assert "channel" not in called_kwargs @pytest.mark.parametrize( From b3eccf09edf8d854ba3524b93723f12f1ca150a2 Mon Sep 17 00:00:00 2001 From: Chalmer Lowe Date: Mon, 24 Aug 2026 14:58:31 -0400 Subject: [PATCH 4/6] Updates comment. --- .../secretmanager_v1/services/secret_manager_service/client.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/google-cloud-secret-manager/google/cloud/secretmanager_v1/services/secret_manager_service/client.py b/packages/google-cloud-secret-manager/google/cloud/secretmanager_v1/services/secret_manager_service/client.py index 544aef6e3c80..82c63519165a 100644 --- a/packages/google-cloud-secret-manager/google/cloud/secretmanager_v1/services/secret_manager_service/client.py +++ b/packages/google-cloud-secret-manager/google/cloud/secretmanager_v1/services/secret_manager_service/client.py @@ -756,7 +756,7 @@ def __init__( "api_audience": self._client_options.api_audience, } - # 🎯 VARIANT B: Eager Channel Creation and Tracing Application + # Eager channel creation and application of otel capabilitites if transport_init is SecretManagerServiceGrpcTransport: if _otel_helpers.is_otel_capabilities_enabled(self._client_options): # Eagerly create the channel using the Transport's classmethod From a9fdafe0fb75153e315d2410894f477bf7cbcf74 Mon Sep 17 00:00:00 2001 From: chalmer lowe Date: Mon, 24 Aug 2026 15:05:18 -0400 Subject: [PATCH 5/6] fix(secretmanager): align interceptor typehints and explain gRPC specific logic --- .../services/secret_manager_service/client.py | 7 +++++-- .../secret_manager_service/transports/grpc.py | 2 +- .../secretmanager_v1/test_secret_manager_service.py | 11 ++++++----- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/packages/google-cloud-secret-manager/google/cloud/secretmanager_v1/services/secret_manager_service/client.py b/packages/google-cloud-secret-manager/google/cloud/secretmanager_v1/services/secret_manager_service/client.py index 82c63519165a..3f296412e920 100644 --- a/packages/google-cloud-secret-manager/google/cloud/secretmanager_v1/services/secret_manager_service/client.py +++ b/packages/google-cloud-secret-manager/google/cloud/secretmanager_v1/services/secret_manager_service/client.py @@ -756,6 +756,10 @@ def __init__( "api_audience": self._client_options.api_audience, } + # NOTE: Eager channel wrapping is only required for standard gRPC. + # OTel gRPC interceptors use a custom protocol (grpcext) that crashes standard + # grpc.intercept_channel inside the Transport. Other wrappers (like Asyncio/REST) + # do not suffer from this specific type incompatibility. # Eager channel creation and application of otel capabilitites if transport_init is SecretManagerServiceGrpcTransport: if _otel_helpers.is_otel_capabilities_enabled(self._client_options): @@ -770,8 +774,7 @@ def __init__( # Apply OTel capabilities to the channel wrapped_channel = _otel_helpers.apply_otel_capabilities_to_channel( - raw_channel, - self._client_options + raw_channel, self._client_options ) # Inject the wrapped channel into transport kwargs diff --git a/packages/google-cloud-secret-manager/google/cloud/secretmanager_v1/services/secret_manager_service/transports/grpc.py b/packages/google-cloud-secret-manager/google/cloud/secretmanager_v1/services/secret_manager_service/transports/grpc.py index fa9f87d2d81e..e161aca3a25d 100644 --- a/packages/google-cloud-secret-manager/google/cloud/secretmanager_v1/services/secret_manager_service/transports/grpc.py +++ b/packages/google-cloud-secret-manager/google/cloud/secretmanager_v1/services/secret_manager_service/transports/grpc.py @@ -147,7 +147,7 @@ def __init__( client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO, always_use_jwt_access: Optional[bool] = False, api_audience: Optional[str] = None, - interceptors: Optional[Sequence[object]] = None, + interceptors: Optional[Sequence[grpc.ClientInterceptor]] = None, ) -> None: """Instantiate the transport. diff --git a/packages/google-cloud-secret-manager/tests/unit/gapic/secretmanager_v1/test_secret_manager_service.py b/packages/google-cloud-secret-manager/tests/unit/gapic/secretmanager_v1/test_secret_manager_service.py index 537a5e662294..ccaf17a57eec 100644 --- a/packages/google-cloud-secret-manager/tests/unit/gapic/secretmanager_v1/test_secret_manager_service.py +++ b/packages/google-cloud-secret-manager/tests/unit/gapic/secretmanager_v1/test_secret_manager_service.py @@ -776,15 +776,16 @@ def test_secret_manager_service_client_otel_eager_channel_injection(): with mock.patch( "google.cloud.secretmanager_v1.services.secret_manager_service.client._otel_helpers.is_otel_capabilities_enabled", - return_value=True + return_value=True, ) as mock_is_enabled: with mock.patch( "google.cloud.secretmanager_v1.services.secret_manager_service.client._otel_helpers.apply_otel_capabilities_to_channel", - return_value=mock_wrapped_channel + return_value=mock_wrapped_channel, ) as mock_apply_otel: with mock.patch.object( - transports.SecretManagerServiceGrpcTransport, "create_channel", - return_value=mock_raw_channel + transports.SecretManagerServiceGrpcTransport, + "create_channel", + return_value=mock_raw_channel, ) as mock_create_channel: with mock.patch.object( transports.SecretManagerServiceGrpcTransport, "__init__" @@ -806,7 +807,7 @@ def test_secret_manager_service_client_otel_eager_channel_injection_disabled(): # Simulate OTel being disabled with mock.patch( "google.cloud.secretmanager_v1.services.secret_manager_service.client._otel_helpers.is_otel_capabilities_enabled", - return_value=False + return_value=False, ) as mock_is_enabled: with mock.patch.object( transports.SecretManagerServiceGrpcTransport, "create_channel" From 391e36a6917307371ff128ca7d6bd2058a178501 Mon Sep 17 00:00:00 2001 From: Chalmer Lowe Date: Mon, 24 Aug 2026 15:12:13 -0400 Subject: [PATCH 6/6] Add context to the comment --- .../services/secret_manager_service/client.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/google-cloud-secret-manager/google/cloud/secretmanager_v1/services/secret_manager_service/client.py b/packages/google-cloud-secret-manager/google/cloud/secretmanager_v1/services/secret_manager_service/client.py index 3f296412e920..e21c1b963409 100644 --- a/packages/google-cloud-secret-manager/google/cloud/secretmanager_v1/services/secret_manager_service/client.py +++ b/packages/google-cloud-secret-manager/google/cloud/secretmanager_v1/services/secret_manager_service/client.py @@ -756,11 +756,13 @@ def __init__( "api_audience": self._client_options.api_audience, } - # NOTE: Eager channel wrapping is only required for standard gRPC. + # NOTE: Eager channel wrapping is only required to accommodate standard gRPC. # OTel gRPC interceptors use a custom protocol (grpcext) that crashes standard - # grpc.intercept_channel inside the Transport. Other wrappers (like Asyncio/REST) + # grpc.intercept_channel() inside the Transport. Other wrappers (like Asyncio/REST) # do not suffer from this specific type incompatibility. - # Eager channel creation and application of otel capabilitites + # We create a raw_channel, apply otel capabilities to the channel and + # pass the channel to transport_init. When the Transport finds an existing + # channel it will use that, otherwise it will create one lazily. if transport_init is SecretManagerServiceGrpcTransport: if _otel_helpers.is_otel_capabilities_enabled(self._client_options): # Eagerly create the channel using the Transport's classmethod