Skip to content

Commit 912b418

Browse files
committed
tests
1 parent a25edc4 commit 912b418

File tree

3 files changed

+44
-16
lines changed

3 files changed

+44
-16
lines changed

examples/trace.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
from opentelemetry.sdk.trace.export import BatchSpanProcessor
2323
from opentelemetry.sdk.trace.sampling import ALWAYS_ON
2424
from opentelemetry import trace
25+
from opentelemetry.propagate import set_global_textmap
26+
from opentelemetry.trace.propagation.tracecontext import TraceContextTextMapPropagator
2527

2628

2729
def main():
@@ -36,10 +38,13 @@ def main():
3638
# Setup the Cloud Spanner Client.
3739
spanner_client = spanner.Client(
3840
project_id,
39-
observability_options=dict(tracer_provider=tracer_provider, enable_extended_tracing=True),
41+
observability_options=dict(tracer_provider=tracer_provider, enable_extended_tracing=True, enable_end_to_end_tracing=True),
4042
)
4143
instance = spanner_client.instance('test-instance')
4244
database = instance.database('test-db')
45+
46+
# Set W3C Trace Context as the global propagator for end to end tracing.
47+
set_global_textmap(TraceContextTextMapPropagator())
4348

4449
# Retrieve a tracer from our custom tracer provider.
4550
tracer = tracer_provider.get_tracer('MyApp')

google/cloud/spanner_v1/_helpers.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,12 @@
3434
from google.cloud.spanner_v1 import JsonObject
3535
from google.cloud.spanner_v1.request_id_header import with_request_id
3636
from google.rpc.error_details_pb2 import RetryInfo
37-
from opentelemetry.propagate import inject
38-
from opentelemetry.propagators.textmap import Setter, Getter
37+
try:
38+
from opentelemetry.propagate import inject
39+
from opentelemetry.propagators.textmap import Setter
40+
HAS_OPENTELEMETRY_INSTALLED = True
41+
except ImportError:
42+
HAS_OPENTELEMETRY_INSTALLED = False
3943
from typing import List, Tuple
4044
import random
4145

@@ -583,8 +587,9 @@ def _metadata_with_span_context(metadata: List[Tuple[str, str]], **kw) -> None:
583587
Returns:
584588
None
585589
"""
586-
metadata.append(("x-goog-spanner-end-to-end-tracing", "true"))
587-
inject(setter=OpenTelemetryContextSetter(), carrier=metadata)
590+
if HAS_OPENTELEMETRY_INSTALLED:
591+
metadata.append(("x-goog-spanner-end-to-end-tracing", "true"))
592+
inject(setter=OpenTelemetryContextSetter(), carrier=metadata)
588593

589594

590595
def _delay_until_retry(exc, deadline, attempts):

tests/unit/test_batch.py

Lines changed: 29 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -563,7 +563,10 @@ def test_batch_write_grpc_error(self):
563563
)
564564

565565
def _test_batch_write_with_request_options(
566-
self, request_options=None, exclude_txn_from_change_streams=False
566+
self,
567+
request_options=None,
568+
exclude_txn_from_change_streams=False,
569+
enable_end_to_end_tracing=False,
567570
):
568571
import datetime
569572
from google.cloud.spanner_v1 import BatchWriteResponse
@@ -577,7 +580,7 @@ def _test_batch_write_with_request_options(
577580
response = BatchWriteResponse(
578581
commit_timestamp=now_pb, indexes=[0], status=status_pb
579582
)
580-
database = _Database()
583+
database = _Database(enable_end_to_end_tracing=enable_end_to_end_tracing)
581584
api = database.spanner_api = _FauxSpannerAPI(_batch_write_response=[response])
582585
session = _Session(database)
583586
groups = self._make_one(session)
@@ -600,13 +603,22 @@ def _test_batch_write_with_request_options(
600603
) = api._batch_request
601604
self.assertEqual(session, self.SESSION_NAME)
602605
self.assertEqual(mutation_groups, groups._mutation_groups)
603-
self.assertEqual(
604-
metadata,
605-
[
606-
("google-cloud-resource-prefix", database.name),
607-
("x-goog-spanner-route-to-leader", "true"),
608-
],
609-
)
606+
expected_metadata = [
607+
("google-cloud-resource-prefix", database.name),
608+
("x-goog-spanner-route-to-leader", "true"),
609+
]
610+
611+
if enable_end_to_end_tracing:
612+
expected_metadata.append(("x-goog-spanner-end-to-end-tracing", "true"))
613+
self.assertTrue(
614+
any(key == "traceparent" for key, _ in metadata),
615+
"traceparent is missing in metadata",
616+
)
617+
618+
# Remove traceparent from actual metadata for comparison
619+
filtered_metadata = [item for item in metadata if item[0] != "traceparent"]
620+
621+
self.assertEqual(filtered_metadata, expected_metadata)
610622
if request_options is None:
611623
expected_request_options = RequestOptions()
612624
elif type(request_options) is dict:
@@ -626,6 +638,9 @@ def _test_batch_write_with_request_options(
626638

627639
def test_batch_write_no_request_options(self):
628640
self._test_batch_write_with_request_options()
641+
642+
def test_batch_write_end_to_end_tracing_enabled(self):
643+
self._test_batch_write_with_request_options(enable_end_to_end_tracing=True)
629644

630645
def test_batch_write_w_transaction_tag_success(self):
631646
self._test_batch_write_with_request_options(
@@ -656,8 +671,11 @@ def session_id(self):
656671

657672

658673
class _Database(object):
659-
name = "testing"
660-
_route_to_leader_enabled = True
674+
def __init__(self, enable_end_to_end_tracing=False):
675+
self.name = "testing"
676+
self._route_to_leader_enabled = True
677+
if enable_end_to_end_tracing:
678+
self.observability_options = dict(enable_end_to_end_tracing=True)
661679

662680

663681
class _FauxSpannerAPI:

0 commit comments

Comments
 (0)