2525)
2626from google .cloud .spanner_v1 .param_types import INT64
2727from google .api_core .retry import Retry
28+ from google .cloud .spanner_v1 ._helpers import (
29+ AtomicCounter ,
30+ _metadata_with_request_id ,
31+ )
32+ from google .cloud .spanner_v1 .request_id_header import REQ_RAND_PROCESS_ID
2833
2934TABLE_NAME = "citizens"
3035COLUMNS = ["email" , "first_name" , "last_name" , "age" ]
@@ -278,7 +283,7 @@ def test_iteration_w_raw_raising_retryable_internal_error(self):
278283 fail_after = True ,
279284 error = InternalServerError (
280285 "Received unexpected EOS on DATA frame from server"
281- )
286+ ),
282287 )
283288 after = _MockIterator (* LAST )
284289 request = mock .Mock (test = "test" , spec = ["test" , "resume_token" ])
@@ -450,7 +455,7 @@ def test_iteration_w_raw_raising_retryable_internal_error_after_token(self):
450455 fail_after = True ,
451456 error = InternalServerError (
452457 "Received unexpected EOS on DATA frame from server"
453- )
458+ ),
454459 )
455460 after = _MockIterator (* SECOND )
456461 request = mock .Mock (test = "test" , spec = ["test" , "resume_token" ])
@@ -767,7 +772,13 @@ def _read_helper(
767772 )
768773 api .streaming_read .assert_called_once_with (
769774 request = expected_request ,
770- metadata = [("google-cloud-resource-prefix" , database .name )],
775+ metadata = [
776+ ("google-cloud-resource-prefix" , database .name ),
777+ (
778+ "x-goog-spanner-request-id" ,
779+ f"1.{ REQ_RAND_PROCESS_ID } .{ _Client .NTH_CLIENT .value } .1.1.1" ,
780+ ),
781+ ],
771782 retry = retry ,
772783 timeout = timeout ,
773784 )
@@ -1016,7 +1027,13 @@ def _execute_sql_helper(
10161027 )
10171028 api .execute_streaming_sql .assert_called_once_with (
10181029 request = expected_request ,
1019- metadata = [("google-cloud-resource-prefix" , database .name )],
1030+ metadata = [
1031+ ("google-cloud-resource-prefix" , database .name ),
1032+ (
1033+ "x-goog-spanner-request-id" ,
1034+ f"1.{ REQ_RAND_PROCESS_ID } .{ _Client .NTH_CLIENT .value } .1.1.1" ,
1035+ ),
1036+ ],
10201037 timeout = timeout ,
10211038 retry = retry ,
10221039 )
@@ -1189,6 +1206,10 @@ def _partition_read_helper(
11891206 metadata = [
11901207 ("google-cloud-resource-prefix" , database .name ),
11911208 ("x-goog-spanner-route-to-leader" , "true" ),
1209+ (
1210+ "x-goog-spanner-request-id" ,
1211+ f"1.{ REQ_RAND_PROCESS_ID } .{ _Client .NTH_CLIENT .value } .1.1.1" ,
1212+ ),
11921213 ],
11931214 retry = retry ,
11941215 timeout = timeout ,
@@ -1363,6 +1384,10 @@ def _partition_query_helper(
13631384 metadata = [
13641385 ("google-cloud-resource-prefix" , database .name ),
13651386 ("x-goog-spanner-route-to-leader" , "true" ),
1387+ (
1388+ "x-goog-spanner-request-id" ,
1389+ f"1.{ REQ_RAND_PROCESS_ID } .{ _Client .NTH_CLIENT .value } .1.1.1" ,
1390+ ),
13661391 ],
13671392 retry = retry ,
13681393 timeout = timeout ,
@@ -1751,7 +1776,13 @@ def test_begin_ok_exact_staleness(self):
17511776 api .begin_transaction .assert_called_once_with (
17521777 session = session .name ,
17531778 options = expected_txn_options ,
1754- metadata = [("google-cloud-resource-prefix" , database .name )],
1779+ metadata = [
1780+ ("google-cloud-resource-prefix" , database .name ),
1781+ (
1782+ "x-goog-spanner-request-id" ,
1783+ f"1.{ REQ_RAND_PROCESS_ID } .{ _Client .NTH_CLIENT .value } .1.1.1" ,
1784+ ),
1785+ ],
17551786 )
17561787
17571788 self .assertSpanAttributes (
@@ -1787,7 +1818,13 @@ def test_begin_ok_exact_strong(self):
17871818 api .begin_transaction .assert_called_once_with (
17881819 session = session .name ,
17891820 options = expected_txn_options ,
1790- metadata = [("google-cloud-resource-prefix" , database .name )],
1821+ metadata = [
1822+ ("google-cloud-resource-prefix" , database .name ),
1823+ (
1824+ "x-goog-spanner-request-id" ,
1825+ f"1.{ REQ_RAND_PROCESS_ID } .{ _Client .NTH_CLIENT .value } .1.1.1" ,
1826+ ),
1827+ ],
17911828 )
17921829
17931830 self .assertSpanAttributes (
@@ -1798,10 +1835,18 @@ def test_begin_ok_exact_strong(self):
17981835
17991836
18001837class _Client (object ):
1838+ NTH_CLIENT = AtomicCounter ()
1839+
18011840 def __init__ (self ):
18021841 from google .cloud .spanner_v1 import ExecuteSqlRequest
18031842
18041843 self ._query_options = ExecuteSqlRequest .QueryOptions (optimizer_version = "1" )
1844+ self ._nth_client_id = _Client .NTH_CLIENT .increment ()
1845+ self ._nth_request = AtomicCounter ()
1846+
1847+ @property
1848+ def _next_nth_request (self ):
1849+ return self ._nth_request .increment ()
18051850
18061851
18071852class _Instance (object ):
@@ -1816,6 +1861,28 @@ def __init__(self, directed_read_options=None):
18161861 self ._route_to_leader_enabled = True
18171862 self ._directed_read_options = directed_read_options
18181863
1864+ @property
1865+ def _next_nth_request (self ):
1866+ return self ._instance ._client ._next_nth_request
1867+
1868+ @property
1869+ def _nth_client_id (self ):
1870+ return self ._instance ._client ._nth_client_id
1871+
1872+ def metadata_with_request_id (self , nth_request , nth_attempt , prior_metadata = []):
1873+ client_id = self ._nth_client_id
1874+ return _metadata_with_request_id (
1875+ self ._nth_client_id ,
1876+ self ._channel_id ,
1877+ nth_request ,
1878+ nth_attempt ,
1879+ prior_metadata ,
1880+ )
1881+
1882+ @property
1883+ def _channel_id (self ):
1884+ return 1
1885+
18191886
18201887class _Session (object ):
18211888 def __init__ (self , database = None , name = TestSnapshot .SESSION_NAME ):
0 commit comments