Skip to content

Commit affce46

Browse files
authored
handle destination_info for UnixDomainSocketConnection correctly (#766)
* handle destination_info for UnixDomainSocketConnection correctly closes #765
1 parent b47b53e commit affce46

File tree

3 files changed

+29
-9
lines changed

3 files changed

+29
-9
lines changed

CHANGELOG.asciidoc

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,13 @@ endif::[]
2626
[[release-notes-5.x]]
2727
=== Python Agent version 5.x
2828
29+
[[release-notes-5.5.2]]
30+
==== v5.5.2
31+
32+
[float]
33+
===== Bug fixes
34+
* Fixed an issue with Redis using unix domain sockets and destination information {pull}766[#766]
35+
2936
[[release-notes-5.5.1]]
3037
==== v5.5.1
3138

elasticapm/instrumentation/packages/redis.py

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -87,11 +87,16 @@ class RedisConnectionInstrumentation(AbstractInstrumentedModule):
8787
def call(self, module, method, wrapped, instance, args, kwargs):
8888
span = execution_context.get_span()
8989
if span and span.subtype == "redis":
90-
port = int(instance.port) if instance.port else None
91-
destination_info = {
92-
"address": instance.host,
93-
"port": port,
94-
"service": {"name": "redis", "resource": "redis", "type": "db"},
95-
}
96-
span.context["destination"] = destination_info
90+
span.context["destination"] = get_destination_info(instance)
9791
return wrapped(*args, **kwargs)
92+
93+
94+
def get_destination_info(connection):
95+
destination_info = {"service": {"name": "redis", "resource": "redis", "type": "db"}}
96+
if hasattr(connection, "port"):
97+
destination_info["port"] = connection.port
98+
destination_info["address"] = connection.host
99+
elif hasattr(connection, "path"):
100+
destination_info["port"] = None
101+
destination_info["address"] = "unix://" + connection.path
102+
return destination_info

tests/instrumentation/redis_tests.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,15 +30,16 @@
3030

3131
import pytest # isort:skip
3232

33-
pytest.importorskip("redis") # isort:skip
33+
redis = pytest.importorskip("redis") # isort:skip
3434

3535
import os
3636
from functools import partial
3737

38-
import redis
38+
from redis import UnixDomainSocketConnection
3939
from redis.client import StrictRedis
4040

4141
from elasticapm.conf.constants import TRANSACTION
42+
from elasticapm.instrumentation.packages.redis import get_destination_info
4243
from elasticapm.traces import capture_span
4344

4445
pytestmark = [pytest.mark.redis]
@@ -155,3 +156,10 @@ def test_redis_client(instrument, elasticapm_client, redis_conn):
155156
assert spans[2]["type"] == "test"
156157

157158
assert len(spans) == 3
159+
160+
161+
def test_unix_domain_socket_connection_destination_info():
162+
conn = UnixDomainSocketConnection("/some/path")
163+
destination_info = get_destination_info(conn)
164+
assert destination_info["port"] is None
165+
assert destination_info["address"] == "unix:///some/path"

0 commit comments

Comments
 (0)