Skip to content

Commit 4e46c66

Browse files
committed
fallback if credentials fail for metrics client
1 parent 86a544d commit 4e46c66

4 files changed

Lines changed: 80 additions & 19 deletions

File tree

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

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
import abc
1919
import concurrent.futures
20+
import logging
2021
import os
2122
import random
2223
import time
@@ -69,6 +70,8 @@
6970
OperationType,
7071
tracked_retry,
7172
)
73+
74+
_LOGGER = logging.getLogger(__name__)
7275
from google.cloud.bigtable.data._metrics.handlers.gcp_exporter import (
7376
BigtableMetricsExporter,
7477
GoogleCloudMetricsHandler,
@@ -275,16 +278,26 @@ def __init__(
275278
client_version=self._client_version(),
276279
)
277280
else:
278-
# create a metrics exporter using the same client configuration
279-
exporter = BigtableMetricsExporter(
280-
project_id=self.project,
281-
credentials=credentials,
282-
client_options=client_options,
283-
)
284-
self._metrics_handler = GoogleCloudMetricsHandler(
285-
exporter=exporter,
286-
client_version=self._client_version(),
287-
)
281+
try:
282+
# create a metrics exporter using the same client configuration
283+
exporter = BigtableMetricsExporter(
284+
project_id=self.project,
285+
credentials=credentials,
286+
client_options=client_options,
287+
)
288+
self._metrics_handler = GoogleCloudMetricsHandler(
289+
exporter=exporter,
290+
client_version=self._client_version(),
291+
)
292+
except Exception as e:
293+
_LOGGER.warning(
294+
"Failed to initialize Google Cloud Metrics Exporter: %s. "
295+
"Falling back to local OpenTelemetry metrics handler.",
296+
e,
297+
)
298+
self._metrics_handler = OpenTelemetryMetricsHandler(
299+
client_version=self._client_version(),
300+
)
288301
self._metrics = BigtableClientSideMetricsController(
289302
handlers=[self._metrics_handler]
290303
)

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

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020

2121
import abc
2222
import concurrent.futures
23+
import logging
2324
import os
2425
import random
2526
import time
@@ -63,6 +64,8 @@
6364
OperationType,
6465
tracked_retry,
6566
)
67+
68+
_LOGGER = logging.getLogger(__name__)
6669
from google.cloud.bigtable.data._metrics.handlers.gcp_exporter import (
6770
BigtableMetricsExporter,
6871
GoogleCloudMetricsHandler,
@@ -206,15 +209,25 @@ def __init__(
206209
client_version=self._client_version()
207210
)
208211
else:
209-
exporter = BigtableMetricsExporter(
210-
project_id=self.project,
211-
credentials=credentials,
212-
client_options=client_options,
213-
)
214-
self._metrics_handler = GoogleCloudMetricsHandler(
215-
exporter=exporter,
216-
client_version=self._client_version(),
217-
)
212+
try:
213+
exporter = BigtableMetricsExporter(
214+
project_id=self.project,
215+
credentials=credentials,
216+
client_options=client_options,
217+
)
218+
self._metrics_handler = GoogleCloudMetricsHandler(
219+
exporter=exporter,
220+
client_version=self._client_version(),
221+
)
222+
except Exception as e:
223+
_LOGGER.warning(
224+
"Failed to initialize Google Cloud Metrics Exporter: %s. "
225+
"Falling back to local OpenTelemetry metrics handler.",
226+
e,
227+
)
228+
self._metrics_handler = OpenTelemetryMetricsHandler(
229+
client_version=self._client_version(),
230+
)
218231
self._metrics = BigtableClientSideMetricsController(
219232
handlers=[self._metrics_handler]
220233
)

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

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,24 @@ async def test_metrics_exporter_init_implicit_project(self):
255255
async with self._make_client(use_emulator=False) as client:
256256
assert client._metrics.handlers[0]._exporter.project_id == client.project
257257

258+
@CrossSync.pytest
259+
@mock.patch(
260+
"google.cloud.bigtable.data._async.client.BigtableMetricsExporter",
261+
side_effect=Exception("Auth error"),
262+
)
263+
@mock.patch(
264+
"google.cloud.bigtable.data._sync_autogen.client.BigtableMetricsExporter",
265+
side_effect=Exception("Auth error"),
266+
)
267+
async def test_metrics_exporter_init_error_fallback(self, mock_sync, mock_async):
268+
from google.cloud.bigtable.data._metrics.handlers.opentelemetry import (
269+
OpenTelemetryMetricsHandler,
270+
)
271+
272+
async with self._make_client(use_emulator=False) as client:
273+
assert isinstance(client._metrics.handlers[0], OpenTelemetryMetricsHandler)
274+
assert getattr(client._metrics.handlers[0], "_exporter", None) is None
275+
258276
@CrossSync.pytest
259277
@mock.patch("google.cloud.bigtable.data._async.client.BigtableMetricsExporter")
260278
@mock.patch(

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

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,23 @@ def test_metrics_exporter_init_implicit_project(self):
225225
with self._make_client(use_emulator=False) as client:
226226
assert client._metrics.handlers[0]._exporter.project_id == client.project
227227

228+
@mock.patch(
229+
"google.cloud.bigtable.data._async.client.BigtableMetricsExporter",
230+
side_effect=Exception("Auth error"),
231+
)
232+
@mock.patch(
233+
"google.cloud.bigtable.data._sync_autogen.client.BigtableMetricsExporter",
234+
side_effect=Exception("Auth error"),
235+
)
236+
def test_metrics_exporter_init_error_fallback(self, mock_sync, mock_async):
237+
from google.cloud.bigtable.data._metrics.handlers.opentelemetry import (
238+
OpenTelemetryMetricsHandler,
239+
)
240+
241+
with self._make_client(use_emulator=False) as client:
242+
assert isinstance(client._metrics.handlers[0], OpenTelemetryMetricsHandler)
243+
assert getattr(client._metrics.handlers[0], "_exporter", None) is None
244+
228245
@mock.patch("google.cloud.bigtable.data._async.client.BigtableMetricsExporter")
229246
@mock.patch(
230247
"google.cloud.bigtable.data._sync_autogen.client.BigtableMetricsExporter"

0 commit comments

Comments
 (0)