Skip to content

Commit a4e971d

Browse files
authored
feat: allow to configure a connection pool maxsize (influxdata#215)
1 parent 56b2624 commit a4e971d

File tree

6 files changed

+41
-11
lines changed

6 files changed

+41
-11
lines changed

CHANGELOG.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
## 1.16.0 [unreleased]
22

33
### Features
4-
1. [#203](https://github.com/influxdata/influxdb-client-python/pull/203): Allow configuring client via TOML file.
4+
1. [#203](https://github.com/influxdata/influxdb-client-python/pull/203): Configure a client via TOML file
5+
1. [#215](https://github.com/influxdata/influxdb-client-python/pull/215): Configure a connection pool maxsize
56

67
### Bug Fixes
78
1. [#206](https://github.com/influxdata/influxdb-client-python/pull/207): Use default (system) certificates instead of Mozilla's root certificates (certifi.where())

README.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,7 @@ The following options are supported:
174174
- ``timeout`` - socket timeout in ms (default value is 10000)
175175
- ``verify_ssl`` - set this to false to skip verifying SSL certificate when calling API from https server
176176
- ``ssl_ca_cert`` - set this to customize the certificate file to verify the peer
177+
- ``connection_pool_maxsize`` - set the number of connections to save that can be reused by urllib3
177178

178179
.. code-block:: python
179180
@@ -200,6 +201,7 @@ Supported properties are:
200201
- ``INFLUXDB_V2_TIMEOUT`` - socket timeout in ms (default value is 10000)
201202
- ``INFLUXDB_V2_VERIFY_SSL`` - set this to false to skip verifying SSL certificate when calling API from https server
202203
- ``INFLUXDB_V2_SSL_CA_CERT`` - set this to customize the certificate file to verify the peer
204+
- ``INFLUXDB_V2_CONNECTION_POOL_MAXSIZE`` - set this to customize the certificate file to verify the peer
203205

204206
.. code-block:: python
205207

influxdb_client/client/influxdb_client.py

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ def __init__(self, url, token, debug=None, timeout=10000, enable_gzip=False, org
3535
:key bool verify_ssl: Set this to false to skip verifying SSL certificate when calling API from https server.
3636
:key str ssl_ca_cert: Set this to customize the certificate file to verify the peer.
3737
:key str proxy: Set this to configure the http proxy to be used (ex. http://localhost:3128)
38+
:key int connection_pool_maxsize: Number of connections to save that can be reused by urllib3.
39+
Defaults to "multiprocessing.cpu_count() * 5".
3840
:key urllib3.util.retry.Retry retries: Set the default retry strategy that is used for all HTTP requests
3941
except batching writes. As a default there is no one retry strategy.
4042
@@ -56,6 +58,7 @@ def __init__(self, url, token, debug=None, timeout=10000, enable_gzip=False, org
5658
conf.verify_ssl = kwargs.get('verify_ssl', True)
5759
conf.ssl_ca_cert = kwargs.get('ssl_ca_cert', None)
5860
conf.proxy = kwargs.get('proxy', None)
61+
conf.connection_pool_maxsize = kwargs.get('connection_pool_maxsize', conf.connection_pool_maxsize)
5962

6063
auth_token = self.token
6164
auth_header_name = "Authorization"
@@ -82,6 +85,7 @@ def from_config_file(cls, config_file: str = "config.ini", debug=None, enable_gz
8285
- timeout,
8386
- verify_ssl
8487
- ssl_ca_cert
88+
- connection_pool_maxsize
8589
8690
config.ini example::
8791
@@ -90,6 +94,7 @@ def from_config_file(cls, config_file: str = "config.ini", debug=None, enable_gz
9094
org=my-org
9195
token=my-token
9296
timeout=6000
97+
connection_pool_maxsize=25
9398
9499
[tags]
95100
id = 132-987-655
@@ -103,6 +108,7 @@ def from_config_file(cls, config_file: str = "config.ini", debug=None, enable_gz
103108
token = "my-token"
104109
org = "my-org"
105110
timeout = 6000
111+
connection_pool_maxsize = 25
106112
107113
[tags]
108114
id = "132-987-655"
@@ -137,18 +143,19 @@ def config_value(key: str):
137143
if config.has_option('influx2', 'ssl_ca_cert'):
138144
ssl_ca_cert = config_value('ssl_ca_cert')
139145

146+
connection_pool_maxsize = None
147+
if config.has_option('influx2', 'connection_pool_maxsize'):
148+
connection_pool_maxsize = config_value('connection_pool_maxsize')
149+
140150
default_tags = None
141151

142152
if config.has_section('tags'):
143153
tags = {k: v.strip('"') for k, v in config.items('tags')}
144154
default_tags = dict(tags)
145155

146-
if timeout:
147-
return cls(url, token, debug=debug, timeout=int(timeout), org=org, default_tags=default_tags,
148-
enable_gzip=enable_gzip, verify_ssl=_to_bool(verify_ssl), ssl_ca_cert=ssl_ca_cert)
149-
150-
return cls(url, token, debug=debug, org=org, default_tags=default_tags, enable_gzip=enable_gzip,
151-
verify_ssl=_to_bool(verify_ssl), ssl_ca_cert=ssl_ca_cert)
156+
return cls(url, token, debug=debug, timeout=_to_int(timeout), org=org, default_tags=default_tags,
157+
enable_gzip=enable_gzip, verify_ssl=_to_bool(verify_ssl), ssl_ca_cert=ssl_ca_cert,
158+
connection_pool_maxsize=_to_int(connection_pool_maxsize))
152159

153160
@classmethod
154161
def from_env_properties(cls, debug=None, enable_gzip=False):
@@ -162,22 +169,25 @@ def from_env_properties(cls, debug=None, enable_gzip=False):
162169
- INFLUXDB_V2_TIMEOUT
163170
- INFLUXDB_V2_VERIFY_SSL
164171
- INFLUXDB_V2_SSL_CA_CERT
172+
- INFLUXDB_V2_CONNECTION_POOL_MAXSIZE
165173
"""
166174
url = os.getenv('INFLUXDB_V2_URL', "http://localhost:8086")
167175
token = os.getenv('INFLUXDB_V2_TOKEN', "my-token")
168176
timeout = os.getenv('INFLUXDB_V2_TIMEOUT', "10000")
169177
org = os.getenv('INFLUXDB_V2_ORG', "my-org")
170178
verify_ssl = os.getenv('INFLUXDB_V2_VERIFY_SSL', "True")
171179
ssl_ca_cert = os.getenv('INFLUXDB_V2_SSL_CA_CERT', None)
180+
connection_pool_maxsize = os.getenv('INFLUXDB_V2_CONNECTION_POOL_MAXSIZE', None)
172181

173182
default_tags = dict()
174183

175184
for key, value in os.environ.items():
176185
if key.startswith("INFLUXDB_V2_TAG_"):
177186
default_tags[key[16:].lower()] = value
178187

179-
return cls(url, token, debug=debug, timeout=int(timeout), org=org, default_tags=default_tags,
180-
enable_gzip=enable_gzip, verify_ssl=_to_bool(verify_ssl), ssl_ca_cert=ssl_ca_cert)
188+
return cls(url, token, debug=debug, timeout=_to_int(timeout), org=org, default_tags=default_tags,
189+
enable_gzip=enable_gzip, verify_ssl=_to_bool(verify_ssl), ssl_ca_cert=ssl_ca_cert,
190+
connection_pool_maxsize=_to_int(connection_pool_maxsize))
181191

182192
def write_api(self, write_options=WriteOptions(), point_settings=PointSettings()) -> WriteApi:
183193
"""
@@ -322,5 +332,9 @@ def update_request_body(self, path: str, body):
322332
return _body
323333

324334

325-
def _to_bool(verify_ssl):
326-
return str(verify_ssl).lower() in ("yes", "true")
335+
def _to_bool(bool_value):
336+
return str(bool_value).lower() in ("yes", "true")
337+
338+
339+
def _to_int(int_value):
340+
return int(int_value) if int_value is not None else None

tests/config.ini

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ url=http://localhost:8086
33
org=my-org
44
token=my-token
55
timeout=6000
6+
connection_pool_maxsize=55
67

78
[tags]
89
id = 132-987-655

tests/config.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
org = "my-org"
55
active = true
66
timeout = 6000
7+
connection_pool_maxsize = 55
78

89
[tags]
910
id = "132-987-655"

tests/test_InfluxDBClient.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,10 @@ def tearDown(self) -> None:
1717
if hasattr(self, 'httpd_thread'):
1818
self.httpd_thread.join()
1919

20+
def test_default_conf(self):
21+
self.client = InfluxDBClient(url="http://localhost:8086", token="my-token", org="my-org")
22+
self.assertIsNotNone(self.client.api_client.configuration.connection_pool_maxsize)
23+
2024
def test_TrailingSlashInUrl(self):
2125
self.client = InfluxDBClient(url="http://localhost:8086", token="my-token", org="my-org")
2226
self.assertEqual('http://localhost:8086', self.client.api_client.configuration.host)
@@ -66,6 +70,7 @@ def assertConfig(self):
6670
self.assertEqual("132-987-655", self.client.default_tags["id"])
6771
self.assertEqual("California Miner", self.client.default_tags["customer"])
6872
self.assertEqual("${env.data_center}", self.client.default_tags["data_center"])
73+
self.assertEqual(55, self.client.api_client.configuration.connection_pool_maxsize)
6974

7075
def test_init_from_file_ssl_default(self):
7176
self.client = InfluxDBClient.from_config_file(f'{os.path.dirname(__file__)}/config.ini')
@@ -113,6 +118,12 @@ def test_init_from_env_ssl_ca_cert(self):
113118

114119
self.assertEqual("/my/custom/path/to/cert", self.client.api_client.configuration.ssl_ca_cert)
115120

121+
def test_init_from_env_connection_pool_maxsize(self):
122+
os.environ["INFLUXDB_V2_CONNECTION_POOL_MAXSIZE"] = "29"
123+
self.client = InfluxDBClient.from_env_properties()
124+
125+
self.assertEqual(29, self.client.api_client.configuration.connection_pool_maxsize)
126+
116127
def _start_http_server(self):
117128
import http.server
118129
import ssl

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy