Skip to content

Commit 0c0f668

Browse files
committed
addressing test issues
1 parent da850c5 commit 0c0f668

8 files changed

Lines changed: 66 additions & 21 deletions

File tree

packages/google-cloud-bigtable/google/cloud/bigtable/data/_async/client.py

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,9 @@
7272
BigtableMetricsExporter,
7373
GoogleCloudMetricsHandler,
7474
)
75+
from google.cloud.bigtable.data._metrics.handlers.opentelemetry import (
76+
OpenTelemetryMetricsHandler,
77+
)
7578
from google.cloud.bigtable.data.exceptions import (
7679
FailedQueryShardError,
7780
ShardedReadRowsExceptionGroup,
@@ -268,8 +271,12 @@ def __init__(
268271
self._is_closed = CrossSync.Event()
269272
if os.getenv("BIGTABLE_EMULATOR_HOST"):
270273
self._gcp_metrics_exporter = None
271-
self._metrics_handler = None
272-
self._metrics = BigtableClientSideMetricsController(handlers=[])
274+
self._metrics_handler = OpenTelemetryMetricsHandler(
275+
client_version=self._client_version(),
276+
)
277+
self._metrics = BigtableClientSideMetricsController(
278+
handlers=[self._metrics_handler]
279+
)
273280
else:
274281
# create a metrics exporter using the same client configuration
275282
self._gcp_metrics_exporter = BigtableMetricsExporter(
@@ -1148,11 +1155,14 @@ def __init__(
11481155
def _create_operation(
11491156
self, op_type: OperationType, **kwargs
11501157
) -> ActiveOperationMetric:
1158+
table_id = getattr(self, "table_id", None) or getattr(
1159+
self, "materialized_view_id", None
1160+
)
11511161
return self.client._metrics.create_operation(
11521162
op_type,
11531163
project_id=self.client.project,
11541164
instance_id=self.instance_id,
1155-
table_id=self.table_id,
1165+
table_id=table_id,
11561166
app_profile_id=self.app_profile_id,
11571167
**kwargs,
11581168
)

packages/google-cloud-bigtable/google/cloud/bigtable/data/_sync_autogen/client.py

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,9 @@
6666
BigtableMetricsExporter,
6767
GoogleCloudMetricsHandler,
6868
)
69+
from google.cloud.bigtable.data._metrics.handlers.opentelemetry import (
70+
OpenTelemetryMetricsHandler,
71+
)
6972
from google.cloud.bigtable.data._sync_autogen._swappable_channel import (
7073
SwappableChannel as SwappableChannelType,
7174
)
@@ -199,8 +202,12 @@ def __init__(
199202
self._is_closed = CrossSync._Sync_Impl.Event()
200203
if os.getenv("BIGTABLE_EMULATOR_HOST"):
201204
self._gcp_metrics_exporter = None
202-
self._metrics_handler = None
203-
self._metrics = BigtableClientSideMetricsController(handlers=[])
205+
self._metrics_handler = OpenTelemetryMetricsHandler(
206+
client_version=self._client_version()
207+
)
208+
self._metrics = BigtableClientSideMetricsController(
209+
handlers=[self._metrics_handler]
210+
)
204211
else:
205212
self._gcp_metrics_exporter = BigtableMetricsExporter(
206213
project_id=self.project,
@@ -912,11 +919,14 @@ def __init__(
912919
def _create_operation(
913920
self, op_type: OperationType, **kwargs
914921
) -> ActiveOperationMetric:
922+
table_id = getattr(self, "table_id", None) or getattr(
923+
self, "materialized_view_id", None
924+
)
915925
return self.client._metrics.create_operation(
916926
op_type,
917927
project_id=self.client.project,
918928
instance_id=self.instance_id,
919-
table_id=self.table_id,
929+
table_id=table_id,
920930
app_profile_id=self.app_profile_id,
921931
**kwargs,
922932
)

packages/google-cloud-bigtable/tests/unit/data/_async/test_client.py

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,8 @@ def _make_client(cls, *args, use_emulator=True, use_mtls="auto", **kwargs):
131131
if use_mtls is not None:
132132
env_mask["GOOGLE_API_USE_MTLS_ENDPOINT"] = use_mtls
133133
with mock.patch.dict(os.environ, env_mask):
134+
if not use_emulator:
135+
os.environ.pop("BIGTABLE_EMULATOR_HOST", None)
134136
return cls._get_target_class()(*args, **kwargs)
135137

136138
@CrossSync.pytest
@@ -228,13 +230,13 @@ async def test_metrics_exporter_init_shares_arguments(self):
228230
expected_options.credentials_file = None
229231
expected_options.quota_project_id = None
230232
with mock.patch(
231-
"google.cloud.bigtable.data._metrics.handlers.gcp_exporter.BigtableMetricsExporter.__init__",
232-
return_value=None,
233+
"google.cloud.bigtable.data._metrics.handlers.gcp_exporter.BigtableMetricsExporter",
233234
) as exporter_mock:
234235
async with self._make_client(
235236
project=expected_project,
236237
credentials=expected_credentials,
237238
client_options=expected_options,
239+
use_emulator=False,
238240
):
239241
exporter_mock.assert_called_once_with(
240242
project_id=expected_project,
@@ -244,7 +246,7 @@ async def test_metrics_exporter_init_shares_arguments(self):
244246

245247
@CrossSync.pytest
246248
async def test_metrics_exporter_init_implicit_project(self):
247-
async with self._make_client() as client:
249+
async with self._make_client(use_emulator=False) as client:
248250
assert client._gcp_metrics_exporter.project_id == client.project
249251

250252
@CrossSync.pytest
@@ -1283,7 +1285,7 @@ async def test_ctor(self):
12831285
expected_read_rows_attempt_timeout = 0.5
12841286
expected_mutate_rows_operation_timeout = 2.5
12851287
expected_mutate_rows_attempt_timeout = 0.75
1286-
client = self._make_client()
1288+
client = self._make_client(use_emulator=False)
12871289
assert not client._active_instances
12881290

12891291
table = self._get_target_class()(
@@ -1646,7 +1648,7 @@ async def test_ctor(self):
16461648
expected_read_rows_attempt_timeout = 0.5
16471649
expected_mutate_rows_operation_timeout = 2.5
16481650
expected_mutate_rows_attempt_timeout = 0.75
1649-
client = self._make_client()
1651+
client = self._make_client(use_emulator=False)
16501652
assert not client._active_instances
16511653

16521654
view = self._get_target_class()(
@@ -1783,7 +1785,7 @@ async def test_ctor(self):
17831785
instance_key = _WarmedInstanceKey(view.instance_name, view.app_profile_id)
17841786
assert instance_key in client._active_instances
17851787
assert client._instance_owners[instance_key] == {id(view)}
1786-
assert isinstance(view._metrics, BigtableClientSideMetricsController)
1788+
assert isinstance(client._metrics, BigtableClientSideMetricsController)
17871789
assert view.default_operation_timeout == expected_operation_timeout
17881790
assert view.default_attempt_timeout == expected_attempt_timeout
17891791
assert (
@@ -1926,11 +1928,15 @@ def _make_client(self, *args, **kwargs):
19261928

19271929
@CrossSync.convert
19281930
def _make_table(self, *args, **kwargs):
1931+
from google.cloud.bigtable.data._metrics import (
1932+
BigtableClientSideMetricsController,
1933+
)
19291934
from google.cloud.bigtable.data._metrics.handlers.gcp_exporter import (
19301935
BigtableMetricsExporter,
19311936
)
19321937

19331938
client_mock = mock.Mock()
1939+
client_mock._metrics = BigtableClientSideMetricsController(handlers=[])
19341940
client_mock._register_instance.side_effect = (
19351941
lambda *args, **kwargs: CrossSync.yield_to_event_loop()
19361942
)

packages/google-cloud-bigtable/tests/unit/data/_async/test_mutations_batcher.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1201,12 +1201,16 @@ async def test_customizable_retryable_errors(
12011201
Test that retryable functions support user-configurable arguments, and that the configured retryables are passed
12021202
down to the gapic layer.
12031203
"""
1204-
from google.cloud.bigtable.data._metrics import ActiveOperationMetric
1204+
from google.cloud.bigtable.data._metrics import (
1205+
ActiveOperationMetric,
1206+
BigtableClientSideMetricsController,
1207+
)
12051208
from google.cloud.bigtable.data._metrics.handlers.gcp_exporter import (
12061209
BigtableMetricsExporter,
12071210
)
12081211

12091212
mock_client = mock.Mock()
1213+
mock_client._metrics = BigtableClientSideMetricsController(handlers=[])
12101214
mock_client._gcp_metrics_exporter = BigtableMetricsExporter("project")
12111215

12121216
with mock.patch.object(

packages/google-cloud-bigtable/tests/unit/data/_metrics/test_gcp_exporter_handler.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -270,7 +270,7 @@ def test__batch_write_with_deadline(self):
270270
instance.client = mock.Mock()
271271
series = [TimeSeries() for _ in range(10)]
272272
# test with deadline
273-
deadline = time.time() + 10
273+
deadline = time.monotonic() + 10
274274
instance._batch_write(series, deadline=deadline)
275275
(
276276
call_args,
@@ -296,6 +296,7 @@ def test_export(self):
296296
# create mock metrics data
297297
expected_value = 123
298298
attributes = {
299+
"resource_project": project_id,
299300
"resource_instance": "instance1",
300301
"resource_cluster": "cluster1",
301302
"resource_table": "table1",

packages/google-cloud-bigtable/tests/unit/data/_metrics/test_opentelemetry_handler.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,7 @@ def test_on_operation_complete_operation_latencies(self):
189189
"status": op.final_status.name,
190190
"resource_zone": op.zone,
191191
"resource_cluster": op.cluster_id,
192+
"app_profile": "default",
192193
**handler.shared_labels,
193194
}
194195
mock_instruments.operation_latencies.record.assert_called_once_with(
@@ -257,6 +258,7 @@ def test_on_operation_complete_first_response_latencies(
257258
"status": op.final_status.name,
258259
"resource_zone": op.zone,
259260
"resource_cluster": op.cluster_id,
261+
"app_profile": "default",
260262
**handler.shared_labels,
261263
}
262264
mock_instruments.first_response_latencies.record.assert_called_once_with(
@@ -286,6 +288,7 @@ def test_on_operation_complete_retry_count(self, attempts_count):
286288
"status": op.final_status.name,
287289
"resource_zone": op.zone,
288290
"resource_cluster": op.cluster_id,
291+
"app_profile": "default",
289292
**handler.shared_labels,
290293
}
291294
mock_instruments.retry_count.add.assert_called_once_with(
@@ -309,6 +312,7 @@ def test_on_attempt_complete_attempt_latencies(self):
309312
"method": op.op_type.value,
310313
"resource_zone": op.zone,
311314
"resource_cluster": op.cluster_id,
315+
"app_profile": "default",
312316
**handler.shared_labels,
313317
}
314318
mock_instruments.attempt_latencies.record.assert_called_once_with(

packages/google-cloud-bigtable/tests/unit/data/_sync_autogen/test_client.py

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,8 @@ def _make_client(cls, *args, use_emulator=True, use_mtls="auto", **kwargs):
104104
if use_mtls is not None:
105105
env_mask["GOOGLE_API_USE_MTLS_ENDPOINT"] = use_mtls
106106
with mock.patch.dict(os.environ, env_mask):
107+
if not use_emulator:
108+
os.environ.pop("BIGTABLE_EMULATOR_HOST", None)
107109
return cls._get_target_class()(*args, **kwargs)
108110

109111
def test_ctor(self):
@@ -195,13 +197,13 @@ def test_metrics_exporter_init_shares_arguments(self):
195197
expected_options.credentials_file = None
196198
expected_options.quota_project_id = None
197199
with mock.patch(
198-
"google.cloud.bigtable.data._metrics.handlers.gcp_exporter.BigtableMetricsExporter.__init__",
199-
return_value=None,
200+
"google.cloud.bigtable.data._metrics.handlers.gcp_exporter.BigtableMetricsExporter"
200201
) as exporter_mock:
201202
with self._make_client(
202203
project=expected_project,
203204
credentials=expected_credentials,
204205
client_options=expected_options,
206+
use_emulator=False,
205207
):
206208
exporter_mock.assert_called_once_with(
207209
project_id=expected_project,
@@ -210,7 +212,7 @@ def test_metrics_exporter_init_shares_arguments(self):
210212
)
211213

212214
def test_metrics_exporter_init_implicit_project(self):
213-
with self._make_client() as client:
215+
with self._make_client(use_emulator=False) as client:
214216
assert client._gcp_metrics_exporter.project_id == client.project
215217

216218
@mock.patch("google.cloud.bigtable.data._async.client.BigtableMetricsExporter")
@@ -1062,7 +1064,7 @@ def test_ctor(self):
10621064
expected_read_rows_attempt_timeout = 0.5
10631065
expected_mutate_rows_operation_timeout = 2.5
10641066
expected_mutate_rows_attempt_timeout = 0.75
1065-
client = self._make_client()
1067+
client = self._make_client(use_emulator=False)
10661068
assert not client._active_instances
10671069
table = self._get_target_class()(
10681070
client,
@@ -1349,7 +1351,7 @@ def test_ctor(self):
13491351
expected_read_rows_attempt_timeout = 0.5
13501352
expected_mutate_rows_operation_timeout = 2.5
13511353
expected_mutate_rows_attempt_timeout = 0.75
1352-
client = self._make_client()
1354+
client = self._make_client(use_emulator=False)
13531355
assert not client._active_instances
13541356
view = self._get_target_class()(
13551357
client,
@@ -1479,7 +1481,7 @@ def test_ctor(self):
14791481
instance_key = _WarmedInstanceKey(view.instance_name, view.app_profile_id)
14801482
assert instance_key in client._active_instances
14811483
assert client._instance_owners[instance_key] == {id(view)}
1482-
assert isinstance(view._metrics, BigtableClientSideMetricsController)
1484+
assert isinstance(client._metrics, BigtableClientSideMetricsController)
14831485
assert view.default_operation_timeout == expected_operation_timeout
14841486
assert view.default_attempt_timeout == expected_attempt_timeout
14851487
assert (
@@ -1593,11 +1595,15 @@ def _make_client(self, *args, **kwargs):
15931595
return CrossSync._Sync_Impl.TestBigtableDataClient._make_client(*args, **kwargs)
15941596

15951597
def _make_table(self, *args, **kwargs):
1598+
from google.cloud.bigtable.data._metrics import (
1599+
BigtableClientSideMetricsController,
1600+
)
15961601
from google.cloud.bigtable.data._metrics.handlers.gcp_exporter import (
15971602
BigtableMetricsExporter,
15981603
)
15991604

16001605
client_mock = mock.Mock()
1606+
client_mock._metrics = BigtableClientSideMetricsController(handlers=[])
16011607
client_mock._register_instance.side_effect = (
16021608
lambda *args, **kwargs: CrossSync._Sync_Impl.yield_to_event_loop()
16031609
)

packages/google-cloud-bigtable/tests/unit/data/_sync_autogen/test_mutations_batcher.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1046,12 +1046,16 @@ def test__add_exceptions(self, limit, in_e, start_e, end_e):
10461046
def test_customizable_retryable_errors(self, input_retryables, expected_retryables):
10471047
"""Test that retryable functions support user-configurable arguments, and that the configured retryables are passed
10481048
down to the gapic layer."""
1049-
from google.cloud.bigtable.data._metrics import ActiveOperationMetric
1049+
from google.cloud.bigtable.data._metrics import (
1050+
ActiveOperationMetric,
1051+
BigtableClientSideMetricsController,
1052+
)
10501053
from google.cloud.bigtable.data._metrics.handlers.gcp_exporter import (
10511054
BigtableMetricsExporter,
10521055
)
10531056

10541057
mock_client = mock.Mock()
1058+
mock_client._metrics = BigtableClientSideMetricsController(handlers=[])
10551059
mock_client._gcp_metrics_exporter = BigtableMetricsExporter("project")
10561060
with mock.patch.object(
10571061
google.api_core.retry, "if_exception_type"

0 commit comments

Comments
 (0)