From 802cfb06e201816562335b9705aa82a9f3fbf730 Mon Sep 17 00:00:00 2001 From: chalmer lowe Date: Fri, 23 Oct 2026 07:48:26 -0400 Subject: [PATCH 1/3] chore(secretmanager): include API action in tracing snippet filenames and remove step numbering --- secretmanager/snippets/requirements.txt | 1 + ...secretmanager_get_secret_version_trace.py} | 8 ++--- ...manager_get_secret_version_trace_async.py} | 8 ++--- ...er_get_secret_version_trace_async_test.py} | 19 +++++++----- ...et_secret_version_trace_client_options.py} | 6 ++-- ...cret_version_trace_client_options_test.py} | 12 ++++--- ...r_get_secret_version_trace_cloud_trace.py} | 8 ++--- ..._secret_version_trace_cloud_trace_test.py} | 6 ++-- ...tmanager_get_secret_version_trace_test.py} | 31 +++++++++++++------ 9 files changed, 59 insertions(+), 40 deletions(-) rename secretmanager/snippets/{secretmanager_trace.py => secretmanager_get_secret_version_trace.py} (91%) rename secretmanager/snippets/{secretmanager_trace_async.py => secretmanager_get_secret_version_trace_async.py} (93%) rename secretmanager/snippets/{secretmanager_trace_async_test.py => secretmanager_get_secret_version_trace_async_test.py} (89%) rename secretmanager/snippets/{secretmanager_trace_client_options.py => secretmanager_get_secret_version_trace_client_options.py} (93%) rename secretmanager/snippets/{secretmanager_trace_client_options_test.py => secretmanager_get_secret_version_trace_client_options_test.py} (85%) rename secretmanager/snippets/{secretmanager_trace_cloud_trace.py => secretmanager_get_secret_version_trace_cloud_trace.py} (92%) rename secretmanager/snippets/{secretmanager_trace_cloud_trace_test.py => secretmanager_get_secret_version_trace_cloud_trace_test.py} (92%) rename secretmanager/snippets/{secretmanager_trace_test.py => secretmanager_get_secret_version_trace_test.py} (79%) diff --git a/secretmanager/snippets/requirements.txt b/secretmanager/snippets/requirements.txt index 1d2d7279fe..3698b01138 100644 --- a/secretmanager/snippets/requirements.txt +++ b/secretmanager/snippets/requirements.txt @@ -4,4 +4,5 @@ google-cloud-secret-manager==2.29.0 google-crc32c==1.8.0 opentelemetry-api>=1.20.0 opentelemetry-sdk>=1.20.0 +opentelemetry-instrumentation-grpc>=0.43b0 opentelemetry-exporter-gcp-trace>=1.7.0 diff --git a/secretmanager/snippets/secretmanager_trace.py b/secretmanager/snippets/secretmanager_get_secret_version_trace.py similarity index 91% rename from secretmanager/snippets/secretmanager_trace.py rename to secretmanager/snippets/secretmanager_get_secret_version_trace.py index d1949e0a7a..1ee6bc7b11 100644 --- a/secretmanager/snippets/secretmanager_trace.py +++ b/secretmanager/snippets/secretmanager_get_secret_version_trace.py @@ -44,18 +44,18 @@ def get_secret_version_with_tracing( # applications (e.g., web servers), configure the TracerProvider once at # application startup. # - # 1. Initialize the OpenTelemetry TracerProvider with a Console exporter + # Initialize the OpenTelemetry TracerProvider with a Console exporter provider = TracerProvider() provider.add_span_processor(SimpleSpanProcessor(ConsoleSpanExporter())) trace.set_tracer_provider(provider) - # 2. Enable Google Cloud client library tracing + # Enable Google Cloud client library tracing os.environ["GOOGLE_SDK_PYTHON_TRACING_ENABLED"] = "true" - # 3. Instantiate the client (automatically discovers the active TracerProvider) + # Instantiate the client (automatically discovers the active TracerProvider) client = secretmanager.SecretManagerServiceClient() - # 4. Construct the resource name and invoke the RPC + # Construct the resource name and invoke the RPC name = f"projects/{project_id}/secrets/{secret_id}/versions/{version_id}" try: diff --git a/secretmanager/snippets/secretmanager_trace_async.py b/secretmanager/snippets/secretmanager_get_secret_version_trace_async.py similarity index 93% rename from secretmanager/snippets/secretmanager_trace_async.py rename to secretmanager/snippets/secretmanager_get_secret_version_trace_async.py index 0feb015c07..c785f70ea8 100644 --- a/secretmanager/snippets/secretmanager_trace_async.py +++ b/secretmanager/snippets/secretmanager_get_secret_version_trace_async.py @@ -45,18 +45,18 @@ async def get_secret_version_with_tracing_async( # applications (e.g., web servers), configure the TracerProvider once at # application startup. # - # 1. Initialize the OpenTelemetry TracerProvider with a Console exporter + # Initialize the OpenTelemetry TracerProvider with a Console exporter provider = TracerProvider() provider.add_span_processor(SimpleSpanProcessor(ConsoleSpanExporter())) trace.set_tracer_provider(provider) - # 2. Enable Google Cloud client library tracing + # Enable Google Cloud client library tracing os.environ["GOOGLE_SDK_PYTHON_TRACING_ENABLED"] = "true" - # 3. Instantiate the async client + # Instantiate the async client client = secretmanager.SecretManagerServiceAsyncClient() - # 4. Construct resource name and invoke the async RPC + # Construct resource name and invoke the async RPC name = f"projects/{project_id}/secrets/{secret_id}/versions/{version_id}" try: diff --git a/secretmanager/snippets/secretmanager_trace_async_test.py b/secretmanager/snippets/secretmanager_get_secret_version_trace_async_test.py similarity index 89% rename from secretmanager/snippets/secretmanager_trace_async_test.py rename to secretmanager/snippets/secretmanager_get_secret_version_trace_async_test.py index a9755add00..6697fd93b4 100644 --- a/secretmanager/snippets/secretmanager_trace_async_test.py +++ b/secretmanager/snippets/secretmanager_get_secret_version_trace_async_test.py @@ -13,7 +13,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -"""Unit tests for secretmanager_trace_async snippet.""" +"""Unit tests for secretmanager_get_secret_version_trace_async snippet.""" import os from unittest import mock @@ -28,7 +28,7 @@ import grpc import pytest -from secretmanager_trace_async import ( +from secretmanager_get_secret_version_trace_async import ( get_secret_version_with_tracing_async, ) @@ -62,7 +62,10 @@ def patched_init(self, *args, **kwargs): kind="grpc_asyncio", ) - with mock.patch("secretmanager_trace_async.TracerProvider", return_value=provider): + with mock.patch( + "secretmanager_get_secret_version_trace_async.TracerProvider", + return_value=provider, + ): with mock.patch.object( SecretManagerServiceGrpcAsyncIOTransport, "__init__", patched_init ): @@ -72,11 +75,11 @@ def patched_init(self, *args, **kwargs): version_id="1", ) - # 1. Verify returned SecretVersion metadata + # Verify returned SecretVersion metadata assert version.name == "projects/test-project/secrets/my-secret/versions/1" assert version.state == secretmanager.SecretVersion.State.ENABLED - # 2. Inspect emitted spans + # Inspect emitted spans spans = exporter.get_finished_spans() assert len(spans) == 2, f"Expected 2 spans (T3 + T4), but got {len(spans)}" @@ -89,7 +92,7 @@ def patched_init(self, *args, **kwargs): t3_span = t3_spans[0] t4_span = t4_spans[0] - # 3. Verify T3 logical client span attributes + # Verify T3 logical client span attributes assert ( t3_span.name == "google.cloud.secretmanager.v1.SecretManagerService/GetSecretVersion" @@ -97,7 +100,7 @@ def patched_init(self, *args, **kwargs): assert t3_span.attributes.get("rpc.system.name") == "grpc" assert t3_span.attributes.get("rpc.response.status_code") == "OK" - # 4. Verify T4 wire attempt span attributes + # Verify T4 wire attempt span attributes assert ( t4_span.name == "google.cloud.secretmanager.v1.SecretManagerService/GetSecretVersion" @@ -109,5 +112,5 @@ def patched_init(self, *args, **kwargs): assert t4_span.attributes.get("rpc.grpc.status_code") == 0 assert t4_span.attributes.get("rpc.response.status_code") == "OK" - # 5. Verify span hierarchy / parent-child linkage + # Verify span hierarchy / parent-child linkage assert t4_span.parent.span_id == t3_span.context.span_id diff --git a/secretmanager/snippets/secretmanager_trace_client_options.py b/secretmanager/snippets/secretmanager_get_secret_version_trace_client_options.py similarity index 93% rename from secretmanager/snippets/secretmanager_trace_client_options.py rename to secretmanager/snippets/secretmanager_get_secret_version_trace_client_options.py index 683409f40d..ff79ded639 100644 --- a/secretmanager/snippets/secretmanager_trace_client_options.py +++ b/secretmanager/snippets/secretmanager_get_secret_version_trace_client_options.py @@ -37,17 +37,17 @@ def get_secret_version_with_client_options( Returns: The SecretVersion metadata object. """ - # 1. Initialize an independent TracerProvider (no global registration required) + # Initialize an independent TracerProvider (no global registration required) provider = TracerProvider() provider.add_span_processor(SimpleSpanProcessor(ConsoleSpanExporter())) - # 2. Pass the TracerProvider directly via ClientOptions + # Pass the TracerProvider directly via ClientOptions # Tracing is activated specifically for this client instance, even without # setting the GOOGLE_SDK_PYTHON_TRACING_ENABLED environment variable. options = ClientOptions(tracer_provider=provider) client = secretmanager.SecretManagerServiceClient(client_options=options) - # 3. Construct resource name and invoke RPC + # Construct resource name and invoke RPC name = f"projects/{project_id}/secrets/{secret_id}/versions/{version_id}" try: diff --git a/secretmanager/snippets/secretmanager_trace_client_options_test.py b/secretmanager/snippets/secretmanager_get_secret_version_trace_client_options_test.py similarity index 85% rename from secretmanager/snippets/secretmanager_trace_client_options_test.py rename to secretmanager/snippets/secretmanager_get_secret_version_trace_client_options_test.py index 5e631286ea..4817084d7d 100644 --- a/secretmanager/snippets/secretmanager_trace_client_options_test.py +++ b/secretmanager/snippets/secretmanager_get_secret_version_trace_client_options_test.py @@ -13,11 +13,12 @@ # See the License for the specific language governing permissions and # limitations under the License. -"""Unit tests for secretmanager_trace_client_options snippet.""" +"""Unit tests for secretmanager_get_secret_version_trace_client_options snippet.""" import os from unittest import mock +from google.api_core.client_options import ClientOptions from google.api_core.gapic_v1 import method from google.cloud import secretmanager from google.cloud.secretmanager_v1.services.secret_manager_service.transports.grpc import ( @@ -25,7 +26,7 @@ ) import grpc -from secretmanager_trace_client_options import ( +from secretmanager_get_secret_version_trace_client_options import ( get_secret_version_with_client_options, ) @@ -43,7 +44,9 @@ def test_get_secret_version_with_client_options( def patched_init(self, *args, **kwargs): kwargs["channel"] = grpc.insecure_channel(f"127.0.0.1:{port}") - client_opts = kwargs.get("client_options") + client_opts = kwargs.get("client_options") or ClientOptions( + tracer_provider=provider + ) orig_init(self, *args, **kwargs) if client_opts and client_opts.tracer_provider: self._wrapped_methods[self.get_secret_version] = method.wrap_method( @@ -57,7 +60,8 @@ def patched_init(self, *args, **kwargs): monkeypatch.delenv("GOOGLE_SDK_PYTHON_TRACING_ENABLED", raising=False) with mock.patch( - "secretmanager_trace_client_options.TracerProvider", return_value=provider + "secretmanager_get_secret_version_trace_client_options.TracerProvider", + return_value=provider, ): version = get_secret_version_with_client_options( project_id="test-project", diff --git a/secretmanager/snippets/secretmanager_trace_cloud_trace.py b/secretmanager/snippets/secretmanager_get_secret_version_trace_cloud_trace.py similarity index 92% rename from secretmanager/snippets/secretmanager_trace_cloud_trace.py rename to secretmanager/snippets/secretmanager_get_secret_version_trace_cloud_trace.py index 7e8e363520..ba3b783170 100644 --- a/secretmanager/snippets/secretmanager_trace_cloud_trace.py +++ b/secretmanager/snippets/secretmanager_get_secret_version_trace_cloud_trace.py @@ -49,7 +49,7 @@ def get_secret_version_cloud_trace( # applications (e.g., web servers), configure the TracerProvider once at # application startup. # - # 1. Initialize OpenTelemetry TracerProvider with CloudTraceSpanExporter + # Initialize OpenTelemetry TracerProvider with CloudTraceSpanExporter # NOTE: We also initialize ConsoleSpanExporter to display results from this sample directly. provider = TracerProvider() cloud_exporter = CloudTraceSpanExporter() @@ -57,13 +57,13 @@ def get_secret_version_cloud_trace( provider.add_span_processor(SimpleSpanProcessor(ConsoleSpanExporter())) trace.set_tracer_provider(provider) - # 2. Enable Google Cloud client library tracing + # Enable Google Cloud client library tracing os.environ["GOOGLE_SDK_PYTHON_TRACING_ENABLED"] = "true" - # 3. Instantiate the client (automatically discovers the active TracerProvider) + # Instantiate the client (automatically discovers the active TracerProvider) client = secretmanager.SecretManagerServiceClient() - # 4. Construct resource name and invoke RPC + # Construct resource name and invoke RPC name = f"projects/{project_id}/secrets/{secret_id}/versions/{version_id}" try: diff --git a/secretmanager/snippets/secretmanager_trace_cloud_trace_test.py b/secretmanager/snippets/secretmanager_get_secret_version_trace_cloud_trace_test.py similarity index 92% rename from secretmanager/snippets/secretmanager_trace_cloud_trace_test.py rename to secretmanager/snippets/secretmanager_get_secret_version_trace_cloud_trace_test.py index 01690e3c14..41ffbb5205 100644 --- a/secretmanager/snippets/secretmanager_trace_cloud_trace_test.py +++ b/secretmanager/snippets/secretmanager_get_secret_version_trace_cloud_trace_test.py @@ -13,7 +13,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -"""Unit tests for secretmanager_trace_cloud_trace snippet.""" +"""Unit tests for secretmanager_get_secret_version_trace_cloud_trace snippet.""" import os import sys @@ -48,7 +48,7 @@ def shutdown(self): # flake8: E402 is ignored here because we must patch sys.modules with a mock # CloudTraceSpanExporter before importing the snippet module in environments # where opentelemetry-exporter-gcp-trace is not installed. -from secretmanager_trace_cloud_trace import ( # noqa: E402 +from secretmanager_get_secret_version_trace_cloud_trace import ( # noqa: E402 get_secret_version_cloud_trace, ) @@ -69,7 +69,7 @@ def patched_init(self, *args, **kwargs): monkeypatch.setattr(SecretManagerServiceGrpcTransport, "__init__", patched_init) with mock.patch( - "secretmanager_trace_cloud_trace.CloudTraceSpanExporter" + "secretmanager_get_secret_version_trace_cloud_trace.CloudTraceSpanExporter" ) as mock_cloud_exporter_cls: instance = MockCloudTraceSpanExporter() mock_cloud_exporter_cls.return_value = instance diff --git a/secretmanager/snippets/secretmanager_trace_test.py b/secretmanager/snippets/secretmanager_get_secret_version_trace_test.py similarity index 79% rename from secretmanager/snippets/secretmanager_trace_test.py rename to secretmanager/snippets/secretmanager_get_secret_version_trace_test.py index 0deedd3097..d75c28f1a5 100644 --- a/secretmanager/snippets/secretmanager_trace_test.py +++ b/secretmanager/snippets/secretmanager_get_secret_version_trace_test.py @@ -13,11 +13,12 @@ # See the License for the specific language governing permissions and # limitations under the License. -"""Unit tests for secretmanager_trace snippet.""" +"""Unit tests for secretmanager_get_secret_version_trace snippet.""" import os from unittest import mock +from google.api_core import _observability from google.api_core.client_options import ClientOptions from google.api_core.gapic_v1 import method from google.cloud import secretmanager @@ -26,7 +27,9 @@ ) import grpc -from secretmanager_trace import get_secret_version_with_tracing +from secretmanager_get_secret_version_trace import ( + get_secret_version_with_tracing, +) # Ensure OTel tracing capabilities are enabled in the environment os.environ["GOOGLE_SDK_EXPERIMENTAL_PYTHON_TRACING_ENABLED"] = "true" @@ -41,17 +44,25 @@ def test_get_secret_version_with_tracing_spans(mock_grpc_server, otel_setup): orig_init = SecretManagerServiceGrpcTransport.__init__ def patched_init(self, *args, **kwargs): - kwargs["channel"] = grpc.insecure_channel(f"127.0.0.1:{port}") + opts = ClientOptions(api_endpoint=f"127.0.0.1:{port}", tracer_provider=provider) + interceptor = _observability.get_otel_interceptor(opts) + channel = grpc.insecure_channel(f"127.0.0.1:{port}") + if interceptor: + channel = interceptor(channel) + kwargs["channel"] = channel orig_init(self, *args, **kwargs) # Ensure modern GAPIC tracing wrapper is attached to the transport callable self._wrapped_methods[self.get_secret_version] = method.wrap_method( self.get_secret_version, method_name="/google.cloud.secretmanager.v1.SecretManagerService/GetSecretVersion", - client_options=ClientOptions(tracer_provider=provider), + client_options=opts, kind="grpc", ) - with mock.patch("secretmanager_trace.TracerProvider", return_value=provider): + with mock.patch( + "secretmanager_get_secret_version_trace.TracerProvider", + return_value=provider, + ): with mock.patch.object( SecretManagerServiceGrpcTransport, "__init__", patched_init ): @@ -61,11 +72,11 @@ def patched_init(self, *args, **kwargs): version_id="1", ) - # 1. Verify returned SecretVersion metadata + # Verify returned SecretVersion metadata assert version.name == "projects/test-project/secrets/my-secret/versions/1" assert version.state == secretmanager.SecretVersion.State.ENABLED - # 2. Inspect emitted spans + # Inspect emitted spans spans = exporter.get_finished_spans() assert len(spans) == 2, f"Expected 2 spans (T3 + T4), but got {len(spans)}" @@ -78,7 +89,7 @@ def patched_init(self, *args, **kwargs): t3_span = t3_spans[0] t4_span = t4_spans[0] - # 3. Verify T3 logical client span attributes + # Verify T3 logical client span attributes assert ( t3_span.name == "google.cloud.secretmanager.v1.SecretManagerService/GetSecretVersion" @@ -86,7 +97,7 @@ def patched_init(self, *args, **kwargs): assert t3_span.attributes.get("rpc.system.name") == "grpc" assert t3_span.attributes.get("rpc.response.status_code") == "OK" - # 4. Verify T4 wire attempt span attributes + # Verify T4 wire attempt span attributes assert ( t4_span.name == "google.cloud.secretmanager.v1.SecretManagerService/GetSecretVersion" @@ -98,5 +109,5 @@ def patched_init(self, *args, **kwargs): assert t4_span.attributes.get("rpc.grpc.status_code") == 0 assert t4_span.attributes.get("rpc.response.status_code") == "OK" - # 5. Verify span hierarchy / parent-child linkage + # Verify span hierarchy / parent-child linkage assert t4_span.parent.span_id == t3_span.context.span_id From ffb4754a9bf28aa58b633c6100a8fbf8f7b352a3 Mon Sep 17 00:00:00 2001 From: chalmer lowe Date: Fri, 23 Oct 2026 07:58:42 -0400 Subject: [PATCH 2/3] chore(secretmanager): drop secretmanager prefix from tracing snippet filenames --- ..._secret_version_trace.py => get_secret_version_trace.py} | 0 ...ion_trace_async.py => get_secret_version_trace_async.py} | 0 ...async_test.py => get_secret_version_trace_async_test.py} | 6 +++--- ...ptions.py => get_secret_version_trace_client_options.py} | 0 ...t.py => get_secret_version_trace_client_options_test.py} | 6 +++--- ...oud_trace.py => get_secret_version_trace_cloud_trace.py} | 0 ...test.py => get_secret_version_trace_cloud_trace_test.py} | 6 +++--- ...rsion_trace_test.py => get_secret_version_trace_test.py} | 6 +++--- 8 files changed, 12 insertions(+), 12 deletions(-) rename secretmanager/snippets/{secretmanager_get_secret_version_trace.py => get_secret_version_trace.py} (100%) rename secretmanager/snippets/{secretmanager_get_secret_version_trace_async.py => get_secret_version_trace_async.py} (100%) rename secretmanager/snippets/{secretmanager_get_secret_version_trace_async_test.py => get_secret_version_trace_async_test.py} (95%) rename secretmanager/snippets/{secretmanager_get_secret_version_trace_client_options.py => get_secret_version_trace_client_options.py} (100%) rename secretmanager/snippets/{secretmanager_get_secret_version_trace_client_options_test.py => get_secret_version_trace_client_options_test.py} (92%) rename secretmanager/snippets/{secretmanager_get_secret_version_trace_cloud_trace.py => get_secret_version_trace_cloud_trace.py} (100%) rename secretmanager/snippets/{secretmanager_get_secret_version_trace_cloud_trace_test.py => get_secret_version_trace_cloud_trace_test.py} (92%) rename secretmanager/snippets/{secretmanager_get_secret_version_trace_test.py => get_secret_version_trace_test.py} (95%) diff --git a/secretmanager/snippets/secretmanager_get_secret_version_trace.py b/secretmanager/snippets/get_secret_version_trace.py similarity index 100% rename from secretmanager/snippets/secretmanager_get_secret_version_trace.py rename to secretmanager/snippets/get_secret_version_trace.py diff --git a/secretmanager/snippets/secretmanager_get_secret_version_trace_async.py b/secretmanager/snippets/get_secret_version_trace_async.py similarity index 100% rename from secretmanager/snippets/secretmanager_get_secret_version_trace_async.py rename to secretmanager/snippets/get_secret_version_trace_async.py diff --git a/secretmanager/snippets/secretmanager_get_secret_version_trace_async_test.py b/secretmanager/snippets/get_secret_version_trace_async_test.py similarity index 95% rename from secretmanager/snippets/secretmanager_get_secret_version_trace_async_test.py rename to secretmanager/snippets/get_secret_version_trace_async_test.py index 6697fd93b4..e9057062cf 100644 --- a/secretmanager/snippets/secretmanager_get_secret_version_trace_async_test.py +++ b/secretmanager/snippets/get_secret_version_trace_async_test.py @@ -13,7 +13,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -"""Unit tests for secretmanager_get_secret_version_trace_async snippet.""" +"""Unit tests for get_secret_version_trace_async snippet.""" import os from unittest import mock @@ -28,7 +28,7 @@ import grpc import pytest -from secretmanager_get_secret_version_trace_async import ( +from get_secret_version_trace_async import ( get_secret_version_with_tracing_async, ) @@ -63,7 +63,7 @@ def patched_init(self, *args, **kwargs): ) with mock.patch( - "secretmanager_get_secret_version_trace_async.TracerProvider", + "get_secret_version_trace_async.TracerProvider", return_value=provider, ): with mock.patch.object( diff --git a/secretmanager/snippets/secretmanager_get_secret_version_trace_client_options.py b/secretmanager/snippets/get_secret_version_trace_client_options.py similarity index 100% rename from secretmanager/snippets/secretmanager_get_secret_version_trace_client_options.py rename to secretmanager/snippets/get_secret_version_trace_client_options.py diff --git a/secretmanager/snippets/secretmanager_get_secret_version_trace_client_options_test.py b/secretmanager/snippets/get_secret_version_trace_client_options_test.py similarity index 92% rename from secretmanager/snippets/secretmanager_get_secret_version_trace_client_options_test.py rename to secretmanager/snippets/get_secret_version_trace_client_options_test.py index 4817084d7d..4b35fa6876 100644 --- a/secretmanager/snippets/secretmanager_get_secret_version_trace_client_options_test.py +++ b/secretmanager/snippets/get_secret_version_trace_client_options_test.py @@ -13,7 +13,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -"""Unit tests for secretmanager_get_secret_version_trace_client_options snippet.""" +"""Unit tests for get_secret_version_trace_client_options snippet.""" import os from unittest import mock @@ -26,7 +26,7 @@ ) import grpc -from secretmanager_get_secret_version_trace_client_options import ( +from get_secret_version_trace_client_options import ( get_secret_version_with_client_options, ) @@ -60,7 +60,7 @@ def patched_init(self, *args, **kwargs): monkeypatch.delenv("GOOGLE_SDK_PYTHON_TRACING_ENABLED", raising=False) with mock.patch( - "secretmanager_get_secret_version_trace_client_options.TracerProvider", + "get_secret_version_trace_client_options.TracerProvider", return_value=provider, ): version = get_secret_version_with_client_options( diff --git a/secretmanager/snippets/secretmanager_get_secret_version_trace_cloud_trace.py b/secretmanager/snippets/get_secret_version_trace_cloud_trace.py similarity index 100% rename from secretmanager/snippets/secretmanager_get_secret_version_trace_cloud_trace.py rename to secretmanager/snippets/get_secret_version_trace_cloud_trace.py diff --git a/secretmanager/snippets/secretmanager_get_secret_version_trace_cloud_trace_test.py b/secretmanager/snippets/get_secret_version_trace_cloud_trace_test.py similarity index 92% rename from secretmanager/snippets/secretmanager_get_secret_version_trace_cloud_trace_test.py rename to secretmanager/snippets/get_secret_version_trace_cloud_trace_test.py index 41ffbb5205..98c2c7f429 100644 --- a/secretmanager/snippets/secretmanager_get_secret_version_trace_cloud_trace_test.py +++ b/secretmanager/snippets/get_secret_version_trace_cloud_trace_test.py @@ -13,7 +13,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -"""Unit tests for secretmanager_get_secret_version_trace_cloud_trace snippet.""" +"""Unit tests for get_secret_version_trace_cloud_trace snippet.""" import os import sys @@ -48,7 +48,7 @@ def shutdown(self): # flake8: E402 is ignored here because we must patch sys.modules with a mock # CloudTraceSpanExporter before importing the snippet module in environments # where opentelemetry-exporter-gcp-trace is not installed. -from secretmanager_get_secret_version_trace_cloud_trace import ( # noqa: E402 +from get_secret_version_trace_cloud_trace import ( # noqa: E402 get_secret_version_cloud_trace, ) @@ -69,7 +69,7 @@ def patched_init(self, *args, **kwargs): monkeypatch.setattr(SecretManagerServiceGrpcTransport, "__init__", patched_init) with mock.patch( - "secretmanager_get_secret_version_trace_cloud_trace.CloudTraceSpanExporter" + "get_secret_version_trace_cloud_trace.CloudTraceSpanExporter" ) as mock_cloud_exporter_cls: instance = MockCloudTraceSpanExporter() mock_cloud_exporter_cls.return_value = instance diff --git a/secretmanager/snippets/secretmanager_get_secret_version_trace_test.py b/secretmanager/snippets/get_secret_version_trace_test.py similarity index 95% rename from secretmanager/snippets/secretmanager_get_secret_version_trace_test.py rename to secretmanager/snippets/get_secret_version_trace_test.py index d75c28f1a5..a92ef4b76e 100644 --- a/secretmanager/snippets/secretmanager_get_secret_version_trace_test.py +++ b/secretmanager/snippets/get_secret_version_trace_test.py @@ -13,7 +13,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -"""Unit tests for secretmanager_get_secret_version_trace snippet.""" +"""Unit tests for get_secret_version_trace snippet.""" import os from unittest import mock @@ -27,7 +27,7 @@ ) import grpc -from secretmanager_get_secret_version_trace import ( +from get_secret_version_trace import ( get_secret_version_with_tracing, ) @@ -60,7 +60,7 @@ def patched_init(self, *args, **kwargs): ) with mock.patch( - "secretmanager_get_secret_version_trace.TracerProvider", + "get_secret_version_trace.TracerProvider", return_value=provider, ): with mock.patch.object( From 05854597672eaa38824938222ce78d73bb8c2977 Mon Sep 17 00:00:00 2001 From: chalmer lowe Date: Fri, 23 Oct 2026 08:44:56 -0400 Subject: [PATCH 3/3] chore(secretmanager): revert test mock shims and fix root-level import ordering --- .../get_secret_version_trace_async_test.py | 7 +++---- ..._secret_version_trace_client_options_test.py | 12 ++++-------- ...get_secret_version_trace_cloud_trace_test.py | 8 ++++---- .../snippets/get_secret_version_trace_test.py | 17 +++++------------ secretmanager/snippets/requirements.txt | 1 - 5 files changed, 16 insertions(+), 29 deletions(-) diff --git a/secretmanager/snippets/get_secret_version_trace_async_test.py b/secretmanager/snippets/get_secret_version_trace_async_test.py index e9057062cf..c139cef8cb 100644 --- a/secretmanager/snippets/get_secret_version_trace_async_test.py +++ b/secretmanager/snippets/get_secret_version_trace_async_test.py @@ -18,6 +18,9 @@ import os from unittest import mock +from get_secret_version_trace_async import ( + get_secret_version_with_tracing_async, +) from google.api_core import _observability from google.api_core.client_options import ClientOptions from google.api_core.gapic_v1 import method_async @@ -28,10 +31,6 @@ import grpc import pytest -from get_secret_version_trace_async import ( - get_secret_version_with_tracing_async, -) - # Ensure OTel tracing capabilities are enabled in the environment os.environ["GOOGLE_SDK_EXPERIMENTAL_PYTHON_TRACING_ENABLED"] = "true" os.environ["GOOGLE_SDK_PYTHON_TRACING_ENABLED"] = "true" diff --git a/secretmanager/snippets/get_secret_version_trace_client_options_test.py b/secretmanager/snippets/get_secret_version_trace_client_options_test.py index 4b35fa6876..d52ae9cb97 100644 --- a/secretmanager/snippets/get_secret_version_trace_client_options_test.py +++ b/secretmanager/snippets/get_secret_version_trace_client_options_test.py @@ -18,7 +18,9 @@ import os from unittest import mock -from google.api_core.client_options import ClientOptions +from get_secret_version_trace_client_options import ( + get_secret_version_with_client_options, +) from google.api_core.gapic_v1 import method from google.cloud import secretmanager from google.cloud.secretmanager_v1.services.secret_manager_service.transports.grpc import ( @@ -26,10 +28,6 @@ ) import grpc -from get_secret_version_trace_client_options import ( - get_secret_version_with_client_options, -) - os.environ["GOOGLE_SDK_EXPERIMENTAL_PYTHON_TRACING_ENABLED"] = "true" @@ -44,9 +42,7 @@ def test_get_secret_version_with_client_options( def patched_init(self, *args, **kwargs): kwargs["channel"] = grpc.insecure_channel(f"127.0.0.1:{port}") - client_opts = kwargs.get("client_options") or ClientOptions( - tracer_provider=provider - ) + client_opts = kwargs.get("client_options") orig_init(self, *args, **kwargs) if client_opts and client_opts.tracer_provider: self._wrapped_methods[self.get_secret_version] = method.wrap_method( diff --git a/secretmanager/snippets/get_secret_version_trace_cloud_trace_test.py b/secretmanager/snippets/get_secret_version_trace_cloud_trace_test.py index 98c2c7f429..660fb12663 100644 --- a/secretmanager/snippets/get_secret_version_trace_cloud_trace_test.py +++ b/secretmanager/snippets/get_secret_version_trace_cloud_trace_test.py @@ -45,10 +45,10 @@ def shutdown(self): mock_module.CloudTraceSpanExporter = MockCloudTraceSpanExporter sys.modules["opentelemetry.exporter.cloud_trace"] = mock_module -# flake8: E402 is ignored here because we must patch sys.modules with a mock -# CloudTraceSpanExporter before importing the snippet module in environments -# where opentelemetry-exporter-gcp-trace is not installed. -from get_secret_version_trace_cloud_trace import ( # noqa: E402 +# flake8: E402 and I100 are ignored here because we must patch sys.modules with +# a mock CloudTraceSpanExporter before importing the snippet module in +# environments where opentelemetry-exporter-gcp-trace is not installed. +from get_secret_version_trace_cloud_trace import ( # noqa: E402, I100 get_secret_version_cloud_trace, ) diff --git a/secretmanager/snippets/get_secret_version_trace_test.py b/secretmanager/snippets/get_secret_version_trace_test.py index a92ef4b76e..1b2f058dd7 100644 --- a/secretmanager/snippets/get_secret_version_trace_test.py +++ b/secretmanager/snippets/get_secret_version_trace_test.py @@ -18,7 +18,9 @@ import os from unittest import mock -from google.api_core import _observability +from get_secret_version_trace import ( + get_secret_version_with_tracing, +) from google.api_core.client_options import ClientOptions from google.api_core.gapic_v1 import method from google.cloud import secretmanager @@ -27,10 +29,6 @@ ) import grpc -from get_secret_version_trace import ( - get_secret_version_with_tracing, -) - # Ensure OTel tracing capabilities are enabled in the environment os.environ["GOOGLE_SDK_EXPERIMENTAL_PYTHON_TRACING_ENABLED"] = "true" os.environ["GOOGLE_SDK_PYTHON_TRACING_ENABLED"] = "true" @@ -44,18 +42,13 @@ def test_get_secret_version_with_tracing_spans(mock_grpc_server, otel_setup): orig_init = SecretManagerServiceGrpcTransport.__init__ def patched_init(self, *args, **kwargs): - opts = ClientOptions(api_endpoint=f"127.0.0.1:{port}", tracer_provider=provider) - interceptor = _observability.get_otel_interceptor(opts) - channel = grpc.insecure_channel(f"127.0.0.1:{port}") - if interceptor: - channel = interceptor(channel) - kwargs["channel"] = channel + kwargs["channel"] = grpc.insecure_channel(f"127.0.0.1:{port}") orig_init(self, *args, **kwargs) # Ensure modern GAPIC tracing wrapper is attached to the transport callable self._wrapped_methods[self.get_secret_version] = method.wrap_method( self.get_secret_version, method_name="/google.cloud.secretmanager.v1.SecretManagerService/GetSecretVersion", - client_options=opts, + client_options=ClientOptions(tracer_provider=provider), kind="grpc", ) diff --git a/secretmanager/snippets/requirements.txt b/secretmanager/snippets/requirements.txt index 3698b01138..1d2d7279fe 100644 --- a/secretmanager/snippets/requirements.txt +++ b/secretmanager/snippets/requirements.txt @@ -4,5 +4,4 @@ google-cloud-secret-manager==2.29.0 google-crc32c==1.8.0 opentelemetry-api>=1.20.0 opentelemetry-sdk>=1.20.0 -opentelemetry-instrumentation-grpc>=0.43b0 opentelemetry-exporter-gcp-trace>=1.7.0