Skip to content

Commit 3610162

Browse files
committed
fix(gapic): support client_options dict when resolving tracer_provider
1 parent ef5771d commit 3610162

2 files changed

Lines changed: 31 additions & 5 deletions

File tree

packages/google-api-core/google/api_core/gapic_v1/method.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -298,11 +298,11 @@ def __init__(
298298
try:
299299
from opentelemetry import trace
300300

301-
tracer_provider = (
302-
getattr(client_options, "tracer_provider", None)
303-
if client_options is not None
304-
else None
305-
)
301+
tracer_provider = None
302+
if isinstance(client_options, dict):
303+
tracer_provider = client_options.get("tracer_provider")
304+
elif client_options is not None:
305+
tracer_provider = getattr(client_options, "tracer_provider", None)
306306
if tracer_provider is not None:
307307
tracer = tracer_provider.get_tracer("google.api_core")
308308
else:

packages/google-api-core/tests/unit/gapic/test_method.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -486,6 +486,32 @@ def test_wrap_method_otel_tracing_custom_client_options(mock_otel):
486486
mock_otel.span.set_attribute.assert_called_with("rpc.response.status_code", "OK")
487487

488488

489+
def test_wrap_method_otel_tracing_dict_client_options(mock_otel):
490+
"""Proves that providing client_options as a dict with tracer_provider uses that provider."""
491+
mock_target = mock.Mock(return_value="success")
492+
493+
mock_provider = mock.Mock()
494+
mock_provider.get_tracer.return_value = mock_otel.tracer
495+
496+
client_options = {"tracer_provider": mock_provider}
497+
498+
wrapped = google.api_core.gapic_v1.method.wrap_method(
499+
mock_target,
500+
client_options=client_options,
501+
method_name="/google.cloud.secretmanager.v1.SecretManagerService/ListSecrets",
502+
)
503+
result = wrapped()
504+
505+
assert result == "success"
506+
mock_provider.get_tracer.assert_called_once_with("google.api_core")
507+
mock_otel.tracer.start_as_current_span.assert_called_once_with(
508+
"google.cloud.secretmanager.v1.SecretManagerService/ListSecrets",
509+
kind="CLIENT",
510+
attributes=_DEFAULT_SPAN_ATTRIBUTES,
511+
)
512+
mock_otel.span.set_attribute.assert_called_with("rpc.response.status_code", "OK")
513+
514+
489515
def test_wrap_method_otel_tracing_enabled_error(mock_otel):
490516
"""Proves that when an RPC fails, the T3 client span enriches the status code attribute."""
491517
err = RuntimeError("gRPC connection reset")

0 commit comments

Comments
 (0)