Skip to content
This repository was archived by the owner on Apr 1, 2026. It is now read-only.

Commit 0fa28bb

Browse files
committed
create metrics client using same credentials as bt client
1 parent 7fd21ca commit 0fa28bb

3 files changed

Lines changed: 29 additions & 20 deletions

File tree

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

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,8 @@
8686
from google.cloud.bigtable.data.row_filters import CellsRowLimitFilter
8787
from google.cloud.bigtable.data.row_filters import RowFilterChain
8888
from google.cloud.bigtable.data._metrics import BigtableClientSideMetricsController
89+
from google.cloud.bigtable.data._metrics.handlers.gcp_exporter import BigtableMetricsExporter
90+
from google.cloud.bigtable.data._metrics.handlers.gcp_exporter import GoogleCloudMetricsHandler
8991

9092
from google.cloud.bigtable.data._cross_sync import CrossSync
9193

@@ -212,6 +214,12 @@ def __init__(
212214
credentials = google.auth.credentials.AnonymousCredentials()
213215
if project is None:
214216
project = _DEFAULT_BIGTABLE_EMULATOR_CLIENT
217+
# create a metrics exporter using the same client configuration
218+
self._gcp_metrics_exporter = BigtableMetricsExporter(
219+
credentials=credentials,
220+
project=project,
221+
client_options=client_options,
222+
)
215223
self._metrics_interceptor = MetricInterceptorType()
216224
# initialize client
217225
ClientWithProject.__init__(
@@ -939,13 +947,17 @@ def __init__(
939947
self.default_retryable_errors: Sequence[type[Exception]] = (
940948
default_retryable_errors or ()
941949
)
942-
943950
self._metrics = BigtableClientSideMetricsController(
944-
client._metrics_interceptor,
945-
project_id=self.client.project,
946-
instance_id=instance_id,
947-
table_id=table_id,
948-
app_profile_id=app_profile_id,
951+
interceptor=client._metrics_interceptor,
952+
handlers=[
953+
GoogleCloudMetricsHandler(
954+
exporter=client._gcp_metrics_exporter,
955+
project_id=self.client.project,
956+
instance_id=instance_id,
957+
table_id=table_id,
958+
app_profile_id=app_profile_id
959+
)
960+
]
949961
)
950962

951963
try:

google/cloud/bigtable/data/_metrics/handlers/gcp_exporter.py

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -99,24 +99,25 @@ class GoogleCloudMetricsHandler(OpenTelemetryMetricsHandler):
9999
- throttling_latencies: latency introduced by waiting when there are too many outstanding requests in a bulk operation.
100100
101101
Args:
102-
- project_id: The Google Cloud project ID for the associated Bigtable Table
102+
- exporter: The exporter object used to write metrics to Cloud Montitoring.
103+
Should correspond 1:1 with a bigtable client, and share auth configuration
103104
- export_interval: The interval (in seconds) at which to export metrics to Cloud Monitoring.
105+
- *args: configuration positional arguments passed down to super class
106+
- *kwargs: configuration keyword arguments passed down to super class
104107
"""
105108

106-
def __init__(self, *args, project_id: str, export_interval=60, **kwargs):
107-
# internal exporter to write metrics to Cloud Monitoring
108-
exporter = _BigtableMetricsExporter(project_id=project_id)
109+
def __init__(self, exporter, *args, export_interval=60, **kwargs):
109110
# periodically executes exporter
110111
gcp_reader = PeriodicExportingMetricReader(
111112
exporter, export_interval_millis=export_interval * 1000
112113
)
113114
# use private meter provider to store instruments and views
114115
meter_provider = MeterProvider(metric_readers=[gcp_reader], views=VIEW_LIST)
115116
otel = _OpenTelemetryInstruments(meter_provider=meter_provider)
116-
super().__init__(*args, instruments=otel, project_id=project_id, **kwargs)
117+
super().__init__(*args, instruments=otel, project_id=exporter.roject_id, **kwargs)
117118

118119

119-
class _BigtableMetricsExporter(MetricExporter):
120+
class BigtableMetricsExporter(MetricExporter):
120121
"""
121122
OpenTelemetry Exporter implementation for sending metrics to Google Cloud Monitoring.
122123
@@ -130,11 +131,12 @@ class _BigtableMetricsExporter(MetricExporter):
130131
- project_id: GCP project id to associate metrics with
131132
"""
132133

133-
def __init__(self, project_id: str):
134+
def __init__(self, *client_args, **client_kwargs):
134135
super().__init__()
135-
self.client = MetricServiceClient()
136+
self.client = MetricServiceClient(*client_args, **client_kwargs)
136137
self.prefix = "bigtable.googleapis.com/internal/client"
137-
self.project_name = self.client.common_project_path(project_id)
138+
self.project_id = self.client.project
139+
self.project_name = self.client.common_project_path(self.project_id)
138140

139141
def export(
140142
self, metrics_data: MetricsData, timeout_millis: float = 10_000, **kwargs

google/cloud/bigtable/data/_metrics/metrics_controller.py

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@ def __init__(
4040
self,
4141
interceptor: AsyncBigtableMetricsInterceptor | BigtableMetricsInterceptor,
4242
handlers: list[MetricsHandler] | None = None,
43-
**kwargs,
4443
):
4544
"""
4645
Initializes the metrics controller.
@@ -52,10 +51,6 @@ def __init__(
5251
"""
5352
self.interceptor = interceptor
5453
self.handlers: list[MetricsHandler] = handlers or []
55-
if handlers is None:
56-
# handlers not given. Use default handlers.
57-
# TODO: add default handlers
58-
pass
5954

6055
def add_handler(self, handler: MetricsHandler) -> None:
6156
"""

0 commit comments

Comments
 (0)