Skip to content

Commit f3bf074

Browse files
committed
feat(opentelemetry): add request_tag to span attributes
1 parent f75e31c commit f3bf074

File tree

6 files changed

+29
-15
lines changed

6 files changed

+29
-15
lines changed

google/cloud/spanner_v1/_helpers.py

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,16 @@
4242
from opentelemetry.propagate import inject
4343
from opentelemetry.propagators.textmap import Setter
4444
from opentelemetry.semconv.resource import ResourceAttributes
45+
from opentelemetry.resourcedetector import gcp_resource_detector
4546
from opentelemetry.resourcedetector.gcp_resource_detector import (
4647
GoogleCloudResourceDetector,
4748
)
4849

50+
# Overwrite the requests timeout for the detector.
51+
# This is necessary as the client will wait the full timeout if the
52+
# code is not run in a GCP environment, with the location endpoints available.
53+
gcp_resource_detector._TIMEOUT_SEC = 0.2
54+
4955
HAS_OPENTELEMETRY_INSTALLED = True
5056
except ImportError:
5157
HAS_OPENTELEMETRY_INSTALLED = False
@@ -65,6 +71,8 @@
6571

6672
log = logging.getLogger(__name__)
6773

74+
_cloud_region: str = None
75+
6876

6977
if HAS_OPENTELEMETRY_INSTALLED:
7078

@@ -90,25 +98,30 @@ def set(self, carrier: List[Tuple[str, str]], key: str, value: str) -> None:
9098

9199

92100
def _get_cloud_region() -> str:
93-
"""Get the location of the resource.
101+
"""Get the location of the resource, caching the result.
94102
95103
Returns:
96104
str: The location of the resource. If OpenTelemetry is not installed, returns a global region.
97105
"""
98-
if not HAS_OPENTELEMETRY_INSTALLED:
99-
return GOOGLE_CLOUD_REGION_GLOBAL
106+
global _cloud_region
107+
if _cloud_region is not None:
108+
return _cloud_region
109+
100110
try:
101111
detector = GoogleCloudResourceDetector()
102112
resources = detector.detect()
103-
104113
if ResourceAttributes.CLOUD_REGION in resources.attributes:
105-
return resources.attributes[ResourceAttributes.CLOUD_REGION]
114+
_cloud_region = resources.attributes[ResourceAttributes.CLOUD_REGION]
115+
else:
116+
_cloud_region = GOOGLE_CLOUD_REGION_GLOBAL
106117
except Exception as e:
107118
log.warning(
108119
"Failed to detect GCP resource location for Spanner metrics, defaulting to 'global'. Error: %s",
109120
e,
110121
)
111-
return GOOGLE_CLOUD_REGION_GLOBAL
122+
_cloud_region = GOOGLE_CLOUD_REGION_GLOBAL
123+
124+
return _cloud_region
112125

113126

114127
def _try_to_coerce_bytes(bytestring):

google/cloud/spanner_v1/_opentelemetry_tracing.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,6 @@ def trace_call(
9999
"enable_end_to_end_tracing", enable_end_to_end_tracing
100100
)
101101
db_name = observability_options.get("db_name", db_name)
102-
cloud_region = observability_options.get("cloud_region", cloud_region)
103102

104103
cloud_region = _get_cloud_region()
105104
tracer = get_tracer(tracer_provider)
@@ -125,7 +124,7 @@ def trace_call(
125124
if "request_options" in attributes:
126125
request_options = attributes.pop("request_options")
127126
if request_options and request_options.request_tag:
128-
attributes["spanner.request_tag"] = request_options.request_tag
127+
attributes["request.tag"] = request_options.request_tag
129128

130129
if extended_tracing_globally_disabled:
131130
enable_extended_tracing = False

tests/system/test_session_api.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
from google.cloud.spanner_admin_database_v1 import DatabaseDialect
3131
from google.cloud._helpers import UTC
3232

33+
from google.cloud.spanner_v1._helpers import _get_cloud_region
3334
from google.cloud.spanner_v1._helpers import AtomicCounter
3435
from google.cloud.spanner_v1.data_types import JsonObject
3536
from google.cloud.spanner_v1.database_sessions_manager import TransactionType
@@ -354,7 +355,7 @@ def _make_attributes(db_instance, **kwargs):
354355
"db.url": "spanner.googleapis.com",
355356
"net.host.name": "spanner.googleapis.com",
356357
"db.instance": db_instance,
357-
"cloud.region": "global",
358+
"cloud.region": _get_cloud_region(),
358359
"gcp.client.service": "spanner",
359360
"gcp.client.version": ot_helpers.LIB_VERSION,
360361
"gcp.client.repo": "googleapis/python-spanner",

tests/unit/test__helpers.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
from opentelemetry.semconv.resource import ResourceAttributes
2121

2222

23-
from google.cloud.spanner_v1 import TransactionOptions
23+
from google.cloud.spanner_v1 import TransactionOptions, _helpers
2424

2525

2626
class Test_merge_query_options(unittest.TestCase):
@@ -94,6 +94,9 @@ def test_base_object_merge_dict(self):
9494

9595

9696
class Test_get_cloud_region(unittest.TestCase):
97+
def setUp(self):
98+
_helpers._cloud_region = None
99+
97100
def _callFUT(self, *args, **kw):
98101
from google.cloud.spanner_v1._helpers import _get_cloud_region
99102

tests/unit/test_snapshot.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@
2727
TransactionOptions,
2828
TransactionSelector,
2929
)
30-
from google.cloud.spanner_v1._helpers import _get_cloud_region
3130
from google.cloud.spanner_v1.snapshot import _SnapshotBase
3231
from tests._builders import (
3332
build_precommit_token_pb,
@@ -1048,7 +1047,7 @@ def _execute_read(
10481047
x_goog_spanner_request_id=req_id,
10491048
)
10501049
if request_options and request_options.request_tag:
1051-
expected_attributes["spanner.request_tag"] = request_options.request_tag
1050+
expected_attributes["request.tag"] = request_options.request_tag
10521051
self.assertSpanAttributes(
10531052
"CloudSpanner._Derived.read", attributes=expected_attributes
10541053
)
@@ -1407,7 +1406,7 @@ def _execute_sql_helper(
14071406
},
14081407
)
14091408
if request_options and request_options.request_tag:
1410-
expected_attributes["spanner.request_tag"] = request_options.request_tag
1409+
expected_attributes["request.tag"] = request_options.request_tag
14111410

14121411
self.assertSpanAttributes(
14131412
"CloudSpanner._Derived.execute_sql",

tests/unit/test_transaction.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@
2626
TransactionOptions,
2727
ResultSetMetadata,
2828
)
29-
from google.cloud.spanner_v1._helpers import _get_cloud_region
3029
from google.cloud.spanner_v1._helpers import GOOGLE_CLOUD_REGION_GLOBAL
3130
from google.cloud.spanner_v1 import DefaultTransactionOptions
3231
from google.cloud.spanner_v1 import Type
@@ -841,7 +840,7 @@ def _execute_update_helper(
841840
database, **{"db.statement": DML_QUERY_WITH_PARAM}
842841
)
843842
if request_options.request_tag:
844-
expected_attributes["spanner.request_tag"] = request_options.request_tag
843+
expected_attributes["request.tag"] = request_options.request_tag
845844
self.assertSpanAttributes(
846845
"CloudSpanner.Transaction.execute_update", attributes=expected_attributes
847846
)

0 commit comments

Comments
 (0)