Skip to content

Commit d43373f

Browse files
authored
Remove urllib3 info from useragent string (#476)
## Problem - Currently we send urllib3 version in the user agent string - Testing with importtime shows importing urllib3 just to get the version extends the initial load time of the pinecone package by about 35 milliseconds. ## Solution I confirmed we're not using this information in the header, so we should remove it to improve initialization performance. ## Test Plan - Analysis with showed Loading this urllib3 to get the version was adding 35 milliseconds to the time needed to "from pinecone import Pinecone" - Updated unit tests
2 parents c0d7aef + 47f5f30 commit d43373f

File tree

3 files changed

+34
-22
lines changed

3 files changed

+34
-22
lines changed

pinecone/utils/user_agent.py

+4-6
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
import urllib3
2-
31
from .version import __version__
42
from .constants import SOURCE_TAG
53
import re
@@ -19,11 +17,11 @@ def _build_source_tag_field(source_tag):
1917

2018

2119
def _get_user_agent(client_id, config):
22-
user_agent_details = {"urllib3": urllib3.__version__}
23-
user_agent = "{} ({})".format(
24-
client_id, ", ".join([f"{k}:{v}" for k, v in user_agent_details.items()])
20+
user_agent = (
21+
f"{client_id}; {_build_source_tag_field(config.source_tag)}"
22+
if config.source_tag
23+
else client_id
2524
)
26-
user_agent += f"; {_build_source_tag_field(config.source_tag)}" if config.source_tag else ""
2725
return user_agent
2826

2927

tests/unit/utils/test_setup_openapi_client.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ def test_setup_openapi_client(self):
1919
openapi_config=openapi_config,
2020
pool_threads=2,
2121
)
22-
user_agent_regex = re.compile(r"python-client-\d+\.\d+\.\d+ \(urllib3\:\d+\.\d+\.\d+\)")
22+
user_agent_regex = re.compile(r"python-client-\d+\.\d+\.\d+")
2323
assert re.match(user_agent_regex, control_plane_client.api_client.user_agent)
2424
assert re.match(
2525
user_agent_regex, control_plane_client.api_client.default_headers["User-Agent"]
@@ -38,7 +38,7 @@ def test_setup_openapi_client_with_api_version(self):
3838
pool_threads=2,
3939
api_version="2024-04",
4040
)
41-
user_agent_regex = re.compile(r"python-client-\d+\.\d+\.\d+ \(urllib3\:\d+\.\d+\.\d+\)")
41+
user_agent_regex = re.compile(r"python-client-\d+\.\d+\.\d+")
4242
assert re.match(user_agent_regex, control_plane_client.api_client.user_agent)
4343
assert re.match(
4444
user_agent_regex, control_plane_client.api_client.default_headers["User-Agent"]
@@ -102,7 +102,7 @@ def test_setup_openapi_client_with_host_override(self, plugin_api_version, plugi
102102
assert isinstance(plugin_client, plugin_api)
103103

104104
# We want requests from plugins to have a user-agent matching the host SDK.
105-
user_agent_regex = re.compile(r"python-client-\d+\.\d+\.\d+ \(urllib3\:\d+\.\d+\.\d+\)")
105+
user_agent_regex = re.compile(r"python-client-\d+\.\d+\.\d+")
106106
assert re.match(user_agent_regex, plugin_client.api_client.user_agent)
107107
assert re.match(user_agent_regex, plugin_client.api_client.default_headers["User-Agent"])
108108

tests/unit/utils/test_user_agent.py

+27-13
Original file line numberDiff line numberDiff line change
@@ -7,30 +7,38 @@ class TestUserAgent:
77
def test_user_agent(self):
88
config = ConfigBuilder.build(api_key="my-api-key", host="https://my-controller-host")
99
useragent = get_user_agent(config)
10-
assert re.search(r"python-client-\d+\.\d+\.\d+", useragent) is not None
11-
assert re.search(r"urllib3:\d+\.\d+\.\d+", useragent) is not None
10+
assert re.search(r"^python-client-\d+\.\d+\.\d+$", useragent) is not None
1211

1312
def test_user_agent_with_source_tag(self):
1413
config = ConfigBuilder.build(
1514
api_key="my-api-key", host="https://my-controller-host", source_tag="my_source_tag"
1615
)
1716
useragent = get_user_agent(config)
18-
assert re.search(r"python-client-\d+\.\d+\.\d+", useragent) is not None
19-
assert re.search(r"urllib3:\d+\.\d+\.\d+", useragent) is not None
20-
assert re.search(r"source_tag=my_source_tag", useragent) is not None
17+
assert (
18+
re.search(r"^python-client-\d+\.\d+\.\d+; source_tag=my_source_tag$", useragent)
19+
is not None
20+
)
2121

2222
def test_source_tag_is_normalized(self):
2323
config = ConfigBuilder.build(
2424
api_key="my-api-key", host="https://my-controller-host", source_tag="my source tag!!!!"
2525
)
2626
useragent = get_user_agent(config)
27-
assert re.search(r"source_tag=my_source_tag", useragent) is not None
27+
assert (
28+
re.search(r"^python-client-\d+\.\d+\.\d+; source_tag=my_source_tag$", useragent)
29+
is not None
30+
)
31+
assert "!!!!" not in useragent
2832

2933
config = ConfigBuilder.build(
3034
api_key="my-api-key", host="https://my-controller-host", source_tag="My Source Tag"
3135
)
3236
useragent = get_user_agent(config)
33-
assert re.search(r"source_tag=my_source_tag", useragent) is not None
37+
assert (
38+
re.search(r"^python-client-\d+\.\d+\.\d+; source_tag=my_source_tag$", useragent)
39+
is not None
40+
)
41+
assert "My Source Tag" not in useragent
3442

3543
config = ConfigBuilder.build(
3644
api_key="my-api-key",
@@ -46,25 +54,31 @@ def test_source_tag_is_normalized(self):
4654
source_tag=" My Source Tag 123 #### !! ",
4755
)
4856
useragent = get_user_agent(config)
49-
assert re.search(r"source_tag=my_source_tag_123", useragent) is not None
57+
assert (
58+
re.search(r"^python-client-\d+\.\d+\.\d+; source_tag=my_source_tag_123$", useragent)
59+
is not None
60+
)
5061

5162
config = ConfigBuilder.build(
5263
api_key="my-api-key", host="https://my-controller-host", source_tag="colon:allowed"
5364
)
5465
useragent = get_user_agent(config)
55-
assert re.search(r"source_tag=colon:allowed", useragent) is not None
66+
assert (
67+
re.search(r"^python-client-\d+\.\d+\.\d+; source_tag=colon:allowed$", useragent)
68+
is not None
69+
)
5670

5771
def test_user_agent_grpc(self):
5872
config = ConfigBuilder.build(api_key="my-api-key", host="https://my-controller-host")
5973
useragent = get_user_agent_grpc(config)
6074
assert re.search(r"python-client\[grpc\]-\d+\.\d+\.\d+", useragent) is not None
61-
assert re.search(r"urllib3:\d+\.\d+\.\d+", useragent) is not None
6275

6376
def test_user_agent_grpc_with_source_tag(self):
6477
config = ConfigBuilder.build(
6578
api_key="my-api-key", host="https://my-controller-host", source_tag="my_source_tag"
6679
)
6780
useragent = get_user_agent_grpc(config)
68-
assert re.search(r"python-client\[grpc\]-\d+\.\d+\.\d+", useragent) is not None
69-
assert re.search(r"urllib3:\d+\.\d+\.\d+", useragent) is not None
70-
assert re.search(r"source_tag=my_source_tag", useragent) is not None
81+
assert (
82+
re.search(r"^python-client\[grpc\]-\d+\.\d+\.\d+; source_tag=my_source_tag$", useragent)
83+
is not None
84+
)

0 commit comments

Comments
 (0)