Skip to content

Commit a610a63

Browse files
committed
feat: add bpd.options.bigquery.requests_transport_adapters option
This allows for overriding requests-based settings such as the maximum connection pool size.
1 parent 1cf9f5e commit a610a63

File tree

4 files changed

+55
-3
lines changed

4 files changed

+55
-3
lines changed

bigframes/_config/bigquery_options.py

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,11 @@
1616

1717
from __future__ import annotations
1818

19-
from typing import Literal, Optional
19+
from typing import Literal, Optional, Sequence, Tuple
2020
import warnings
2121

2222
import google.auth.credentials
23+
import requests.adapters
2324

2425
import bigframes.enums
2526
import bigframes.exceptions as bfe
@@ -90,6 +91,9 @@ def __init__(
9091
allow_large_results: bool = False,
9192
ordering_mode: Literal["strict", "partial"] = "strict",
9293
client_endpoints_override: Optional[dict] = None,
94+
requests_transport_adapters: Sequence[
95+
Tuple[str, requests.adapters.BaseAdapter]
96+
] = (),
9397
):
9498
self._credentials = credentials
9599
self._project = project
@@ -100,6 +104,7 @@ def __init__(
100104
self._kms_key_name = kms_key_name
101105
self._skip_bq_connection_check = skip_bq_connection_check
102106
self._allow_large_results = allow_large_results
107+
self._requests_transport_adapters = requests_transport_adapters
103108
self._session_started = False
104109
# Determines the ordering strictness for the session.
105110
self._ordering_mode = _validate_ordering_mode(ordering_mode)
@@ -379,3 +384,32 @@ def client_endpoints_override(self, value: dict):
379384
)
380385

381386
self._client_endpoints_override = value
387+
388+
@property
389+
def requests_transport_adapters(
390+
self,
391+
) -> Sequence[Tuple[str, requests.adapters.BaseAdapter]]:
392+
"""Transport adapters for requests-based REST clients such as the
393+
google-cloud-bigquery package.
394+
395+
For more details, see the explanation in `requests guide to transport
396+
adapters
397+
<https://requests.readthedocs.io/en/latest/user/advanced/#transport-adapters>`_.
398+
399+
Returns:
400+
Sequence[Tuple[str, requests.adapters.BaseAdapter]]:
401+
Prefixes and corresponding transport adapters to `mount
402+
<https://requests.readthedocs.io/en/latest/api/#requests.Session.mount>`_
403+
in requests-based REST clients.
404+
"""
405+
return self._requests_transport_adapters
406+
407+
@requests_transport_adapters.setter
408+
def requests_transport_adapters(
409+
self, value: Sequence[Tuple[str, requests.adapters.BaseAdapter]]
410+
) -> None:
411+
if self._session_started and self._requests_transport_adapters != value:
412+
raise ValueError(
413+
SESSION_STARTED_MESSAGE.format(attribute="requests_transport_adapters")
414+
)
415+
self._requests_transport_adapters = value

bigframes/pandas/io/api.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -496,6 +496,7 @@ def _set_default_session_location_if_possible(query):
496496
application_name=config.options.bigquery.application_name,
497497
bq_kms_key_name=config.options.bigquery.kms_key_name,
498498
client_endpoints_override=config.options.bigquery.client_endpoints_override,
499+
requests_transport_adapters=config.options.bigquery.requests_transport_adapters,
499500
)
500501

501502
bqclient = clients_provider.bqclient

bigframes/session/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,7 @@ def __init__(
171171
application_name=context.application_name,
172172
bq_kms_key_name=self._bq_kms_key_name,
173173
client_endpoints_override=context.client_endpoints_override,
174+
requests_transport_adapters=context.requests_transport_adapters,
174175
)
175176

176177
# TODO(shobs): Remove this logic after https://github.com/ibis-project/ibis/issues/8494

bigframes/session/clients.py

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,18 +17,20 @@
1717
import os
1818
import threading
1919
import typing
20-
from typing import Optional
20+
from typing import Optional, Sequence, Tuple
2121

2222
import google.api_core.client_info
2323
import google.api_core.client_options
2424
import google.api_core.gapic_v1.client_info
2525
import google.auth.credentials
26+
import google.auth.transport.requests
2627
import google.cloud.bigquery as bigquery
2728
import google.cloud.bigquery_connection_v1
2829
import google.cloud.bigquery_storage_v1
2930
import google.cloud.functions_v2
3031
import google.cloud.resourcemanager_v3
3132
import pydata_google_auth
33+
import requests
3234

3335
import bigframes.constants
3436
import bigframes.version
@@ -79,6 +81,10 @@ def __init__(
7981
application_name: Optional[str] = None,
8082
bq_kms_key_name: Optional[str] = None,
8183
client_endpoints_override: dict = {},
84+
*,
85+
requests_transport_adapters: Sequence[
86+
Tuple[str, requests.adapters.BaseAdapter]
87+
] = (),
8288
):
8389
credentials_project = None
8490
if credentials is None:
@@ -124,6 +130,7 @@ def __init__(
124130
)
125131
self._location = location
126132
self._use_regional_endpoints = use_regional_endpoints
133+
self._requests_transport_adapters = requests_transport_adapters
127134

128135
self._credentials = credentials
129136
self._bq_kms_key_name = bq_kms_key_name
@@ -173,12 +180,21 @@ def _create_bigquery_client(self):
173180
user_agent=self._application_name
174181
)
175182

183+
requests_session = google.auth.transport.requests.AuthorizedSession(
184+
self._credentials
185+
)
186+
for prefix, adapter in self._requests_transport_adapters:
187+
requests_session.mount(prefix, adapter)
188+
176189
bq_client = bigquery.Client(
177190
client_info=bq_info,
178191
client_options=bq_options,
179-
credentials=self._credentials,
180192
project=self._project,
181193
location=self._location,
194+
# Instead of credentials, use _http so that users can override
195+
# requests options with transport adapters. See internal issue
196+
# b/419106112.
197+
_http=requests_session,
182198
)
183199

184200
if self._bq_kms_key_name:

0 commit comments

Comments
 (0)