Skip to content

Commit 7a73d65

Browse files
committed
Address review feedback
1 parent 3a1611e commit 7a73d65

File tree

7 files changed

+92
-60
lines changed

7 files changed

+92
-60
lines changed

google/cloud/spanner_v1/_opentelemetry_tracing.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,10 @@ def trace_call(name, session, extra_attributes=None, observability_options=None)
103103
yield span
104104
except Exception as error:
105105
span.set_status(Status(StatusCode.ERROR, str(error)))
106-
span.record_exception(error)
106+
# OpenTelemetry-Python imposes invoking span.record_exception on __exit__
107+
# on any exception. We should file a bug later on with them to only
108+
# invoke .record_exception if not already invoked, hence we should not
109+
# invoke .record_exception on our own else we shall have 2 exceptions.
107110
raise
108111
else:
109112
span.set_status(Status(StatusCode.OK))
@@ -115,6 +118,6 @@ def get_current_span():
115118
return trace.get_current_span()
116119

117120

118-
def add_span_event(span, commentary, event_attributes=None):
121+
def add_span_event(span, event_name, event_attributes=None):
119122
if span:
120-
span.add_event(commentary, event_attributes)
123+
span.add_event(event_name, event_attributes)

google/cloud/spanner_v1/pool.py

Lines changed: 37 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -197,23 +197,25 @@ def bind(self, database):
197197
when needed.
198198
"""
199199
self._database = database
200+
requested_session_count = self.size - self._sessions.qsize()
201+
span = get_current_span()
202+
span_event_attributes = {"kind": type(self).__name__}
203+
204+
if requested_session_count <= 0:
205+
add_span_event(
206+
span,
207+
f"Invalid session pool size({requested_session_count}) <= 0",
208+
span_event_attributes,
209+
)
210+
return
211+
200212
api = database.spanner_api
201213
metadata = _metadata_with_prefix(database.name)
202214
if database._route_to_leader_enabled:
203215
metadata.append(
204216
_metadata_with_leader_aware_routing(database._route_to_leader_enabled)
205217
)
206218
self._database_role = self._database_role or self._database.database_role
207-
208-
requested_session_count = self.size - self._sessions.qsize()
209-
request = BatchCreateSessionsRequest(
210-
database=database.name,
211-
session_count=requested_session_count,
212-
session_template=Session(creator_role=self.database_role),
213-
)
214-
215-
span = get_current_span()
216-
span_event_attributes = {"kind": type(self).__name__}
217219
if requested_session_count > 0:
218220
add_span_event(
219221
span,
@@ -225,6 +227,12 @@ def bind(self, database):
225227
add_span_event(span, "Session pool is already full", span_event_attributes)
226228
return
227229

230+
request = BatchCreateSessionsRequest(
231+
database=database.name,
232+
session_count=requested_session_count,
233+
session_template=Session(creator_role=self.database_role),
234+
)
235+
228236
returned_session_count = 0
229237
while not self._sessions.full():
230238
request.session_count = requested_session_count - self._sessions.qsize()
@@ -277,7 +285,9 @@ def get(self, timeout=None):
277285
)
278286
session = self._sessions.get(block=True, timeout=timeout)
279287
except queue.Empty as e:
280-
add_span_event(current_span, "No session available", span_event_attributes)
288+
add_span_event(
289+
current_span, "No sessions available in the pool", span_event_attributes
290+
)
281291
raise e
282292

283293
span_event_attributes["session.id"] = session._session_id
@@ -290,6 +300,7 @@ def get(self, timeout=None):
290300
)
291301
session = self._database.session()
292302
session.create()
303+
# Replacing with the updated session.id.
293304
span_event_attributes["session.id"] = session._session_id
294305

295306
span_event_attributes["time.elapsed"] = time.time() - start_time
@@ -377,10 +388,10 @@ def get(self):
377388
span_event_attributes,
378389
)
379390
session = self._sessions.get_nowait()
380-
except queue.Empty:
391+
except queue.Empty as e:
381392
add_span_event(
382393
current_span,
383-
"No session available. Creating session",
394+
"No sessions available in pool. Creating session",
384395
span_event_attributes,
385396
)
386397
session = self._new_session()
@@ -502,6 +513,14 @@ def bind(self, database):
502513
span_event_attributes = {"kind": type(self).__name__}
503514

504515
requested_session_count = request.session_count
516+
if requested_session_count <= 0:
517+
add_span_event(
518+
current_span,
519+
f"Invalid session pool size({requested_session_count}) <= 0",
520+
span_event_attributes,
521+
)
522+
return
523+
505524
current_span = get_current_span()
506525
add_span_event(
507526
current_span,
@@ -571,7 +590,11 @@ def get(self, timeout=None):
571590
try:
572591
ping_after, session = self._sessions.get(block=True, timeout=timeout)
573592
except queue.Empty as e:
574-
add_span_event(current_span, "No session available", span_event_attributes)
593+
add_span_event(
594+
current_span,
595+
"No sessions available in the pool within the specified timeout",
596+
span_event_attributes,
597+
)
575598
raise e
576599

577600
if _NOW() > ping_after:

google/cloud/spanner_v1/session.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,8 @@ def exists(self):
174174
current_span = get_current_span()
175175
if self._session_id is None:
176176
add_span_event(
177-
current_span, "Checking if Session failed due to unset session_id"
177+
current_span,
178+
"Checking session existence: Session does not exist as it has not been created yet",
178179
)
179180
return False
180181

google/cloud/spanner_v1/transaction.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -283,9 +283,6 @@ def commit(
283283
trace_attributes,
284284
observability_options,
285285
) as span:
286-
if self._transaction_id is None and len(self._mutations) > 0:
287-
self.begin()
288-
289286
add_span_event(span, "Starting Commit")
290287

291288
method = functools.partial(

tests/_helpers.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,3 +108,22 @@ def assertSpanEvents(self, name, wantEventNames=[], span=None):
108108
for event in span.events:
109109
actualEventNames.append(event.name)
110110
self.assertEqual(actualEventNames, wantEventNames)
111+
112+
def assertSpanNames(self, want_span_names):
113+
if not HAS_OPENTELEMETRY_INSTALLED:
114+
return
115+
116+
span_list = self.get_finished_spans()
117+
got_span_names = [span.name for span in span_list]
118+
self.assertEqual(got_span_names, want_span_names)
119+
120+
def get_finished_spans(self):
121+
if HAS_OPENTELEMETRY_INSTALLED:
122+
return list(
123+
filter(
124+
lambda span: span and span.name,
125+
self.ot_exporter.get_finished_spans(),
126+
)
127+
)
128+
else:
129+
return []

tests/unit/test_pool.py

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,33 @@ def test_spans_bind_get(self):
242242
]
243243
self.assertSpanEvents("pool.Get", wantEventNames)
244244

245+
def test_spans_bind_get_empty_pool(self):
246+
pool = self._make_one(size=0)
247+
database = _Database("name")
248+
session1 = _Session(database)
249+
with trace_call("pool.Get", session1) as span:
250+
try:
251+
pool.bind(database)
252+
database._sessions = database._sessions[:0]
253+
pool.get()
254+
except:
255+
pass
256+
257+
wantEventNames = [
258+
"Invalid session pool size(0) <= 0",
259+
"Acquiring session",
260+
"Waiting for a session to become available",
261+
"No sessions available in the pool",
262+
]
263+
self.assertSpanEvents("pool.Get", wantEventNames)
264+
265+
# Check for the overall spans too.
266+
self.assertSpanNames(["pool.Get"])
267+
self.assertSpanAttributes(
268+
"pool.Get",
269+
attributes=TestFixedSizePool.BASE_ATTRIBUTES,
270+
)
271+
245272
def test_spans_pool_bind(self):
246273
pool = self._make_one(size=1)
247274
database = _Database("name")
@@ -259,7 +286,6 @@ def test_spans_pool_bind(self):
259286
"Requesting 1 sessions",
260287
"Creating 1 sessions",
261288
"exception",
262-
"exception",
263289
]
264290
self.assertSpanEvents("testBind", wantEventNames)
265291

@@ -429,7 +455,7 @@ def test_spans_get_empty_pool(self):
429455
wantEventNames = [
430456
"Acquiring session",
431457
"Waiting for a session to become available",
432-
"No session available. Creating session",
458+
"No sessions available. Creating session",
433459
]
434460
self.assertSpanEvents("pool.Get", wantEventNames)
435461

tests/unit/test_session.py

Lines changed: 0 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -212,43 +212,6 @@ def test_create_session_span_annotations(self):
212212
wantEventNames = ["Creating Session"]
213213
self.assertSpanEvents("TestSessionSpan", wantEventNames, span)
214214

215-
def test_get_session_span_annotations(self):
216-
from google.cloud.spanner_v1 import CreateSessionRequest
217-
from google.cloud.spanner_v1 import Session as SessionRequestProto
218-
219-
session_pb = self._make_session_pb(
220-
self.SESSION_NAME, database_role=self.DATABASE_ROLE
221-
)
222-
223-
gax_api = self._make_spanner_api()
224-
gax_api.create_session.return_value = session_pb
225-
database = self._make_database(database_role=self.DATABASE_ROLE)
226-
database.spanner_api = gax_api
227-
session = self._make_one(database, database_role=self.DATABASE_ROLE)
228-
229-
with trace_call("TestSessionSpan", session) as span:
230-
session.create()
231-
232-
self.assertEqual(session.session_id, self.SESSION_ID)
233-
self.assertEqual(session.database_role, self.DATABASE_ROLE)
234-
session_template = SessionRequestProto(creator_role=self.DATABASE_ROLE)
235-
236-
request = CreateSessionRequest(
237-
database=database.name,
238-
session=session_template,
239-
)
240-
241-
gax_api.create_session.assert_called_once_with(
242-
request=request,
243-
metadata=[
244-
("google-cloud-resource-prefix", database.name),
245-
("x-goog-spanner-route-to-leader", "true"),
246-
],
247-
)
248-
249-
wantEventNames = ["Creating Session"]
250-
self.assertSpanEvents("TestSessionSpan", wantEventNames, span)
251-
252215
def test_create_wo_database_role(self):
253216
from google.cloud.spanner_v1 import CreateSessionRequest
254217

0 commit comments

Comments
 (0)