From 7b16980cce8c8b83a8fc18622e7e95a94687047b Mon Sep 17 00:00:00 2001 From: Benjamin Wohlwend Date: Fri, 20 Mar 2020 11:54:26 +0100 Subject: [PATCH 1/2] handle destination_info for UnixDomainSocketConnection correctly closes #765 --- elasticapm/instrumentation/packages/redis.py | 19 ++++++++++++------- tests/instrumentation/redis_tests.py | 12 ++++++++++-- 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/elasticapm/instrumentation/packages/redis.py b/elasticapm/instrumentation/packages/redis.py index 695e24a18..8fcc9c2ff 100644 --- a/elasticapm/instrumentation/packages/redis.py +++ b/elasticapm/instrumentation/packages/redis.py @@ -87,11 +87,16 @@ class RedisConnectionInstrumentation(AbstractInstrumentedModule): def call(self, module, method, wrapped, instance, args, kwargs): span = execution_context.get_span() if span and span.subtype == "redis": - port = int(instance.port) if instance.port else None - destination_info = { - "address": instance.host, - "port": port, - "service": {"name": "redis", "resource": "redis", "type": "db"}, - } - span.context["destination"] = destination_info + span.context["destination"] = get_destination_info(instance) return wrapped(*args, **kwargs) + + +def get_destination_info(connection): + destination_info = {"service": {"name": "redis", "resource": "redis", "type": "db"}} + if hasattr(connection, "port"): + destination_info["port"] = connection.port + destination_info["address"] = connection.host + elif hasattr(connection, "path"): + destination_info["port"] = None + destination_info["address"] = "unix://" + connection.path + return destination_info diff --git a/tests/instrumentation/redis_tests.py b/tests/instrumentation/redis_tests.py index 6fd5f1a79..69e29ef41 100644 --- a/tests/instrumentation/redis_tests.py +++ b/tests/instrumentation/redis_tests.py @@ -30,15 +30,16 @@ import pytest # isort:skip -pytest.importorskip("redis") # isort:skip +redis = pytest.importorskip("redis") # isort:skip import os from functools import partial -import redis +from redis import UnixDomainSocketConnection from redis.client import StrictRedis from elasticapm.conf.constants import TRANSACTION +from elasticapm.instrumentation.packages.redis import get_destination_info from elasticapm.traces import capture_span pytestmark = [pytest.mark.redis] @@ -155,3 +156,10 @@ def test_redis_client(instrument, elasticapm_client, redis_conn): assert spans[2]["type"] == "test" assert len(spans) == 3 + + +def test_unix_domain_socket_connection_destination_info(): + conn = UnixDomainSocketConnection("/some/path") + destination_info = get_destination_info(conn) + assert destination_info["port"] is None + assert destination_info["address"] == "unix:///some/path" From bb35b0d7af7ebab9402b8205d50e205325504783 Mon Sep 17 00:00:00 2001 From: Benjamin Wohlwend Date: Fri, 20 Mar 2020 17:35:50 +0100 Subject: [PATCH 2/2] updated changelog --- CHANGELOG.asciidoc | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc index 5f59feb13..ef4bc5f8e 100644 --- a/CHANGELOG.asciidoc +++ b/CHANGELOG.asciidoc @@ -26,6 +26,13 @@ endif::[] [[release-notes-5.x]] === Python Agent version 5.x +[[release-notes-5.5.2]] +==== v5.5.2 + +[float] +===== Bug fixes +* Fixed an issue with Redis using unix domain sockets and destination information {pull}766[#766] + [[release-notes-5.5.1]] ==== v5.5.1