Skip to content

Commit 5cdcc9d

Browse files
feat: [Many APIs] Add REST Interceptors which support reading metadata (#13502)
BEGIN_COMMIT_OVERRIDE feat: Add REST Interceptors which support reading metadata feat: Add support for reading selective GAPIC generation methods from service YAML chore: Update gapic-generator-python to v1.22.0 END_COMMIT_OVERRIDE - [ ] Regenerate this pull request now. feat: Add support for reading selective GAPIC generation methods from service YAML chore: Update gapic-generator-python to v1.22.0 PiperOrigin-RevId: 724026024 Source-Link: googleapis/googleapis@ad99638 Source-Link: googleapis/googleapis-gen@e291c4d Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLWNsb3VkLXRyYWNlLy5Pd2xCb3QueWFtbCIsImgiOiJlMjkxYzRkZDFkNjcwZWRhMTk5OThkZTc2Zjk2N2UxNjAzYTQ4OTkzIn0= Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLWNsb3VkLXRyYW5zbGF0ZS8uT3dsQm90LnlhbWwiLCJoIjoiZTI5MWM0ZGQxZDY3MGVkYTE5OTk4ZGU3NmY5NjdlMTYwM2E0ODk5MyJ9 Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLWNsb3VkLXZpZGVvLWxpdmUtc3RyZWFtLy5Pd2xCb3QueWFtbCIsImgiOiJlMjkxYzRkZDFkNjcwZWRhMTk5OThkZTc2Zjk2N2UxNjAzYTQ4OTkzIn0= Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLWNsb3VkLXZpZGVvLXN0aXRjaGVyLy5Pd2xCb3QueWFtbCIsImgiOiJlMjkxYzRkZDFkNjcwZWRhMTk5OThkZTc2Zjk2N2UxNjAzYTQ4OTkzIn0= Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLWNsb3VkLXZpZGVvLXRyYW5zY29kZXIvLk93bEJvdC55YW1sIiwiaCI6ImUyOTFjNGRkMWQ2NzBlZGExOTk5OGRlNzZmOTY3ZTE2MDNhNDg5OTMifQ== Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLWNsb3VkLXZpZGVvaW50ZWxsaWdlbmNlLy5Pd2xCb3QueWFtbCIsImgiOiJlMjkxYzRkZDFkNjcwZWRhMTk5OThkZTc2Zjk2N2UxNjAzYTQ4OTkzIn0= Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLWNsb3VkLXZpc2lvbi8uT3dsQm90LnlhbWwiLCJoIjoiZTI5MWM0ZGQxZDY3MGVkYTE5OTk4ZGU3NmY5NjdlMTYwM2E0ODk5MyJ9 Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLWNsb3VkLXZpc2lvbmFpLy5Pd2xCb3QueWFtbCIsImgiOiJlMjkxYzRkZDFkNjcwZWRhMTk5OThkZTc2Zjk2N2UxNjAzYTQ4OTkzIn0= Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLWNsb3VkLXZtLW1pZ3JhdGlvbi8uT3dsQm90LnlhbWwiLCJoIjoiZTI5MWM0ZGQxZDY3MGVkYTE5OTk4ZGU3NmY5NjdlMTYwM2E0ODk5MyJ9 Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLWNsb3VkLXZtd2FyZWVuZ2luZS8uT3dsQm90LnlhbWwiLCJoIjoiZTI5MWM0ZGQxZDY3MGVkYTE5OTk4ZGU3NmY5NjdlMTYwM2E0ODk5MyJ9 Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLWNsb3VkLXZwYy1hY2Nlc3MvLk93bEJvdC55YW1sIiwiaCI6ImUyOTFjNGRkMWQ2NzBlZGExOTk5OGRlNzZmOTY3ZTE2MDNhNDg5OTMifQ== Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLWNsb3VkLXdlYnJpc2svLk93bEJvdC55YW1sIiwiaCI6ImUyOTFjNGRkMWQ2NzBlZGExOTk5OGRlNzZmOTY3ZTE2MDNhNDg5OTMifQ== Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLWNsb3VkLXdlYnNlY3VyaXR5c2Nhbm5lci8uT3dsQm90LnlhbWwiLCJoIjoiZTI5MWM0ZGQxZDY3MGVkYTE5OTk4ZGU3NmY5NjdlMTYwM2E0ODk5MyJ9 Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLWNsb3VkLXdvcmtmbG93cy8uT3dsQm90LnlhbWwiLCJoIjoiZTI5MWM0ZGQxZDY3MGVkYTE5OTk4ZGU3NmY5NjdlMTYwM2E0ODk5MyJ9 Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLWNsb3VkLXdvcmtzdGF0aW9ucy8uT3dsQm90LnlhbWwiLCJoIjoiZTI5MWM0ZGQxZDY3MGVkYTE5OTk4ZGU3NmY5NjdlMTYwM2E0ODk5MyJ9 Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLWdlby10eXBlLy5Pd2xCb3QueWFtbCIsImgiOiJlMjkxYzRkZDFkNjcwZWRhMTk5OThkZTc2Zjk2N2UxNjAzYTQ4OTkzIn0= Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLW1hcHMtYWRkcmVzc3ZhbGlkYXRpb24vLk93bEJvdC55YW1sIiwiaCI6ImUyOTFjNGRkMWQ2NzBlZGExOTk5OGRlNzZmOTY3ZTE2MDNhNDg5OTMifQ== Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLW1hcHMtYXJlYWluc2lnaHRzLy5Pd2xCb3QueWFtbCIsImgiOiJlMjkxYzRkZDFkNjcwZWRhMTk5OThkZTc2Zjk2N2UxNjAzYTQ4OTkzIn0= Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLW1hcHMtZmxlZXRlbmdpbmUtZGVsaXZlcnkvLk93bEJvdC55YW1sIiwiaCI6ImUyOTFjNGRkMWQ2NzBlZGExOTk5OGRlNzZmOTY3ZTE2MDNhNDg5OTMifQ== Copy-Tag: eyJwIjoicGFja2FnZXMvZ29vZ2xlLW1hcHMtZmxlZXRlbmdpbmUvLk93bEJvdC55YW1sIiwiaCI6ImUyOTFjNGRkMWQ2NzBlZGExOTk5OGRlNzZmOTY3ZTE2MDNhNDg5OTMifQ== --------- Co-authored-by: Owl Bot <gcf-owl-bot[bot]@users.noreply.github.com>
1 parent 87b5382 commit 5cdcc9d

File tree

241 files changed

+25999
-2064
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

241 files changed

+25999
-2064
lines changed

packages/google-cloud-trace/google/cloud/trace/gapic_version.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,4 @@
1313
# See the License for the specific language governing permissions and
1414
# limitations under the License.
1515
#
16-
__version__ = "1.15.0" # {x-release-please-version}
16+
__version__ = "0.0.0" # {x-release-please-version}

packages/google-cloud-trace/google/cloud/trace_v1/gapic_version.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,4 @@
1313
# See the License for the specific language governing permissions and
1414
# limitations under the License.
1515
#
16-
__version__ = "1.15.0" # {x-release-please-version}
16+
__version__ = "0.0.0" # {x-release-please-version}

packages/google-cloud-trace/google/cloud/trace_v1/services/trace_service/client.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
# limitations under the License.
1515
#
1616
from collections import OrderedDict
17+
from http import HTTPStatus
18+
import json
1719
import logging as std_logging
1820
import os
1921
import re
@@ -466,6 +468,33 @@ def _validate_universe_domain(self):
466468
# NOTE (b/349488459): universe validation is disabled until further notice.
467469
return True
468470

471+
def _add_cred_info_for_auth_errors(
472+
self, error: core_exceptions.GoogleAPICallError
473+
) -> None:
474+
"""Adds credential info string to error details for 401/403/404 errors.
475+
476+
Args:
477+
error (google.api_core.exceptions.GoogleAPICallError): The error to add the cred info.
478+
"""
479+
if error.code not in [
480+
HTTPStatus.UNAUTHORIZED,
481+
HTTPStatus.FORBIDDEN,
482+
HTTPStatus.NOT_FOUND,
483+
]:
484+
return
485+
486+
cred = self._transport._credentials
487+
488+
# get_cred_info is only available in google-auth>=2.35.0
489+
if not hasattr(cred, "get_cred_info"):
490+
return
491+
492+
# ignore the type check since pypy test fails when get_cred_info
493+
# is not available
494+
cred_info = cred.get_cred_info() # type: ignore
495+
if cred_info and hasattr(error._details, "append"):
496+
error._details.append(json.dumps(cred_info))
497+
469498
@property
470499
def api_endpoint(self):
471500
"""Return the API endpoint used by the client instance.

packages/google-cloud-trace/google/cloud/trace_v1/services/trace_service/transports/rest.py

Lines changed: 56 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -110,12 +110,33 @@ def pre_get_trace(
110110
def post_get_trace(self, response: trace.Trace) -> trace.Trace:
111111
"""Post-rpc interceptor for get_trace
112112
113-
Override in a subclass to manipulate the response
113+
DEPRECATED. Please use the `post_get_trace_with_metadata`
114+
interceptor instead.
115+
116+
Override in a subclass to read or manipulate the response
114117
after it is returned by the TraceService server but before
115-
it is returned to user code.
118+
it is returned to user code. This `post_get_trace` interceptor runs
119+
before the `post_get_trace_with_metadata` interceptor.
116120
"""
117121
return response
118122

123+
def post_get_trace_with_metadata(
124+
self, response: trace.Trace, metadata: Sequence[Tuple[str, Union[str, bytes]]]
125+
) -> Tuple[trace.Trace, Sequence[Tuple[str, Union[str, bytes]]]]:
126+
"""Post-rpc interceptor for get_trace
127+
128+
Override in a subclass to read or manipulate the response or metadata after it
129+
is returned by the TraceService server but before it is returned to user code.
130+
131+
We recommend only using this `post_get_trace_with_metadata`
132+
interceptor in new development instead of the `post_get_trace` interceptor.
133+
When both interceptors are used, this `post_get_trace_with_metadata` interceptor runs after the
134+
`post_get_trace` interceptor. The (possibly modified) response returned by
135+
`post_get_trace` will be passed to
136+
`post_get_trace_with_metadata`.
137+
"""
138+
return response, metadata
139+
119140
def pre_list_traces(
120141
self,
121142
request: trace.ListTracesRequest,
@@ -133,12 +154,35 @@ def post_list_traces(
133154
) -> trace.ListTracesResponse:
134155
"""Post-rpc interceptor for list_traces
135156
136-
Override in a subclass to manipulate the response
157+
DEPRECATED. Please use the `post_list_traces_with_metadata`
158+
interceptor instead.
159+
160+
Override in a subclass to read or manipulate the response
137161
after it is returned by the TraceService server but before
138-
it is returned to user code.
162+
it is returned to user code. This `post_list_traces` interceptor runs
163+
before the `post_list_traces_with_metadata` interceptor.
139164
"""
140165
return response
141166

167+
def post_list_traces_with_metadata(
168+
self,
169+
response: trace.ListTracesResponse,
170+
metadata: Sequence[Tuple[str, Union[str, bytes]]],
171+
) -> Tuple[trace.ListTracesResponse, Sequence[Tuple[str, Union[str, bytes]]]]:
172+
"""Post-rpc interceptor for list_traces
173+
174+
Override in a subclass to read or manipulate the response or metadata after it
175+
is returned by the TraceService server but before it is returned to user code.
176+
177+
We recommend only using this `post_list_traces_with_metadata`
178+
interceptor in new development instead of the `post_list_traces` interceptor.
179+
When both interceptors are used, this `post_list_traces_with_metadata` interceptor runs after the
180+
`post_list_traces` interceptor. The (possibly modified) response returned by
181+
`post_list_traces` will be passed to
182+
`post_list_traces_with_metadata`.
183+
"""
184+
return response, metadata
185+
142186
def pre_patch_traces(
143187
self,
144188
request: trace.PatchTracesRequest,
@@ -367,6 +411,10 @@ def __call__(
367411
json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True)
368412

369413
resp = self._interceptor.post_get_trace(resp)
414+
response_metadata = [(k, str(v)) for k, v in response.headers.items()]
415+
resp, _ = self._interceptor.post_get_trace_with_metadata(
416+
resp, response_metadata
417+
)
370418
if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor(
371419
logging.DEBUG
372420
): # pragma: NO COVER
@@ -512,6 +560,10 @@ def __call__(
512560
json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True)
513561

514562
resp = self._interceptor.post_list_traces(resp)
563+
response_metadata = [(k, str(v)) for k, v in response.headers.items()]
564+
resp, _ = self._interceptor.post_list_traces_with_metadata(
565+
resp, response_metadata
566+
)
515567
if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor(
516568
logging.DEBUG
517569
): # pragma: NO COVER

packages/google-cloud-trace/google/cloud/trace_v2/gapic_version.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,4 @@
1313
# See the License for the specific language governing permissions and
1414
# limitations under the License.
1515
#
16-
__version__ = "1.15.0" # {x-release-please-version}
16+
__version__ = "0.0.0" # {x-release-please-version}

packages/google-cloud-trace/google/cloud/trace_v2/services/trace_service/client.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
# limitations under the License.
1515
#
1616
from collections import OrderedDict
17+
from http import HTTPStatus
18+
import json
1719
import logging as std_logging
1820
import os
1921
import re
@@ -493,6 +495,33 @@ def _validate_universe_domain(self):
493495
# NOTE (b/349488459): universe validation is disabled until further notice.
494496
return True
495497

498+
def _add_cred_info_for_auth_errors(
499+
self, error: core_exceptions.GoogleAPICallError
500+
) -> None:
501+
"""Adds credential info string to error details for 401/403/404 errors.
502+
503+
Args:
504+
error (google.api_core.exceptions.GoogleAPICallError): The error to add the cred info.
505+
"""
506+
if error.code not in [
507+
HTTPStatus.UNAUTHORIZED,
508+
HTTPStatus.FORBIDDEN,
509+
HTTPStatus.NOT_FOUND,
510+
]:
511+
return
512+
513+
cred = self._transport._credentials
514+
515+
# get_cred_info is only available in google-auth>=2.35.0
516+
if not hasattr(cred, "get_cred_info"):
517+
return
518+
519+
# ignore the type check since pypy test fails when get_cred_info
520+
# is not available
521+
cred_info = cred.get_cred_info() # type: ignore
522+
if cred_info and hasattr(error._details, "append"):
523+
error._details.append(json.dumps(cred_info))
524+
496525
@property
497526
def api_endpoint(self):
498527
"""Return the API endpoint used by the client instance.

packages/google-cloud-trace/google/cloud/trace_v2/services/trace_service/transports/rest.py

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,12 +112,33 @@ def pre_create_span(
112112
def post_create_span(self, response: trace.Span) -> trace.Span:
113113
"""Post-rpc interceptor for create_span
114114
115-
Override in a subclass to manipulate the response
115+
DEPRECATED. Please use the `post_create_span_with_metadata`
116+
interceptor instead.
117+
118+
Override in a subclass to read or manipulate the response
116119
after it is returned by the TraceService server but before
117-
it is returned to user code.
120+
it is returned to user code. This `post_create_span` interceptor runs
121+
before the `post_create_span_with_metadata` interceptor.
118122
"""
119123
return response
120124

125+
def post_create_span_with_metadata(
126+
self, response: trace.Span, metadata: Sequence[Tuple[str, Union[str, bytes]]]
127+
) -> Tuple[trace.Span, Sequence[Tuple[str, Union[str, bytes]]]]:
128+
"""Post-rpc interceptor for create_span
129+
130+
Override in a subclass to read or manipulate the response or metadata after it
131+
is returned by the TraceService server but before it is returned to user code.
132+
133+
We recommend only using this `post_create_span_with_metadata`
134+
interceptor in new development instead of the `post_create_span` interceptor.
135+
When both interceptors are used, this `post_create_span_with_metadata` interceptor runs after the
136+
`post_create_span` interceptor. The (possibly modified) response returned by
137+
`post_create_span` will be passed to
138+
`post_create_span_with_metadata`.
139+
"""
140+
return response, metadata
141+
121142

122143
@dataclasses.dataclass
123144
class TraceServiceRestStub:
@@ -476,6 +497,10 @@ def __call__(
476497
json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True)
477498

478499
resp = self._interceptor.post_create_span(resp)
500+
response_metadata = [(k, str(v)) for k, v in response.headers.items()]
501+
resp, _ = self._interceptor.post_create_span_with_metadata(
502+
resp, response_metadata
503+
)
479504
if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor(
480505
logging.DEBUG
481506
): # pragma: NO COVER

packages/google-cloud-trace/samples/generated_samples/snippet_metadata_google.devtools.cloudtrace.v1.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
],
99
"language": "PYTHON",
1010
"name": "google-cloud-trace",
11-
"version": "1.15.0"
11+
"version": "0.1.0"
1212
},
1313
"snippets": [
1414
{

packages/google-cloud-trace/samples/generated_samples/snippet_metadata_google.devtools.cloudtrace.v2.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
],
99
"language": "PYTHON",
1010
"name": "google-cloud-trace",
11-
"version": "1.15.0"
11+
"version": "0.1.0"
1212
},
1313
"snippets": [
1414
{

packages/google-cloud-trace/tests/unit/gapic/trace_v1/test_trace_service.py

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,13 @@
6161
)
6262
from google.cloud.trace_v1.types import trace
6363

64+
CRED_INFO_JSON = {
65+
"credential_source": "/path/to/file",
66+
"credential_type": "service account credentials",
67+
"principal": "service-account@example.com",
68+
}
69+
CRED_INFO_STRING = json.dumps(CRED_INFO_JSON)
70+
6471

6572
async def mock_async_gen(data, chunk_size=1):
6673
for i in range(0, len(data)): # pragma: NO COVER
@@ -304,6 +311,49 @@ def test__get_universe_domain():
304311
assert str(excinfo.value) == "Universe Domain cannot be an empty string."
305312

306313

314+
@pytest.mark.parametrize(
315+
"error_code,cred_info_json,show_cred_info",
316+
[
317+
(401, CRED_INFO_JSON, True),
318+
(403, CRED_INFO_JSON, True),
319+
(404, CRED_INFO_JSON, True),
320+
(500, CRED_INFO_JSON, False),
321+
(401, None, False),
322+
(403, None, False),
323+
(404, None, False),
324+
(500, None, False),
325+
],
326+
)
327+
def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info):
328+
cred = mock.Mock(["get_cred_info"])
329+
cred.get_cred_info = mock.Mock(return_value=cred_info_json)
330+
client = TraceServiceClient(credentials=cred)
331+
client._transport._credentials = cred
332+
333+
error = core_exceptions.GoogleAPICallError("message", details=["foo"])
334+
error.code = error_code
335+
336+
client._add_cred_info_for_auth_errors(error)
337+
if show_cred_info:
338+
assert error.details == ["foo", CRED_INFO_STRING]
339+
else:
340+
assert error.details == ["foo"]
341+
342+
343+
@pytest.mark.parametrize("error_code", [401, 403, 404, 500])
344+
def test__add_cred_info_for_auth_errors_no_get_cred_info(error_code):
345+
cred = mock.Mock([])
346+
assert not hasattr(cred, "get_cred_info")
347+
client = TraceServiceClient(credentials=cred)
348+
client._transport._credentials = cred
349+
350+
error = core_exceptions.GoogleAPICallError("message", details=[])
351+
error.code = error_code
352+
353+
client._add_cred_info_for_auth_errors(error)
354+
assert error.details == []
355+
356+
307357
@pytest.mark.parametrize(
308358
"client_class,transport_name",
309359
[
@@ -3198,10 +3248,13 @@ def test_list_traces_rest_interceptors(null_interceptor):
31983248
) as transcode, mock.patch.object(
31993249
transports.TraceServiceRestInterceptor, "post_list_traces"
32003250
) as post, mock.patch.object(
3251+
transports.TraceServiceRestInterceptor, "post_list_traces_with_metadata"
3252+
) as post_with_metadata, mock.patch.object(
32013253
transports.TraceServiceRestInterceptor, "pre_list_traces"
32023254
) as pre:
32033255
pre.assert_not_called()
32043256
post.assert_not_called()
3257+
post_with_metadata.assert_not_called()
32053258
pb_message = trace.ListTracesRequest.pb(trace.ListTracesRequest())
32063259
transcode.return_value = {
32073260
"method": "post",
@@ -3223,6 +3276,7 @@ def test_list_traces_rest_interceptors(null_interceptor):
32233276
]
32243277
pre.return_value = request, metadata
32253278
post.return_value = trace.ListTracesResponse()
3279+
post_with_metadata.return_value = trace.ListTracesResponse(), metadata
32263280

32273281
client.list_traces(
32283282
request,
@@ -3234,6 +3288,7 @@ def test_list_traces_rest_interceptors(null_interceptor):
32343288

32353289
pre.assert_called_once()
32363290
post.assert_called_once()
3291+
post_with_metadata.assert_called_once()
32373292

32383293

32393294
def test_get_trace_rest_bad_request(request_type=trace.GetTraceRequest):
@@ -3318,10 +3373,13 @@ def test_get_trace_rest_interceptors(null_interceptor):
33183373
) as transcode, mock.patch.object(
33193374
transports.TraceServiceRestInterceptor, "post_get_trace"
33203375
) as post, mock.patch.object(
3376+
transports.TraceServiceRestInterceptor, "post_get_trace_with_metadata"
3377+
) as post_with_metadata, mock.patch.object(
33213378
transports.TraceServiceRestInterceptor, "pre_get_trace"
33223379
) as pre:
33233380
pre.assert_not_called()
33243381
post.assert_not_called()
3382+
post_with_metadata.assert_not_called()
33253383
pb_message = trace.GetTraceRequest.pb(trace.GetTraceRequest())
33263384
transcode.return_value = {
33273385
"method": "post",
@@ -3343,6 +3401,7 @@ def test_get_trace_rest_interceptors(null_interceptor):
33433401
]
33443402
pre.return_value = request, metadata
33453403
post.return_value = trace.Trace()
3404+
post_with_metadata.return_value = trace.Trace(), metadata
33463405

33473406
client.get_trace(
33483407
request,
@@ -3354,6 +3413,7 @@ def test_get_trace_rest_interceptors(null_interceptor):
33543413

33553414
pre.assert_called_once()
33563415
post.assert_called_once()
3416+
post_with_metadata.assert_called_once()
33573417

33583418

33593419
def test_patch_traces_rest_bad_request(request_type=trace.PatchTracesRequest):

0 commit comments

Comments
 (0)