Skip to content

Commit 222089d

Browse files
Configure a unique user agent for usage tracking purposes
1 parent 21b4f5b commit 222089d

File tree

2 files changed

+34
-3
lines changed

2 files changed

+34
-3
lines changed

elasticsearch_dsl/connections.py

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ def add_connection(self, alias, conn):
5858
"""
5959
Add a connection object, it will be passed through as-is.
6060
"""
61-
self._conns[alias] = conn
61+
self._conns[alias] = self._with_user_agent(conn)
6262

6363
def remove_connection(self, alias):
6464
"""
@@ -82,7 +82,7 @@ def create_connection(self, alias="default", **kwargs):
8282
"""
8383
kwargs.setdefault("serializer", serializer)
8484
conn = self._conns[alias] = self.elasticsearch_class(**kwargs)
85-
return conn
85+
return self._with_user_agent(conn)
8686

8787
def get_connection(self, alias="default"):
8888
"""
@@ -96,7 +96,7 @@ def get_connection(self, alias="default"):
9696
# do not check isinstance(Elasticsearch) so that people can wrap their
9797
# clients
9898
if not isinstance(alias, str):
99-
return alias
99+
return self._with_user_agent(alias)
100100

101101
# connection already established
102102
try:
@@ -111,6 +111,19 @@ def get_connection(self, alias="default"):
111111
# no connection and no kwargs to set one up
112112
raise KeyError(f"There is no connection with alias {alias!r}.")
113113

114+
def _with_user_agent(self, conn):
115+
from . import __versionstr__ # this is here to avoid circular imports
116+
117+
# try to inject our user agent
118+
if hasattr(conn, '_headers'):
119+
is_frozen = conn._headers.frozen
120+
if is_frozen:
121+
conn._headers = conn._headers.copy()
122+
conn._headers.update({'user-agent': f"elasticsearch-dsl-py/{__versionstr__}"})
123+
if is_frozen:
124+
conn._headers.freeze()
125+
return conn
126+
114127

115128
connections = Connections()
116129
configure = connections.configure

tests/test_connections.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,3 +107,21 @@ def test_create_connection_adds_our_serializer():
107107

108108
c_serializers = c.get_connection("testing").transport.serializers
109109
assert c_serializers.serializers["application/json"] is serializer.serializer
110+
111+
112+
def test_connection_has_correct_user_agent():
113+
c = connections.Connections(elasticsearch_class=Elasticsearch)
114+
115+
c.create_connection("testing", hosts=["https://es.com:9200"])
116+
assert c.get_connection('testing')._headers['user-agent'].startswith('elasticsearch-dsl-py/')
117+
118+
my_client = Elasticsearch(hosts=['http://localhost:9200'])
119+
my_client = my_client.options(headers={'user-agent': 'my-user-agent/1.0'})
120+
c.add_connection("default", my_client)
121+
assert c.get_connection()._headers['user-agent'].startswith('elasticsearch-dsl-py/')
122+
123+
my_client = Elasticsearch(hosts=['http://localhost:9200'])
124+
assert c.get_connection(my_client)._headers['user-agent'].startswith('elasticsearch-dsl-py/')
125+
126+
not_a_client = object()
127+
assert c.get_connection(not_a_client) == not_a_client

0 commit comments

Comments
 (0)